]> git.openstreetmap.org Git - rails.git/blob - vendor/assets/iD/iD.js
339e58d881d467425b9674394a3324b9f7ac2827
[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       var unmasked = true;
17432     } catch (e) {}
17433
17434     var result = nativeObjectToString.call(value);
17435     if (unmasked) {
17436       if (isOwn) {
17437         value[symToStringTag] = tag;
17438       } else {
17439         delete value[symToStringTag];
17440       }
17441     }
17442     return result;
17443   }
17444
17445   /** Used for built-in method references. */
17446   var objectProto$1 = Object.prototype;
17447
17448   /**
17449    * Used to resolve the
17450    * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
17451    * of values.
17452    */
17453   var nativeObjectToString$1 = objectProto$1.toString;
17454
17455   /**
17456    * Converts `value` to a string using `Object.prototype.toString`.
17457    *
17458    * @private
17459    * @param {*} value The value to convert.
17460    * @returns {string} Returns the converted string.
17461    */
17462   function objectToString(value) {
17463     return nativeObjectToString$1.call(value);
17464   }
17465
17466   /** `Object#toString` result references. */
17467   var nullTag = '[object Null]',
17468       undefinedTag = '[object Undefined]';
17469
17470   /** Built-in value references. */
17471   var symToStringTag$1 = Symbol ? Symbol.toStringTag : undefined;
17472
17473   /**
17474    * The base implementation of `getTag` without fallbacks for buggy environments.
17475    *
17476    * @private
17477    * @param {*} value The value to query.
17478    * @returns {string} Returns the `toStringTag`.
17479    */
17480   function baseGetTag(value) {
17481     if (value == null) {
17482       return value === undefined ? undefinedTag : nullTag;
17483     }
17484     return (symToStringTag$1 && symToStringTag$1 in Object(value))
17485       ? getRawTag(value)
17486       : objectToString(value);
17487   }
17488
17489   /**
17490    * Checks if `value` is the
17491    * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
17492    * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
17493    *
17494    * @static
17495    * @memberOf _
17496    * @since 0.1.0
17497    * @category Lang
17498    * @param {*} value The value to check.
17499    * @returns {boolean} Returns `true` if `value` is an object, else `false`.
17500    * @example
17501    *
17502    * _.isObject({});
17503    * // => true
17504    *
17505    * _.isObject([1, 2, 3]);
17506    * // => true
17507    *
17508    * _.isObject(_.noop);
17509    * // => true
17510    *
17511    * _.isObject(null);
17512    * // => false
17513    */
17514   function isObject(value) {
17515     var type = typeof value;
17516     return value != null && (type == 'object' || type == 'function');
17517   }
17518
17519   /** `Object#toString` result references. */
17520   var asyncTag = '[object AsyncFunction]',
17521       funcTag = '[object Function]',
17522       genTag = '[object GeneratorFunction]',
17523       proxyTag = '[object Proxy]';
17524
17525   /**
17526    * Checks if `value` is classified as a `Function` object.
17527    *
17528    * @static
17529    * @memberOf _
17530    * @since 0.1.0
17531    * @category Lang
17532    * @param {*} value The value to check.
17533    * @returns {boolean} Returns `true` if `value` is a function, else `false`.
17534    * @example
17535    *
17536    * _.isFunction(_);
17537    * // => true
17538    *
17539    * _.isFunction(/abc/);
17540    * // => false
17541    */
17542   function isFunction(value) {
17543     if (!isObject(value)) {
17544       return false;
17545     }
17546     // The use of `Object#toString` avoids issues with the `typeof` operator
17547     // in Safari 9 which returns 'object' for typed arrays and other constructors.
17548     var tag = baseGetTag(value);
17549     return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
17550   }
17551
17552   /** Used to detect overreaching core-js shims. */
17553   var coreJsData = root$2['__core-js_shared__'];
17554
17555   /** Used to detect methods masquerading as native. */
17556   var maskSrcKey = (function() {
17557     var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
17558     return uid ? ('Symbol(src)_1.' + uid) : '';
17559   }());
17560
17561   /**
17562    * Checks if `func` has its source masked.
17563    *
17564    * @private
17565    * @param {Function} func The function to check.
17566    * @returns {boolean} Returns `true` if `func` is masked, else `false`.
17567    */
17568   function isMasked(func) {
17569     return !!maskSrcKey && (maskSrcKey in func);
17570   }
17571
17572   /** Used for built-in method references. */
17573   var funcProto = Function.prototype;
17574
17575   /** Used to resolve the decompiled source of functions. */
17576   var funcToString = funcProto.toString;
17577
17578   /**
17579    * Converts `func` to its source code.
17580    *
17581    * @private
17582    * @param {Function} func The function to convert.
17583    * @returns {string} Returns the source code.
17584    */
17585   function toSource(func) {
17586     if (func != null) {
17587       try {
17588         return funcToString.call(func);
17589       } catch (e) {}
17590       try {
17591         return (func + '');
17592       } catch (e) {}
17593     }
17594     return '';
17595   }
17596
17597   /**
17598    * Used to match `RegExp`
17599    * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
17600    */
17601   var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
17602
17603   /** Used to detect host constructors (Safari). */
17604   var reIsHostCtor = /^\[object .+?Constructor\]$/;
17605
17606   /** Used for built-in method references. */
17607   var funcProto$1 = Function.prototype,
17608       objectProto$2 = Object.prototype;
17609
17610   /** Used to resolve the decompiled source of functions. */
17611   var funcToString$1 = funcProto$1.toString;
17612
17613   /** Used to check objects for own properties. */
17614   var hasOwnProperty$1 = objectProto$2.hasOwnProperty;
17615
17616   /** Used to detect if a method is native. */
17617   var reIsNative = RegExp('^' +
17618     funcToString$1.call(hasOwnProperty$1).replace(reRegExpChar, '\\$&')
17619     .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
17620   );
17621
17622   /**
17623    * The base implementation of `_.isNative` without bad shim checks.
17624    *
17625    * @private
17626    * @param {*} value The value to check.
17627    * @returns {boolean} Returns `true` if `value` is a native function,
17628    *  else `false`.
17629    */
17630   function baseIsNative(value) {
17631     if (!isObject(value) || isMasked(value)) {
17632       return false;
17633     }
17634     var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
17635     return pattern.test(toSource(value));
17636   }
17637
17638   /**
17639    * Gets the value at `key` of `object`.
17640    *
17641    * @private
17642    * @param {Object} [object] The object to query.
17643    * @param {string} key The key of the property to get.
17644    * @returns {*} Returns the property value.
17645    */
17646   function getValue(object, key) {
17647     return object == null ? undefined : object[key];
17648   }
17649
17650   /**
17651    * Gets the native function at `key` of `object`.
17652    *
17653    * @private
17654    * @param {Object} object The object to query.
17655    * @param {string} key The key of the method to get.
17656    * @returns {*} Returns the function if it's native, else `undefined`.
17657    */
17658   function getNative(object, key) {
17659     var value = getValue(object, key);
17660     return baseIsNative(value) ? value : undefined;
17661   }
17662
17663   /* Built-in method references that are verified to be native. */
17664   var Map$1 = getNative(root$2, 'Map');
17665
17666   /* Built-in method references that are verified to be native. */
17667   var nativeCreate = getNative(Object, 'create');
17668
17669   /**
17670    * Removes all key-value entries from the hash.
17671    *
17672    * @private
17673    * @name clear
17674    * @memberOf Hash
17675    */
17676   function hashClear() {
17677     this.__data__ = nativeCreate ? nativeCreate(null) : {};
17678     this.size = 0;
17679   }
17680
17681   /**
17682    * Removes `key` and its value from the hash.
17683    *
17684    * @private
17685    * @name delete
17686    * @memberOf Hash
17687    * @param {Object} hash The hash to modify.
17688    * @param {string} key The key of the value to remove.
17689    * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17690    */
17691   function hashDelete(key) {
17692     var result = this.has(key) && delete this.__data__[key];
17693     this.size -= result ? 1 : 0;
17694     return result;
17695   }
17696
17697   /** Used to stand-in for `undefined` hash values. */
17698   var HASH_UNDEFINED = '__lodash_hash_undefined__';
17699
17700   /** Used for built-in method references. */
17701   var objectProto$3 = Object.prototype;
17702
17703   /** Used to check objects for own properties. */
17704   var hasOwnProperty$2 = objectProto$3.hasOwnProperty;
17705
17706   /**
17707    * Gets the hash value for `key`.
17708    *
17709    * @private
17710    * @name get
17711    * @memberOf Hash
17712    * @param {string} key The key of the value to get.
17713    * @returns {*} Returns the entry value.
17714    */
17715   function hashGet(key) {
17716     var data = this.__data__;
17717     if (nativeCreate) {
17718       var result = data[key];
17719       return result === HASH_UNDEFINED ? undefined : result;
17720     }
17721     return hasOwnProperty$2.call(data, key) ? data[key] : undefined;
17722   }
17723
17724   /** Used for built-in method references. */
17725   var objectProto$4 = Object.prototype;
17726
17727   /** Used to check objects for own properties. */
17728   var hasOwnProperty$3 = objectProto$4.hasOwnProperty;
17729
17730   /**
17731    * Checks if a hash value for `key` exists.
17732    *
17733    * @private
17734    * @name has
17735    * @memberOf Hash
17736    * @param {string} key The key of the entry to check.
17737    * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17738    */
17739   function hashHas(key) {
17740     var data = this.__data__;
17741     return nativeCreate ? (data[key] !== undefined) : hasOwnProperty$3.call(data, key);
17742   }
17743
17744   /** Used to stand-in for `undefined` hash values. */
17745   var HASH_UNDEFINED$1 = '__lodash_hash_undefined__';
17746
17747   /**
17748    * Sets the hash `key` to `value`.
17749    *
17750    * @private
17751    * @name set
17752    * @memberOf Hash
17753    * @param {string} key The key of the value to set.
17754    * @param {*} value The value to set.
17755    * @returns {Object} Returns the hash instance.
17756    */
17757   function hashSet(key, value) {
17758     var data = this.__data__;
17759     this.size += this.has(key) ? 0 : 1;
17760     data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED$1 : value;
17761     return this;
17762   }
17763
17764   /**
17765    * Creates a hash object.
17766    *
17767    * @private
17768    * @constructor
17769    * @param {Array} [entries] The key-value pairs to cache.
17770    */
17771   function Hash(entries) {
17772     var index = -1,
17773         length = entries == null ? 0 : entries.length;
17774
17775     this.clear();
17776     while (++index < length) {
17777       var entry = entries[index];
17778       this.set(entry[0], entry[1]);
17779     }
17780   }
17781
17782   // Add methods to `Hash`.
17783   Hash.prototype.clear = hashClear;
17784   Hash.prototype['delete'] = hashDelete;
17785   Hash.prototype.get = hashGet;
17786   Hash.prototype.has = hashHas;
17787   Hash.prototype.set = hashSet;
17788
17789   /**
17790    * Removes all key-value entries from the map.
17791    *
17792    * @private
17793    * @name clear
17794    * @memberOf MapCache
17795    */
17796   function mapCacheClear() {
17797     this.size = 0;
17798     this.__data__ = {
17799       'hash': new Hash,
17800       'map': new (Map$1 || ListCache),
17801       'string': new Hash
17802     };
17803   }
17804
17805   /**
17806    * Checks if `value` is suitable for use as unique object key.
17807    *
17808    * @private
17809    * @param {*} value The value to check.
17810    * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
17811    */
17812   function isKeyable(value) {
17813     var type = typeof value;
17814     return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
17815       ? (value !== '__proto__')
17816       : (value === null);
17817   }
17818
17819   /**
17820    * Gets the data for `map`.
17821    *
17822    * @private
17823    * @param {Object} map The map to query.
17824    * @param {string} key The reference key.
17825    * @returns {*} Returns the map data.
17826    */
17827   function getMapData(map, key) {
17828     var data = map.__data__;
17829     return isKeyable(key)
17830       ? data[typeof key == 'string' ? 'string' : 'hash']
17831       : data.map;
17832   }
17833
17834   /**
17835    * Removes `key` and its value from the map.
17836    *
17837    * @private
17838    * @name delete
17839    * @memberOf MapCache
17840    * @param {string} key The key of the value to remove.
17841    * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17842    */
17843   function mapCacheDelete(key) {
17844     var result = getMapData(this, key)['delete'](key);
17845     this.size -= result ? 1 : 0;
17846     return result;
17847   }
17848
17849   /**
17850    * Gets the map value for `key`.
17851    *
17852    * @private
17853    * @name get
17854    * @memberOf MapCache
17855    * @param {string} key The key of the value to get.
17856    * @returns {*} Returns the entry value.
17857    */
17858   function mapCacheGet(key) {
17859     return getMapData(this, key).get(key);
17860   }
17861
17862   /**
17863    * Checks if a map value for `key` exists.
17864    *
17865    * @private
17866    * @name has
17867    * @memberOf MapCache
17868    * @param {string} key The key of the entry to check.
17869    * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17870    */
17871   function mapCacheHas(key) {
17872     return getMapData(this, key).has(key);
17873   }
17874
17875   /**
17876    * Sets the map `key` to `value`.
17877    *
17878    * @private
17879    * @name set
17880    * @memberOf MapCache
17881    * @param {string} key The key of the value to set.
17882    * @param {*} value The value to set.
17883    * @returns {Object} Returns the map cache instance.
17884    */
17885   function mapCacheSet(key, value) {
17886     var data = getMapData(this, key),
17887         size = data.size;
17888
17889     data.set(key, value);
17890     this.size += data.size == size ? 0 : 1;
17891     return this;
17892   }
17893
17894   /**
17895    * Creates a map cache object to store key-value pairs.
17896    *
17897    * @private
17898    * @constructor
17899    * @param {Array} [entries] The key-value pairs to cache.
17900    */
17901   function MapCache(entries) {
17902     var index = -1,
17903         length = entries == null ? 0 : entries.length;
17904
17905     this.clear();
17906     while (++index < length) {
17907       var entry = entries[index];
17908       this.set(entry[0], entry[1]);
17909     }
17910   }
17911
17912   // Add methods to `MapCache`.
17913   MapCache.prototype.clear = mapCacheClear;
17914   MapCache.prototype['delete'] = mapCacheDelete;
17915   MapCache.prototype.get = mapCacheGet;
17916   MapCache.prototype.has = mapCacheHas;
17917   MapCache.prototype.set = mapCacheSet;
17918
17919   /** Used as the size to enable large array optimizations. */
17920   var LARGE_ARRAY_SIZE = 200;
17921
17922   /**
17923    * Sets the stack `key` to `value`.
17924    *
17925    * @private
17926    * @name set
17927    * @memberOf Stack
17928    * @param {string} key The key of the value to set.
17929    * @param {*} value The value to set.
17930    * @returns {Object} Returns the stack cache instance.
17931    */
17932   function stackSet(key, value) {
17933     var data = this.__data__;
17934     if (data instanceof ListCache) {
17935       var pairs = data.__data__;
17936       if (!Map$1 || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
17937         pairs.push([key, value]);
17938         this.size = ++data.size;
17939         return this;
17940       }
17941       data = this.__data__ = new MapCache(pairs);
17942     }
17943     data.set(key, value);
17944     this.size = data.size;
17945     return this;
17946   }
17947
17948   /**
17949    * Creates a stack cache object to store key-value pairs.
17950    *
17951    * @private
17952    * @constructor
17953    * @param {Array} [entries] The key-value pairs to cache.
17954    */
17955   function Stack(entries) {
17956     var data = this.__data__ = new ListCache(entries);
17957     this.size = data.size;
17958   }
17959
17960   // Add methods to `Stack`.
17961   Stack.prototype.clear = stackClear;
17962   Stack.prototype['delete'] = stackDelete;
17963   Stack.prototype.get = stackGet;
17964   Stack.prototype.has = stackHas;
17965   Stack.prototype.set = stackSet;
17966
17967   /**
17968    * A specialized version of `_.forEach` for arrays without support for
17969    * iteratee shorthands.
17970    *
17971    * @private
17972    * @param {Array} [array] The array to iterate over.
17973    * @param {Function} iteratee The function invoked per iteration.
17974    * @returns {Array} Returns `array`.
17975    */
17976   function arrayEach(array, iteratee) {
17977     var index = -1,
17978         length = array == null ? 0 : array.length;
17979
17980     while (++index < length) {
17981       if (iteratee(array[index], index, array) === false) {
17982         break;
17983       }
17984     }
17985     return array;
17986   }
17987
17988   var defineProperty = (function() {
17989     try {
17990       var func = getNative(Object, 'defineProperty');
17991       func({}, '', {});
17992       return func;
17993     } catch (e) {}
17994   }());
17995
17996   /**
17997    * The base implementation of `assignValue` and `assignMergeValue` without
17998    * value checks.
17999    *
18000    * @private
18001    * @param {Object} object The object to modify.
18002    * @param {string} key The key of the property to assign.
18003    * @param {*} value The value to assign.
18004    */
18005   function baseAssignValue(object, key, value) {
18006     if (key == '__proto__' && defineProperty) {
18007       defineProperty(object, key, {
18008         'configurable': true,
18009         'enumerable': true,
18010         'value': value,
18011         'writable': true
18012       });
18013     } else {
18014       object[key] = value;
18015     }
18016   }
18017
18018   /** Used for built-in method references. */
18019   var objectProto$5 = Object.prototype;
18020
18021   /** Used to check objects for own properties. */
18022   var hasOwnProperty$4 = objectProto$5.hasOwnProperty;
18023
18024   /**
18025    * Assigns `value` to `key` of `object` if the existing value is not equivalent
18026    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
18027    * for equality comparisons.
18028    *
18029    * @private
18030    * @param {Object} object The object to modify.
18031    * @param {string} key The key of the property to assign.
18032    * @param {*} value The value to assign.
18033    */
18034   function assignValue(object, key, value) {
18035     var objValue = object[key];
18036     if (!(hasOwnProperty$4.call(object, key) && eq(objValue, value)) ||
18037         (value === undefined && !(key in object))) {
18038       baseAssignValue(object, key, value);
18039     }
18040   }
18041
18042   /**
18043    * Copies properties of `source` to `object`.
18044    *
18045    * @private
18046    * @param {Object} source The object to copy properties from.
18047    * @param {Array} props The property identifiers to copy.
18048    * @param {Object} [object={}] The object to copy properties to.
18049    * @param {Function} [customizer] The function to customize copied values.
18050    * @returns {Object} Returns `object`.
18051    */
18052   function copyObject(source, props, object, customizer) {
18053     var isNew = !object;
18054     object || (object = {});
18055
18056     var index = -1,
18057         length = props.length;
18058
18059     while (++index < length) {
18060       var key = props[index];
18061
18062       var newValue = customizer
18063         ? customizer(object[key], source[key], key, object, source)
18064         : undefined;
18065
18066       if (newValue === undefined) {
18067         newValue = source[key];
18068       }
18069       if (isNew) {
18070         baseAssignValue(object, key, newValue);
18071       } else {
18072         assignValue(object, key, newValue);
18073       }
18074     }
18075     return object;
18076   }
18077
18078   /**
18079    * The base implementation of `_.times` without support for iteratee shorthands
18080    * or max array length checks.
18081    *
18082    * @private
18083    * @param {number} n The number of times to invoke `iteratee`.
18084    * @param {Function} iteratee The function invoked per iteration.
18085    * @returns {Array} Returns the array of results.
18086    */
18087   function baseTimes(n, iteratee) {
18088     var index = -1,
18089         result = Array(n);
18090
18091     while (++index < n) {
18092       result[index] = iteratee(index);
18093     }
18094     return result;
18095   }
18096
18097   /**
18098    * Checks if `value` is object-like. A value is object-like if it's not `null`
18099    * and has a `typeof` result of "object".
18100    *
18101    * @static
18102    * @memberOf _
18103    * @since 4.0.0
18104    * @category Lang
18105    * @param {*} value The value to check.
18106    * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
18107    * @example
18108    *
18109    * _.isObjectLike({});
18110    * // => true
18111    *
18112    * _.isObjectLike([1, 2, 3]);
18113    * // => true
18114    *
18115    * _.isObjectLike(_.noop);
18116    * // => false
18117    *
18118    * _.isObjectLike(null);
18119    * // => false
18120    */
18121   function isObjectLike(value) {
18122     return value != null && typeof value == 'object';
18123   }
18124
18125   /** `Object#toString` result references. */
18126   var argsTag = '[object Arguments]';
18127
18128   /**
18129    * The base implementation of `_.isArguments`.
18130    *
18131    * @private
18132    * @param {*} value The value to check.
18133    * @returns {boolean} Returns `true` if `value` is an `arguments` object,
18134    */
18135   function baseIsArguments(value) {
18136     return isObjectLike(value) && baseGetTag(value) == argsTag;
18137   }
18138
18139   /** Used for built-in method references. */
18140   var objectProto$6 = Object.prototype;
18141
18142   /** Used to check objects for own properties. */
18143   var hasOwnProperty$5 = objectProto$6.hasOwnProperty;
18144
18145   /** Built-in value references. */
18146   var propertyIsEnumerable = objectProto$6.propertyIsEnumerable;
18147
18148   /**
18149    * Checks if `value` is likely an `arguments` object.
18150    *
18151    * @static
18152    * @memberOf _
18153    * @since 0.1.0
18154    * @category Lang
18155    * @param {*} value The value to check.
18156    * @returns {boolean} Returns `true` if `value` is an `arguments` object,
18157    *  else `false`.
18158    * @example
18159    *
18160    * _.isArguments(function() { return arguments; }());
18161    * // => true
18162    *
18163    * _.isArguments([1, 2, 3]);
18164    * // => false
18165    */
18166   var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
18167     return isObjectLike(value) && hasOwnProperty$5.call(value, 'callee') &&
18168       !propertyIsEnumerable.call(value, 'callee');
18169   };
18170
18171   /**
18172    * Checks if `value` is classified as an `Array` object.
18173    *
18174    * @static
18175    * @memberOf _
18176    * @since 0.1.0
18177    * @category Lang
18178    * @param {*} value The value to check.
18179    * @returns {boolean} Returns `true` if `value` is an array, else `false`.
18180    * @example
18181    *
18182    * _.isArray([1, 2, 3]);
18183    * // => true
18184    *
18185    * _.isArray(document.body.children);
18186    * // => false
18187    *
18188    * _.isArray('abc');
18189    * // => false
18190    *
18191    * _.isArray(_.noop);
18192    * // => false
18193    */
18194   var isArray = Array.isArray;
18195
18196   /**
18197    * This method returns `false`.
18198    *
18199    * @static
18200    * @memberOf _
18201    * @since 4.13.0
18202    * @category Util
18203    * @returns {boolean} Returns `false`.
18204    * @example
18205    *
18206    * _.times(2, _.stubFalse);
18207    * // => [false, false]
18208    */
18209   function stubFalse() {
18210     return false;
18211   }
18212
18213   /** Detect free variable `exports`. */
18214   var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
18215
18216   /** Detect free variable `module`. */
18217   var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
18218
18219   /** Detect the popular CommonJS extension `module.exports`. */
18220   var moduleExports = freeModule && freeModule.exports === freeExports;
18221
18222   /** Built-in value references. */
18223   var Buffer = moduleExports ? root$2.Buffer : undefined;
18224
18225   /* Built-in method references for those with the same name as other `lodash` methods. */
18226   var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;
18227
18228   /**
18229    * Checks if `value` is a buffer.
18230    *
18231    * @static
18232    * @memberOf _
18233    * @since 4.3.0
18234    * @category Lang
18235    * @param {*} value The value to check.
18236    * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
18237    * @example
18238    *
18239    * _.isBuffer(new Buffer(2));
18240    * // => true
18241    *
18242    * _.isBuffer(new Uint8Array(2));
18243    * // => false
18244    */
18245   var isBuffer = nativeIsBuffer || stubFalse;
18246
18247   /** Used as references for various `Number` constants. */
18248   var MAX_SAFE_INTEGER = 9007199254740991;
18249
18250   /** Used to detect unsigned integer values. */
18251   var reIsUint = /^(?:0|[1-9]\d*)$/;
18252
18253   /**
18254    * Checks if `value` is a valid array-like index.
18255    *
18256    * @private
18257    * @param {*} value The value to check.
18258    * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
18259    * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
18260    */
18261   function isIndex(value, length) {
18262     var type = typeof value;
18263     length = length == null ? MAX_SAFE_INTEGER : length;
18264
18265     return !!length &&
18266       (type == 'number' ||
18267         (type != 'symbol' && reIsUint.test(value))) &&
18268           (value > -1 && value % 1 == 0 && value < length);
18269   }
18270
18271   /** Used as references for various `Number` constants. */
18272   var MAX_SAFE_INTEGER$1 = 9007199254740991;
18273
18274   /**
18275    * Checks if `value` is a valid array-like length.
18276    *
18277    * **Note:** This method is loosely based on
18278    * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
18279    *
18280    * @static
18281    * @memberOf _
18282    * @since 4.0.0
18283    * @category Lang
18284    * @param {*} value The value to check.
18285    * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
18286    * @example
18287    *
18288    * _.isLength(3);
18289    * // => true
18290    *
18291    * _.isLength(Number.MIN_VALUE);
18292    * // => false
18293    *
18294    * _.isLength(Infinity);
18295    * // => false
18296    *
18297    * _.isLength('3');
18298    * // => false
18299    */
18300   function isLength(value) {
18301     return typeof value == 'number' &&
18302       value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER$1;
18303   }
18304
18305   /** `Object#toString` result references. */
18306   var argsTag$1 = '[object Arguments]',
18307       arrayTag = '[object Array]',
18308       boolTag = '[object Boolean]',
18309       dateTag = '[object Date]',
18310       errorTag = '[object Error]',
18311       funcTag$1 = '[object Function]',
18312       mapTag = '[object Map]',
18313       numberTag = '[object Number]',
18314       objectTag = '[object Object]',
18315       regexpTag = '[object RegExp]',
18316       setTag = '[object Set]',
18317       stringTag = '[object String]',
18318       weakMapTag = '[object WeakMap]';
18319
18320   var arrayBufferTag = '[object ArrayBuffer]',
18321       dataViewTag = '[object DataView]',
18322       float32Tag = '[object Float32Array]',
18323       float64Tag = '[object Float64Array]',
18324       int8Tag = '[object Int8Array]',
18325       int16Tag = '[object Int16Array]',
18326       int32Tag = '[object Int32Array]',
18327       uint8Tag = '[object Uint8Array]',
18328       uint8ClampedTag = '[object Uint8ClampedArray]',
18329       uint16Tag = '[object Uint16Array]',
18330       uint32Tag = '[object Uint32Array]';
18331
18332   /** Used to identify `toStringTag` values of typed arrays. */
18333   var typedArrayTags = {};
18334   typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
18335   typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
18336   typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
18337   typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
18338   typedArrayTags[uint32Tag] = true;
18339   typedArrayTags[argsTag$1] = typedArrayTags[arrayTag] =
18340   typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
18341   typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
18342   typedArrayTags[errorTag] = typedArrayTags[funcTag$1] =
18343   typedArrayTags[mapTag] = typedArrayTags[numberTag] =
18344   typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
18345   typedArrayTags[setTag] = typedArrayTags[stringTag] =
18346   typedArrayTags[weakMapTag] = false;
18347
18348   /**
18349    * The base implementation of `_.isTypedArray` without Node.js optimizations.
18350    *
18351    * @private
18352    * @param {*} value The value to check.
18353    * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
18354    */
18355   function baseIsTypedArray(value) {
18356     return isObjectLike(value) &&
18357       isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
18358   }
18359
18360   /**
18361    * The base implementation of `_.unary` without support for storing metadata.
18362    *
18363    * @private
18364    * @param {Function} func The function to cap arguments for.
18365    * @returns {Function} Returns the new capped function.
18366    */
18367   function baseUnary(func) {
18368     return function(value) {
18369       return func(value);
18370     };
18371   }
18372
18373   /** Detect free variable `exports`. */
18374   var freeExports$1 = typeof exports == 'object' && exports && !exports.nodeType && exports;
18375
18376   /** Detect free variable `module`. */
18377   var freeModule$1 = freeExports$1 && typeof module == 'object' && module && !module.nodeType && module;
18378
18379   /** Detect the popular CommonJS extension `module.exports`. */
18380   var moduleExports$1 = freeModule$1 && freeModule$1.exports === freeExports$1;
18381
18382   /** Detect free variable `process` from Node.js. */
18383   var freeProcess = moduleExports$1 && freeGlobal.process;
18384
18385   /** Used to access faster Node.js helpers. */
18386   var nodeUtil = (function() {
18387     try {
18388       // Use `util.types` for Node.js 10+.
18389       var types = freeModule$1 && freeModule$1.require && freeModule$1.require('util').types;
18390
18391       if (types) {
18392         return types;
18393       }
18394
18395       // Legacy `process.binding('util')` for Node.js < 10.
18396       return freeProcess && freeProcess.binding && freeProcess.binding('util');
18397     } catch (e) {}
18398   }());
18399
18400   /* Node.js helper references. */
18401   var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
18402
18403   /**
18404    * Checks if `value` is classified as a typed array.
18405    *
18406    * @static
18407    * @memberOf _
18408    * @since 3.0.0
18409    * @category Lang
18410    * @param {*} value The value to check.
18411    * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
18412    * @example
18413    *
18414    * _.isTypedArray(new Uint8Array);
18415    * // => true
18416    *
18417    * _.isTypedArray([]);
18418    * // => false
18419    */
18420   var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
18421
18422   /** Used for built-in method references. */
18423   var objectProto$7 = Object.prototype;
18424
18425   /** Used to check objects for own properties. */
18426   var hasOwnProperty$6 = objectProto$7.hasOwnProperty;
18427
18428   /**
18429    * Creates an array of the enumerable property names of the array-like `value`.
18430    *
18431    * @private
18432    * @param {*} value The value to query.
18433    * @param {boolean} inherited Specify returning inherited property names.
18434    * @returns {Array} Returns the array of property names.
18435    */
18436   function arrayLikeKeys(value, inherited) {
18437     var isArr = isArray(value),
18438         isArg = !isArr && isArguments(value),
18439         isBuff = !isArr && !isArg && isBuffer(value),
18440         isType = !isArr && !isArg && !isBuff && isTypedArray(value),
18441         skipIndexes = isArr || isArg || isBuff || isType,
18442         result = skipIndexes ? baseTimes(value.length, String) : [],
18443         length = result.length;
18444
18445     for (var key in value) {
18446       if ((inherited || hasOwnProperty$6.call(value, key)) &&
18447           !(skipIndexes && (
18448              // Safari 9 has enumerable `arguments.length` in strict mode.
18449              key == 'length' ||
18450              // Node.js 0.10 has enumerable non-index properties on buffers.
18451              (isBuff && (key == 'offset' || key == 'parent')) ||
18452              // PhantomJS 2 has enumerable non-index properties on typed arrays.
18453              (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
18454              // Skip index properties.
18455              isIndex(key, length)
18456           ))) {
18457         result.push(key);
18458       }
18459     }
18460     return result;
18461   }
18462
18463   /** Used for built-in method references. */
18464   var objectProto$8 = Object.prototype;
18465
18466   /**
18467    * Checks if `value` is likely a prototype object.
18468    *
18469    * @private
18470    * @param {*} value The value to check.
18471    * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
18472    */
18473   function isPrototype(value) {
18474     var Ctor = value && value.constructor,
18475         proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$8;
18476
18477     return value === proto;
18478   }
18479
18480   /**
18481    * Creates a unary function that invokes `func` with its argument transformed.
18482    *
18483    * @private
18484    * @param {Function} func The function to wrap.
18485    * @param {Function} transform The argument transform.
18486    * @returns {Function} Returns the new function.
18487    */
18488   function overArg(func, transform) {
18489     return function(arg) {
18490       return func(transform(arg));
18491     };
18492   }
18493
18494   /* Built-in method references for those with the same name as other `lodash` methods. */
18495   var nativeKeys = overArg(Object.keys, Object);
18496
18497   /** Used for built-in method references. */
18498   var objectProto$9 = Object.prototype;
18499
18500   /** Used to check objects for own properties. */
18501   var hasOwnProperty$7 = objectProto$9.hasOwnProperty;
18502
18503   /**
18504    * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
18505    *
18506    * @private
18507    * @param {Object} object The object to query.
18508    * @returns {Array} Returns the array of property names.
18509    */
18510   function baseKeys(object) {
18511     if (!isPrototype(object)) {
18512       return nativeKeys(object);
18513     }
18514     var result = [];
18515     for (var key in Object(object)) {
18516       if (hasOwnProperty$7.call(object, key) && key != 'constructor') {
18517         result.push(key);
18518       }
18519     }
18520     return result;
18521   }
18522
18523   /**
18524    * Checks if `value` is array-like. A value is considered array-like if it's
18525    * not a function and has a `value.length` that's an integer greater than or
18526    * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
18527    *
18528    * @static
18529    * @memberOf _
18530    * @since 4.0.0
18531    * @category Lang
18532    * @param {*} value The value to check.
18533    * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
18534    * @example
18535    *
18536    * _.isArrayLike([1, 2, 3]);
18537    * // => true
18538    *
18539    * _.isArrayLike(document.body.children);
18540    * // => true
18541    *
18542    * _.isArrayLike('abc');
18543    * // => true
18544    *
18545    * _.isArrayLike(_.noop);
18546    * // => false
18547    */
18548   function isArrayLike(value) {
18549     return value != null && isLength(value.length) && !isFunction(value);
18550   }
18551
18552   /**
18553    * Creates an array of the own enumerable property names of `object`.
18554    *
18555    * **Note:** Non-object values are coerced to objects. See the
18556    * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
18557    * for more details.
18558    *
18559    * @static
18560    * @since 0.1.0
18561    * @memberOf _
18562    * @category Object
18563    * @param {Object} object The object to query.
18564    * @returns {Array} Returns the array of property names.
18565    * @example
18566    *
18567    * function Foo() {
18568    *   this.a = 1;
18569    *   this.b = 2;
18570    * }
18571    *
18572    * Foo.prototype.c = 3;
18573    *
18574    * _.keys(new Foo);
18575    * // => ['a', 'b'] (iteration order is not guaranteed)
18576    *
18577    * _.keys('hi');
18578    * // => ['0', '1']
18579    */
18580   function keys$1(object) {
18581     return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
18582   }
18583
18584   /**
18585    * The base implementation of `_.assign` without support for multiple sources
18586    * or `customizer` functions.
18587    *
18588    * @private
18589    * @param {Object} object The destination object.
18590    * @param {Object} source The source object.
18591    * @returns {Object} Returns `object`.
18592    */
18593   function baseAssign(object, source) {
18594     return object && copyObject(source, keys$1(source), object);
18595   }
18596
18597   /**
18598    * This function is like
18599    * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
18600    * except that it includes inherited enumerable properties.
18601    *
18602    * @private
18603    * @param {Object} object The object to query.
18604    * @returns {Array} Returns the array of property names.
18605    */
18606   function nativeKeysIn(object) {
18607     var result = [];
18608     if (object != null) {
18609       for (var key in Object(object)) {
18610         result.push(key);
18611       }
18612     }
18613     return result;
18614   }
18615
18616   /** Used for built-in method references. */
18617   var objectProto$a = Object.prototype;
18618
18619   /** Used to check objects for own properties. */
18620   var hasOwnProperty$8 = objectProto$a.hasOwnProperty;
18621
18622   /**
18623    * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
18624    *
18625    * @private
18626    * @param {Object} object The object to query.
18627    * @returns {Array} Returns the array of property names.
18628    */
18629   function baseKeysIn(object) {
18630     if (!isObject(object)) {
18631       return nativeKeysIn(object);
18632     }
18633     var isProto = isPrototype(object),
18634         result = [];
18635
18636     for (var key in object) {
18637       if (!(key == 'constructor' && (isProto || !hasOwnProperty$8.call(object, key)))) {
18638         result.push(key);
18639       }
18640     }
18641     return result;
18642   }
18643
18644   /**
18645    * Creates an array of the own and inherited enumerable property names of `object`.
18646    *
18647    * **Note:** Non-object values are coerced to objects.
18648    *
18649    * @static
18650    * @memberOf _
18651    * @since 3.0.0
18652    * @category Object
18653    * @param {Object} object The object to query.
18654    * @returns {Array} Returns the array of property names.
18655    * @example
18656    *
18657    * function Foo() {
18658    *   this.a = 1;
18659    *   this.b = 2;
18660    * }
18661    *
18662    * Foo.prototype.c = 3;
18663    *
18664    * _.keysIn(new Foo);
18665    * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
18666    */
18667   function keysIn$1(object) {
18668     return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
18669   }
18670
18671   /**
18672    * The base implementation of `_.assignIn` without support for multiple sources
18673    * or `customizer` functions.
18674    *
18675    * @private
18676    * @param {Object} object The destination object.
18677    * @param {Object} source The source object.
18678    * @returns {Object} Returns `object`.
18679    */
18680   function baseAssignIn(object, source) {
18681     return object && copyObject(source, keysIn$1(source), object);
18682   }
18683
18684   /** Detect free variable `exports`. */
18685   var freeExports$2 = typeof exports == 'object' && exports && !exports.nodeType && exports;
18686
18687   /** Detect free variable `module`. */
18688   var freeModule$2 = freeExports$2 && typeof module == 'object' && module && !module.nodeType && module;
18689
18690   /** Detect the popular CommonJS extension `module.exports`. */
18691   var moduleExports$2 = freeModule$2 && freeModule$2.exports === freeExports$2;
18692
18693   /** Built-in value references. */
18694   var Buffer$1 = moduleExports$2 ? root$2.Buffer : undefined,
18695       allocUnsafe = Buffer$1 ? Buffer$1.allocUnsafe : undefined;
18696
18697   /**
18698    * Creates a clone of  `buffer`.
18699    *
18700    * @private
18701    * @param {Buffer} buffer The buffer to clone.
18702    * @param {boolean} [isDeep] Specify a deep clone.
18703    * @returns {Buffer} Returns the cloned buffer.
18704    */
18705   function cloneBuffer(buffer, isDeep) {
18706     if (isDeep) {
18707       return buffer.slice();
18708     }
18709     var length = buffer.length,
18710         result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
18711
18712     buffer.copy(result);
18713     return result;
18714   }
18715
18716   /**
18717    * Copies the values of `source` to `array`.
18718    *
18719    * @private
18720    * @param {Array} source The array to copy values from.
18721    * @param {Array} [array=[]] The array to copy values to.
18722    * @returns {Array} Returns `array`.
18723    */
18724   function copyArray(source, array) {
18725     var index = -1,
18726         length = source.length;
18727
18728     array || (array = Array(length));
18729     while (++index < length) {
18730       array[index] = source[index];
18731     }
18732     return array;
18733   }
18734
18735   /**
18736    * A specialized version of `_.filter` for arrays without support for
18737    * iteratee shorthands.
18738    *
18739    * @private
18740    * @param {Array} [array] The array to iterate over.
18741    * @param {Function} predicate The function invoked per iteration.
18742    * @returns {Array} Returns the new filtered array.
18743    */
18744   function arrayFilter(array, predicate) {
18745     var index = -1,
18746         length = array == null ? 0 : array.length,
18747         resIndex = 0,
18748         result = [];
18749
18750     while (++index < length) {
18751       var value = array[index];
18752       if (predicate(value, index, array)) {
18753         result[resIndex++] = value;
18754       }
18755     }
18756     return result;
18757   }
18758
18759   /**
18760    * This method returns a new empty array.
18761    *
18762    * @static
18763    * @memberOf _
18764    * @since 4.13.0
18765    * @category Util
18766    * @returns {Array} Returns the new empty array.
18767    * @example
18768    *
18769    * var arrays = _.times(2, _.stubArray);
18770    *
18771    * console.log(arrays);
18772    * // => [[], []]
18773    *
18774    * console.log(arrays[0] === arrays[1]);
18775    * // => false
18776    */
18777   function stubArray() {
18778     return [];
18779   }
18780
18781   /** Used for built-in method references. */
18782   var objectProto$b = Object.prototype;
18783
18784   /** Built-in value references. */
18785   var propertyIsEnumerable$1 = objectProto$b.propertyIsEnumerable;
18786
18787   /* Built-in method references for those with the same name as other `lodash` methods. */
18788   var nativeGetSymbols = Object.getOwnPropertySymbols;
18789
18790   /**
18791    * Creates an array of the own enumerable symbols of `object`.
18792    *
18793    * @private
18794    * @param {Object} object The object to query.
18795    * @returns {Array} Returns the array of symbols.
18796    */
18797   var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
18798     if (object == null) {
18799       return [];
18800     }
18801     object = Object(object);
18802     return arrayFilter(nativeGetSymbols(object), function(symbol) {
18803       return propertyIsEnumerable$1.call(object, symbol);
18804     });
18805   };
18806
18807   /**
18808    * Copies own symbols of `source` to `object`.
18809    *
18810    * @private
18811    * @param {Object} source The object to copy symbols from.
18812    * @param {Object} [object={}] The object to copy symbols to.
18813    * @returns {Object} Returns `object`.
18814    */
18815   function copySymbols(source, object) {
18816     return copyObject(source, getSymbols(source), object);
18817   }
18818
18819   /**
18820    * Appends the elements of `values` to `array`.
18821    *
18822    * @private
18823    * @param {Array} array The array to modify.
18824    * @param {Array} values The values to append.
18825    * @returns {Array} Returns `array`.
18826    */
18827   function arrayPush(array, values) {
18828     var index = -1,
18829         length = values.length,
18830         offset = array.length;
18831
18832     while (++index < length) {
18833       array[offset + index] = values[index];
18834     }
18835     return array;
18836   }
18837
18838   /** Built-in value references. */
18839   var getPrototype = overArg(Object.getPrototypeOf, Object);
18840
18841   /* Built-in method references for those with the same name as other `lodash` methods. */
18842   var nativeGetSymbols$1 = Object.getOwnPropertySymbols;
18843
18844   /**
18845    * Creates an array of the own and inherited enumerable symbols of `object`.
18846    *
18847    * @private
18848    * @param {Object} object The object to query.
18849    * @returns {Array} Returns the array of symbols.
18850    */
18851   var getSymbolsIn = !nativeGetSymbols$1 ? stubArray : function(object) {
18852     var result = [];
18853     while (object) {
18854       arrayPush(result, getSymbols(object));
18855       object = getPrototype(object);
18856     }
18857     return result;
18858   };
18859
18860   /**
18861    * Copies own and inherited symbols of `source` to `object`.
18862    *
18863    * @private
18864    * @param {Object} source The object to copy symbols from.
18865    * @param {Object} [object={}] The object to copy symbols to.
18866    * @returns {Object} Returns `object`.
18867    */
18868   function copySymbolsIn(source, object) {
18869     return copyObject(source, getSymbolsIn(source), object);
18870   }
18871
18872   /**
18873    * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
18874    * `keysFunc` and `symbolsFunc` to get the enumerable property names and
18875    * symbols of `object`.
18876    *
18877    * @private
18878    * @param {Object} object The object to query.
18879    * @param {Function} keysFunc The function to get the keys of `object`.
18880    * @param {Function} symbolsFunc The function to get the symbols of `object`.
18881    * @returns {Array} Returns the array of property names and symbols.
18882    */
18883   function baseGetAllKeys(object, keysFunc, symbolsFunc) {
18884     var result = keysFunc(object);
18885     return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
18886   }
18887
18888   /**
18889    * Creates an array of own enumerable property names and symbols of `object`.
18890    *
18891    * @private
18892    * @param {Object} object The object to query.
18893    * @returns {Array} Returns the array of property names and symbols.
18894    */
18895   function getAllKeys(object) {
18896     return baseGetAllKeys(object, keys$1, getSymbols);
18897   }
18898
18899   /**
18900    * Creates an array of own and inherited enumerable property names and
18901    * symbols of `object`.
18902    *
18903    * @private
18904    * @param {Object} object The object to query.
18905    * @returns {Array} Returns the array of property names and symbols.
18906    */
18907   function getAllKeysIn(object) {
18908     return baseGetAllKeys(object, keysIn$1, getSymbolsIn);
18909   }
18910
18911   /* Built-in method references that are verified to be native. */
18912   var DataView = getNative(root$2, 'DataView');
18913
18914   /* Built-in method references that are verified to be native. */
18915   var Promise = getNative(root$2, 'Promise');
18916
18917   /* Built-in method references that are verified to be native. */
18918   var Set$1 = getNative(root$2, 'Set');
18919
18920   /* Built-in method references that are verified to be native. */
18921   var WeakMap = getNative(root$2, 'WeakMap');
18922
18923   /** `Object#toString` result references. */
18924   var mapTag$1 = '[object Map]',
18925       objectTag$1 = '[object Object]',
18926       promiseTag = '[object Promise]',
18927       setTag$1 = '[object Set]',
18928       weakMapTag$1 = '[object WeakMap]';
18929
18930   var dataViewTag$1 = '[object DataView]';
18931
18932   /** Used to detect maps, sets, and weakmaps. */
18933   var dataViewCtorString = toSource(DataView),
18934       mapCtorString = toSource(Map$1),
18935       promiseCtorString = toSource(Promise),
18936       setCtorString = toSource(Set$1),
18937       weakMapCtorString = toSource(WeakMap);
18938
18939   /**
18940    * Gets the `toStringTag` of `value`.
18941    *
18942    * @private
18943    * @param {*} value The value to query.
18944    * @returns {string} Returns the `toStringTag`.
18945    */
18946   var getTag = baseGetTag;
18947
18948   // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
18949   if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag$1) ||
18950       (Map$1 && getTag(new Map$1) != mapTag$1) ||
18951       (Promise && getTag(Promise.resolve()) != promiseTag) ||
18952       (Set$1 && getTag(new Set$1) != setTag$1) ||
18953       (WeakMap && getTag(new WeakMap) != weakMapTag$1)) {
18954     getTag = function(value) {
18955       var result = baseGetTag(value),
18956           Ctor = result == objectTag$1 ? value.constructor : undefined,
18957           ctorString = Ctor ? toSource(Ctor) : '';
18958
18959       if (ctorString) {
18960         switch (ctorString) {
18961           case dataViewCtorString: return dataViewTag$1;
18962           case mapCtorString: return mapTag$1;
18963           case promiseCtorString: return promiseTag;
18964           case setCtorString: return setTag$1;
18965           case weakMapCtorString: return weakMapTag$1;
18966         }
18967       }
18968       return result;
18969     };
18970   }
18971
18972   var getTag$1 = getTag;
18973
18974   /** Used for built-in method references. */
18975   var objectProto$c = Object.prototype;
18976
18977   /** Used to check objects for own properties. */
18978   var hasOwnProperty$9 = objectProto$c.hasOwnProperty;
18979
18980   /**
18981    * Initializes an array clone.
18982    *
18983    * @private
18984    * @param {Array} array The array to clone.
18985    * @returns {Array} Returns the initialized clone.
18986    */
18987   function initCloneArray(array) {
18988     var length = array.length,
18989         result = new array.constructor(length);
18990
18991     // Add properties assigned by `RegExp#exec`.
18992     if (length && typeof array[0] == 'string' && hasOwnProperty$9.call(array, 'index')) {
18993       result.index = array.index;
18994       result.input = array.input;
18995     }
18996     return result;
18997   }
18998
18999   /** Built-in value references. */
19000   var Uint8Array$1 = root$2.Uint8Array;
19001
19002   /**
19003    * Creates a clone of `arrayBuffer`.
19004    *
19005    * @private
19006    * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
19007    * @returns {ArrayBuffer} Returns the cloned array buffer.
19008    */
19009   function cloneArrayBuffer(arrayBuffer) {
19010     var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
19011     new Uint8Array$1(result).set(new Uint8Array$1(arrayBuffer));
19012     return result;
19013   }
19014
19015   /**
19016    * Creates a clone of `dataView`.
19017    *
19018    * @private
19019    * @param {Object} dataView The data view to clone.
19020    * @param {boolean} [isDeep] Specify a deep clone.
19021    * @returns {Object} Returns the cloned data view.
19022    */
19023   function cloneDataView(dataView, isDeep) {
19024     var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
19025     return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
19026   }
19027
19028   /** Used to match `RegExp` flags from their coerced string values. */
19029   var reFlags = /\w*$/;
19030
19031   /**
19032    * Creates a clone of `regexp`.
19033    *
19034    * @private
19035    * @param {Object} regexp The regexp to clone.
19036    * @returns {Object} Returns the cloned regexp.
19037    */
19038   function cloneRegExp(regexp) {
19039     var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
19040     result.lastIndex = regexp.lastIndex;
19041     return result;
19042   }
19043
19044   /** Used to convert symbols to primitives and strings. */
19045   var symbolProto = Symbol ? Symbol.prototype : undefined,
19046       symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
19047
19048   /**
19049    * Creates a clone of the `symbol` object.
19050    *
19051    * @private
19052    * @param {Object} symbol The symbol object to clone.
19053    * @returns {Object} Returns the cloned symbol object.
19054    */
19055   function cloneSymbol(symbol) {
19056     return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
19057   }
19058
19059   /**
19060    * Creates a clone of `typedArray`.
19061    *
19062    * @private
19063    * @param {Object} typedArray The typed array to clone.
19064    * @param {boolean} [isDeep] Specify a deep clone.
19065    * @returns {Object} Returns the cloned typed array.
19066    */
19067   function cloneTypedArray(typedArray, isDeep) {
19068     var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
19069     return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
19070   }
19071
19072   /** `Object#toString` result references. */
19073   var boolTag$1 = '[object Boolean]',
19074       dateTag$1 = '[object Date]',
19075       mapTag$2 = '[object Map]',
19076       numberTag$1 = '[object Number]',
19077       regexpTag$1 = '[object RegExp]',
19078       setTag$2 = '[object Set]',
19079       stringTag$1 = '[object String]',
19080       symbolTag = '[object Symbol]';
19081
19082   var arrayBufferTag$1 = '[object ArrayBuffer]',
19083       dataViewTag$2 = '[object DataView]',
19084       float32Tag$1 = '[object Float32Array]',
19085       float64Tag$1 = '[object Float64Array]',
19086       int8Tag$1 = '[object Int8Array]',
19087       int16Tag$1 = '[object Int16Array]',
19088       int32Tag$1 = '[object Int32Array]',
19089       uint8Tag$1 = '[object Uint8Array]',
19090       uint8ClampedTag$1 = '[object Uint8ClampedArray]',
19091       uint16Tag$1 = '[object Uint16Array]',
19092       uint32Tag$1 = '[object Uint32Array]';
19093
19094   /**
19095    * Initializes an object clone based on its `toStringTag`.
19096    *
19097    * **Note:** This function only supports cloning values with tags of
19098    * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
19099    *
19100    * @private
19101    * @param {Object} object The object to clone.
19102    * @param {string} tag The `toStringTag` of the object to clone.
19103    * @param {boolean} [isDeep] Specify a deep clone.
19104    * @returns {Object} Returns the initialized clone.
19105    */
19106   function initCloneByTag(object, tag, isDeep) {
19107     var Ctor = object.constructor;
19108     switch (tag) {
19109       case arrayBufferTag$1:
19110         return cloneArrayBuffer(object);
19111
19112       case boolTag$1:
19113       case dateTag$1:
19114         return new Ctor(+object);
19115
19116       case dataViewTag$2:
19117         return cloneDataView(object, isDeep);
19118
19119       case float32Tag$1: case float64Tag$1:
19120       case int8Tag$1: case int16Tag$1: case int32Tag$1:
19121       case uint8Tag$1: case uint8ClampedTag$1: case uint16Tag$1: case uint32Tag$1:
19122         return cloneTypedArray(object, isDeep);
19123
19124       case mapTag$2:
19125         return new Ctor;
19126
19127       case numberTag$1:
19128       case stringTag$1:
19129         return new Ctor(object);
19130
19131       case regexpTag$1:
19132         return cloneRegExp(object);
19133
19134       case setTag$2:
19135         return new Ctor;
19136
19137       case symbolTag:
19138         return cloneSymbol(object);
19139     }
19140   }
19141
19142   /** Built-in value references. */
19143   var objectCreate = Object.create;
19144
19145   /**
19146    * The base implementation of `_.create` without support for assigning
19147    * properties to the created object.
19148    *
19149    * @private
19150    * @param {Object} proto The object to inherit from.
19151    * @returns {Object} Returns the new object.
19152    */
19153   var baseCreate = (function() {
19154     function object() {}
19155     return function(proto) {
19156       if (!isObject(proto)) {
19157         return {};
19158       }
19159       if (objectCreate) {
19160         return objectCreate(proto);
19161       }
19162       object.prototype = proto;
19163       var result = new object;
19164       object.prototype = undefined;
19165       return result;
19166     };
19167   }());
19168
19169   /**
19170    * Initializes an object clone.
19171    *
19172    * @private
19173    * @param {Object} object The object to clone.
19174    * @returns {Object} Returns the initialized clone.
19175    */
19176   function initCloneObject(object) {
19177     return (typeof object.constructor == 'function' && !isPrototype(object))
19178       ? baseCreate(getPrototype(object))
19179       : {};
19180   }
19181
19182   /** `Object#toString` result references. */
19183   var mapTag$3 = '[object Map]';
19184
19185   /**
19186    * The base implementation of `_.isMap` without Node.js optimizations.
19187    *
19188    * @private
19189    * @param {*} value The value to check.
19190    * @returns {boolean} Returns `true` if `value` is a map, else `false`.
19191    */
19192   function baseIsMap(value) {
19193     return isObjectLike(value) && getTag$1(value) == mapTag$3;
19194   }
19195
19196   /* Node.js helper references. */
19197   var nodeIsMap = nodeUtil && nodeUtil.isMap;
19198
19199   /**
19200    * Checks if `value` is classified as a `Map` object.
19201    *
19202    * @static
19203    * @memberOf _
19204    * @since 4.3.0
19205    * @category Lang
19206    * @param {*} value The value to check.
19207    * @returns {boolean} Returns `true` if `value` is a map, else `false`.
19208    * @example
19209    *
19210    * _.isMap(new Map);
19211    * // => true
19212    *
19213    * _.isMap(new WeakMap);
19214    * // => false
19215    */
19216   var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
19217
19218   /** `Object#toString` result references. */
19219   var setTag$3 = '[object Set]';
19220
19221   /**
19222    * The base implementation of `_.isSet` without Node.js optimizations.
19223    *
19224    * @private
19225    * @param {*} value The value to check.
19226    * @returns {boolean} Returns `true` if `value` is a set, else `false`.
19227    */
19228   function baseIsSet(value) {
19229     return isObjectLike(value) && getTag$1(value) == setTag$3;
19230   }
19231
19232   /* Node.js helper references. */
19233   var nodeIsSet = nodeUtil && nodeUtil.isSet;
19234
19235   /**
19236    * Checks if `value` is classified as a `Set` object.
19237    *
19238    * @static
19239    * @memberOf _
19240    * @since 4.3.0
19241    * @category Lang
19242    * @param {*} value The value to check.
19243    * @returns {boolean} Returns `true` if `value` is a set, else `false`.
19244    * @example
19245    *
19246    * _.isSet(new Set);
19247    * // => true
19248    *
19249    * _.isSet(new WeakSet);
19250    * // => false
19251    */
19252   var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
19253
19254   /** Used to compose bitmasks for cloning. */
19255   var CLONE_DEEP_FLAG = 1,
19256       CLONE_FLAT_FLAG = 2,
19257       CLONE_SYMBOLS_FLAG = 4;
19258
19259   /** `Object#toString` result references. */
19260   var argsTag$2 = '[object Arguments]',
19261       arrayTag$1 = '[object Array]',
19262       boolTag$2 = '[object Boolean]',
19263       dateTag$2 = '[object Date]',
19264       errorTag$1 = '[object Error]',
19265       funcTag$2 = '[object Function]',
19266       genTag$1 = '[object GeneratorFunction]',
19267       mapTag$4 = '[object Map]',
19268       numberTag$2 = '[object Number]',
19269       objectTag$2 = '[object Object]',
19270       regexpTag$2 = '[object RegExp]',
19271       setTag$4 = '[object Set]',
19272       stringTag$2 = '[object String]',
19273       symbolTag$1 = '[object Symbol]',
19274       weakMapTag$2 = '[object WeakMap]';
19275
19276   var arrayBufferTag$2 = '[object ArrayBuffer]',
19277       dataViewTag$3 = '[object DataView]',
19278       float32Tag$2 = '[object Float32Array]',
19279       float64Tag$2 = '[object Float64Array]',
19280       int8Tag$2 = '[object Int8Array]',
19281       int16Tag$2 = '[object Int16Array]',
19282       int32Tag$2 = '[object Int32Array]',
19283       uint8Tag$2 = '[object Uint8Array]',
19284       uint8ClampedTag$2 = '[object Uint8ClampedArray]',
19285       uint16Tag$2 = '[object Uint16Array]',
19286       uint32Tag$2 = '[object Uint32Array]';
19287
19288   /** Used to identify `toStringTag` values supported by `_.clone`. */
19289   var cloneableTags = {};
19290   cloneableTags[argsTag$2] = cloneableTags[arrayTag$1] =
19291   cloneableTags[arrayBufferTag$2] = cloneableTags[dataViewTag$3] =
19292   cloneableTags[boolTag$2] = cloneableTags[dateTag$2] =
19293   cloneableTags[float32Tag$2] = cloneableTags[float64Tag$2] =
19294   cloneableTags[int8Tag$2] = cloneableTags[int16Tag$2] =
19295   cloneableTags[int32Tag$2] = cloneableTags[mapTag$4] =
19296   cloneableTags[numberTag$2] = cloneableTags[objectTag$2] =
19297   cloneableTags[regexpTag$2] = cloneableTags[setTag$4] =
19298   cloneableTags[stringTag$2] = cloneableTags[symbolTag$1] =
19299   cloneableTags[uint8Tag$2] = cloneableTags[uint8ClampedTag$2] =
19300   cloneableTags[uint16Tag$2] = cloneableTags[uint32Tag$2] = true;
19301   cloneableTags[errorTag$1] = cloneableTags[funcTag$2] =
19302   cloneableTags[weakMapTag$2] = false;
19303
19304   /**
19305    * The base implementation of `_.clone` and `_.cloneDeep` which tracks
19306    * traversed objects.
19307    *
19308    * @private
19309    * @param {*} value The value to clone.
19310    * @param {boolean} bitmask The bitmask flags.
19311    *  1 - Deep clone
19312    *  2 - Flatten inherited properties
19313    *  4 - Clone symbols
19314    * @param {Function} [customizer] The function to customize cloning.
19315    * @param {string} [key] The key of `value`.
19316    * @param {Object} [object] The parent object of `value`.
19317    * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
19318    * @returns {*} Returns the cloned value.
19319    */
19320   function baseClone(value, bitmask, customizer, key, object, stack) {
19321     var result,
19322         isDeep = bitmask & CLONE_DEEP_FLAG,
19323         isFlat = bitmask & CLONE_FLAT_FLAG,
19324         isFull = bitmask & CLONE_SYMBOLS_FLAG;
19325
19326     if (customizer) {
19327       result = object ? customizer(value, key, object, stack) : customizer(value);
19328     }
19329     if (result !== undefined) {
19330       return result;
19331     }
19332     if (!isObject(value)) {
19333       return value;
19334     }
19335     var isArr = isArray(value);
19336     if (isArr) {
19337       result = initCloneArray(value);
19338       if (!isDeep) {
19339         return copyArray(value, result);
19340       }
19341     } else {
19342       var tag = getTag$1(value),
19343           isFunc = tag == funcTag$2 || tag == genTag$1;
19344
19345       if (isBuffer(value)) {
19346         return cloneBuffer(value, isDeep);
19347       }
19348       if (tag == objectTag$2 || tag == argsTag$2 || (isFunc && !object)) {
19349         result = (isFlat || isFunc) ? {} : initCloneObject(value);
19350         if (!isDeep) {
19351           return isFlat
19352             ? copySymbolsIn(value, baseAssignIn(result, value))
19353             : copySymbols(value, baseAssign(result, value));
19354         }
19355       } else {
19356         if (!cloneableTags[tag]) {
19357           return object ? value : {};
19358         }
19359         result = initCloneByTag(value, tag, isDeep);
19360       }
19361     }
19362     // Check for circular references and return its corresponding clone.
19363     stack || (stack = new Stack);
19364     var stacked = stack.get(value);
19365     if (stacked) {
19366       return stacked;
19367     }
19368     stack.set(value, result);
19369
19370     if (isSet(value)) {
19371       value.forEach(function(subValue) {
19372         result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
19373       });
19374
19375       return result;
19376     }
19377
19378     if (isMap(value)) {
19379       value.forEach(function(subValue, key) {
19380         result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
19381       });
19382
19383       return result;
19384     }
19385
19386     var keysFunc = isFull
19387       ? (isFlat ? getAllKeysIn : getAllKeys)
19388       : (isFlat ? keysIn : keys$1);
19389
19390     var props = isArr ? undefined : keysFunc(value);
19391     arrayEach(props || value, function(subValue, key) {
19392       if (props) {
19393         key = subValue;
19394         subValue = value[key];
19395       }
19396       // Recursively populate clone (susceptible to call stack limits).
19397       assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
19398     });
19399     return result;
19400   }
19401
19402   /** Used to compose bitmasks for cloning. */
19403   var CLONE_SYMBOLS_FLAG$1 = 4;
19404
19405   /**
19406    * Creates a shallow clone of `value`.
19407    *
19408    * **Note:** This method is loosely based on the
19409    * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
19410    * and supports cloning arrays, array buffers, booleans, date objects, maps,
19411    * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
19412    * arrays. The own enumerable properties of `arguments` objects are cloned
19413    * as plain objects. An empty object is returned for uncloneable values such
19414    * as error objects, functions, DOM nodes, and WeakMaps.
19415    *
19416    * @static
19417    * @memberOf _
19418    * @since 0.1.0
19419    * @category Lang
19420    * @param {*} value The value to clone.
19421    * @returns {*} Returns the cloned value.
19422    * @see _.cloneDeep
19423    * @example
19424    *
19425    * var objects = [{ 'a': 1 }, { 'b': 2 }];
19426    *
19427    * var shallow = _.clone(objects);
19428    * console.log(shallow[0] === objects[0]);
19429    * // => true
19430    */
19431   function clone(value) {
19432     return baseClone(value, CLONE_SYMBOLS_FLAG$1);
19433   }
19434
19435   /**
19436    * A specialized version of `baseAggregator` for arrays.
19437    *
19438    * @private
19439    * @param {Array} [array] The array to iterate over.
19440    * @param {Function} setter The function to set `accumulator` values.
19441    * @param {Function} iteratee The iteratee to transform keys.
19442    * @param {Object} accumulator The initial aggregated object.
19443    * @returns {Function} Returns `accumulator`.
19444    */
19445   function arrayAggregator(array, setter, iteratee, accumulator) {
19446     var index = -1,
19447         length = array == null ? 0 : array.length;
19448
19449     while (++index < length) {
19450       var value = array[index];
19451       setter(accumulator, value, iteratee(value), array);
19452     }
19453     return accumulator;
19454   }
19455
19456   /**
19457    * Creates a base function for methods like `_.forIn` and `_.forOwn`.
19458    *
19459    * @private
19460    * @param {boolean} [fromRight] Specify iterating from right to left.
19461    * @returns {Function} Returns the new base function.
19462    */
19463   function createBaseFor(fromRight) {
19464     return function(object, iteratee, keysFunc) {
19465       var index = -1,
19466           iterable = Object(object),
19467           props = keysFunc(object),
19468           length = props.length;
19469
19470       while (length--) {
19471         var key = props[fromRight ? length : ++index];
19472         if (iteratee(iterable[key], key, iterable) === false) {
19473           break;
19474         }
19475       }
19476       return object;
19477     };
19478   }
19479
19480   /**
19481    * The base implementation of `baseForOwn` which iterates over `object`
19482    * properties returned by `keysFunc` and invokes `iteratee` for each property.
19483    * Iteratee functions may exit iteration early by explicitly returning `false`.
19484    *
19485    * @private
19486    * @param {Object} object The object to iterate over.
19487    * @param {Function} iteratee The function invoked per iteration.
19488    * @param {Function} keysFunc The function to get the keys of `object`.
19489    * @returns {Object} Returns `object`.
19490    */
19491   var baseFor = createBaseFor();
19492
19493   /**
19494    * The base implementation of `_.forOwn` without support for iteratee shorthands.
19495    *
19496    * @private
19497    * @param {Object} object The object to iterate over.
19498    * @param {Function} iteratee The function invoked per iteration.
19499    * @returns {Object} Returns `object`.
19500    */
19501   function baseForOwn(object, iteratee) {
19502     return object && baseFor(object, iteratee, keys$1);
19503   }
19504
19505   /**
19506    * Creates a `baseEach` or `baseEachRight` function.
19507    *
19508    * @private
19509    * @param {Function} eachFunc The function to iterate over a collection.
19510    * @param {boolean} [fromRight] Specify iterating from right to left.
19511    * @returns {Function} Returns the new base function.
19512    */
19513   function createBaseEach(eachFunc, fromRight) {
19514     return function(collection, iteratee) {
19515       if (collection == null) {
19516         return collection;
19517       }
19518       if (!isArrayLike(collection)) {
19519         return eachFunc(collection, iteratee);
19520       }
19521       var length = collection.length,
19522           index = fromRight ? length : -1,
19523           iterable = Object(collection);
19524
19525       while ((fromRight ? index-- : ++index < length)) {
19526         if (iteratee(iterable[index], index, iterable) === false) {
19527           break;
19528         }
19529       }
19530       return collection;
19531     };
19532   }
19533
19534   /**
19535    * The base implementation of `_.forEach` without support for iteratee shorthands.
19536    *
19537    * @private
19538    * @param {Array|Object} collection The collection to iterate over.
19539    * @param {Function} iteratee The function invoked per iteration.
19540    * @returns {Array|Object} Returns `collection`.
19541    */
19542   var baseEach = createBaseEach(baseForOwn);
19543
19544   /**
19545    * Aggregates elements of `collection` on `accumulator` with keys transformed
19546    * by `iteratee` and values set by `setter`.
19547    *
19548    * @private
19549    * @param {Array|Object} collection The collection to iterate over.
19550    * @param {Function} setter The function to set `accumulator` values.
19551    * @param {Function} iteratee The iteratee to transform keys.
19552    * @param {Object} accumulator The initial aggregated object.
19553    * @returns {Function} Returns `accumulator`.
19554    */
19555   function baseAggregator(collection, setter, iteratee, accumulator) {
19556     baseEach(collection, function(value, key, collection) {
19557       setter(accumulator, value, iteratee(value), collection);
19558     });
19559     return accumulator;
19560   }
19561
19562   /** Used to stand-in for `undefined` hash values. */
19563   var HASH_UNDEFINED$2 = '__lodash_hash_undefined__';
19564
19565   /**
19566    * Adds `value` to the array cache.
19567    *
19568    * @private
19569    * @name add
19570    * @memberOf SetCache
19571    * @alias push
19572    * @param {*} value The value to cache.
19573    * @returns {Object} Returns the cache instance.
19574    */
19575   function setCacheAdd(value) {
19576     this.__data__.set(value, HASH_UNDEFINED$2);
19577     return this;
19578   }
19579
19580   /**
19581    * Checks if `value` is in the array cache.
19582    *
19583    * @private
19584    * @name has
19585    * @memberOf SetCache
19586    * @param {*} value The value to search for.
19587    * @returns {number} Returns `true` if `value` is found, else `false`.
19588    */
19589   function setCacheHas(value) {
19590     return this.__data__.has(value);
19591   }
19592
19593   /**
19594    *
19595    * Creates an array cache object to store unique values.
19596    *
19597    * @private
19598    * @constructor
19599    * @param {Array} [values] The values to cache.
19600    */
19601   function SetCache(values) {
19602     var index = -1,
19603         length = values == null ? 0 : values.length;
19604
19605     this.__data__ = new MapCache;
19606     while (++index < length) {
19607       this.add(values[index]);
19608     }
19609   }
19610
19611   // Add methods to `SetCache`.
19612   SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
19613   SetCache.prototype.has = setCacheHas;
19614
19615   /**
19616    * A specialized version of `_.some` for arrays without support for iteratee
19617    * shorthands.
19618    *
19619    * @private
19620    * @param {Array} [array] The array to iterate over.
19621    * @param {Function} predicate The function invoked per iteration.
19622    * @returns {boolean} Returns `true` if any element passes the predicate check,
19623    *  else `false`.
19624    */
19625   function arraySome(array, predicate) {
19626     var index = -1,
19627         length = array == null ? 0 : array.length;
19628
19629     while (++index < length) {
19630       if (predicate(array[index], index, array)) {
19631         return true;
19632       }
19633     }
19634     return false;
19635   }
19636
19637   /**
19638    * Checks if a `cache` value for `key` exists.
19639    *
19640    * @private
19641    * @param {Object} cache The cache to query.
19642    * @param {string} key The key of the entry to check.
19643    * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
19644    */
19645   function cacheHas(cache, key) {
19646     return cache.has(key);
19647   }
19648
19649   /** Used to compose bitmasks for value comparisons. */
19650   var COMPARE_PARTIAL_FLAG = 1,
19651       COMPARE_UNORDERED_FLAG = 2;
19652
19653   /**
19654    * A specialized version of `baseIsEqualDeep` for arrays with support for
19655    * partial deep comparisons.
19656    *
19657    * @private
19658    * @param {Array} array The array to compare.
19659    * @param {Array} other The other array to compare.
19660    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19661    * @param {Function} customizer The function to customize comparisons.
19662    * @param {Function} equalFunc The function to determine equivalents of values.
19663    * @param {Object} stack Tracks traversed `array` and `other` objects.
19664    * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
19665    */
19666   function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
19667     var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
19668         arrLength = array.length,
19669         othLength = other.length;
19670
19671     if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
19672       return false;
19673     }
19674     // Assume cyclic values are equal.
19675     var stacked = stack.get(array);
19676     if (stacked && stack.get(other)) {
19677       return stacked == other;
19678     }
19679     var index = -1,
19680         result = true,
19681         seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
19682
19683     stack.set(array, other);
19684     stack.set(other, array);
19685
19686     // Ignore non-index properties.
19687     while (++index < arrLength) {
19688       var arrValue = array[index],
19689           othValue = other[index];
19690
19691       if (customizer) {
19692         var compared = isPartial
19693           ? customizer(othValue, arrValue, index, other, array, stack)
19694           : customizer(arrValue, othValue, index, array, other, stack);
19695       }
19696       if (compared !== undefined) {
19697         if (compared) {
19698           continue;
19699         }
19700         result = false;
19701         break;
19702       }
19703       // Recursively compare arrays (susceptible to call stack limits).
19704       if (seen) {
19705         if (!arraySome(other, function(othValue, othIndex) {
19706               if (!cacheHas(seen, othIndex) &&
19707                   (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
19708                 return seen.push(othIndex);
19709               }
19710             })) {
19711           result = false;
19712           break;
19713         }
19714       } else if (!(
19715             arrValue === othValue ||
19716               equalFunc(arrValue, othValue, bitmask, customizer, stack)
19717           )) {
19718         result = false;
19719         break;
19720       }
19721     }
19722     stack['delete'](array);
19723     stack['delete'](other);
19724     return result;
19725   }
19726
19727   /**
19728    * Converts `map` to its key-value pairs.
19729    *
19730    * @private
19731    * @param {Object} map The map to convert.
19732    * @returns {Array} Returns the key-value pairs.
19733    */
19734   function mapToArray(map) {
19735     var index = -1,
19736         result = Array(map.size);
19737
19738     map.forEach(function(value, key) {
19739       result[++index] = [key, value];
19740     });
19741     return result;
19742   }
19743
19744   /**
19745    * Converts `set` to an array of its values.
19746    *
19747    * @private
19748    * @param {Object} set The set to convert.
19749    * @returns {Array} Returns the values.
19750    */
19751   function setToArray(set) {
19752     var index = -1,
19753         result = Array(set.size);
19754
19755     set.forEach(function(value) {
19756       result[++index] = value;
19757     });
19758     return result;
19759   }
19760
19761   /** Used to compose bitmasks for value comparisons. */
19762   var COMPARE_PARTIAL_FLAG$1 = 1,
19763       COMPARE_UNORDERED_FLAG$1 = 2;
19764
19765   /** `Object#toString` result references. */
19766   var boolTag$3 = '[object Boolean]',
19767       dateTag$3 = '[object Date]',
19768       errorTag$2 = '[object Error]',
19769       mapTag$5 = '[object Map]',
19770       numberTag$3 = '[object Number]',
19771       regexpTag$3 = '[object RegExp]',
19772       setTag$5 = '[object Set]',
19773       stringTag$3 = '[object String]',
19774       symbolTag$2 = '[object Symbol]';
19775
19776   var arrayBufferTag$3 = '[object ArrayBuffer]',
19777       dataViewTag$4 = '[object DataView]';
19778
19779   /** Used to convert symbols to primitives and strings. */
19780   var symbolProto$1 = Symbol ? Symbol.prototype : undefined,
19781       symbolValueOf$1 = symbolProto$1 ? symbolProto$1.valueOf : undefined;
19782
19783   /**
19784    * A specialized version of `baseIsEqualDeep` for comparing objects of
19785    * the same `toStringTag`.
19786    *
19787    * **Note:** This function only supports comparing values with tags of
19788    * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
19789    *
19790    * @private
19791    * @param {Object} object The object to compare.
19792    * @param {Object} other The other object to compare.
19793    * @param {string} tag The `toStringTag` of the objects to compare.
19794    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19795    * @param {Function} customizer The function to customize comparisons.
19796    * @param {Function} equalFunc The function to determine equivalents of values.
19797    * @param {Object} stack Tracks traversed `object` and `other` objects.
19798    * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19799    */
19800   function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
19801     switch (tag) {
19802       case dataViewTag$4:
19803         if ((object.byteLength != other.byteLength) ||
19804             (object.byteOffset != other.byteOffset)) {
19805           return false;
19806         }
19807         object = object.buffer;
19808         other = other.buffer;
19809
19810       case arrayBufferTag$3:
19811         if ((object.byteLength != other.byteLength) ||
19812             !equalFunc(new Uint8Array$1(object), new Uint8Array$1(other))) {
19813           return false;
19814         }
19815         return true;
19816
19817       case boolTag$3:
19818       case dateTag$3:
19819       case numberTag$3:
19820         // Coerce booleans to `1` or `0` and dates to milliseconds.
19821         // Invalid dates are coerced to `NaN`.
19822         return eq(+object, +other);
19823
19824       case errorTag$2:
19825         return object.name == other.name && object.message == other.message;
19826
19827       case regexpTag$3:
19828       case stringTag$3:
19829         // Coerce regexes to strings and treat strings, primitives and objects,
19830         // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
19831         // for more details.
19832         return object == (other + '');
19833
19834       case mapTag$5:
19835         var convert = mapToArray;
19836
19837       case setTag$5:
19838         var isPartial = bitmask & COMPARE_PARTIAL_FLAG$1;
19839         convert || (convert = setToArray);
19840
19841         if (object.size != other.size && !isPartial) {
19842           return false;
19843         }
19844         // Assume cyclic values are equal.
19845         var stacked = stack.get(object);
19846         if (stacked) {
19847           return stacked == other;
19848         }
19849         bitmask |= COMPARE_UNORDERED_FLAG$1;
19850
19851         // Recursively compare objects (susceptible to call stack limits).
19852         stack.set(object, other);
19853         var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
19854         stack['delete'](object);
19855         return result;
19856
19857       case symbolTag$2:
19858         if (symbolValueOf$1) {
19859           return symbolValueOf$1.call(object) == symbolValueOf$1.call(other);
19860         }
19861     }
19862     return false;
19863   }
19864
19865   /** Used to compose bitmasks for value comparisons. */
19866   var COMPARE_PARTIAL_FLAG$2 = 1;
19867
19868   /** Used for built-in method references. */
19869   var objectProto$d = Object.prototype;
19870
19871   /** Used to check objects for own properties. */
19872   var hasOwnProperty$a = objectProto$d.hasOwnProperty;
19873
19874   /**
19875    * A specialized version of `baseIsEqualDeep` for objects with support for
19876    * partial deep comparisons.
19877    *
19878    * @private
19879    * @param {Object} object The object to compare.
19880    * @param {Object} other The other object to compare.
19881    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19882    * @param {Function} customizer The function to customize comparisons.
19883    * @param {Function} equalFunc The function to determine equivalents of values.
19884    * @param {Object} stack Tracks traversed `object` and `other` objects.
19885    * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19886    */
19887   function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
19888     var isPartial = bitmask & COMPARE_PARTIAL_FLAG$2,
19889         objProps = getAllKeys(object),
19890         objLength = objProps.length,
19891         othProps = getAllKeys(other),
19892         othLength = othProps.length;
19893
19894     if (objLength != othLength && !isPartial) {
19895       return false;
19896     }
19897     var index = objLength;
19898     while (index--) {
19899       var key = objProps[index];
19900       if (!(isPartial ? key in other : hasOwnProperty$a.call(other, key))) {
19901         return false;
19902       }
19903     }
19904     // Assume cyclic values are equal.
19905     var stacked = stack.get(object);
19906     if (stacked && stack.get(other)) {
19907       return stacked == other;
19908     }
19909     var result = true;
19910     stack.set(object, other);
19911     stack.set(other, object);
19912
19913     var skipCtor = isPartial;
19914     while (++index < objLength) {
19915       key = objProps[index];
19916       var objValue = object[key],
19917           othValue = other[key];
19918
19919       if (customizer) {
19920         var compared = isPartial
19921           ? customizer(othValue, objValue, key, other, object, stack)
19922           : customizer(objValue, othValue, key, object, other, stack);
19923       }
19924       // Recursively compare objects (susceptible to call stack limits).
19925       if (!(compared === undefined
19926             ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
19927             : compared
19928           )) {
19929         result = false;
19930         break;
19931       }
19932       skipCtor || (skipCtor = key == 'constructor');
19933     }
19934     if (result && !skipCtor) {
19935       var objCtor = object.constructor,
19936           othCtor = other.constructor;
19937
19938       // Non `Object` object instances with different constructors are not equal.
19939       if (objCtor != othCtor &&
19940           ('constructor' in object && 'constructor' in other) &&
19941           !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
19942             typeof othCtor == 'function' && othCtor instanceof othCtor)) {
19943         result = false;
19944       }
19945     }
19946     stack['delete'](object);
19947     stack['delete'](other);
19948     return result;
19949   }
19950
19951   /** Used to compose bitmasks for value comparisons. */
19952   var COMPARE_PARTIAL_FLAG$3 = 1;
19953
19954   /** `Object#toString` result references. */
19955   var argsTag$3 = '[object Arguments]',
19956       arrayTag$2 = '[object Array]',
19957       objectTag$3 = '[object Object]';
19958
19959   /** Used for built-in method references. */
19960   var objectProto$e = Object.prototype;
19961
19962   /** Used to check objects for own properties. */
19963   var hasOwnProperty$b = objectProto$e.hasOwnProperty;
19964
19965   /**
19966    * A specialized version of `baseIsEqual` for arrays and objects which performs
19967    * deep comparisons and tracks traversed objects enabling objects with circular
19968    * references to be compared.
19969    *
19970    * @private
19971    * @param {Object} object The object to compare.
19972    * @param {Object} other The other object to compare.
19973    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19974    * @param {Function} customizer The function to customize comparisons.
19975    * @param {Function} equalFunc The function to determine equivalents of values.
19976    * @param {Object} [stack] Tracks traversed `object` and `other` objects.
19977    * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19978    */
19979   function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
19980     var objIsArr = isArray(object),
19981         othIsArr = isArray(other),
19982         objTag = objIsArr ? arrayTag$2 : getTag$1(object),
19983         othTag = othIsArr ? arrayTag$2 : getTag$1(other);
19984
19985     objTag = objTag == argsTag$3 ? objectTag$3 : objTag;
19986     othTag = othTag == argsTag$3 ? objectTag$3 : othTag;
19987
19988     var objIsObj = objTag == objectTag$3,
19989         othIsObj = othTag == objectTag$3,
19990         isSameTag = objTag == othTag;
19991
19992     if (isSameTag && isBuffer(object)) {
19993       if (!isBuffer(other)) {
19994         return false;
19995       }
19996       objIsArr = true;
19997       objIsObj = false;
19998     }
19999     if (isSameTag && !objIsObj) {
20000       stack || (stack = new Stack);
20001       return (objIsArr || isTypedArray(object))
20002         ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
20003         : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
20004     }
20005     if (!(bitmask & COMPARE_PARTIAL_FLAG$3)) {
20006       var objIsWrapped = objIsObj && hasOwnProperty$b.call(object, '__wrapped__'),
20007           othIsWrapped = othIsObj && hasOwnProperty$b.call(other, '__wrapped__');
20008
20009       if (objIsWrapped || othIsWrapped) {
20010         var objUnwrapped = objIsWrapped ? object.value() : object,
20011             othUnwrapped = othIsWrapped ? other.value() : other;
20012
20013         stack || (stack = new Stack);
20014         return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
20015       }
20016     }
20017     if (!isSameTag) {
20018       return false;
20019     }
20020     stack || (stack = new Stack);
20021     return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
20022   }
20023
20024   /**
20025    * The base implementation of `_.isEqual` which supports partial comparisons
20026    * and tracks traversed objects.
20027    *
20028    * @private
20029    * @param {*} value The value to compare.
20030    * @param {*} other The other value to compare.
20031    * @param {boolean} bitmask The bitmask flags.
20032    *  1 - Unordered comparison
20033    *  2 - Partial comparison
20034    * @param {Function} [customizer] The function to customize comparisons.
20035    * @param {Object} [stack] Tracks traversed `value` and `other` objects.
20036    * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
20037    */
20038   function baseIsEqual(value, other, bitmask, customizer, stack) {
20039     if (value === other) {
20040       return true;
20041     }
20042     if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
20043       return value !== value && other !== other;
20044     }
20045     return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
20046   }
20047
20048   /** Used to compose bitmasks for value comparisons. */
20049   var COMPARE_PARTIAL_FLAG$4 = 1,
20050       COMPARE_UNORDERED_FLAG$2 = 2;
20051
20052   /**
20053    * The base implementation of `_.isMatch` without support for iteratee shorthands.
20054    *
20055    * @private
20056    * @param {Object} object The object to inspect.
20057    * @param {Object} source The object of property values to match.
20058    * @param {Array} matchData The property names, values, and compare flags to match.
20059    * @param {Function} [customizer] The function to customize comparisons.
20060    * @returns {boolean} Returns `true` if `object` is a match, else `false`.
20061    */
20062   function baseIsMatch(object, source, matchData, customizer) {
20063     var index = matchData.length,
20064         length = index,
20065         noCustomizer = !customizer;
20066
20067     if (object == null) {
20068       return !length;
20069     }
20070     object = Object(object);
20071     while (index--) {
20072       var data = matchData[index];
20073       if ((noCustomizer && data[2])
20074             ? data[1] !== object[data[0]]
20075             : !(data[0] in object)
20076           ) {
20077         return false;
20078       }
20079     }
20080     while (++index < length) {
20081       data = matchData[index];
20082       var key = data[0],
20083           objValue = object[key],
20084           srcValue = data[1];
20085
20086       if (noCustomizer && data[2]) {
20087         if (objValue === undefined && !(key in object)) {
20088           return false;
20089         }
20090       } else {
20091         var stack = new Stack;
20092         if (customizer) {
20093           var result = customizer(objValue, srcValue, key, object, source, stack);
20094         }
20095         if (!(result === undefined
20096               ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$4 | COMPARE_UNORDERED_FLAG$2, customizer, stack)
20097               : result
20098             )) {
20099           return false;
20100         }
20101       }
20102     }
20103     return true;
20104   }
20105
20106   /**
20107    * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
20108    *
20109    * @private
20110    * @param {*} value The value to check.
20111    * @returns {boolean} Returns `true` if `value` if suitable for strict
20112    *  equality comparisons, else `false`.
20113    */
20114   function isStrictComparable(value) {
20115     return value === value && !isObject(value);
20116   }
20117
20118   /**
20119    * Gets the property names, values, and compare flags of `object`.
20120    *
20121    * @private
20122    * @param {Object} object The object to query.
20123    * @returns {Array} Returns the match data of `object`.
20124    */
20125   function getMatchData(object) {
20126     var result = keys$1(object),
20127         length = result.length;
20128
20129     while (length--) {
20130       var key = result[length],
20131           value = object[key];
20132
20133       result[length] = [key, value, isStrictComparable(value)];
20134     }
20135     return result;
20136   }
20137
20138   /**
20139    * A specialized version of `matchesProperty` for source values suitable
20140    * for strict equality comparisons, i.e. `===`.
20141    *
20142    * @private
20143    * @param {string} key The key of the property to get.
20144    * @param {*} srcValue The value to match.
20145    * @returns {Function} Returns the new spec function.
20146    */
20147   function matchesStrictComparable(key, srcValue) {
20148     return function(object) {
20149       if (object == null) {
20150         return false;
20151       }
20152       return object[key] === srcValue &&
20153         (srcValue !== undefined || (key in Object(object)));
20154     };
20155   }
20156
20157   /**
20158    * The base implementation of `_.matches` which doesn't clone `source`.
20159    *
20160    * @private
20161    * @param {Object} source The object of property values to match.
20162    * @returns {Function} Returns the new spec function.
20163    */
20164   function baseMatches(source) {
20165     var matchData = getMatchData(source);
20166     if (matchData.length == 1 && matchData[0][2]) {
20167       return matchesStrictComparable(matchData[0][0], matchData[0][1]);
20168     }
20169     return function(object) {
20170       return object === source || baseIsMatch(object, source, matchData);
20171     };
20172   }
20173
20174   /** `Object#toString` result references. */
20175   var symbolTag$3 = '[object Symbol]';
20176
20177   /**
20178    * Checks if `value` is classified as a `Symbol` primitive or object.
20179    *
20180    * @static
20181    * @memberOf _
20182    * @since 4.0.0
20183    * @category Lang
20184    * @param {*} value The value to check.
20185    * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
20186    * @example
20187    *
20188    * _.isSymbol(Symbol.iterator);
20189    * // => true
20190    *
20191    * _.isSymbol('abc');
20192    * // => false
20193    */
20194   function isSymbol(value) {
20195     return typeof value == 'symbol' ||
20196       (isObjectLike(value) && baseGetTag(value) == symbolTag$3);
20197   }
20198
20199   /** Used to match property names within property paths. */
20200   var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
20201       reIsPlainProp = /^\w*$/;
20202
20203   /**
20204    * Checks if `value` is a property name and not a property path.
20205    *
20206    * @private
20207    * @param {*} value The value to check.
20208    * @param {Object} [object] The object to query keys on.
20209    * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
20210    */
20211   function isKey(value, object) {
20212     if (isArray(value)) {
20213       return false;
20214     }
20215     var type = typeof value;
20216     if (type == 'number' || type == 'symbol' || type == 'boolean' ||
20217         value == null || isSymbol(value)) {
20218       return true;
20219     }
20220     return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
20221       (object != null && value in Object(object));
20222   }
20223
20224   /** Error message constants. */
20225   var FUNC_ERROR_TEXT = 'Expected a function';
20226
20227   /**
20228    * Creates a function that memoizes the result of `func`. If `resolver` is
20229    * provided, it determines the cache key for storing the result based on the
20230    * arguments provided to the memoized function. By default, the first argument
20231    * provided to the memoized function is used as the map cache key. The `func`
20232    * is invoked with the `this` binding of the memoized function.
20233    *
20234    * **Note:** The cache is exposed as the `cache` property on the memoized
20235    * function. Its creation may be customized by replacing the `_.memoize.Cache`
20236    * constructor with one whose instances implement the
20237    * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
20238    * method interface of `clear`, `delete`, `get`, `has`, and `set`.
20239    *
20240    * @static
20241    * @memberOf _
20242    * @since 0.1.0
20243    * @category Function
20244    * @param {Function} func The function to have its output memoized.
20245    * @param {Function} [resolver] The function to resolve the cache key.
20246    * @returns {Function} Returns the new memoized function.
20247    * @example
20248    *
20249    * var object = { 'a': 1, 'b': 2 };
20250    * var other = { 'c': 3, 'd': 4 };
20251    *
20252    * var values = _.memoize(_.values);
20253    * values(object);
20254    * // => [1, 2]
20255    *
20256    * values(other);
20257    * // => [3, 4]
20258    *
20259    * object.a = 2;
20260    * values(object);
20261    * // => [1, 2]
20262    *
20263    * // Modify the result cache.
20264    * values.cache.set(object, ['a', 'b']);
20265    * values(object);
20266    * // => ['a', 'b']
20267    *
20268    * // Replace `_.memoize.Cache`.
20269    * _.memoize.Cache = WeakMap;
20270    */
20271   function memoize(func, resolver) {
20272     if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
20273       throw new TypeError(FUNC_ERROR_TEXT);
20274     }
20275     var memoized = function() {
20276       var args = arguments,
20277           key = resolver ? resolver.apply(this, args) : args[0],
20278           cache = memoized.cache;
20279
20280       if (cache.has(key)) {
20281         return cache.get(key);
20282       }
20283       var result = func.apply(this, args);
20284       memoized.cache = cache.set(key, result) || cache;
20285       return result;
20286     };
20287     memoized.cache = new (memoize.Cache || MapCache);
20288     return memoized;
20289   }
20290
20291   // Expose `MapCache`.
20292   memoize.Cache = MapCache;
20293
20294   /** Used as the maximum memoize cache size. */
20295   var MAX_MEMOIZE_SIZE = 500;
20296
20297   /**
20298    * A specialized version of `_.memoize` which clears the memoized function's
20299    * cache when it exceeds `MAX_MEMOIZE_SIZE`.
20300    *
20301    * @private
20302    * @param {Function} func The function to have its output memoized.
20303    * @returns {Function} Returns the new memoized function.
20304    */
20305   function memoizeCapped(func) {
20306     var result = memoize(func, function(key) {
20307       if (cache.size === MAX_MEMOIZE_SIZE) {
20308         cache.clear();
20309       }
20310       return key;
20311     });
20312
20313     var cache = result.cache;
20314     return result;
20315   }
20316
20317   /** Used to match property names within property paths. */
20318   var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
20319
20320   /** Used to match backslashes in property paths. */
20321   var reEscapeChar = /\\(\\)?/g;
20322
20323   /**
20324    * Converts `string` to a property path array.
20325    *
20326    * @private
20327    * @param {string} string The string to convert.
20328    * @returns {Array} Returns the property path array.
20329    */
20330   var stringToPath = memoizeCapped(function(string) {
20331     var result = [];
20332     if (string.charCodeAt(0) === 46 /* . */) {
20333       result.push('');
20334     }
20335     string.replace(rePropName, function(match, number, quote, subString) {
20336       result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
20337     });
20338     return result;
20339   });
20340
20341   /**
20342    * A specialized version of `_.map` for arrays without support for iteratee
20343    * shorthands.
20344    *
20345    * @private
20346    * @param {Array} [array] The array to iterate over.
20347    * @param {Function} iteratee The function invoked per iteration.
20348    * @returns {Array} Returns the new mapped array.
20349    */
20350   function arrayMap(array, iteratee) {
20351     var index = -1,
20352         length = array == null ? 0 : array.length,
20353         result = Array(length);
20354
20355     while (++index < length) {
20356       result[index] = iteratee(array[index], index, array);
20357     }
20358     return result;
20359   }
20360
20361   /** Used as references for various `Number` constants. */
20362   var INFINITY = 1 / 0;
20363
20364   /** Used to convert symbols to primitives and strings. */
20365   var symbolProto$2 = Symbol ? Symbol.prototype : undefined,
20366       symbolToString = symbolProto$2 ? symbolProto$2.toString : undefined;
20367
20368   /**
20369    * The base implementation of `_.toString` which doesn't convert nullish
20370    * values to empty strings.
20371    *
20372    * @private
20373    * @param {*} value The value to process.
20374    * @returns {string} Returns the string.
20375    */
20376   function baseToString(value) {
20377     // Exit early for strings to avoid a performance hit in some environments.
20378     if (typeof value == 'string') {
20379       return value;
20380     }
20381     if (isArray(value)) {
20382       // Recursively convert values (susceptible to call stack limits).
20383       return arrayMap(value, baseToString) + '';
20384     }
20385     if (isSymbol(value)) {
20386       return symbolToString ? symbolToString.call(value) : '';
20387     }
20388     var result = (value + '');
20389     return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
20390   }
20391
20392   /**
20393    * Converts `value` to a string. An empty string is returned for `null`
20394    * and `undefined` values. The sign of `-0` is preserved.
20395    *
20396    * @static
20397    * @memberOf _
20398    * @since 4.0.0
20399    * @category Lang
20400    * @param {*} value The value to convert.
20401    * @returns {string} Returns the converted string.
20402    * @example
20403    *
20404    * _.toString(null);
20405    * // => ''
20406    *
20407    * _.toString(-0);
20408    * // => '-0'
20409    *
20410    * _.toString([1, 2, 3]);
20411    * // => '1,2,3'
20412    */
20413   function toString(value) {
20414     return value == null ? '' : baseToString(value);
20415   }
20416
20417   /**
20418    * Casts `value` to a path array if it's not one.
20419    *
20420    * @private
20421    * @param {*} value The value to inspect.
20422    * @param {Object} [object] The object to query keys on.
20423    * @returns {Array} Returns the cast property path array.
20424    */
20425   function castPath(value, object) {
20426     if (isArray(value)) {
20427       return value;
20428     }
20429     return isKey(value, object) ? [value] : stringToPath(toString(value));
20430   }
20431
20432   /** Used as references for various `Number` constants. */
20433   var INFINITY$1 = 1 / 0;
20434
20435   /**
20436    * Converts `value` to a string key if it's not a string or symbol.
20437    *
20438    * @private
20439    * @param {*} value The value to inspect.
20440    * @returns {string|symbol} Returns the key.
20441    */
20442   function toKey(value) {
20443     if (typeof value == 'string' || isSymbol(value)) {
20444       return value;
20445     }
20446     var result = (value + '');
20447     return (result == '0' && (1 / value) == -INFINITY$1) ? '-0' : result;
20448   }
20449
20450   /**
20451    * The base implementation of `_.get` without support for default values.
20452    *
20453    * @private
20454    * @param {Object} object The object to query.
20455    * @param {Array|string} path The path of the property to get.
20456    * @returns {*} Returns the resolved value.
20457    */
20458   function baseGet(object, path) {
20459     path = castPath(path, object);
20460
20461     var index = 0,
20462         length = path.length;
20463
20464     while (object != null && index < length) {
20465       object = object[toKey(path[index++])];
20466     }
20467     return (index && index == length) ? object : undefined;
20468   }
20469
20470   /**
20471    * Gets the value at `path` of `object`. If the resolved value is
20472    * `undefined`, the `defaultValue` is returned in its place.
20473    *
20474    * @static
20475    * @memberOf _
20476    * @since 3.7.0
20477    * @category Object
20478    * @param {Object} object The object to query.
20479    * @param {Array|string} path The path of the property to get.
20480    * @param {*} [defaultValue] The value returned for `undefined` resolved values.
20481    * @returns {*} Returns the resolved value.
20482    * @example
20483    *
20484    * var object = { 'a': [{ 'b': { 'c': 3 } }] };
20485    *
20486    * _.get(object, 'a[0].b.c');
20487    * // => 3
20488    *
20489    * _.get(object, ['a', '0', 'b', 'c']);
20490    * // => 3
20491    *
20492    * _.get(object, 'a.b.c', 'default');
20493    * // => 'default'
20494    */
20495   function get$2(object, path, defaultValue) {
20496     var result = object == null ? undefined : baseGet(object, path);
20497     return result === undefined ? defaultValue : result;
20498   }
20499
20500   /**
20501    * The base implementation of `_.hasIn` without support for deep paths.
20502    *
20503    * @private
20504    * @param {Object} [object] The object to query.
20505    * @param {Array|string} key The key to check.
20506    * @returns {boolean} Returns `true` if `key` exists, else `false`.
20507    */
20508   function baseHasIn(object, key) {
20509     return object != null && key in Object(object);
20510   }
20511
20512   /**
20513    * Checks if `path` exists on `object`.
20514    *
20515    * @private
20516    * @param {Object} object The object to query.
20517    * @param {Array|string} path The path to check.
20518    * @param {Function} hasFunc The function to check properties.
20519    * @returns {boolean} Returns `true` if `path` exists, else `false`.
20520    */
20521   function hasPath(object, path, hasFunc) {
20522     path = castPath(path, object);
20523
20524     var index = -1,
20525         length = path.length,
20526         result = false;
20527
20528     while (++index < length) {
20529       var key = toKey(path[index]);
20530       if (!(result = object != null && hasFunc(object, key))) {
20531         break;
20532       }
20533       object = object[key];
20534     }
20535     if (result || ++index != length) {
20536       return result;
20537     }
20538     length = object == null ? 0 : object.length;
20539     return !!length && isLength(length) && isIndex(key, length) &&
20540       (isArray(object) || isArguments(object));
20541   }
20542
20543   /**
20544    * Checks if `path` is a direct or inherited property of `object`.
20545    *
20546    * @static
20547    * @memberOf _
20548    * @since 4.0.0
20549    * @category Object
20550    * @param {Object} object The object to query.
20551    * @param {Array|string} path The path to check.
20552    * @returns {boolean} Returns `true` if `path` exists, else `false`.
20553    * @example
20554    *
20555    * var object = _.create({ 'a': _.create({ 'b': 2 }) });
20556    *
20557    * _.hasIn(object, 'a');
20558    * // => true
20559    *
20560    * _.hasIn(object, 'a.b');
20561    * // => true
20562    *
20563    * _.hasIn(object, ['a', 'b']);
20564    * // => true
20565    *
20566    * _.hasIn(object, 'b');
20567    * // => false
20568    */
20569   function hasIn(object, path) {
20570     return object != null && hasPath(object, path, baseHasIn);
20571   }
20572
20573   /** Used to compose bitmasks for value comparisons. */
20574   var COMPARE_PARTIAL_FLAG$5 = 1,
20575       COMPARE_UNORDERED_FLAG$3 = 2;
20576
20577   /**
20578    * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
20579    *
20580    * @private
20581    * @param {string} path The path of the property to get.
20582    * @param {*} srcValue The value to match.
20583    * @returns {Function} Returns the new spec function.
20584    */
20585   function baseMatchesProperty(path, srcValue) {
20586     if (isKey(path) && isStrictComparable(srcValue)) {
20587       return matchesStrictComparable(toKey(path), srcValue);
20588     }
20589     return function(object) {
20590       var objValue = get$2(object, path);
20591       return (objValue === undefined && objValue === srcValue)
20592         ? hasIn(object, path)
20593         : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$5 | COMPARE_UNORDERED_FLAG$3);
20594     };
20595   }
20596
20597   /**
20598    * This method returns the first argument it receives.
20599    *
20600    * @static
20601    * @since 0.1.0
20602    * @memberOf _
20603    * @category Util
20604    * @param {*} value Any value.
20605    * @returns {*} Returns `value`.
20606    * @example
20607    *
20608    * var object = { 'a': 1 };
20609    *
20610    * console.log(_.identity(object) === object);
20611    * // => true
20612    */
20613   function identity$8(value) {
20614     return value;
20615   }
20616
20617   /**
20618    * The base implementation of `_.property` without support for deep paths.
20619    *
20620    * @private
20621    * @param {string} key The key of the property to get.
20622    * @returns {Function} Returns the new accessor function.
20623    */
20624   function baseProperty(key) {
20625     return function(object) {
20626       return object == null ? undefined : object[key];
20627     };
20628   }
20629
20630   /**
20631    * A specialized version of `baseProperty` which supports deep paths.
20632    *
20633    * @private
20634    * @param {Array|string} path The path of the property to get.
20635    * @returns {Function} Returns the new accessor function.
20636    */
20637   function basePropertyDeep(path) {
20638     return function(object) {
20639       return baseGet(object, path);
20640     };
20641   }
20642
20643   /**
20644    * Creates a function that returns the value at `path` of a given object.
20645    *
20646    * @static
20647    * @memberOf _
20648    * @since 2.4.0
20649    * @category Util
20650    * @param {Array|string} path The path of the property to get.
20651    * @returns {Function} Returns the new accessor function.
20652    * @example
20653    *
20654    * var objects = [
20655    *   { 'a': { 'b': 2 } },
20656    *   { 'a': { 'b': 1 } }
20657    * ];
20658    *
20659    * _.map(objects, _.property('a.b'));
20660    * // => [2, 1]
20661    *
20662    * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
20663    * // => [1, 2]
20664    */
20665   function property(path) {
20666     return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
20667   }
20668
20669   /**
20670    * The base implementation of `_.iteratee`.
20671    *
20672    * @private
20673    * @param {*} [value=_.identity] The value to convert to an iteratee.
20674    * @returns {Function} Returns the iteratee.
20675    */
20676   function baseIteratee(value) {
20677     // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
20678     // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
20679     if (typeof value == 'function') {
20680       return value;
20681     }
20682     if (value == null) {
20683       return identity$8;
20684     }
20685     if (typeof value == 'object') {
20686       return isArray(value)
20687         ? baseMatchesProperty(value[0], value[1])
20688         : baseMatches(value);
20689     }
20690     return property(value);
20691   }
20692
20693   /**
20694    * Creates a function like `_.groupBy`.
20695    *
20696    * @private
20697    * @param {Function} setter The function to set accumulator values.
20698    * @param {Function} [initializer] The accumulator object initializer.
20699    * @returns {Function} Returns the new aggregator function.
20700    */
20701   function createAggregator(setter, initializer) {
20702     return function(collection, iteratee) {
20703       var func = isArray(collection) ? arrayAggregator : baseAggregator,
20704           accumulator = initializer ? initializer() : {};
20705
20706       return func(collection, setter, baseIteratee(iteratee, 2), accumulator);
20707     };
20708   }
20709
20710   /** Used for built-in method references. */
20711   var objectProto$f = Object.prototype;
20712
20713   /** Used to check objects for own properties. */
20714   var hasOwnProperty$c = objectProto$f.hasOwnProperty;
20715
20716   /**
20717    * Creates an object composed of keys generated from the results of running
20718    * each element of `collection` thru `iteratee`. The order of grouped values
20719    * is determined by the order they occur in `collection`. The corresponding
20720    * value of each key is an array of elements responsible for generating the
20721    * key. The iteratee is invoked with one argument: (value).
20722    *
20723    * @static
20724    * @memberOf _
20725    * @since 0.1.0
20726    * @category Collection
20727    * @param {Array|Object} collection The collection to iterate over.
20728    * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
20729    * @returns {Object} Returns the composed aggregate object.
20730    * @example
20731    *
20732    * _.groupBy([6.1, 4.2, 6.3], Math.floor);
20733    * // => { '4': [4.2], '6': [6.1, 6.3] }
20734    *
20735    * // The `_.property` iteratee shorthand.
20736    * _.groupBy(['one', 'two', 'three'], 'length');
20737    * // => { '3': ['one', 'two'], '5': ['three'] }
20738    */
20739   var groupBy = createAggregator(function(result, value, key) {
20740     if (hasOwnProperty$c.call(result, key)) {
20741       result[key].push(value);
20742     } else {
20743       baseAssignValue(result, key, [value]);
20744     }
20745   });
20746
20747   /**
20748    * Gets the last element of `array`.
20749    *
20750    * @static
20751    * @memberOf _
20752    * @since 0.1.0
20753    * @category Array
20754    * @param {Array} array The array to query.
20755    * @returns {*} Returns the last element of `array`.
20756    * @example
20757    *
20758    * _.last([1, 2, 3]);
20759    * // => 3
20760    */
20761   function last(array) {
20762     var length = array == null ? 0 : array.length;
20763     return length ? array[length - 1] : undefined;
20764   }
20765
20766   /**
20767    * The base implementation of `_.slice` without an iteratee call guard.
20768    *
20769    * @private
20770    * @param {Array} array The array to slice.
20771    * @param {number} [start=0] The start position.
20772    * @param {number} [end=array.length] The end position.
20773    * @returns {Array} Returns the slice of `array`.
20774    */
20775   function baseSlice(array, start, end) {
20776     var index = -1,
20777         length = array.length;
20778
20779     if (start < 0) {
20780       start = -start > length ? 0 : (length + start);
20781     }
20782     end = end > length ? length : end;
20783     if (end < 0) {
20784       end += length;
20785     }
20786     length = start > end ? 0 : ((end - start) >>> 0);
20787     start >>>= 0;
20788
20789     var result = Array(length);
20790     while (++index < length) {
20791       result[index] = array[index + start];
20792     }
20793     return result;
20794   }
20795
20796   /**
20797    * Gets the parent value at `path` of `object`.
20798    *
20799    * @private
20800    * @param {Object} object The object to query.
20801    * @param {Array} path The path to get the parent value of.
20802    * @returns {*} Returns the parent value.
20803    */
20804   function parent(object, path) {
20805     return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
20806   }
20807
20808   /**
20809    * The base implementation of `_.unset`.
20810    *
20811    * @private
20812    * @param {Object} object The object to modify.
20813    * @param {Array|string} path The property path to unset.
20814    * @returns {boolean} Returns `true` if the property is deleted, else `false`.
20815    */
20816   function baseUnset(object, path) {
20817     path = castPath(path, object);
20818     object = parent(object, path);
20819     return object == null || delete object[toKey(last(path))];
20820   }
20821
20822   /** `Object#toString` result references. */
20823   var objectTag$4 = '[object Object]';
20824
20825   /** Used for built-in method references. */
20826   var funcProto$2 = Function.prototype,
20827       objectProto$g = Object.prototype;
20828
20829   /** Used to resolve the decompiled source of functions. */
20830   var funcToString$2 = funcProto$2.toString;
20831
20832   /** Used to check objects for own properties. */
20833   var hasOwnProperty$d = objectProto$g.hasOwnProperty;
20834
20835   /** Used to infer the `Object` constructor. */
20836   var objectCtorString = funcToString$2.call(Object);
20837
20838   /**
20839    * Checks if `value` is a plain object, that is, an object created by the
20840    * `Object` constructor or one with a `[[Prototype]]` of `null`.
20841    *
20842    * @static
20843    * @memberOf _
20844    * @since 0.8.0
20845    * @category Lang
20846    * @param {*} value The value to check.
20847    * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
20848    * @example
20849    *
20850    * function Foo() {
20851    *   this.a = 1;
20852    * }
20853    *
20854    * _.isPlainObject(new Foo);
20855    * // => false
20856    *
20857    * _.isPlainObject([1, 2, 3]);
20858    * // => false
20859    *
20860    * _.isPlainObject({ 'x': 0, 'y': 0 });
20861    * // => true
20862    *
20863    * _.isPlainObject(Object.create(null));
20864    * // => true
20865    */
20866   function isPlainObject(value) {
20867     if (!isObjectLike(value) || baseGetTag(value) != objectTag$4) {
20868       return false;
20869     }
20870     var proto = getPrototype(value);
20871     if (proto === null) {
20872       return true;
20873     }
20874     var Ctor = hasOwnProperty$d.call(proto, 'constructor') && proto.constructor;
20875     return typeof Ctor == 'function' && Ctor instanceof Ctor &&
20876       funcToString$2.call(Ctor) == objectCtorString;
20877   }
20878
20879   /**
20880    * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
20881    * objects.
20882    *
20883    * @private
20884    * @param {*} value The value to inspect.
20885    * @param {string} key The key of the property to inspect.
20886    * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
20887    */
20888   function customOmitClone(value) {
20889     return isPlainObject(value) ? undefined : value;
20890   }
20891
20892   /** Built-in value references. */
20893   var spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;
20894
20895   /**
20896    * Checks if `value` is a flattenable `arguments` object or array.
20897    *
20898    * @private
20899    * @param {*} value The value to check.
20900    * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
20901    */
20902   function isFlattenable(value) {
20903     return isArray(value) || isArguments(value) ||
20904       !!(spreadableSymbol && value && value[spreadableSymbol]);
20905   }
20906
20907   /**
20908    * The base implementation of `_.flatten` with support for restricting flattening.
20909    *
20910    * @private
20911    * @param {Array} array The array to flatten.
20912    * @param {number} depth The maximum recursion depth.
20913    * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
20914    * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
20915    * @param {Array} [result=[]] The initial result value.
20916    * @returns {Array} Returns the new flattened array.
20917    */
20918   function baseFlatten(array, depth, predicate, isStrict, result) {
20919     var index = -1,
20920         length = array.length;
20921
20922     predicate || (predicate = isFlattenable);
20923     result || (result = []);
20924
20925     while (++index < length) {
20926       var value = array[index];
20927       if (depth > 0 && predicate(value)) {
20928         if (depth > 1) {
20929           // Recursively flatten arrays (susceptible to call stack limits).
20930           baseFlatten(value, depth - 1, predicate, isStrict, result);
20931         } else {
20932           arrayPush(result, value);
20933         }
20934       } else if (!isStrict) {
20935         result[result.length] = value;
20936       }
20937     }
20938     return result;
20939   }
20940
20941   /**
20942    * Flattens `array` a single level deep.
20943    *
20944    * @static
20945    * @memberOf _
20946    * @since 0.1.0
20947    * @category Array
20948    * @param {Array} array The array to flatten.
20949    * @returns {Array} Returns the new flattened array.
20950    * @example
20951    *
20952    * _.flatten([1, [2, [3, [4]], 5]]);
20953    * // => [1, 2, [3, [4]], 5]
20954    */
20955   function flatten(array) {
20956     var length = array == null ? 0 : array.length;
20957     return length ? baseFlatten(array, 1) : [];
20958   }
20959
20960   /**
20961    * A faster alternative to `Function#apply`, this function invokes `func`
20962    * with the `this` binding of `thisArg` and the arguments of `args`.
20963    *
20964    * @private
20965    * @param {Function} func The function to invoke.
20966    * @param {*} thisArg The `this` binding of `func`.
20967    * @param {Array} args The arguments to invoke `func` with.
20968    * @returns {*} Returns the result of `func`.
20969    */
20970   function apply(func, thisArg, args) {
20971     switch (args.length) {
20972       case 0: return func.call(thisArg);
20973       case 1: return func.call(thisArg, args[0]);
20974       case 2: return func.call(thisArg, args[0], args[1]);
20975       case 3: return func.call(thisArg, args[0], args[1], args[2]);
20976     }
20977     return func.apply(thisArg, args);
20978   }
20979
20980   /* Built-in method references for those with the same name as other `lodash` methods. */
20981   var nativeMax = Math.max;
20982
20983   /**
20984    * A specialized version of `baseRest` which transforms the rest array.
20985    *
20986    * @private
20987    * @param {Function} func The function to apply a rest parameter to.
20988    * @param {number} [start=func.length-1] The start position of the rest parameter.
20989    * @param {Function} transform The rest array transform.
20990    * @returns {Function} Returns the new function.
20991    */
20992   function overRest(func, start, transform) {
20993     start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
20994     return function() {
20995       var args = arguments,
20996           index = -1,
20997           length = nativeMax(args.length - start, 0),
20998           array = Array(length);
20999
21000       while (++index < length) {
21001         array[index] = args[start + index];
21002       }
21003       index = -1;
21004       var otherArgs = Array(start + 1);
21005       while (++index < start) {
21006         otherArgs[index] = args[index];
21007       }
21008       otherArgs[start] = transform(array);
21009       return apply(func, this, otherArgs);
21010     };
21011   }
21012
21013   /**
21014    * Creates a function that returns `value`.
21015    *
21016    * @static
21017    * @memberOf _
21018    * @since 2.4.0
21019    * @category Util
21020    * @param {*} value The value to return from the new function.
21021    * @returns {Function} Returns the new constant function.
21022    * @example
21023    *
21024    * var objects = _.times(2, _.constant({ 'a': 1 }));
21025    *
21026    * console.log(objects);
21027    * // => [{ 'a': 1 }, { 'a': 1 }]
21028    *
21029    * console.log(objects[0] === objects[1]);
21030    * // => true
21031    */
21032   function constant$d(value) {
21033     return function() {
21034       return value;
21035     };
21036   }
21037
21038   /**
21039    * The base implementation of `setToString` without support for hot loop shorting.
21040    *
21041    * @private
21042    * @param {Function} func The function to modify.
21043    * @param {Function} string The `toString` result.
21044    * @returns {Function} Returns `func`.
21045    */
21046   var baseSetToString = !defineProperty ? identity$8 : function(func, string) {
21047     return defineProperty(func, 'toString', {
21048       'configurable': true,
21049       'enumerable': false,
21050       'value': constant$d(string),
21051       'writable': true
21052     });
21053   };
21054
21055   /** Used to detect hot functions by number of calls within a span of milliseconds. */
21056   var HOT_COUNT = 800,
21057       HOT_SPAN = 16;
21058
21059   /* Built-in method references for those with the same name as other `lodash` methods. */
21060   var nativeNow = Date.now;
21061
21062   /**
21063    * Creates a function that'll short out and invoke `identity` instead
21064    * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
21065    * milliseconds.
21066    *
21067    * @private
21068    * @param {Function} func The function to restrict.
21069    * @returns {Function} Returns the new shortable function.
21070    */
21071   function shortOut(func) {
21072     var count = 0,
21073         lastCalled = 0;
21074
21075     return function() {
21076       var stamp = nativeNow(),
21077           remaining = HOT_SPAN - (stamp - lastCalled);
21078
21079       lastCalled = stamp;
21080       if (remaining > 0) {
21081         if (++count >= HOT_COUNT) {
21082           return arguments[0];
21083         }
21084       } else {
21085         count = 0;
21086       }
21087       return func.apply(undefined, arguments);
21088     };
21089   }
21090
21091   /**
21092    * Sets the `toString` method of `func` to return `string`.
21093    *
21094    * @private
21095    * @param {Function} func The function to modify.
21096    * @param {Function} string The `toString` result.
21097    * @returns {Function} Returns `func`.
21098    */
21099   var setToString = shortOut(baseSetToString);
21100
21101   /**
21102    * A specialized version of `baseRest` which flattens the rest array.
21103    *
21104    * @private
21105    * @param {Function} func The function to apply a rest parameter to.
21106    * @returns {Function} Returns the new function.
21107    */
21108   function flatRest(func) {
21109     return setToString(overRest(func, undefined, flatten), func + '');
21110   }
21111
21112   /** Used to compose bitmasks for cloning. */
21113   var CLONE_DEEP_FLAG$1 = 1,
21114       CLONE_FLAT_FLAG$1 = 2,
21115       CLONE_SYMBOLS_FLAG$2 = 4;
21116
21117   /**
21118    * The opposite of `_.pick`; this method creates an object composed of the
21119    * own and inherited enumerable property paths of `object` that are not omitted.
21120    *
21121    * **Note:** This method is considerably slower than `_.pick`.
21122    *
21123    * @static
21124    * @since 0.1.0
21125    * @memberOf _
21126    * @category Object
21127    * @param {Object} object The source object.
21128    * @param {...(string|string[])} [paths] The property paths to omit.
21129    * @returns {Object} Returns the new object.
21130    * @example
21131    *
21132    * var object = { 'a': 1, 'b': '2', 'c': 3 };
21133    *
21134    * _.omit(object, ['a', 'c']);
21135    * // => { 'b': '2' }
21136    */
21137   var omit = flatRest(function(object, paths) {
21138     var result = {};
21139     if (object == null) {
21140       return result;
21141     }
21142     var isDeep = false;
21143     paths = arrayMap(paths, function(path) {
21144       path = castPath(path, object);
21145       isDeep || (isDeep = path.length > 1);
21146       return path;
21147     });
21148     copyObject(object, getAllKeysIn(object), result);
21149     if (isDeep) {
21150       result = baseClone(result, CLONE_DEEP_FLAG$1 | CLONE_FLAT_FLAG$1 | CLONE_SYMBOLS_FLAG$2, customOmitClone);
21151     }
21152     var length = paths.length;
21153     while (length--) {
21154       baseUnset(result, paths[length]);
21155     }
21156     return result;
21157   });
21158
21159   /**
21160    * Creates an array with all falsey values removed. The values `false`, `null`,
21161    * `0`, `""`, `undefined`, and `NaN` are falsey.
21162    *
21163    * @static
21164    * @memberOf _
21165    * @since 0.1.0
21166    * @category Array
21167    * @param {Array} array The array to compact.
21168    * @returns {Array} Returns the new array of filtered values.
21169    * @example
21170    *
21171    * _.compact([0, 1, false, 2, '', 3]);
21172    * // => [1, 2, 3]
21173    */
21174   function compact(array) {
21175     var index = -1,
21176         length = array == null ? 0 : array.length,
21177         resIndex = 0,
21178         result = [];
21179
21180     while (++index < length) {
21181       var value = array[index];
21182       if (value) {
21183         result[resIndex++] = value;
21184       }
21185     }
21186     return result;
21187   }
21188
21189   /**
21190    * The base implementation of `_.rest` which doesn't validate or coerce arguments.
21191    *
21192    * @private
21193    * @param {Function} func The function to apply a rest parameter to.
21194    * @param {number} [start=func.length-1] The start position of the rest parameter.
21195    * @returns {Function} Returns the new function.
21196    */
21197   function baseRest(func, start) {
21198     return setToString(overRest(func, start, identity$8), func + '');
21199   }
21200
21201   /**
21202    * Checks if the given arguments are from an iteratee call.
21203    *
21204    * @private
21205    * @param {*} value The potential iteratee value argument.
21206    * @param {*} index The potential iteratee index or key argument.
21207    * @param {*} object The potential iteratee object argument.
21208    * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
21209    *  else `false`.
21210    */
21211   function isIterateeCall(value, index, object) {
21212     if (!isObject(object)) {
21213       return false;
21214     }
21215     var type = typeof index;
21216     if (type == 'number'
21217           ? (isArrayLike(object) && isIndex(index, object.length))
21218           : (type == 'string' && index in object)
21219         ) {
21220       return eq(object[index], value);
21221     }
21222     return false;
21223   }
21224
21225   /**
21226    * Creates a function like `_.assign`.
21227    *
21228    * @private
21229    * @param {Function} assigner The function to assign values.
21230    * @returns {Function} Returns the new assigner function.
21231    */
21232   function createAssigner(assigner) {
21233     return baseRest(function(object, sources) {
21234       var index = -1,
21235           length = sources.length,
21236           customizer = length > 1 ? sources[length - 1] : undefined,
21237           guard = length > 2 ? sources[2] : undefined;
21238
21239       customizer = (assigner.length > 3 && typeof customizer == 'function')
21240         ? (length--, customizer)
21241         : undefined;
21242
21243       if (guard && isIterateeCall(sources[0], sources[1], guard)) {
21244         customizer = length < 3 ? undefined : customizer;
21245         length = 1;
21246       }
21247       object = Object(object);
21248       while (++index < length) {
21249         var source = sources[index];
21250         if (source) {
21251           assigner(object, source, index, customizer);
21252         }
21253       }
21254       return object;
21255     });
21256   }
21257
21258   /**
21259    * This method is like `_.assign` except that it iterates over own and
21260    * inherited source properties.
21261    *
21262    * **Note:** This method mutates `object`.
21263    *
21264    * @static
21265    * @memberOf _
21266    * @since 4.0.0
21267    * @alias extend
21268    * @category Object
21269    * @param {Object} object The destination object.
21270    * @param {...Object} [sources] The source objects.
21271    * @returns {Object} Returns `object`.
21272    * @see _.assign
21273    * @example
21274    *
21275    * function Foo() {
21276    *   this.a = 1;
21277    * }
21278    *
21279    * function Bar() {
21280    *   this.c = 3;
21281    * }
21282    *
21283    * Foo.prototype.b = 2;
21284    * Bar.prototype.d = 4;
21285    *
21286    * _.assignIn({ 'a': 0 }, new Foo, new Bar);
21287    * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
21288    */
21289   var assignIn = createAssigner(function(object, source) {
21290     copyObject(source, keysIn$1(source), object);
21291   });
21292
21293   /**
21294    * The base implementation of `_.filter` without support for iteratee shorthands.
21295    *
21296    * @private
21297    * @param {Array|Object} collection The collection to iterate over.
21298    * @param {Function} predicate The function invoked per iteration.
21299    * @returns {Array} Returns the new filtered array.
21300    */
21301   function baseFilter(collection, predicate) {
21302     var result = [];
21303     baseEach(collection, function(value, index, collection) {
21304       if (predicate(value, index, collection)) {
21305         result.push(value);
21306       }
21307     });
21308     return result;
21309   }
21310
21311   /**
21312    * Iterates over elements of `collection`, returning an array of all elements
21313    * `predicate` returns truthy for. The predicate is invoked with three
21314    * arguments: (value, index|key, collection).
21315    *
21316    * **Note:** Unlike `_.remove`, this method returns a new array.
21317    *
21318    * @static
21319    * @memberOf _
21320    * @since 0.1.0
21321    * @category Collection
21322    * @param {Array|Object} collection The collection to iterate over.
21323    * @param {Function} [predicate=_.identity] The function invoked per iteration.
21324    * @returns {Array} Returns the new filtered array.
21325    * @see _.reject
21326    * @example
21327    *
21328    * var users = [
21329    *   { 'user': 'barney', 'age': 36, 'active': true },
21330    *   { 'user': 'fred',   'age': 40, 'active': false }
21331    * ];
21332    *
21333    * _.filter(users, function(o) { return !o.active; });
21334    * // => objects for ['fred']
21335    *
21336    * // The `_.matches` iteratee shorthand.
21337    * _.filter(users, { 'age': 36, 'active': true });
21338    * // => objects for ['barney']
21339    *
21340    * // The `_.matchesProperty` iteratee shorthand.
21341    * _.filter(users, ['active', false]);
21342    * // => objects for ['fred']
21343    *
21344    * // The `_.property` iteratee shorthand.
21345    * _.filter(users, 'active');
21346    * // => objects for ['barney']
21347    */
21348   function filter(collection, predicate) {
21349     var func = isArray(collection) ? arrayFilter : baseFilter;
21350     return func(collection, baseIteratee(predicate, 3));
21351   }
21352
21353   /**
21354    * Creates a `_.find` or `_.findLast` function.
21355    *
21356    * @private
21357    * @param {Function} findIndexFunc The function to find the collection index.
21358    * @returns {Function} Returns the new find function.
21359    */
21360   function createFind(findIndexFunc) {
21361     return function(collection, predicate, fromIndex) {
21362       var iterable = Object(collection);
21363       if (!isArrayLike(collection)) {
21364         var iteratee = baseIteratee(predicate, 3);
21365         collection = keys$1(collection);
21366         predicate = function(key) { return iteratee(iterable[key], key, iterable); };
21367       }
21368       var index = findIndexFunc(collection, predicate, fromIndex);
21369       return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
21370     };
21371   }
21372
21373   /**
21374    * The base implementation of `_.findIndex` and `_.findLastIndex` without
21375    * support for iteratee shorthands.
21376    *
21377    * @private
21378    * @param {Array} array The array to inspect.
21379    * @param {Function} predicate The function invoked per iteration.
21380    * @param {number} fromIndex The index to search from.
21381    * @param {boolean} [fromRight] Specify iterating from right to left.
21382    * @returns {number} Returns the index of the matched value, else `-1`.
21383    */
21384   function baseFindIndex(array, predicate, fromIndex, fromRight) {
21385     var length = array.length,
21386         index = fromIndex + (fromRight ? 1 : -1);
21387
21388     while ((fromRight ? index-- : ++index < length)) {
21389       if (predicate(array[index], index, array)) {
21390         return index;
21391       }
21392     }
21393     return -1;
21394   }
21395
21396   /** Used as references for various `Number` constants. */
21397   var NAN = 0 / 0;
21398
21399   /** Used to match leading and trailing whitespace. */
21400   var reTrim = /^\s+|\s+$/g;
21401
21402   /** Used to detect bad signed hexadecimal string values. */
21403   var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
21404
21405   /** Used to detect binary string values. */
21406   var reIsBinary = /^0b[01]+$/i;
21407
21408   /** Used to detect octal string values. */
21409   var reIsOctal = /^0o[0-7]+$/i;
21410
21411   /** Built-in method references without a dependency on `root`. */
21412   var freeParseInt = parseInt;
21413
21414   /**
21415    * Converts `value` to a number.
21416    *
21417    * @static
21418    * @memberOf _
21419    * @since 4.0.0
21420    * @category Lang
21421    * @param {*} value The value to process.
21422    * @returns {number} Returns the number.
21423    * @example
21424    *
21425    * _.toNumber(3.2);
21426    * // => 3.2
21427    *
21428    * _.toNumber(Number.MIN_VALUE);
21429    * // => 5e-324
21430    *
21431    * _.toNumber(Infinity);
21432    * // => Infinity
21433    *
21434    * _.toNumber('3.2');
21435    * // => 3.2
21436    */
21437   function toNumber(value) {
21438     if (typeof value == 'number') {
21439       return value;
21440     }
21441     if (isSymbol(value)) {
21442       return NAN;
21443     }
21444     if (isObject(value)) {
21445       var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
21446       value = isObject(other) ? (other + '') : other;
21447     }
21448     if (typeof value != 'string') {
21449       return value === 0 ? value : +value;
21450     }
21451     value = value.replace(reTrim, '');
21452     var isBinary = reIsBinary.test(value);
21453     return (isBinary || reIsOctal.test(value))
21454       ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
21455       : (reIsBadHex.test(value) ? NAN : +value);
21456   }
21457
21458   /** Used as references for various `Number` constants. */
21459   var INFINITY$2 = 1 / 0,
21460       MAX_INTEGER = 1.7976931348623157e+308;
21461
21462   /**
21463    * Converts `value` to a finite number.
21464    *
21465    * @static
21466    * @memberOf _
21467    * @since 4.12.0
21468    * @category Lang
21469    * @param {*} value The value to convert.
21470    * @returns {number} Returns the converted number.
21471    * @example
21472    *
21473    * _.toFinite(3.2);
21474    * // => 3.2
21475    *
21476    * _.toFinite(Number.MIN_VALUE);
21477    * // => 5e-324
21478    *
21479    * _.toFinite(Infinity);
21480    * // => 1.7976931348623157e+308
21481    *
21482    * _.toFinite('3.2');
21483    * // => 3.2
21484    */
21485   function toFinite(value) {
21486     if (!value) {
21487       return value === 0 ? value : 0;
21488     }
21489     value = toNumber(value);
21490     if (value === INFINITY$2 || value === -INFINITY$2) {
21491       var sign = (value < 0 ? -1 : 1);
21492       return sign * MAX_INTEGER;
21493     }
21494     return value === value ? value : 0;
21495   }
21496
21497   /**
21498    * Converts `value` to an integer.
21499    *
21500    * **Note:** This method is loosely based on
21501    * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
21502    *
21503    * @static
21504    * @memberOf _
21505    * @since 4.0.0
21506    * @category Lang
21507    * @param {*} value The value to convert.
21508    * @returns {number} Returns the converted integer.
21509    * @example
21510    *
21511    * _.toInteger(3.2);
21512    * // => 3
21513    *
21514    * _.toInteger(Number.MIN_VALUE);
21515    * // => 0
21516    *
21517    * _.toInteger(Infinity);
21518    * // => 1.7976931348623157e+308
21519    *
21520    * _.toInteger('3.2');
21521    * // => 3
21522    */
21523   function toInteger(value) {
21524     var result = toFinite(value),
21525         remainder = result % 1;
21526
21527     return result === result ? (remainder ? result - remainder : result) : 0;
21528   }
21529
21530   /* Built-in method references for those with the same name as other `lodash` methods. */
21531   var nativeMax$1 = Math.max;
21532
21533   /**
21534    * This method is like `_.find` except that it returns the index of the first
21535    * element `predicate` returns truthy for instead of the element itself.
21536    *
21537    * @static
21538    * @memberOf _
21539    * @since 1.1.0
21540    * @category Array
21541    * @param {Array} array The array to inspect.
21542    * @param {Function} [predicate=_.identity] The function invoked per iteration.
21543    * @param {number} [fromIndex=0] The index to search from.
21544    * @returns {number} Returns the index of the found element, else `-1`.
21545    * @example
21546    *
21547    * var users = [
21548    *   { 'user': 'barney',  'active': false },
21549    *   { 'user': 'fred',    'active': false },
21550    *   { 'user': 'pebbles', 'active': true }
21551    * ];
21552    *
21553    * _.findIndex(users, function(o) { return o.user == 'barney'; });
21554    * // => 0
21555    *
21556    * // The `_.matches` iteratee shorthand.
21557    * _.findIndex(users, { 'user': 'fred', 'active': false });
21558    * // => 1
21559    *
21560    * // The `_.matchesProperty` iteratee shorthand.
21561    * _.findIndex(users, ['active', false]);
21562    * // => 0
21563    *
21564    * // The `_.property` iteratee shorthand.
21565    * _.findIndex(users, 'active');
21566    * // => 2
21567    */
21568   function findIndex(array, predicate, fromIndex) {
21569     var length = array == null ? 0 : array.length;
21570     if (!length) {
21571       return -1;
21572     }
21573     var index = fromIndex == null ? 0 : toInteger(fromIndex);
21574     if (index < 0) {
21575       index = nativeMax$1(length + index, 0);
21576     }
21577     return baseFindIndex(array, baseIteratee(predicate, 3), index);
21578   }
21579
21580   /**
21581    * Iterates over elements of `collection`, returning the first element
21582    * `predicate` returns truthy for. The predicate is invoked with three
21583    * arguments: (value, index|key, collection).
21584    *
21585    * @static
21586    * @memberOf _
21587    * @since 0.1.0
21588    * @category Collection
21589    * @param {Array|Object} collection The collection to inspect.
21590    * @param {Function} [predicate=_.identity] The function invoked per iteration.
21591    * @param {number} [fromIndex=0] The index to search from.
21592    * @returns {*} Returns the matched element, else `undefined`.
21593    * @example
21594    *
21595    * var users = [
21596    *   { 'user': 'barney',  'age': 36, 'active': true },
21597    *   { 'user': 'fred',    'age': 40, 'active': false },
21598    *   { 'user': 'pebbles', 'age': 1,  'active': true }
21599    * ];
21600    *
21601    * _.find(users, function(o) { return o.age < 40; });
21602    * // => object for 'barney'
21603    *
21604    * // The `_.matches` iteratee shorthand.
21605    * _.find(users, { 'age': 1, 'active': true });
21606    * // => object for 'pebbles'
21607    *
21608    * // The `_.matchesProperty` iteratee shorthand.
21609    * _.find(users, ['active', false]);
21610    * // => object for 'fred'
21611    *
21612    * // The `_.property` iteratee shorthand.
21613    * _.find(users, 'active');
21614    * // => object for 'barney'
21615    */
21616   var find$1 = createFind(findIndex);
21617
21618   /**
21619    * The base implementation of `_.map` without support for iteratee shorthands.
21620    *
21621    * @private
21622    * @param {Array|Object} collection The collection to iterate over.
21623    * @param {Function} iteratee The function invoked per iteration.
21624    * @returns {Array} Returns the new mapped array.
21625    */
21626   function baseMap(collection, iteratee) {
21627     var index = -1,
21628         result = isArrayLike(collection) ? Array(collection.length) : [];
21629
21630     baseEach(collection, function(value, key, collection) {
21631       result[++index] = iteratee(value, key, collection);
21632     });
21633     return result;
21634   }
21635
21636   /**
21637    * Creates an array of values by running each element in `collection` thru
21638    * `iteratee`. The iteratee is invoked with three arguments:
21639    * (value, index|key, collection).
21640    *
21641    * Many lodash methods are guarded to work as iteratees for methods like
21642    * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
21643    *
21644    * The guarded methods are:
21645    * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
21646    * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
21647    * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
21648    * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
21649    *
21650    * @static
21651    * @memberOf _
21652    * @since 0.1.0
21653    * @category Collection
21654    * @param {Array|Object} collection The collection to iterate over.
21655    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
21656    * @returns {Array} Returns the new mapped array.
21657    * @example
21658    *
21659    * function square(n) {
21660    *   return n * n;
21661    * }
21662    *
21663    * _.map([4, 8], square);
21664    * // => [16, 64]
21665    *
21666    * _.map({ 'a': 4, 'b': 8 }, square);
21667    * // => [16, 64] (iteration order is not guaranteed)
21668    *
21669    * var users = [
21670    *   { 'user': 'barney' },
21671    *   { 'user': 'fred' }
21672    * ];
21673    *
21674    * // The `_.property` iteratee shorthand.
21675    * _.map(users, 'user');
21676    * // => ['barney', 'fred']
21677    */
21678   function map$3(collection, iteratee) {
21679     var func = isArray(collection) ? arrayMap : baseMap;
21680     return func(collection, baseIteratee(iteratee, 3));
21681   }
21682
21683   /**
21684    * The base implementation of `_.values` and `_.valuesIn` which creates an
21685    * array of `object` property values corresponding to the property names
21686    * of `props`.
21687    *
21688    * @private
21689    * @param {Object} object The object to query.
21690    * @param {Array} props The property names to get values for.
21691    * @returns {Object} Returns the array of property values.
21692    */
21693   function baseValues(object, props) {
21694     return arrayMap(props, function(key) {
21695       return object[key];
21696     });
21697   }
21698
21699   /**
21700    * Creates an array of the own enumerable string keyed property values of `object`.
21701    *
21702    * **Note:** Non-object values are coerced to objects.
21703    *
21704    * @static
21705    * @since 0.1.0
21706    * @memberOf _
21707    * @category Object
21708    * @param {Object} object The object to query.
21709    * @returns {Array} Returns the array of property values.
21710    * @example
21711    *
21712    * function Foo() {
21713    *   this.a = 1;
21714    *   this.b = 2;
21715    * }
21716    *
21717    * Foo.prototype.c = 3;
21718    *
21719    * _.values(new Foo);
21720    * // => [1, 2] (iteration order is not guaranteed)
21721    *
21722    * _.values('hi');
21723    * // => ['h', 'i']
21724    */
21725   function values$1(object) {
21726     return object == null ? [] : baseValues(object, keys$1(object));
21727   }
21728
21729   /**
21730    * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
21731    * of key-value pairs for `object` corresponding to the property names of `props`.
21732    *
21733    * @private
21734    * @param {Object} object The object to query.
21735    * @param {Array} props The property names to get values for.
21736    * @returns {Object} Returns the key-value pairs.
21737    */
21738   function baseToPairs(object, props) {
21739     return arrayMap(props, function(key) {
21740       return [key, object[key]];
21741     });
21742   }
21743
21744   /**
21745    * Converts `set` to its value-value pairs.
21746    *
21747    * @private
21748    * @param {Object} set The set to convert.
21749    * @returns {Array} Returns the value-value pairs.
21750    */
21751   function setToPairs(set) {
21752     var index = -1,
21753         result = Array(set.size);
21754
21755     set.forEach(function(value) {
21756       result[++index] = [value, value];
21757     });
21758     return result;
21759   }
21760
21761   /** `Object#toString` result references. */
21762   var mapTag$6 = '[object Map]',
21763       setTag$6 = '[object Set]';
21764
21765   /**
21766    * Creates a `_.toPairs` or `_.toPairsIn` function.
21767    *
21768    * @private
21769    * @param {Function} keysFunc The function to get the keys of a given object.
21770    * @returns {Function} Returns the new pairs function.
21771    */
21772   function createToPairs(keysFunc) {
21773     return function(object) {
21774       var tag = getTag$1(object);
21775       if (tag == mapTag$6) {
21776         return mapToArray(object);
21777       }
21778       if (tag == setTag$6) {
21779         return setToPairs(object);
21780       }
21781       return baseToPairs(object, keysFunc(object));
21782     };
21783   }
21784
21785   /**
21786    * Creates an array of own enumerable string keyed-value pairs for `object`
21787    * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
21788    * entries are returned.
21789    *
21790    * @static
21791    * @memberOf _
21792    * @since 4.0.0
21793    * @alias entries
21794    * @category Object
21795    * @param {Object} object The object to query.
21796    * @returns {Array} Returns the key-value pairs.
21797    * @example
21798    *
21799    * function Foo() {
21800    *   this.a = 1;
21801    *   this.b = 2;
21802    * }
21803    *
21804    * Foo.prototype.c = 3;
21805    *
21806    * _.toPairs(new Foo);
21807    * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
21808    */
21809   var toPairs = createToPairs(keys$1);
21810
21811   /**
21812    * The base implementation of `_.isNaN` without support for number objects.
21813    *
21814    * @private
21815    * @param {*} value The value to check.
21816    * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
21817    */
21818   function baseIsNaN(value) {
21819     return value !== value;
21820   }
21821
21822   /**
21823    * A specialized version of `_.indexOf` which performs strict equality
21824    * comparisons of values, i.e. `===`.
21825    *
21826    * @private
21827    * @param {Array} array The array to inspect.
21828    * @param {*} value The value to search for.
21829    * @param {number} fromIndex The index to search from.
21830    * @returns {number} Returns the index of the matched value, else `-1`.
21831    */
21832   function strictIndexOf(array, value, fromIndex) {
21833     var index = fromIndex - 1,
21834         length = array.length;
21835
21836     while (++index < length) {
21837       if (array[index] === value) {
21838         return index;
21839       }
21840     }
21841     return -1;
21842   }
21843
21844   /**
21845    * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
21846    *
21847    * @private
21848    * @param {Array} array The array to inspect.
21849    * @param {*} value The value to search for.
21850    * @param {number} fromIndex The index to search from.
21851    * @returns {number} Returns the index of the matched value, else `-1`.
21852    */
21853   function baseIndexOf(array, value, fromIndex) {
21854     return value === value
21855       ? strictIndexOf(array, value, fromIndex)
21856       : baseFindIndex(array, baseIsNaN, fromIndex);
21857   }
21858
21859   /**
21860    * A specialized version of `_.includes` for arrays without support for
21861    * specifying an index to search from.
21862    *
21863    * @private
21864    * @param {Array} [array] The array to inspect.
21865    * @param {*} target The value to search for.
21866    * @returns {boolean} Returns `true` if `target` is found, else `false`.
21867    */
21868   function arrayIncludes(array, value) {
21869     var length = array == null ? 0 : array.length;
21870     return !!length && baseIndexOf(array, value, 0) > -1;
21871   }
21872
21873   /**
21874    * This function is like `arrayIncludes` except that it accepts a comparator.
21875    *
21876    * @private
21877    * @param {Array} [array] The array to inspect.
21878    * @param {*} target The value to search for.
21879    * @param {Function} comparator The comparator invoked per element.
21880    * @returns {boolean} Returns `true` if `target` is found, else `false`.
21881    */
21882   function arrayIncludesWith(array, value, comparator) {
21883     var index = -1,
21884         length = array == null ? 0 : array.length;
21885
21886     while (++index < length) {
21887       if (comparator(value, array[index])) {
21888         return true;
21889       }
21890     }
21891     return false;
21892   }
21893
21894   /**
21895    * This method returns `undefined`.
21896    *
21897    * @static
21898    * @memberOf _
21899    * @since 2.3.0
21900    * @category Util
21901    * @example
21902    *
21903    * _.times(2, _.noop);
21904    * // => [undefined, undefined]
21905    */
21906   function noop$3() {
21907     // No operation performed.
21908   }
21909
21910   /** Used as references for various `Number` constants. */
21911   var INFINITY$3 = 1 / 0;
21912
21913   /**
21914    * Creates a set object of `values`.
21915    *
21916    * @private
21917    * @param {Array} values The values to add to the set.
21918    * @returns {Object} Returns the new set.
21919    */
21920   var createSet = !(Set$1 && (1 / setToArray(new Set$1([,-0]))[1]) == INFINITY$3) ? noop$3 : function(values) {
21921     return new Set$1(values);
21922   };
21923
21924   /** Used as the size to enable large array optimizations. */
21925   var LARGE_ARRAY_SIZE$1 = 200;
21926
21927   /**
21928    * The base implementation of `_.uniqBy` without support for iteratee shorthands.
21929    *
21930    * @private
21931    * @param {Array} array The array to inspect.
21932    * @param {Function} [iteratee] The iteratee invoked per element.
21933    * @param {Function} [comparator] The comparator invoked per element.
21934    * @returns {Array} Returns the new duplicate free array.
21935    */
21936   function baseUniq(array, iteratee, comparator) {
21937     var index = -1,
21938         includes = arrayIncludes,
21939         length = array.length,
21940         isCommon = true,
21941         result = [],
21942         seen = result;
21943
21944     if (comparator) {
21945       isCommon = false;
21946       includes = arrayIncludesWith;
21947     }
21948     else if (length >= LARGE_ARRAY_SIZE$1) {
21949       var set = iteratee ? null : createSet(array);
21950       if (set) {
21951         return setToArray(set);
21952       }
21953       isCommon = false;
21954       includes = cacheHas;
21955       seen = new SetCache;
21956     }
21957     else {
21958       seen = iteratee ? [] : result;
21959     }
21960     outer:
21961     while (++index < length) {
21962       var value = array[index],
21963           computed = iteratee ? iteratee(value) : value;
21964
21965       value = (comparator || value !== 0) ? value : 0;
21966       if (isCommon && computed === computed) {
21967         var seenIndex = seen.length;
21968         while (seenIndex--) {
21969           if (seen[seenIndex] === computed) {
21970             continue outer;
21971           }
21972         }
21973         if (iteratee) {
21974           seen.push(computed);
21975         }
21976         result.push(value);
21977       }
21978       else if (!includes(seen, computed, comparator)) {
21979         if (seen !== result) {
21980           seen.push(computed);
21981         }
21982         result.push(value);
21983       }
21984     }
21985     return result;
21986   }
21987
21988   /**
21989    * This method is like `_.isArrayLike` except that it also checks if `value`
21990    * is an object.
21991    *
21992    * @static
21993    * @memberOf _
21994    * @since 4.0.0
21995    * @category Lang
21996    * @param {*} value The value to check.
21997    * @returns {boolean} Returns `true` if `value` is an array-like object,
21998    *  else `false`.
21999    * @example
22000    *
22001    * _.isArrayLikeObject([1, 2, 3]);
22002    * // => true
22003    *
22004    * _.isArrayLikeObject(document.body.children);
22005    * // => true
22006    *
22007    * _.isArrayLikeObject('abc');
22008    * // => false
22009    *
22010    * _.isArrayLikeObject(_.noop);
22011    * // => false
22012    */
22013   function isArrayLikeObject(value) {
22014     return isObjectLike(value) && isArrayLike(value);
22015   }
22016
22017   /**
22018    * Creates an array of unique values, in order, from all given arrays using
22019    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
22020    * for equality comparisons.
22021    *
22022    * @static
22023    * @memberOf _
22024    * @since 0.1.0
22025    * @category Array
22026    * @param {...Array} [arrays] The arrays to inspect.
22027    * @returns {Array} Returns the new array of combined values.
22028    * @example
22029    *
22030    * _.union([2], [1, 2]);
22031    * // => [2, 1]
22032    */
22033   var union = baseRest(function(arrays) {
22034     return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
22035   });
22036
22037   /** Used as the size to enable large array optimizations. */
22038   var LARGE_ARRAY_SIZE$2 = 200;
22039
22040   /**
22041    * The base implementation of methods like `_.difference` without support
22042    * for excluding multiple arrays or iteratee shorthands.
22043    *
22044    * @private
22045    * @param {Array} array The array to inspect.
22046    * @param {Array} values The values to exclude.
22047    * @param {Function} [iteratee] The iteratee invoked per element.
22048    * @param {Function} [comparator] The comparator invoked per element.
22049    * @returns {Array} Returns the new array of filtered values.
22050    */
22051   function baseDifference(array, values, iteratee, comparator) {
22052     var index = -1,
22053         includes = arrayIncludes,
22054         isCommon = true,
22055         length = array.length,
22056         result = [],
22057         valuesLength = values.length;
22058
22059     if (!length) {
22060       return result;
22061     }
22062     if (iteratee) {
22063       values = arrayMap(values, baseUnary(iteratee));
22064     }
22065     if (comparator) {
22066       includes = arrayIncludesWith;
22067       isCommon = false;
22068     }
22069     else if (values.length >= LARGE_ARRAY_SIZE$2) {
22070       includes = cacheHas;
22071       isCommon = false;
22072       values = new SetCache(values);
22073     }
22074     outer:
22075     while (++index < length) {
22076       var value = array[index],
22077           computed = iteratee == null ? value : iteratee(value);
22078
22079       value = (comparator || value !== 0) ? value : 0;
22080       if (isCommon && computed === computed) {
22081         var valuesIndex = valuesLength;
22082         while (valuesIndex--) {
22083           if (values[valuesIndex] === computed) {
22084             continue outer;
22085           }
22086         }
22087         result.push(value);
22088       }
22089       else if (!includes(values, computed, comparator)) {
22090         result.push(value);
22091       }
22092     }
22093     return result;
22094   }
22095
22096   /**
22097    * Creates an array excluding all given values using
22098    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
22099    * for equality comparisons.
22100    *
22101    * **Note:** Unlike `_.pull`, this method returns a new array.
22102    *
22103    * @static
22104    * @memberOf _
22105    * @since 0.1.0
22106    * @category Array
22107    * @param {Array} array The array to inspect.
22108    * @param {...*} [values] The values to exclude.
22109    * @returns {Array} Returns the new array of filtered values.
22110    * @see _.difference, _.xor
22111    * @example
22112    *
22113    * _.without([2, 1, 2, 3], 1, 2);
22114    * // => [3]
22115    */
22116   var without = baseRest(function(array, values) {
22117     return isArrayLikeObject(array)
22118       ? baseDifference(array, values)
22119       : [];
22120   });
22121
22122   function osmIsInterestingTag(key) {
22123       return key !== 'attribution' &&
22124           key !== 'created_by' &&
22125           key !== 'source' &&
22126           key !== 'odbl' &&
22127           key.indexOf('tiger:') !== 0;
22128
22129   }
22130
22131
22132   var osmOneWayTags = {
22133       'aerialway': {
22134           'chair_lift': true,
22135           'mixed_lift': true,
22136           't-bar': true,
22137           'j-bar': true,
22138           'platter': true,
22139           'rope_tow': true,
22140           'magic_carpet': true,
22141           'yes': true
22142       },
22143       'highway': {
22144           'motorway': true
22145       },
22146       'junction': {
22147           'circular': true,
22148           'roundabout': true
22149       },
22150       'man_made': {
22151           'piste:halfpipe': true
22152       },
22153       'piste:type': {
22154           'downhill': true,
22155           'sled': true,
22156           'yes': true
22157       },
22158       'waterway': {
22159           'canal': true,
22160           'ditch': true,
22161           'drain': true,
22162           'river': true,
22163           'stream': true
22164       }
22165   };
22166
22167
22168   var osmPavedTags = {
22169       'surface': {
22170           'paved': true,
22171           'asphalt': true,
22172           'concrete': true,
22173           'concrete:lanes': true,
22174           'concrete:plates': true
22175       },
22176       'tracktype': {
22177           'grade1': true
22178       }
22179   };
22180
22181   var osmRightSideIsInsideTags = {
22182       'natural': {
22183           'cliff': true,
22184           'coastline': 'coastline',
22185       },
22186       'barrier': {
22187           'retaining_wall': true,
22188           'kerb': true,
22189           'guard_rail': true,
22190           'city_wall': true,
22191       },
22192       'man_made': {
22193           'embankment': true
22194       }
22195   };
22196
22197   var wikibooks = [
22198       [
22199           "Afrikaans",
22200           "Afrikaans",
22201           "af"
22202       ],
22203       [
22204           "Arabic",
22205           "العربية",
22206           "ar"
22207       ],
22208       [
22209           "Azerbaijani",
22210           "azərbaycanca",
22211           "az"
22212       ],
22213       [
22214           "Belarusian",
22215           "беларуская",
22216           "be"
22217       ],
22218       [
22219           "Bulgarian",
22220           "български",
22221           "bg"
22222       ],
22223       [
22224           "Bangla",
22225           "বাংলা",
22226           "bn"
22227       ],
22228       [
22229           "Bosnian",
22230           "bosanski",
22231           "bs"
22232       ],
22233       [
22234           "Catalan",
22235           "català",
22236           "ca"
22237       ],
22238       [
22239           "Czech",
22240           "čeština",
22241           "cs"
22242       ],
22243       [
22244           "Chuvash",
22245           "Чӑвашла",
22246           "cv"
22247       ],
22248       [
22249           "Welsh",
22250           "Cymraeg",
22251           "cy"
22252       ],
22253       [
22254           "Danish",
22255           "dansk",
22256           "da"
22257       ],
22258       [
22259           "German",
22260           "Deutsch",
22261           "de"
22262       ],
22263       [
22264           "Greek",
22265           "Ελληνικά",
22266           "el"
22267       ],
22268       [
22269           "English",
22270           "English",
22271           "en"
22272       ],
22273       [
22274           "Esperanto",
22275           "Esperanto",
22276           "eo"
22277       ],
22278       [
22279           "Spanish",
22280           "español",
22281           "es"
22282       ],
22283       [
22284           "Estonian",
22285           "eesti",
22286           "et"
22287       ],
22288       [
22289           "Basque",
22290           "euskara",
22291           "eu"
22292       ],
22293       [
22294           "Persian",
22295           "فارسی",
22296           "fa"
22297       ],
22298       [
22299           "Finnish",
22300           "suomi",
22301           "fi"
22302       ],
22303       [
22304           "French",
22305           "français",
22306           "fr"
22307       ],
22308       [
22309           "Western Frisian",
22310           "Frysk",
22311           "fy"
22312       ],
22313       [
22314           "Galician",
22315           "galego",
22316           "gl"
22317       ],
22318       [
22319           "Hebrew",
22320           "עברית",
22321           "he"
22322       ],
22323       [
22324           "Hindi",
22325           "हिन्दी",
22326           "hi"
22327       ],
22328       [
22329           "Croatian",
22330           "hrvatski",
22331           "hr"
22332       ],
22333       [
22334           "Hungarian",
22335           "magyar",
22336           "hu"
22337       ],
22338       [
22339           "Armenian",
22340           "Հայերեն",
22341           "hy"
22342       ],
22343       [
22344           "Interlingua",
22345           "interlingua",
22346           "ia"
22347       ],
22348       [
22349           "Indonesian",
22350           "Bahasa Indonesia",
22351           "id"
22352       ],
22353       [
22354           "Icelandic",
22355           "íslenska",
22356           "is"
22357       ],
22358       [
22359           "Italian",
22360           "italiano",
22361           "it"
22362       ],
22363       [
22364           "Japanese",
22365           "日本語",
22366           "ja"
22367       ],
22368       [
22369           "Georgian",
22370           "ქართული",
22371           "ka"
22372       ],
22373       [
22374           "Kazakh",
22375           "қазақша",
22376           "kk"
22377       ],
22378       [
22379           "Khmer",
22380           "ភាសាខ្មែរ",
22381           "km"
22382       ],
22383       [
22384           "Korean",
22385           "한국어",
22386           "ko"
22387       ],
22388       [
22389           "Kurdish",
22390           "Kurdî",
22391           "ku"
22392       ],
22393       [
22394           "Kyrgyz",
22395           "Кыргызча",
22396           "ky"
22397       ],
22398       [
22399           "Latin",
22400           "Latina",
22401           "la"
22402       ],
22403       [
22404           "Limburgish",
22405           "Limburgs",
22406           "li"
22407       ],
22408       [
22409           "Lithuanian",
22410           "lietuvių",
22411           "lt"
22412       ],
22413       [
22414           "Malagasy",
22415           "Malagasy",
22416           "mg"
22417       ],
22418       [
22419           "Macedonian",
22420           "македонски",
22421           "mk"
22422       ],
22423       [
22424           "Malayalam",
22425           "മലയാളം",
22426           "ml"
22427       ],
22428       [
22429           "Marathi",
22430           "मराठी",
22431           "mr"
22432       ],
22433       [
22434           "Malay",
22435           "Bahasa Melayu",
22436           "ms"
22437       ],
22438       [
22439           "Nepali",
22440           "नेपाली",
22441           "ne"
22442       ],
22443       [
22444           "Dutch",
22445           "Nederlands",
22446           "nl"
22447       ],
22448       [
22449           "Norwegian",
22450           "norsk bokmål",
22451           "no"
22452       ],
22453       [
22454           "Occitan",
22455           "occitan",
22456           "oc"
22457       ],
22458       [
22459           "Punjabi",
22460           "ਪੰਜਾਬੀ",
22461           "pa"
22462       ],
22463       [
22464           "Polish",
22465           "polski",
22466           "pl"
22467       ],
22468       [
22469           "Portuguese",
22470           "português",
22471           "pt"
22472       ],
22473       [
22474           "Romanian",
22475           "română",
22476           "ro"
22477       ],
22478       [
22479           "Russian",
22480           "русский",
22481           "ru"
22482       ],
22483       [
22484           "Sanskrit",
22485           "संस्कृतम्",
22486           "sa"
22487       ],
22488       [
22489           "Sinhala",
22490           "සිංහල",
22491           "si"
22492       ],
22493       [
22494           "Slovak",
22495           "slovenčina",
22496           "sk"
22497       ],
22498       [
22499           "Slovenian",
22500           "slovenščina",
22501           "sl"
22502       ],
22503       [
22504           "Albanian",
22505           "shqip",
22506           "sq"
22507       ],
22508       [
22509           "Serbian",
22510           "српски / srpski",
22511           "sr"
22512       ],
22513       [
22514           "Swedish",
22515           "svenska",
22516           "sv"
22517       ],
22518       [
22519           "Tamil",
22520           "தமிழ்",
22521           "ta"
22522       ],
22523       [
22524           "Telugu",
22525           "తెలుగు",
22526           "te"
22527       ],
22528       [
22529           "Tajik",
22530           "тоҷикӣ",
22531           "tg"
22532       ],
22533       [
22534           "Thai",
22535           "ไทย",
22536           "th"
22537       ],
22538       [
22539           "Tagalog",
22540           "Tagalog",
22541           "tl"
22542       ],
22543       [
22544           "Turkish",
22545           "Türkçe",
22546           "tr"
22547       ],
22548       [
22549           "Tatar",
22550           "татарча/tatarça",
22551           "tt"
22552       ],
22553       [
22554           "Ukrainian",
22555           "українська",
22556           "uk"
22557       ],
22558       [
22559           "Urdu",
22560           "اردو",
22561           "ur"
22562       ],
22563       [
22564           "Vietnamese",
22565           "Tiếng Việt",
22566           "vi"
22567       ],
22568       [
22569           "Chinese",
22570           "中文",
22571           "zh"
22572       ]
22573   ];
22574
22575   var wikibooks$1 = /*#__PURE__*/Object.freeze({
22576     default: wikibooks
22577   });
22578
22579   var wikinews = [
22580       [
22581           "Arabic",
22582           "العربية",
22583           "ar"
22584       ],
22585       [
22586           "Bulgarian",
22587           "български",
22588           "bg"
22589       ],
22590       [
22591           "Bosnian",
22592           "bosanski",
22593           "bs"
22594       ],
22595       [
22596           "Catalan",
22597           "català",
22598           "ca"
22599       ],
22600       [
22601           "Czech",
22602           "čeština",
22603           "cs"
22604       ],
22605       [
22606           "German",
22607           "Deutsch",
22608           "de"
22609       ],
22610       [
22611           "Greek",
22612           "Ελληνικά",
22613           "el"
22614       ],
22615       [
22616           "English",
22617           "English",
22618           "en"
22619       ],
22620       [
22621           "Esperanto",
22622           "Esperanto",
22623           "eo"
22624       ],
22625       [
22626           "Spanish",
22627           "español",
22628           "es"
22629       ],
22630       [
22631           "Persian",
22632           "فارسی",
22633           "fa"
22634       ],
22635       [
22636           "Finnish",
22637           "suomi",
22638           "fi"
22639       ],
22640       [
22641           "French",
22642           "français",
22643           "fr"
22644       ],
22645       [
22646           "Hebrew",
22647           "עברית",
22648           "he"
22649       ],
22650       [
22651           "Italian",
22652           "italiano",
22653           "it"
22654       ],
22655       [
22656           "Japanese",
22657           "日本語",
22658           "ja"
22659       ],
22660       [
22661           "Korean",
22662           "한국어",
22663           "ko"
22664       ],
22665       [
22666           "Norwegian",
22667           "norsk bokmål",
22668           "no"
22669       ],
22670       [
22671           "Polish",
22672           "polski",
22673           "pl"
22674       ],
22675       [
22676           "Portuguese",
22677           "português",
22678           "pt"
22679       ],
22680       [
22681           "Romanian",
22682           "română",
22683           "ro"
22684       ],
22685       [
22686           "Russian",
22687           "русский",
22688           "ru"
22689       ],
22690       [
22691           "Albanian",
22692           "shqip",
22693           "sq"
22694       ],
22695       [
22696           "Serbian",
22697           "српски / srpski",
22698           "sr"
22699       ],
22700       [
22701           "Swedish",
22702           "svenska",
22703           "sv"
22704       ],
22705       [
22706           "Tamil",
22707           "தமிழ்",
22708           "ta"
22709       ],
22710       [
22711           "Turkish",
22712           "Türkçe",
22713           "tr"
22714       ],
22715       [
22716           "Ukrainian",
22717           "українська",
22718           "uk"
22719       ],
22720       [
22721           "Chinese",
22722           "中文",
22723           "zh"
22724       ]
22725   ];
22726
22727   var wikinews$1 = /*#__PURE__*/Object.freeze({
22728     default: wikinews
22729   });
22730
22731   var wikiquote = [
22732       [
22733           "Afrikaans",
22734           "Afrikaans",
22735           "af"
22736       ],
22737       [
22738           "Arabic",
22739           "العربية",
22740           "ar"
22741       ],
22742       [
22743           "Azerbaijani",
22744           "azərbaycanca",
22745           "az"
22746       ],
22747       [
22748           "Belarusian",
22749           "беларуская",
22750           "be"
22751       ],
22752       [
22753           "Bulgarian",
22754           "български",
22755           "bg"
22756       ],
22757       [
22758           "Breton",
22759           "brezhoneg",
22760           "br"
22761       ],
22762       [
22763           "Bosnian",
22764           "bosanski",
22765           "bs"
22766       ],
22767       [
22768           "Catalan",
22769           "català",
22770           "ca"
22771       ],
22772       [
22773           "Czech",
22774           "čeština",
22775           "cs"
22776       ],
22777       [
22778           "Welsh",
22779           "Cymraeg",
22780           "cy"
22781       ],
22782       [
22783           "Danish",
22784           "dansk",
22785           "da"
22786       ],
22787       [
22788           "German",
22789           "Deutsch",
22790           "de"
22791       ],
22792       [
22793           "Greek",
22794           "Ελληνικά",
22795           "el"
22796       ],
22797       [
22798           "English",
22799           "English",
22800           "en"
22801       ],
22802       [
22803           "Esperanto",
22804           "Esperanto",
22805           "eo"
22806       ],
22807       [
22808           "Spanish",
22809           "español",
22810           "es"
22811       ],
22812       [
22813           "Estonian",
22814           "eesti",
22815           "et"
22816       ],
22817       [
22818           "Basque",
22819           "euskara",
22820           "eu"
22821       ],
22822       [
22823           "Persian",
22824           "فارسی",
22825           "fa"
22826       ],
22827       [
22828           "Finnish",
22829           "suomi",
22830           "fi"
22831       ],
22832       [
22833           "French",
22834           "français",
22835           "fr"
22836       ],
22837       [
22838           "Galician",
22839           "galego",
22840           "gl"
22841       ],
22842       [
22843           "Gujarati",
22844           "ગુજરાતી",
22845           "gu"
22846       ],
22847       [
22848           "Hebrew",
22849           "עברית",
22850           "he"
22851       ],
22852       [
22853           "Hindi",
22854           "हिन्दी",
22855           "hi"
22856       ],
22857       [
22858           "Croatian",
22859           "hrvatski",
22860           "hr"
22861       ],
22862       [
22863           "Hungarian",
22864           "magyar",
22865           "hu"
22866       ],
22867       [
22868           "Armenian",
22869           "Հայերեն",
22870           "hy"
22871       ],
22872       [
22873           "Indonesian",
22874           "Bahasa Indonesia",
22875           "id"
22876       ],
22877       [
22878           "Icelandic",
22879           "íslenska",
22880           "is"
22881       ],
22882       [
22883           "Italian",
22884           "italiano",
22885           "it"
22886       ],
22887       [
22888           "Japanese",
22889           "日本語",
22890           "ja"
22891       ],
22892       [
22893           "Georgian",
22894           "ქართული",
22895           "ka"
22896       ],
22897       [
22898           "Kannada",
22899           "ಕನ್ನಡ",
22900           "kn"
22901       ],
22902       [
22903           "Korean",
22904           "한국어",
22905           "ko"
22906       ],
22907       [
22908           "Kurdish",
22909           "Kurdî",
22910           "ku"
22911       ],
22912       [
22913           "Kyrgyz",
22914           "Кыргызча",
22915           "ky"
22916       ],
22917       [
22918           "Latin",
22919           "Latina",
22920           "la"
22921       ],
22922       [
22923           "Limburgish",
22924           "Limburgs",
22925           "li"
22926       ],
22927       [
22928           "Lithuanian",
22929           "lietuvių",
22930           "lt"
22931       ],
22932       [
22933           "Malayalam",
22934           "മലയാളം",
22935           "ml"
22936       ],
22937       [
22938           "Marathi",
22939           "मराठी",
22940           "mr"
22941       ],
22942       [
22943           "Dutch",
22944           "Nederlands",
22945           "nl"
22946       ],
22947       [
22948           "Norwegian Nynorsk",
22949           "norsk nynorsk",
22950           "nn"
22951       ],
22952       [
22953           "Norwegian",
22954           "norsk bokmål",
22955           "no"
22956       ],
22957       [
22958           "Polish",
22959           "polski",
22960           "pl"
22961       ],
22962       [
22963           "Portuguese",
22964           "português",
22965           "pt"
22966       ],
22967       [
22968           "Romanian",
22969           "română",
22970           "ro"
22971       ],
22972       [
22973           "Russian",
22974           "русский",
22975           "ru"
22976       ],
22977       [
22978           "Sanskrit",
22979           "संस्कृतम्",
22980           "sa"
22981       ],
22982       [
22983           "Slovak",
22984           "slovenčina",
22985           "sk"
22986       ],
22987       [
22988           "Slovenian",
22989           "slovenščina",
22990           "sl"
22991       ],
22992       [
22993           "Albanian",
22994           "shqip",
22995           "sq"
22996       ],
22997       [
22998           "Serbian",
22999           "српски / srpski",
23000           "sr"
23001       ],
23002       [
23003           "Sundanese",
23004           "Basa Sunda",
23005           "su"
23006       ],
23007       [
23008           "Swedish",
23009           "svenska",
23010           "sv"
23011       ],
23012       [
23013           "Tamil",
23014           "தமிழ்",
23015           "ta"
23016       ],
23017       [
23018           "Telugu",
23019           "తెలుగు",
23020           "te"
23021       ],
23022       [
23023           "Thai",
23024           "ไทย",
23025           "th"
23026       ],
23027       [
23028           "Turkish",
23029           "Türkçe",
23030           "tr"
23031       ],
23032       [
23033           "Ukrainian",
23034           "українська",
23035           "uk"
23036       ],
23037       [
23038           "Urdu",
23039           "اردو",
23040           "ur"
23041       ],
23042       [
23043           "Uzbek",
23044           "oʻzbekcha/ўзбекча",
23045           "uz"
23046       ],
23047       [
23048           "Vietnamese",
23049           "Tiếng Việt",
23050           "vi"
23051       ],
23052       [
23053           "Wolof",
23054           "Wolof",
23055           "wo"
23056       ],
23057       [
23058           "Chinese",
23059           "中文",
23060           "zh"
23061       ]
23062   ];
23063
23064   var wikiquote$1 = /*#__PURE__*/Object.freeze({
23065     default: wikiquote
23066   });
23067
23068   var wikiversity = [
23069       [
23070           "Arabic",
23071           "العربية",
23072           "ar"
23073       ],
23074       [
23075           "Czech",
23076           "čeština",
23077           "cs"
23078       ],
23079       [
23080           "German",
23081           "Deutsch",
23082           "de"
23083       ],
23084       [
23085           "Greek",
23086           "Ελληνικά",
23087           "el"
23088       ],
23089       [
23090           "English",
23091           "English",
23092           "en"
23093       ],
23094       [
23095           "Spanish",
23096           "español",
23097           "es"
23098       ],
23099       [
23100           "Finnish",
23101           "suomi",
23102           "fi"
23103       ],
23104       [
23105           "French",
23106           "français",
23107           "fr"
23108       ],
23109       [
23110           "Italian",
23111           "italiano",
23112           "it"
23113       ],
23114       [
23115           "Japanese",
23116           "日本語",
23117           "ja"
23118       ],
23119       [
23120           "Korean",
23121           "한국어",
23122           "ko"
23123       ],
23124       [
23125           "Portuguese",
23126           "português",
23127           "pt"
23128       ],
23129       [
23130           "Russian",
23131           "русский",
23132           "ru"
23133       ],
23134       [
23135           "Slovenian",
23136           "slovenščina",
23137           "sl"
23138       ],
23139       [
23140           "Swedish",
23141           "svenska",
23142           "sv"
23143       ]
23144   ];
23145
23146   var wikiversity$1 = /*#__PURE__*/Object.freeze({
23147     default: wikiversity
23148   });
23149
23150   var wikivoyage = [
23151       [
23152           "German",
23153           "Deutsch",
23154           "de"
23155       ],
23156       [
23157           "Greek",
23158           "Ελληνικά",
23159           "el"
23160       ],
23161       [
23162           "English",
23163           "English",
23164           "en"
23165       ],
23166       [
23167           "Spanish",
23168           "español",
23169           "es"
23170       ],
23171       [
23172           "Persian",
23173           "فارسی",
23174           "fa"
23175       ],
23176       [
23177           "Finnish",
23178           "suomi",
23179           "fi"
23180       ],
23181       [
23182           "French",
23183           "français",
23184           "fr"
23185       ],
23186       [
23187           "Hebrew",
23188           "עברית",
23189           "he"
23190       ],
23191       [
23192           "Italian",
23193           "italiano",
23194           "it"
23195       ],
23196       [
23197           "Dutch",
23198           "Nederlands",
23199           "nl"
23200       ],
23201       [
23202           "Polish",
23203           "polski",
23204           "pl"
23205       ],
23206       [
23207           "Portuguese",
23208           "português",
23209           "pt"
23210       ],
23211       [
23212           "Romanian",
23213           "română",
23214           "ro"
23215       ],
23216       [
23217           "Russian",
23218           "русский",
23219           "ru"
23220       ],
23221       [
23222           "Swedish",
23223           "svenska",
23224           "sv"
23225       ],
23226       [
23227           "Ukrainian",
23228           "українська",
23229           "uk"
23230       ],
23231       [
23232           "Vietnamese",
23233           "Tiếng Việt",
23234           "vi"
23235       ],
23236       [
23237           "Chinese",
23238           "中文",
23239           "zh"
23240       ]
23241   ];
23242
23243   var wikivoyage$1 = /*#__PURE__*/Object.freeze({
23244     default: wikivoyage
23245   });
23246
23247   var wiktionary = [
23248       [
23249           "Afrikaans",
23250           "Afrikaans",
23251           "af"
23252       ],
23253       [
23254           "Amharic",
23255           "አማርኛ",
23256           "am"
23257       ],
23258       [
23259           "Aragonese",
23260           "aragonés",
23261           "an"
23262       ],
23263       [
23264           "Old English",
23265           "Ænglisc",
23266           "ang"
23267       ],
23268       [
23269           "Arabic",
23270           "العربية",
23271           "ar"
23272       ],
23273       [
23274           "Asturian",
23275           "asturianu",
23276           "ast"
23277       ],
23278       [
23279           "Aymara",
23280           "Aymar aru",
23281           "ay"
23282       ],
23283       [
23284           "Azerbaijani",
23285           "azərbaycanca",
23286           "az"
23287       ],
23288       [
23289           "Belarusian",
23290           "беларуская",
23291           "be"
23292       ],
23293       [
23294           "Bulgarian",
23295           "български",
23296           "bg"
23297       ],
23298       [
23299           "Bangla",
23300           "বাংলা",
23301           "bn"
23302       ],
23303       [
23304           "Breton",
23305           "brezhoneg",
23306           "br"
23307       ],
23308       [
23309           "Bosnian",
23310           "bosanski",
23311           "bs"
23312       ],
23313       [
23314           "Catalan",
23315           "català",
23316           "ca"
23317       ],
23318       [
23319           "Cherokee",
23320           "ᏣᎳᎩ",
23321           "chr"
23322       ],
23323       [
23324           "Corsican",
23325           "corsu",
23326           "co"
23327       ],
23328       [
23329           "Czech",
23330           "čeština",
23331           "cs"
23332       ],
23333       [
23334           "Kashubian",
23335           "kaszëbsczi",
23336           "csb"
23337       ],
23338       [
23339           "Welsh",
23340           "Cymraeg",
23341           "cy"
23342       ],
23343       [
23344           "Danish",
23345           "dansk",
23346           "da"
23347       ],
23348       [
23349           "German",
23350           "Deutsch",
23351           "de"
23352       ],
23353       [
23354           "Divehi",
23355           "ދިވެހިބަސް",
23356           "dv"
23357       ],
23358       [
23359           "Greek",
23360           "Ελληνικά",
23361           "el"
23362       ],
23363       [
23364           "English",
23365           "English",
23366           "en"
23367       ],
23368       [
23369           "Esperanto",
23370           "Esperanto",
23371           "eo"
23372       ],
23373       [
23374           "Spanish",
23375           "español",
23376           "es"
23377       ],
23378       [
23379           "Estonian",
23380           "eesti",
23381           "et"
23382       ],
23383       [
23384           "Basque",
23385           "euskara",
23386           "eu"
23387       ],
23388       [
23389           "Persian",
23390           "فارسی",
23391           "fa"
23392       ],
23393       [
23394           "Finnish",
23395           "suomi",
23396           "fi"
23397       ],
23398       [
23399           "Fijian",
23400           "Na Vosa Vakaviti",
23401           "fj"
23402       ],
23403       [
23404           "Faroese",
23405           "føroyskt",
23406           "fo"
23407       ],
23408       [
23409           "French",
23410           "français",
23411           "fr"
23412       ],
23413       [
23414           "Western Frisian",
23415           "Frysk",
23416           "fy"
23417       ],
23418       [
23419           "Irish",
23420           "Gaeilge",
23421           "ga"
23422       ],
23423       [
23424           "Scottish Gaelic",
23425           "Gàidhlig",
23426           "gd"
23427       ],
23428       [
23429           "Galician",
23430           "galego",
23431           "gl"
23432       ],
23433       [
23434           "Guarani",
23435           "Avañe'ẽ",
23436           "gn"
23437       ],
23438       [
23439           "Gujarati",
23440           "ગુજરાતી",
23441           "gu"
23442       ],
23443       [
23444           "Manx",
23445           "Gaelg",
23446           "gv"
23447       ],
23448       [
23449           "Hausa",
23450           "Hausa",
23451           "ha"
23452       ],
23453       [
23454           "Hebrew",
23455           "עברית",
23456           "he"
23457       ],
23458       [
23459           "Hindi",
23460           "हिन्दी",
23461           "hi"
23462       ],
23463       [
23464           "Croatian",
23465           "hrvatski",
23466           "hr"
23467       ],
23468       [
23469           "Upper Sorbian",
23470           "hornjoserbsce",
23471           "hsb"
23472       ],
23473       [
23474           "Hungarian",
23475           "magyar",
23476           "hu"
23477       ],
23478       [
23479           "Armenian",
23480           "Հայերեն",
23481           "hy"
23482       ],
23483       [
23484           "Interlingua",
23485           "interlingua",
23486           "ia"
23487       ],
23488       [
23489           "Indonesian",
23490           "Bahasa Indonesia",
23491           "id"
23492       ],
23493       [
23494           "Interlingue",
23495           "Interlingue",
23496           "ie"
23497       ],
23498       [
23499           "Ido",
23500           "Ido",
23501           "io"
23502       ],
23503       [
23504           "Icelandic",
23505           "íslenska",
23506           "is"
23507       ],
23508       [
23509           "Italian",
23510           "italiano",
23511           "it"
23512       ],
23513       [
23514           "Inuktitut",
23515           "ᐃᓄᒃᑎᑐᑦ/inuktitut",
23516           "iu"
23517       ],
23518       [
23519           "Japanese",
23520           "日本語",
23521           "ja"
23522       ],
23523       [
23524           "Lojban",
23525           "la .lojban.",
23526           "jbo"
23527       ],
23528       [
23529           "Javanese",
23530           "Basa Jawa",
23531           "jv"
23532       ],
23533       [
23534           "Georgian",
23535           "ქართული",
23536           "ka"
23537       ],
23538       [
23539           "Kazakh",
23540           "қазақша",
23541           "kk"
23542       ],
23543       [
23544           "Kalaallisut",
23545           "kalaallisut",
23546           "kl"
23547       ],
23548       [
23549           "Khmer",
23550           "ភាសាខ្មែរ",
23551           "km"
23552       ],
23553       [
23554           "Kannada",
23555           "ಕನ್ನಡ",
23556           "kn"
23557       ],
23558       [
23559           "Korean",
23560           "한국어",
23561           "ko"
23562       ],
23563       [
23564           "Kashmiri",
23565           "कॉशुर / کٲشُر",
23566           "ks"
23567       ],
23568       [
23569           "Kurdish",
23570           "Kurdî",
23571           "ku"
23572       ],
23573       [
23574           "Cornish",
23575           "kernowek",
23576           "kw"
23577       ],
23578       [
23579           "Kyrgyz",
23580           "Кыргызча",
23581           "ky"
23582       ],
23583       [
23584           "Latin",
23585           "Latina",
23586           "la"
23587       ],
23588       [
23589           "Luxembourgish",
23590           "Lëtzebuergesch",
23591           "lb"
23592       ],
23593       [
23594           "Limburgish",
23595           "Limburgs",
23596           "li"
23597       ],
23598       [
23599           "Lingala",
23600           "lingála",
23601           "ln"
23602       ],
23603       [
23604           "Lao",
23605           "ລາວ",
23606           "lo"
23607       ],
23608       [
23609           "Lithuanian",
23610           "lietuvių",
23611           "lt"
23612       ],
23613       [
23614           "Latvian",
23615           "latviešu",
23616           "lv"
23617       ],
23618       [
23619           "Malagasy",
23620           "Malagasy",
23621           "mg"
23622       ],
23623       [
23624           "Maori",
23625           "Māori",
23626           "mi"
23627       ],
23628       [
23629           "Macedonian",
23630           "македонски",
23631           "mk"
23632       ],
23633       [
23634           "Malayalam",
23635           "മലയാളം",
23636           "ml"
23637       ],
23638       [
23639           "Mongolian",
23640           "монгол",
23641           "mn"
23642       ],
23643       [
23644           "Marathi",
23645           "मराठी",
23646           "mr"
23647       ],
23648       [
23649           "Malay",
23650           "Bahasa Melayu",
23651           "ms"
23652       ],
23653       [
23654           "Maltese",
23655           "Malti",
23656           "mt"
23657       ],
23658       [
23659           "Burmese",
23660           "မြန်မာဘာသာ",
23661           "my"
23662       ],
23663       [
23664           "Nauru",
23665           "Dorerin Naoero",
23666           "na"
23667       ],
23668       [
23669           "Nāhuatl",
23670           "Nāhuatl",
23671           "nah"
23672       ],
23673       [
23674           "Low German",
23675           "Plattdüütsch",
23676           "nds"
23677       ],
23678       [
23679           "Nepali",
23680           "नेपाली",
23681           "ne"
23682       ],
23683       [
23684           "Dutch",
23685           "Nederlands",
23686           "nl"
23687       ],
23688       [
23689           "Norwegian Nynorsk",
23690           "norsk nynorsk",
23691           "nn"
23692       ],
23693       [
23694           "Norwegian",
23695           "norsk bokmål",
23696           "no"
23697       ],
23698       [
23699           "Occitan",
23700           "occitan",
23701           "oc"
23702       ],
23703       [
23704           "Oromo",
23705           "Oromoo",
23706           "om"
23707       ],
23708       [
23709           "Odia",
23710           "ଓଡ଼ିଆ",
23711           "or"
23712       ],
23713       [
23714           "Punjabi",
23715           "ਪੰਜਾਬੀ",
23716           "pa"
23717       ],
23718       [
23719           "Polish",
23720           "polski",
23721           "pl"
23722       ],
23723       [
23724           "Western Punjabi",
23725           "پنجابی",
23726           "pnb"
23727       ],
23728       [
23729           "Pashto",
23730           "پښتو",
23731           "ps"
23732       ],
23733       [
23734           "Portuguese",
23735           "português",
23736           "pt"
23737       ],
23738       [
23739           "Quechua",
23740           "Runa Simi",
23741           "qu"
23742       ],
23743       [
23744           "Romanian",
23745           "română",
23746           "ro"
23747       ],
23748       [
23749           "Aromanian",
23750           "armãneashti",
23751           "roa-rup"
23752       ],
23753       [
23754           "Russian",
23755           "русский",
23756           "ru"
23757       ],
23758       [
23759           "Kinyarwanda",
23760           "Kinyarwanda",
23761           "rw"
23762       ],
23763       [
23764           "Sanskrit",
23765           "संस्कृतम्",
23766           "sa"
23767       ],
23768       [
23769           "Sicilian",
23770           "sicilianu",
23771           "scn"
23772       ],
23773       [
23774           "Sindhi",
23775           "سنڌي",
23776           "sd"
23777       ],
23778       [
23779           "Sango",
23780           "Sängö",
23781           "sg"
23782       ],
23783       [
23784           "Serbo-Croatian",
23785           "srpskohrvatski / српскохрватски",
23786           "sh"
23787       ],
23788       [
23789           "Sinhala",
23790           "සිංහල",
23791           "si"
23792       ],
23793       [
23794           "Simple English",
23795           "Simple English",
23796           "simple"
23797       ],
23798       [
23799           "Slovak",
23800           "slovenčina",
23801           "sk"
23802       ],
23803       [
23804           "Slovenian",
23805           "slovenščina",
23806           "sl"
23807       ],
23808       [
23809           "Samoan",
23810           "Gagana Samoa",
23811           "sm"
23812       ],
23813       [
23814           "Somali",
23815           "Soomaaliga",
23816           "so"
23817       ],
23818       [
23819           "Albanian",
23820           "shqip",
23821           "sq"
23822       ],
23823       [
23824           "Serbian",
23825           "српски / srpski",
23826           "sr"
23827       ],
23828       [
23829           "Swati",
23830           "SiSwati",
23831           "ss"
23832       ],
23833       [
23834           "Southern Sotho",
23835           "Sesotho",
23836           "st"
23837       ],
23838       [
23839           "Sundanese",
23840           "Basa Sunda",
23841           "su"
23842       ],
23843       [
23844           "Swedish",
23845           "svenska",
23846           "sv"
23847       ],
23848       [
23849           "Swahili",
23850           "Kiswahili",
23851           "sw"
23852       ],
23853       [
23854           "Tamil",
23855           "தமிழ்",
23856           "ta"
23857       ],
23858       [
23859           "Telugu",
23860           "తెలుగు",
23861           "te"
23862       ],
23863       [
23864           "Tajik",
23865           "тоҷикӣ",
23866           "tg"
23867       ],
23868       [
23869           "Thai",
23870           "ไทย",
23871           "th"
23872       ],
23873       [
23874           "Tigrinya",
23875           "ትግርኛ",
23876           "ti"
23877       ],
23878       [
23879           "Turkmen",
23880           "Türkmençe",
23881           "tk"
23882       ],
23883       [
23884           "Tagalog",
23885           "Tagalog",
23886           "tl"
23887       ],
23888       [
23889           "Tswana",
23890           "Setswana",
23891           "tn"
23892       ],
23893       [
23894           "Tok Pisin",
23895           "Tok Pisin",
23896           "tpi"
23897       ],
23898       [
23899           "Turkish",
23900           "Türkçe",
23901           "tr"
23902       ],
23903       [
23904           "Tsonga",
23905           "Xitsonga",
23906           "ts"
23907       ],
23908       [
23909           "Tatar",
23910           "татарча/tatarça",
23911           "tt"
23912       ],
23913       [
23914           "Uyghur",
23915           "ئۇيغۇرچە / Uyghurche",
23916           "ug"
23917       ],
23918       [
23919           "Ukrainian",
23920           "українська",
23921           "uk"
23922       ],
23923       [
23924           "Urdu",
23925           "اردو",
23926           "ur"
23927       ],
23928       [
23929           "Uzbek",
23930           "oʻzbekcha/ўзбекча",
23931           "uz"
23932       ],
23933       [
23934           "Venetian",
23935           "vèneto",
23936           "vec"
23937       ],
23938       [
23939           "Vietnamese",
23940           "Tiếng Việt",
23941           "vi"
23942       ],
23943       [
23944           "Volapük",
23945           "Volapük",
23946           "vo"
23947       ],
23948       [
23949           "Walloon",
23950           "walon",
23951           "wa"
23952       ],
23953       [
23954           "Wolof",
23955           "Wolof",
23956           "wo"
23957       ],
23958       [
23959           "Yiddish",
23960           "ייִדיש",
23961           "yi"
23962       ],
23963       [
23964           "Chinese",
23965           "中文",
23966           "zh"
23967       ],
23968       [
23969           "Chinese (Min Nan)",
23970           "Bân-lâm-gú",
23971           "zh-min-nan"
23972       ],
23973       [
23974           "Zulu",
23975           "isiZulu",
23976           "zu"
23977       ]
23978   ];
23979
23980   var wiktionary$1 = /*#__PURE__*/Object.freeze({
23981     default: wiktionary
23982   });
23983
23984   var wikipedia = [
23985       [
23986           "Abkhazian",
23987           "Аҧсшәа",
23988           "ab"
23989       ],
23990       [
23991           "Achinese",
23992           "Acèh",
23993           "ace"
23994       ],
23995       [
23996           "Adyghe",
23997           "адыгабзэ",
23998           "ady"
23999       ],
24000       [
24001           "Afrikaans",
24002           "Afrikaans",
24003           "af"
24004       ],
24005       [
24006           "Akan",
24007           "Akan",
24008           "ak"
24009       ],
24010       [
24011           "Alemannisch",
24012           "Alemannisch",
24013           "als"
24014       ],
24015       [
24016           "Amharic",
24017           "አማርኛ",
24018           "am"
24019       ],
24020       [
24021           "Aragonese",
24022           "aragonés",
24023           "an"
24024       ],
24025       [
24026           "Old English",
24027           "Ænglisc",
24028           "ang"
24029       ],
24030       [
24031           "Arabic",
24032           "العربية",
24033           "ar"
24034       ],
24035       [
24036           "Aramaic",
24037           "ܐܪܡܝܐ",
24038           "arc"
24039       ],
24040       [
24041           "Egyptian Arabic",
24042           "مصرى",
24043           "arz"
24044       ],
24045       [
24046           "Assamese",
24047           "অসমীয়া",
24048           "as"
24049       ],
24050       [
24051           "Asturian",
24052           "asturianu",
24053           "ast"
24054       ],
24055       [
24056           "Avaric",
24057           "авар",
24058           "av"
24059       ],
24060       [
24061           "Aymara",
24062           "Aymar aru",
24063           "ay"
24064       ],
24065       [
24066           "Azerbaijani",
24067           "azərbaycanca",
24068           "az"
24069       ],
24070       [
24071           "تۆرکجه",
24072           "تۆرکجه",
24073           "azb"
24074       ],
24075       [
24076           "Bashkir",
24077           "башҡортса",
24078           "ba"
24079       ],
24080       [
24081           "Bavarian",
24082           "Boarisch",
24083           "bar"
24084       ],
24085       [
24086           "Samogitian",
24087           "žemaitėška",
24088           "bat-smg"
24089       ],
24090       [
24091           "Bikol Central",
24092           "Bikol Central",
24093           "bcl"
24094       ],
24095       [
24096           "Belarusian",
24097           "беларуская",
24098           "be"
24099       ],
24100       [
24101           "беларуская (тарашкевіца)‎",
24102           "беларуская (тарашкевіца)‎",
24103           "be-x-old"
24104       ],
24105       [
24106           "Bulgarian",
24107           "български",
24108           "bg"
24109       ],
24110       [
24111           "भोजपुरी",
24112           "भोजपुरी",
24113           "bh"
24114       ],
24115       [
24116           "Bislama",
24117           "Bislama",
24118           "bi"
24119       ],
24120       [
24121           "Banjar",
24122           "Bahasa Banjar",
24123           "bjn"
24124       ],
24125       [
24126           "Bambara",
24127           "bamanankan",
24128           "bm"
24129       ],
24130       [
24131           "Bangla",
24132           "বাংলা",
24133           "bn"
24134       ],
24135       [
24136           "Tibetan",
24137           "བོད་ཡིག",
24138           "bo"
24139       ],
24140       [
24141           "Bishnupriya",
24142           "বিষ্ণুপ্রিয়া মণিপুরী",
24143           "bpy"
24144       ],
24145       [
24146           "Breton",
24147           "brezhoneg",
24148           "br"
24149       ],
24150       [
24151           "Bosnian",
24152           "bosanski",
24153           "bs"
24154       ],
24155       [
24156           "Buginese",
24157           "ᨅᨔ ᨕᨘᨁᨗ",
24158           "bug"
24159       ],
24160       [
24161           "буряад",
24162           "буряад",
24163           "bxr"
24164       ],
24165       [
24166           "Catalan",
24167           "català",
24168           "ca"
24169       ],
24170       [
24171           "Chavacano de Zamboanga",
24172           "Chavacano de Zamboanga",
24173           "cbk-zam"
24174       ],
24175       [
24176           "Min Dong Chinese",
24177           "Mìng-dĕ̤ng-ngṳ̄",
24178           "cdo"
24179       ],
24180       [
24181           "Chechen",
24182           "нохчийн",
24183           "ce"
24184       ],
24185       [
24186           "Cebuano",
24187           "Cebuano",
24188           "ceb"
24189       ],
24190       [
24191           "Chamorro",
24192           "Chamoru",
24193           "ch"
24194       ],
24195       [
24196           "Cherokee",
24197           "ᏣᎳᎩ",
24198           "chr"
24199       ],
24200       [
24201           "Cheyenne",
24202           "Tsetsêhestâhese",
24203           "chy"
24204       ],
24205       [
24206           "Central Kurdish",
24207           "کوردیی ناوەندی",
24208           "ckb"
24209       ],
24210       [
24211           "Corsican",
24212           "corsu",
24213           "co"
24214       ],
24215       [
24216           "Cree",
24217           "Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ",
24218           "cr"
24219       ],
24220       [
24221           "Crimean Turkish",
24222           "qırımtatarca",
24223           "crh"
24224       ],
24225       [
24226           "Czech",
24227           "čeština",
24228           "cs"
24229       ],
24230       [
24231           "Kashubian",
24232           "kaszëbsczi",
24233           "csb"
24234       ],
24235       [
24236           "Church Slavic",
24237           "словѣньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ",
24238           "cu"
24239       ],
24240       [
24241           "Chuvash",
24242           "Чӑвашла",
24243           "cv"
24244       ],
24245       [
24246           "Welsh",
24247           "Cymraeg",
24248           "cy"
24249       ],
24250       [
24251           "Danish",
24252           "dansk",
24253           "da"
24254       ],
24255       [
24256           "German",
24257           "Deutsch",
24258           "de"
24259       ],
24260       [
24261           "Zazaki",
24262           "Zazaki",
24263           "diq"
24264       ],
24265       [
24266           "Lower Sorbian",
24267           "dolnoserbski",
24268           "dsb"
24269       ],
24270       [
24271           "Divehi",
24272           "ދިވެހިބަސް",
24273           "dv"
24274       ],
24275       [
24276           "Dzongkha",
24277           "ཇོང་ཁ",
24278           "dz"
24279       ],
24280       [
24281           "Ewe",
24282           "eʋegbe",
24283           "ee"
24284       ],
24285       [
24286           "Greek",
24287           "Ελληνικά",
24288           "el"
24289       ],
24290       [
24291           "Emiliano-Romagnolo",
24292           "emiliàn e rumagnòl",
24293           "eml"
24294       ],
24295       [
24296           "English",
24297           "English",
24298           "en"
24299       ],
24300       [
24301           "Esperanto",
24302           "Esperanto",
24303           "eo"
24304       ],
24305       [
24306           "Spanish",
24307           "español",
24308           "es"
24309       ],
24310       [
24311           "Estonian",
24312           "eesti",
24313           "et"
24314       ],
24315       [
24316           "Basque",
24317           "euskara",
24318           "eu"
24319       ],
24320       [
24321           "Extremaduran",
24322           "estremeñu",
24323           "ext"
24324       ],
24325       [
24326           "Persian",
24327           "فارسی",
24328           "fa"
24329       ],
24330       [
24331           "Fulah",
24332           "Fulfulde",
24333           "ff"
24334       ],
24335       [
24336           "Finnish",
24337           "suomi",
24338           "fi"
24339       ],
24340       [
24341           "Võro",
24342           "Võro",
24343           "fiu-vro"
24344       ],
24345       [
24346           "Fijian",
24347           "Na Vosa Vakaviti",
24348           "fj"
24349       ],
24350       [
24351           "Faroese",
24352           "føroyskt",
24353           "fo"
24354       ],
24355       [
24356           "French",
24357           "français",
24358           "fr"
24359       ],
24360       [
24361           "Arpitan",
24362           "arpetan",
24363           "frp"
24364       ],
24365       [
24366           "Northern Frisian",
24367           "Nordfriisk",
24368           "frr"
24369       ],
24370       [
24371           "Friulian",
24372           "furlan",
24373           "fur"
24374       ],
24375       [
24376           "Western Frisian",
24377           "Frysk",
24378           "fy"
24379       ],
24380       [
24381           "Irish",
24382           "Gaeilge",
24383           "ga"
24384       ],
24385       [
24386           "Gagauz",
24387           "Gagauz",
24388           "gag"
24389       ],
24390       [
24391           "Gan Chinese",
24392           "贛語",
24393           "gan"
24394       ],
24395       [
24396           "Scottish Gaelic",
24397           "Gàidhlig",
24398           "gd"
24399       ],
24400       [
24401           "Galician",
24402           "galego",
24403           "gl"
24404       ],
24405       [
24406           "Gilaki",
24407           "گیلکی",
24408           "glk"
24409       ],
24410       [
24411           "Guarani",
24412           "Avañe'ẽ",
24413           "gn"
24414       ],
24415       [
24416           "Goan Konkani",
24417           "गोंयची कोंकणी / Gõychi Konknni",
24418           "gom"
24419       ],
24420       [
24421           "Gothic",
24422           "𐌲𐌿𐍄𐌹𐍃𐌺",
24423           "got"
24424       ],
24425       [
24426           "Gujarati",
24427           "ગુજરાતી",
24428           "gu"
24429       ],
24430       [
24431           "Manx",
24432           "Gaelg",
24433           "gv"
24434       ],
24435       [
24436           "Hausa",
24437           "Hausa",
24438           "ha"
24439       ],
24440       [
24441           "Hakka Chinese",
24442           "客家語/Hak-kâ-ngî",
24443           "hak"
24444       ],
24445       [
24446           "Hawaiian",
24447           "Hawaiʻi",
24448           "haw"
24449       ],
24450       [
24451           "Hebrew",
24452           "עברית",
24453           "he"
24454       ],
24455       [
24456           "Hindi",
24457           "हिन्दी",
24458           "hi"
24459       ],
24460       [
24461           "Fiji Hindi",
24462           "Fiji Hindi",
24463           "hif"
24464       ],
24465       [
24466           "Croatian",
24467           "hrvatski",
24468           "hr"
24469       ],
24470       [
24471           "Upper Sorbian",
24472           "hornjoserbsce",
24473           "hsb"
24474       ],
24475       [
24476           "Haitian Creole",
24477           "Kreyòl ayisyen",
24478           "ht"
24479       ],
24480       [
24481           "Hungarian",
24482           "magyar",
24483           "hu"
24484       ],
24485       [
24486           "Armenian",
24487           "Հայերեն",
24488           "hy"
24489       ],
24490       [
24491           "Interlingua",
24492           "interlingua",
24493           "ia"
24494       ],
24495       [
24496           "Indonesian",
24497           "Bahasa Indonesia",
24498           "id"
24499       ],
24500       [
24501           "Interlingue",
24502           "Interlingue",
24503           "ie"
24504       ],
24505       [
24506           "Igbo",
24507           "Igbo",
24508           "ig"
24509       ],
24510       [
24511           "Inupiaq",
24512           "Iñupiak",
24513           "ik"
24514       ],
24515       [
24516           "Iloko",
24517           "Ilokano",
24518           "ilo"
24519       ],
24520       [
24521           "Ido",
24522           "Ido",
24523           "io"
24524       ],
24525       [
24526           "Icelandic",
24527           "íslenska",
24528           "is"
24529       ],
24530       [
24531           "Italian",
24532           "italiano",
24533           "it"
24534       ],
24535       [
24536           "Inuktitut",
24537           "ᐃᓄᒃᑎᑐᑦ/inuktitut",
24538           "iu"
24539       ],
24540       [
24541           "Japanese",
24542           "日本語",
24543           "ja"
24544       ],
24545       [
24546           "Jamaican Creole English",
24547           "Patois",
24548           "jam"
24549       ],
24550       [
24551           "Lojban",
24552           "la .lojban.",
24553           "jbo"
24554       ],
24555       [
24556           "Javanese",
24557           "Basa Jawa",
24558           "jv"
24559       ],
24560       [
24561           "Georgian",
24562           "ქართული",
24563           "ka"
24564       ],
24565       [
24566           "Kara-Kalpak",
24567           "Qaraqalpaqsha",
24568           "kaa"
24569       ],
24570       [
24571           "Kabyle",
24572           "Taqbaylit",
24573           "kab"
24574       ],
24575       [
24576           "Kabardian",
24577           "Адыгэбзэ",
24578           "kbd"
24579       ],
24580       [
24581           "Kongo",
24582           "Kongo",
24583           "kg"
24584       ],
24585       [
24586           "Kikuyu",
24587           "Gĩkũyũ",
24588           "ki"
24589       ],
24590       [
24591           "Kazakh",
24592           "қазақша",
24593           "kk"
24594       ],
24595       [
24596           "Kalaallisut",
24597           "kalaallisut",
24598           "kl"
24599       ],
24600       [
24601           "Khmer",
24602           "ភាសាខ្មែរ",
24603           "km"
24604       ],
24605       [
24606           "Kannada",
24607           "ಕನ್ನಡ",
24608           "kn"
24609       ],
24610       [
24611           "Korean",
24612           "한국어",
24613           "ko"
24614       ],
24615       [
24616           "Komi-Permyak",
24617           "Перем Коми",
24618           "koi"
24619       ],
24620       [
24621           "Karachay-Balkar",
24622           "къарачай-малкъар",
24623           "krc"
24624       ],
24625       [
24626           "Kashmiri",
24627           "कॉशुर / کٲشُر",
24628           "ks"
24629       ],
24630       [
24631           "Colognian",
24632           "Ripoarisch",
24633           "ksh"
24634       ],
24635       [
24636           "Kurdish",
24637           "Kurdî",
24638           "ku"
24639       ],
24640       [
24641           "Komi",
24642           "коми",
24643           "kv"
24644       ],
24645       [
24646           "Cornish",
24647           "kernowek",
24648           "kw"
24649       ],
24650       [
24651           "Kyrgyz",
24652           "Кыргызча",
24653           "ky"
24654       ],
24655       [
24656           "Latin",
24657           "Latina",
24658           "la"
24659       ],
24660       [
24661           "Ladino",
24662           "Ladino",
24663           "lad"
24664       ],
24665       [
24666           "Luxembourgish",
24667           "Lëtzebuergesch",
24668           "lb"
24669       ],
24670       [
24671           "лакку",
24672           "лакку",
24673           "lbe"
24674       ],
24675       [
24676           "Lezghian",
24677           "лезги",
24678           "lez"
24679       ],
24680       [
24681           "Ganda",
24682           "Luganda",
24683           "lg"
24684       ],
24685       [
24686           "Limburgish",
24687           "Limburgs",
24688           "li"
24689       ],
24690       [
24691           "Ligurian",
24692           "Ligure",
24693           "lij"
24694       ],
24695       [
24696           "Lombard",
24697           "lumbaart",
24698           "lmo"
24699       ],
24700       [
24701           "Lingala",
24702           "lingála",
24703           "ln"
24704       ],
24705       [
24706           "Lao",
24707           "ລາວ",
24708           "lo"
24709       ],
24710       [
24711           "Northern Luri",
24712           "لۊری شومالی",
24713           "lrc"
24714       ],
24715       [
24716           "Lithuanian",
24717           "lietuvių",
24718           "lt"
24719       ],
24720       [
24721           "Latgalian",
24722           "latgaļu",
24723           "ltg"
24724       ],
24725       [
24726           "Latvian",
24727           "latviešu",
24728           "lv"
24729       ],
24730       [
24731           "Maithili",
24732           "मैथिली",
24733           "mai"
24734       ],
24735       [
24736           "Basa Banyumasan",
24737           "Basa Banyumasan",
24738           "map-bms"
24739       ],
24740       [
24741           "Moksha",
24742           "мокшень",
24743           "mdf"
24744       ],
24745       [
24746           "Malagasy",
24747           "Malagasy",
24748           "mg"
24749       ],
24750       [
24751           "Eastern Mari",
24752           "олык марий",
24753           "mhr"
24754       ],
24755       [
24756           "Maori",
24757           "Māori",
24758           "mi"
24759       ],
24760       [
24761           "Minangkabau",
24762           "Baso Minangkabau",
24763           "min"
24764       ],
24765       [
24766           "Macedonian",
24767           "македонски",
24768           "mk"
24769       ],
24770       [
24771           "Malayalam",
24772           "മലയാളം",
24773           "ml"
24774       ],
24775       [
24776           "Mongolian",
24777           "монгол",
24778           "mn"
24779       ],
24780       [
24781           "Marathi",
24782           "मराठी",
24783           "mr"
24784       ],
24785       [
24786           "Western Mari",
24787           "кырык мары",
24788           "mrj"
24789       ],
24790       [
24791           "Malay",
24792           "Bahasa Melayu",
24793           "ms"
24794       ],
24795       [
24796           "Maltese",
24797           "Malti",
24798           "mt"
24799       ],
24800       [
24801           "Mirandese",
24802           "Mirandés",
24803           "mwl"
24804       ],
24805       [
24806           "Burmese",
24807           "မြန်မာဘာသာ",
24808           "my"
24809       ],
24810       [
24811           "Erzya",
24812           "эрзянь",
24813           "myv"
24814       ],
24815       [
24816           "Mazanderani",
24817           "مازِرونی",
24818           "mzn"
24819       ],
24820       [
24821           "Nauru",
24822           "Dorerin Naoero",
24823           "na"
24824       ],
24825       [
24826           "Nāhuatl",
24827           "Nāhuatl",
24828           "nah"
24829       ],
24830       [
24831           "Neapolitan",
24832           "Napulitano",
24833           "nap"
24834       ],
24835       [
24836           "Low German",
24837           "Plattdüütsch",
24838           "nds"
24839       ],
24840       [
24841           "Low Saxon",
24842           "Nedersaksies",
24843           "nds-nl"
24844       ],
24845       [
24846           "Nepali",
24847           "नेपाली",
24848           "ne"
24849       ],
24850       [
24851           "Newari",
24852           "नेपाल भाषा",
24853           "new"
24854       ],
24855       [
24856           "Dutch",
24857           "Nederlands",
24858           "nl"
24859       ],
24860       [
24861           "Norwegian Nynorsk",
24862           "norsk nynorsk",
24863           "nn"
24864       ],
24865       [
24866           "Norwegian",
24867           "norsk bokmål",
24868           "no"
24869       ],
24870       [
24871           "Novial",
24872           "Novial",
24873           "nov"
24874       ],
24875       [
24876           "Nouormand",
24877           "Nouormand",
24878           "nrm"
24879       ],
24880       [
24881           "Northern Sotho",
24882           "Sesotho sa Leboa",
24883           "nso"
24884       ],
24885       [
24886           "Navajo",
24887           "Diné bizaad",
24888           "nv"
24889       ],
24890       [
24891           "Nyanja",
24892           "Chi-Chewa",
24893           "ny"
24894       ],
24895       [
24896           "Occitan",
24897           "occitan",
24898           "oc"
24899       ],
24900       [
24901           "Livvi-Karelian",
24902           "Livvinkarjala",
24903           "olo"
24904       ],
24905       [
24906           "Oromo",
24907           "Oromoo",
24908           "om"
24909       ],
24910       [
24911           "Odia",
24912           "ଓଡ଼ିଆ",
24913           "or"
24914       ],
24915       [
24916           "Ossetic",
24917           "Ирон",
24918           "os"
24919       ],
24920       [
24921           "Punjabi",
24922           "ਪੰਜਾਬੀ",
24923           "pa"
24924       ],
24925       [
24926           "Pangasinan",
24927           "Pangasinan",
24928           "pag"
24929       ],
24930       [
24931           "Pampanga",
24932           "Kapampangan",
24933           "pam"
24934       ],
24935       [
24936           "Papiamento",
24937           "Papiamentu",
24938           "pap"
24939       ],
24940       [
24941           "Picard",
24942           "Picard",
24943           "pcd"
24944       ],
24945       [
24946           "Pennsylvania German",
24947           "Deitsch",
24948           "pdc"
24949       ],
24950       [
24951           "Palatine German",
24952           "Pälzisch",
24953           "pfl"
24954       ],
24955       [
24956           "Pali",
24957           "पालि",
24958           "pi"
24959       ],
24960       [
24961           "Norfuk / Pitkern",
24962           "Norfuk / Pitkern",
24963           "pih"
24964       ],
24965       [
24966           "Polish",
24967           "polski",
24968           "pl"
24969       ],
24970       [
24971           "Piedmontese",
24972           "Piemontèis",
24973           "pms"
24974       ],
24975       [
24976           "Western Punjabi",
24977           "پنجابی",
24978           "pnb"
24979       ],
24980       [
24981           "Pontic",
24982           "Ποντιακά",
24983           "pnt"
24984       ],
24985       [
24986           "Pashto",
24987           "پښتو",
24988           "ps"
24989       ],
24990       [
24991           "Portuguese",
24992           "português",
24993           "pt"
24994       ],
24995       [
24996           "Quechua",
24997           "Runa Simi",
24998           "qu"
24999       ],
25000       [
25001           "Romansh",
25002           "rumantsch",
25003           "rm"
25004       ],
25005       [
25006           "Romani",
25007           "Romani",
25008           "rmy"
25009       ],
25010       [
25011           "Rundi",
25012           "Kirundi",
25013           "rn"
25014       ],
25015       [
25016           "Romanian",
25017           "română",
25018           "ro"
25019       ],
25020       [
25021           "Aromanian",
25022           "armãneashti",
25023           "roa-rup"
25024       ],
25025       [
25026           "tarandíne",
25027           "tarandíne",
25028           "roa-tara"
25029       ],
25030       [
25031           "Russian",
25032           "русский",
25033           "ru"
25034       ],
25035       [
25036           "Rusyn",
25037           "русиньскый",
25038           "rue"
25039       ],
25040       [
25041           "Kinyarwanda",
25042           "Kinyarwanda",
25043           "rw"
25044       ],
25045       [
25046           "Sanskrit",
25047           "संस्कृतम्",
25048           "sa"
25049       ],
25050       [
25051           "Sakha",
25052           "саха тыла",
25053           "sah"
25054       ],
25055       [
25056           "Sardinian",
25057           "sardu",
25058           "sc"
25059       ],
25060       [
25061           "Sicilian",
25062           "sicilianu",
25063           "scn"
25064       ],
25065       [
25066           "Scots",
25067           "Scots",
25068           "sco"
25069       ],
25070       [
25071           "Sindhi",
25072           "سنڌي",
25073           "sd"
25074       ],
25075       [
25076           "Northern Sami",
25077           "sámegiella",
25078           "se"
25079       ],
25080       [
25081           "Sango",
25082           "Sängö",
25083           "sg"
25084       ],
25085       [
25086           "Serbo-Croatian",
25087           "srpskohrvatski / српскохрватски",
25088           "sh"
25089       ],
25090       [
25091           "Sinhala",
25092           "සිංහල",
25093           "si"
25094       ],
25095       [
25096           "Simple English",
25097           "Simple English",
25098           "simple"
25099       ],
25100       [
25101           "Slovak",
25102           "slovenčina",
25103           "sk"
25104       ],
25105       [
25106           "Slovenian",
25107           "slovenščina",
25108           "sl"
25109       ],
25110       [
25111           "Samoan",
25112           "Gagana Samoa",
25113           "sm"
25114       ],
25115       [
25116           "Shona",
25117           "chiShona",
25118           "sn"
25119       ],
25120       [
25121           "Somali",
25122           "Soomaaliga",
25123           "so"
25124       ],
25125       [
25126           "Albanian",
25127           "shqip",
25128           "sq"
25129       ],
25130       [
25131           "Serbian",
25132           "српски / srpski",
25133           "sr"
25134       ],
25135       [
25136           "Sranan Tongo",
25137           "Sranantongo",
25138           "srn"
25139       ],
25140       [
25141           "Swati",
25142           "SiSwati",
25143           "ss"
25144       ],
25145       [
25146           "Southern Sotho",
25147           "Sesotho",
25148           "st"
25149       ],
25150       [
25151           "Saterland Frisian",
25152           "Seeltersk",
25153           "stq"
25154       ],
25155       [
25156           "Sundanese",
25157           "Basa Sunda",
25158           "su"
25159       ],
25160       [
25161           "Swedish",
25162           "svenska",
25163           "sv"
25164       ],
25165       [
25166           "Swahili",
25167           "Kiswahili",
25168           "sw"
25169       ],
25170       [
25171           "Silesian",
25172           "ślůnski",
25173           "szl"
25174       ],
25175       [
25176           "Tamil",
25177           "தமிழ்",
25178           "ta"
25179       ],
25180       [
25181           "Tulu",
25182           "ತುಳು",
25183           "tcy"
25184       ],
25185       [
25186           "Telugu",
25187           "తెలుగు",
25188           "te"
25189       ],
25190       [
25191           "Tetum",
25192           "tetun",
25193           "tet"
25194       ],
25195       [
25196           "Tajik",
25197           "тоҷикӣ",
25198           "tg"
25199       ],
25200       [
25201           "Thai",
25202           "ไทย",
25203           "th"
25204       ],
25205       [
25206           "Tigrinya",
25207           "ትግርኛ",
25208           "ti"
25209       ],
25210       [
25211           "Turkmen",
25212           "Türkmençe",
25213           "tk"
25214       ],
25215       [
25216           "Tagalog",
25217           "Tagalog",
25218           "tl"
25219       ],
25220       [
25221           "Tswana",
25222           "Setswana",
25223           "tn"
25224       ],
25225       [
25226           "Tongan",
25227           "lea faka-Tonga",
25228           "to"
25229       ],
25230       [
25231           "Tok Pisin",
25232           "Tok Pisin",
25233           "tpi"
25234       ],
25235       [
25236           "Turkish",
25237           "Türkçe",
25238           "tr"
25239       ],
25240       [
25241           "Tsonga",
25242           "Xitsonga",
25243           "ts"
25244       ],
25245       [
25246           "Tatar",
25247           "татарча/tatarça",
25248           "tt"
25249       ],
25250       [
25251           "Tumbuka",
25252           "chiTumbuka",
25253           "tum"
25254       ],
25255       [
25256           "Twi",
25257           "Twi",
25258           "tw"
25259       ],
25260       [
25261           "Tahitian",
25262           "reo tahiti",
25263           "ty"
25264       ],
25265       [
25266           "Tuvinian",
25267           "тыва дыл",
25268           "tyv"
25269       ],
25270       [
25271           "Udmurt",
25272           "удмурт",
25273           "udm"
25274       ],
25275       [
25276           "Uyghur",
25277           "ئۇيغۇرچە / Uyghurche",
25278           "ug"
25279       ],
25280       [
25281           "Ukrainian",
25282           "українська",
25283           "uk"
25284       ],
25285       [
25286           "Urdu",
25287           "اردو",
25288           "ur"
25289       ],
25290       [
25291           "Uzbek",
25292           "oʻzbekcha/ўзбекча",
25293           "uz"
25294       ],
25295       [
25296           "Venda",
25297           "Tshivenda",
25298           "ve"
25299       ],
25300       [
25301           "Venetian",
25302           "vèneto",
25303           "vec"
25304       ],
25305       [
25306           "Veps",
25307           "vepsän kel’",
25308           "vep"
25309       ],
25310       [
25311           "Vietnamese",
25312           "Tiếng Việt",
25313           "vi"
25314       ],
25315       [
25316           "West Flemish",
25317           "West-Vlams",
25318           "vls"
25319       ],
25320       [
25321           "Volapük",
25322           "Volapük",
25323           "vo"
25324       ],
25325       [
25326           "Walloon",
25327           "walon",
25328           "wa"
25329       ],
25330       [
25331           "Waray",
25332           "Winaray",
25333           "war"
25334       ],
25335       [
25336           "Wolof",
25337           "Wolof",
25338           "wo"
25339       ],
25340       [
25341           "Wu Chinese",
25342           "吴语",
25343           "wuu"
25344       ],
25345       [
25346           "Kalmyk",
25347           "хальмг",
25348           "xal"
25349       ],
25350       [
25351           "Xhosa",
25352           "isiXhosa",
25353           "xh"
25354       ],
25355       [
25356           "Mingrelian",
25357           "მარგალური",
25358           "xmf"
25359       ],
25360       [
25361           "Yiddish",
25362           "ייִדיש",
25363           "yi"
25364       ],
25365       [
25366           "Yoruba",
25367           "Yorùbá",
25368           "yo"
25369       ],
25370       [
25371           "Zhuang",
25372           "Vahcuengh",
25373           "za"
25374       ],
25375       [
25376           "Zeelandic",
25377           "Zeêuws",
25378           "zea"
25379       ],
25380       [
25381           "Chinese",
25382           "中文",
25383           "zh"
25384       ],
25385       [
25386           "Classical Chinese",
25387           "文言",
25388           "zh-classical"
25389       ],
25390       [
25391           "Chinese (Min Nan)",
25392           "Bân-lâm-gú",
25393           "zh-min-nan"
25394       ],
25395       [
25396           "Cantonese",
25397           "粵語",
25398           "zh-yue"
25399       ],
25400       [
25401           "Zulu",
25402           "isiZulu",
25403           "zu"
25404       ]
25405   ];
25406
25407   var wikipedia$1 = /*#__PURE__*/Object.freeze({
25408     default: wikipedia
25409   });
25410
25411   var wikisource = [
25412       [
25413           "Arabic",
25414           "العربية",
25415           "ar"
25416       ],
25417       [
25418           "Assamese",
25419           "অসমীয়া",
25420           "as"
25421       ],
25422       [
25423           "Azerbaijani",
25424           "azərbaycanca",
25425           "az"
25426       ],
25427       [
25428           "Belarusian",
25429           "беларуская",
25430           "be"
25431       ],
25432       [
25433           "Bulgarian",
25434           "български",
25435           "bg"
25436       ],
25437       [
25438           "Bangla",
25439           "বাংলা",
25440           "bn"
25441       ],
25442       [
25443           "Breton",
25444           "brezhoneg",
25445           "br"
25446       ],
25447       [
25448           "Bosnian",
25449           "bosanski",
25450           "bs"
25451       ],
25452       [
25453           "Catalan",
25454           "català",
25455           "ca"
25456       ],
25457       [
25458           "Czech",
25459           "čeština",
25460           "cs"
25461       ],
25462       [
25463           "Welsh",
25464           "Cymraeg",
25465           "cy"
25466       ],
25467       [
25468           "Danish",
25469           "dansk",
25470           "da"
25471       ],
25472       [
25473           "German",
25474           "Deutsch",
25475           "de"
25476       ],
25477       [
25478           "Greek",
25479           "Ελληνικά",
25480           "el"
25481       ],
25482       [
25483           "English",
25484           "English",
25485           "en"
25486       ],
25487       [
25488           "Esperanto",
25489           "Esperanto",
25490           "eo"
25491       ],
25492       [
25493           "Spanish",
25494           "español",
25495           "es"
25496       ],
25497       [
25498           "Estonian",
25499           "eesti",
25500           "et"
25501       ],
25502       [
25503           "Persian",
25504           "فارسی",
25505           "fa"
25506       ],
25507       [
25508           "Finnish",
25509           "suomi",
25510           "fi"
25511       ],
25512       [
25513           "Faroese",
25514           "føroyskt",
25515           "fo"
25516       ],
25517       [
25518           "French",
25519           "français",
25520           "fr"
25521       ],
25522       [
25523           "Galician",
25524           "galego",
25525           "gl"
25526       ],
25527       [
25528           "Gujarati",
25529           "ગુજરાતી",
25530           "gu"
25531       ],
25532       [
25533           "Hebrew",
25534           "עברית",
25535           "he"
25536       ],
25537       [
25538           "Croatian",
25539           "hrvatski",
25540           "hr"
25541       ],
25542       [
25543           "Hungarian",
25544           "magyar",
25545           "hu"
25546       ],
25547       [
25548           "Armenian",
25549           "Հայերեն",
25550           "hy"
25551       ],
25552       [
25553           "Indonesian",
25554           "Bahasa Indonesia",
25555           "id"
25556       ],
25557       [
25558           "Icelandic",
25559           "íslenska",
25560           "is"
25561       ],
25562       [
25563           "Italian",
25564           "italiano",
25565           "it"
25566       ],
25567       [
25568           "Japanese",
25569           "日本語",
25570           "ja"
25571       ],
25572       [
25573           "Kannada",
25574           "ಕನ್ನಡ",
25575           "kn"
25576       ],
25577       [
25578           "Korean",
25579           "한국어",
25580           "ko"
25581       ],
25582       [
25583           "Latin",
25584           "Latina",
25585           "la"
25586       ],
25587       [
25588           "Limburgish",
25589           "Limburgs",
25590           "li"
25591       ],
25592       [
25593           "Lithuanian",
25594           "lietuvių",
25595           "lt"
25596       ],
25597       [
25598           "Macedonian",
25599           "македонски",
25600           "mk"
25601       ],
25602       [
25603           "Malayalam",
25604           "മലയാളം",
25605           "ml"
25606       ],
25607       [
25608           "Marathi",
25609           "मराठी",
25610           "mr"
25611       ],
25612       [
25613           "Dutch",
25614           "Nederlands",
25615           "nl"
25616       ],
25617       [
25618           "Norwegian",
25619           "norsk bokmål",
25620           "no"
25621       ],
25622       [
25623           "Odia",
25624           "ଓଡ଼ିଆ",
25625           "or"
25626       ],
25627       [
25628           "Punjabi",
25629           "ਪੰਜਾਬੀ",
25630           "pa"
25631       ],
25632       [
25633           "Polish",
25634           "polski",
25635           "pl"
25636       ],
25637       [
25638           "Portuguese",
25639           "português",
25640           "pt"
25641       ],
25642       [
25643           "Romanian",
25644           "română",
25645           "ro"
25646       ],
25647       [
25648           "Russian",
25649           "русский",
25650           "ru"
25651       ],
25652       [
25653           "Sanskrit",
25654           "संस्कृतम्",
25655           "sa"
25656       ],
25657       [
25658           "Sakha",
25659           "саха тыла",
25660           "sah"
25661       ],
25662       [
25663           "Slovak",
25664           "slovenčina",
25665           "sk"
25666       ],
25667       [
25668           "Slovenian",
25669           "slovenščina",
25670           "sl"
25671       ],
25672       [
25673           "Serbian",
25674           "српски / srpski",
25675           "sr"
25676       ],
25677       [
25678           "Swedish",
25679           "svenska",
25680           "sv"
25681       ],
25682       [
25683           "Tamil",
25684           "தமிழ்",
25685           "ta"
25686       ],
25687       [
25688           "Telugu",
25689           "తెలుగు",
25690           "te"
25691       ],
25692       [
25693           "Thai",
25694           "ไทย",
25695           "th"
25696       ],
25697       [
25698           "Turkish",
25699           "Türkçe",
25700           "tr"
25701       ],
25702       [
25703           "Ukrainian",
25704           "українська",
25705           "uk"
25706       ],
25707       [
25708           "Venetian",
25709           "vèneto",
25710           "vec"
25711       ],
25712       [
25713           "Vietnamese",
25714           "Tiếng Việt",
25715           "vi"
25716       ],
25717       [
25718           "Yiddish",
25719           "ייִדיש",
25720           "yi"
25721       ],
25722       [
25723           "Chinese",
25724           "中文",
25725           "zh"
25726       ],
25727       [
25728           "Chinese (Min Nan)",
25729           "Bân-lâm-gú",
25730           "zh-min-nan"
25731       ]
25732   ];
25733
25734   var wikisource$1 = /*#__PURE__*/Object.freeze({
25735     default: wikisource
25736   });
25737
25738   var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
25739
25740   function unwrapExports (x) {
25741         return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x.default : x;
25742   }
25743
25744   function createCommonjsModule(fn, module) {
25745         return module = { exports: {} }, fn(module, module.exports), module.exports;
25746   }
25747
25748   function getCjsExportFromNamespace (n) {
25749         return n && n.default || n;
25750   }
25751
25752   getCjsExportFromNamespace(wikibooks$1);
25753
25754   getCjsExportFromNamespace(wikinews$1);
25755
25756   getCjsExportFromNamespace(wikiquote$1);
25757
25758   getCjsExportFromNamespace(wikiversity$1);
25759
25760   getCjsExportFromNamespace(wikivoyage$1);
25761
25762   getCjsExportFromNamespace(wiktionary$1);
25763
25764   var require$$6 = getCjsExportFromNamespace(wikipedia$1);
25765
25766   getCjsExportFromNamespace(wikisource$1);
25767
25768   var wikipedia$2 = require$$6;
25769
25770   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"]]}];
25771
25772   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"}}];
25773
25774   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};
25775
25776   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}};
25777
25778   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"};
25779
25780   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:["inspector.zoom_to.key"],text:"shortcuts.browsing.with_selected.zoom_to"},{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"}]}]}];
25781
25782   var type$2 = "FeatureCollection";
25783   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]]]}}];
25784   var dataImperial = {
25785   type: type$2,
25786   features: features
25787   };
25788
25789   var type$3 = "FeatureCollection";
25790   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]]]}}];
25791   var dataDriveLeft = {
25792   type: type$3,
25793   features: features$1
25794   };
25795
25796   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",errors:"Errors",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:{zoom_to:{key:"Z",title:"Zoom to this",tooltip_feature:"Center and zoom the map to focus on this feature.",tooltip_note:"Center and zoom the map to focus on this note.",tooltip_data:"Center and zoom the map to focus on this data.",tooltip_issue:"Center and zoom the map to focus on this issue."},no_documentation_combination:"There is no documentation available for this tag combination",no_documentation_key:"There is no documentation available for this key",show_more:"Show More",view_on_osm:"View on openstreetmap.org",view_on_keepRight:"View on keepright.at",all_fields:"All fields",all_tags:"All tags",all_members:"All members",all_relations:"All relations",new_relation:"New relation...",choose_relation:"Choose a parent relation",role:"Role",choose:"Select feature type",results:"{n} results for {search}",reference:"View on OpenStreetMap Wiki",edit_reference:"Edit or translate description",wiki_reference:"View documentation",wiki_en_reference:"View documentation in English",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"},keepRight:{tooltip:"Automatically detected map issues from keepright.at",title:"KeepRight Issues"},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.",generic_name:"Possible generic name",generic_name_tooltip:"This feature seems to have a generic name \"{name}\". Please only use the name field to record the official name of a feature.",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",QA:{keepRight:{title:"KeepRight Error",detail_title:"Error",detail_description:"Description",comment:"Comment",comment_placeholder:"Enter a comment to share with other users.",close:"Close (Error Fixed)",ignore:"Ignore (Not an Error)",save_comment:"Save Comment",close_comment:"Close and Comment",ignore_comment:"Ignore and Comment",error_parts:{this_node:"this node",this_way:"this way",this_relation:"this relation",this_oneway:"this oneway",this_highway:"this highway",this_railway:"this railway",this_waterway:"this waterway",this_cycleway:"this cycleway",this_cycleway_footpath:"this cycleway/footpath",this_riverbank:"this riverbank",this_crossing:"this crossing",this_railway_crossing:"this railway crossing",this_bridge:"this bridge",this_tunnel:"this tunnel",this_boundary:"this boundary",this_turn_restriction:"this turn restriction",this_roundabout:"this roundabout",this_mini_roundabout:"this mini-roundabout",this_track:"this track",this_feature:"this feature",highway:"highway",railway:"railway",waterway:"waterway",cycleway:"cycleway",cycleway_footpath:"cycleway/footpath",riverbank:"riverbank",place_of_worship:"place of worship",pub:"pub",restaurant:"restaurant",school:"school",university:"university",hospital:"hospital",library:"library",theatre:"theatre",courthouse:"courthouse",bank:"bank",cinema:"cinema",pharmacy:"pharmacy",cafe:"cafe",fast_food:"fast food",fuel:"fuel",from:"from",to:"to",left_hand:"left-hand",right_hand:"right-hand"},errorTypes:{"20":{title:"Multiple nodes on the same spot",description:"There is more than one node in this spot. Node IDs: {var1}."},"30":{title:"Non-closed area",description:"{var1} is tagged with \"{var2}\" and should be a closed loop."},"40":{title:"Impossible oneway",description:"The first node {var1} of {var2} is not connected to any other way."},"41":{description:"The last node {var1} of {var2} is not connected to any other way."},"42":{description:"You cannot reach {var1} because all ways leading from it are oneway."},"43":{description:"You cannot escape from {var1} because all ways leading to it are oneway."},"50":{title:"Almost junction",description:"{var1} is very close but not connected to way {var2}."},"60":{title:"Deprecated tag",description:"{var1} uses deprecated tag \"{var2}\". Please use \"{var3}\" instead."},"70":{title:"Missing tag",description:"{var1} has an empty tag: \"{var2}\"."},"71":{description:"{var1} has no tags."},"72":{description:"{var1} is not member of any way and doesn't have any tags."},"73":{description:"{var1} has a \"{var2}\" tag but no \"highway\" tag."},"74":{description:"{var1} has an empty tag: \"{var2}\"."},"75":{description:"{var1} has a name \"{var2}\" but no other tags."},"90":{title:"Motorway without ref tag",description:"{var1} is tagged as a motorway and therefore needs a \"ref\", \"nat_ref\", or \"int_ref\" tag."},"100":{title:"Place of worship without religion",description:"{var1} is tagged as a place of worship and therefore needs a religion tag."},"110":{title:"Point of interest without name",description:"{var1} is tagged as a \"{var2}\" and therefore needs a name tag."},"120":{title:"Way without nodes",description:"{var1} has just one single node."},"130":{title:"Disconnected way",description:"{var1} is not connected to the rest of the map."},"150":{title:"Railway crossing without tag",description:"{var1} of a highway and a railway needs to be tagged as \"railway=crossing\" or \"railway=level_crossing\"."},"160":{title:"Railway layer conflict",description:"There are ways in different layers (e.g. tunnel or bridge) meeting at {var1}."},"170":{title:"FIXME tagged item",description:"{var1} has a FIXME tag: {var2}"},"180":{title:"Relation without type",description:"{var1} is missing a \"type\" tag."},"190":{title:"Intersection without junction",description:"{var1} intersects the {var2} {var3} but there is no junction node, bridge, or tunnel."},"200":{title:"Overlapping ways",description:"{var1} overlaps the {var2} {var3}."},"210":{title:"Self-intersecting way",description:"There is an unspecified issue with self intersecting ways."},"211":{description:"{var1} contains more than one node multiple times. Nodes are {var2}. This may or may not be an error."},"212":{description:"{var1} has only two different nodes and contains one of them more than once."},"220":{title:"Misspelled tag",description:"{var1} is tagged \"{var2}\" where \"{var3}\" looks like \"{var4}\"."},"221":{description:"{var1} has a suspicious tag \"{var2}\"."},"230":{title:"Layer conflict",description:"{var1} is a junction of ways on different layers."},"231":{description:"{var1} is a junction of ways on different layers: {var2}.",layer:"(layer: {layer})"},"232":{description:"{var1} is tagged with \"layer={var2}\". This need not be an error but it looks strange."},"270":{title:"Unusual motorway connection",description:"{var1} is a junction of a motorway and a highway other than \"motorway\", \"motorway_link\", \"trunk\", \"rest_area\", or \"construction\". Connection to \"service\" or \"unclassified\" is only valid if it has \"access=no/private\", or it leads to a motorway service area, or if it is a \"service=parking_aisle\"."},"280":{title:"Boundary issue",description:"There is an unspecified issue with this boundary."},"281":{title:"Boundary missing name",description:"{var1} has no name."},"282":{title:"Boundary missing admin level",description:"The boundary of {var1} has no valid numeric admin_level. Please do not mix admin levels (e.g. \"6;7\"). Always tag the lowest admin_level of all boundaries."},"283":{title:"Boundary not a closed loop",description:"The boundary of {var1} is not a closed loop."},"284":{title:"Boundary is split",description:"The boundary of {var1} splits here."},"285":{title:"Boundary admin_level too high",description:"{var1} has \"admin_level={var2}\" but belongs to a relation with lower \"admin_level\" (e.g. higher priority); it should have the lowest \"admin_level\" of all relations."},"290":{title:"Restriction issue",description:"There is an unspecified issue with this restriction."},"291":{title:"Restriction missing type",description:"{var1} has an unrecognized restriction type."},"292":{title:"Restriction missing \"from\" way",description:"{var1} has {var2} \"from\" members, but it should have 1."},"293":{title:"Restriction missing \"to\" way",description:"{var1} has {var2} \"to\" members, but it should have 1."},"294":{title:"Restriction \"from\" or \"to\" is not a way",description:"{var1} has \"from\" or \"to\" members which should be ways. {var2}."},"295":{title:"Restriction \"via\" is not an endpoint",description:"{var1} has a \"via\" (node {var2}) which is not the first or the last member of \"{var3}\" (way {var4})."},"296":{title:"Unusual restriction angle",description:"{var1} has a restriction type \"{var2}\" but the angle is {var3} degrees. Maybe the restriction type is not appropriate?"},"297":{title:"Wrong direction of \"to\" way",description:"{var1} does not match the direction of \"to\" way {var2}."},"298":{title:"Redundant restriction - oneway",description:"{var1} may be redundant. Entry already prohibited by \"oneway\" tag on {var2}."},"300":{title:"Missing maxspeed",description:"{var1} is missing a \"maxspeed\" tag and is tagged as motorway, trunk, primary, or secondary."},"310":{title:"Roundabout issue",description:"There is an unspecified issue with this roundabout."},"311":{title:"Roundabout not closed loop",description:"{var1} is part of a roundabout but is not closed-loop. (Split carriageways approaching a roundabout should not be tagged as roundabout)."},"312":{title:"Roundabout wrong direction",description:"If {var1} is in a country with {var2} traffic then its orientation goes the wrong way around."},"313":{title:"Roundabout weakly connected",description:"{var1} has only {var2} other road(s) connected. Roundabouts typically have 3 or more."},"320":{title:"Improper link connection",description:"{var1} is tagged as \"{var2}\" but doesn't have a connection to any other \"{var3}\" or \"{var4}\"."},"350":{title:"Improper bridge tag",description:"{var1} doesn't have a tag in common with its surrounding ways that shows the purpose of this bridge. There should be one of these tags: {var2}."},"360":{title:"Missing local name tag",description:"It would be nice if {var1} had a local name tag \"name:XX={var2}\" where XX shows the language of its common name \"{var2}\"."},"370":{title:"Doubled places",description:"{var1} has tags in common with the surrounding way {var2} {var3} and seems to be redundant.",including_the_name:"(including the name {name})"},"380":{title:"Non-physical use of sport tag",description:"{var1} is tagged \"{var2}\" but has no physical tag (e.g. \"leisure\", \"building\", \"amenity\", or \"highway\")."},"390":{title:"Missing tracktype",description:"{var1} doesn't have a \"tracktype\" tag."},"400":{title:"Geometry issue",description:"There is an unspecified issue with the geometry here."},"401":{title:"Missing turn restriction",description:"Ways {var1} and {var2} join in a very sharp angle here and there is no oneway tag or turn restriction that prevents turning."},"402":{title:"Impossible angle",description:"{var1} bends in a very sharp angle here."},"410":{title:"Website issue",description:"There is an unspecified issue with a contact website or URL."},"411":{description:"{var1} may have an outdated URL: {var2} returned HTTP status code {var3}."},"412":{description:"{var1} may have an outdated URL: {var2} contained suspicious text \"{var3}\"."},"413":{description:"{var1} may have an outdated URL: {var2} did not contain keywords \"{var3}\"."}}}},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 {leftclick} 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."},qa:{title:"Quality Assurance",intro:"*Quality Assurance* (Q/A) tools can find improper tags, disconnected roads, and other issues with OpenStreetMap, which mappers can then fix. To view existing Q/A issues, click the {data} **Map data** panel to enable a specific Q/A layer.",tools_h:"Tools",tools:"The following tools are currently supported: [KeepRight](https://www.keepright.at/). Expect iD to support [Osmose](https://osmose.openstreetmap.fr/), [ImproveOSM](https://improveosm.org/en/), and more Q/A tools in the future.",issues_h:"Handling Issues",issues:"Handling Q/A issues is similar to handling notes. Click on a marker to view the issue details in the sidebar. Each tool has its own capabilities, but generally you can comment and/or close an issue."},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",zoom_to:"Zoom to selected feature"},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"},architect:{label:"Architect"},"area/highway":{label:"Type"},artist:{label:"Artist"},artwork_type:{label:"Type"},atm:{label:"ATM"},attraction:{label:"Type"},backrest:{label:"Backrest"},barrier:{label:"Type"},basin:{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:"Beauty Specialty"},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"},"building/material":{label:"Material"},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"},check_date:{label:"Last Checked Date"},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"},couplings:{label:"Couplings",placeholder:"1, 2, 3..."},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"},destination_oneway:{label:"Destinations"},"destination/ref_oneway":{label:"Destination Road Numbers"},"destination/symbol_oneway":{label:"Destination Symbols"},devices:{label:"Devices",placeholder:"1, 2, 3..."},diaper:{label:"Diaper Changing Available"},diet_multi:{label:"Diet Types"},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"},dog:{label:"Dogs",options:{yes:"Allowed",leashed:"Leashed Only",no:"Not Allowed"}},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"},enforcement:{label:"Type"},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/diameter":{label:"Diameter (mm, in, or letters)"},"fire_hydrant/pressure":{label:"Pressure (bar)"},"fire_hydrant/type":{label:"Shape",options:{pillar:"Pillar/Aboveground",underground:"Underground",wall:"Wall",pipe:"Capped Pipe"}},fireplace:{label:"Fireplace"},fitness_station:{label:"Equipment Type"},fixme:{label:"Fix Me"},"flag/type":{label:"Flag Type"},ford:{label:"Type",placeholder:"Default"},frequency_electrified:{label:"Operating Frequency"},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_yes:{label:"Intermittent"},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)"},"junction/ref_oneway":{label:"Junction Number"},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"},minspeed:{label:"Minimum Speed Limit",placeholder:"20, 30, 40..."},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"}},"oneway/bicycle":{label:"One Way (Bicycles)"},opening_date:{label:"Expected Opening Date"},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"},"roof/colour":{label:"Roof Color"},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"},"survey/date":{label:"Last Survey Date"},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:{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_electrified:{label:"Voltage"},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_source:{label:"Water Source"},water_volume:{label:"Water Reserve Volume (m³)"},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:""},attraction:{name:"Attraction",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,undergraduate school"},"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:"potable water source,water fountain,drinking fountain,bubbler,water tap"},"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 Counter",terms:"apothecary,drug store,drugstore,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:"Christian 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:"Jewish Synagogue",terms:"jewish"},"amenity/place_of_worship/muslim":{name:"Muslim 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,graduate school,PhD program,master's degree program"},"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:"Apartment Building",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"},"club/sport":{name:"Sports Club",terms:"athletics club,sporting club,sports association,sports society"},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,fire water well,hydrant"},"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/construction":{name:"Road Closed",terms:"closed,closure,construction"},"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/basin":{name:"Basin",terms:""},"landuse/farm":{name:"Farmland",terms:""},"landuse/pond":{name:"Pond",terms:""},"landuse/reservoir":{name:"Reservoir",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/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:"Managed Forest",terms:"cut,forest,forestry,lumber,silviculture,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/residential/apartments":{name:"Apartment Complex",terms:"flat,residence,tenement"},"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,asanas,modern yoga,meditation"},"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:"football,gridiron"},"leisure/pitch/australian_football":{name:"Australian Football Field",terms:"Aussie,AFL,football"},"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/netball":{name:"Netball Court",terms:""},"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/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/track/horse_racing":{name:"Racetrack (Horse Racing)",terms:"race*,horse,track"},"leisure/track/running":{name:"Racetrack (Running)",terms:"race*,running,sprint,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/basin":{name:"Basin",terms:"detention,drain,overflow,rain,retention"},"natural/water/canal":{name:"Canal",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/water/river":{name:"River",terms:"beck,branch,brook,course,creek,estuary,rill,riverbank,rivulet,run,runnel,stream,tributary,watercourse"},"natural/water/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"},"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:"real estate"},"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/downhill/halfpipe":{name:"Halfpipe",terms:"ski,alpine,halfpipe,half pipe,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/caravan":{name:"RV 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,beauty,drug store,drugstore,gift,hair,med*,pharmacy,prescription,tooth"},"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/fireplace":{name:"Fireplace Store",terms:"fireplace,stove,masonry heater"},"shop/fishing":{name:"Fishing Shop",terms:""},"shop/florist":{name:"Florist",terms:"flower"},"shop/frame":{name:"Framing Shop",terms:"art*,paint*,photo*,frame"},"shop/frozen_food":{name:"Frozen Food",terms:""},"shop/fuel":{name:"Fuel Shop",terms:""},"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/hunting":{name:"Hunting Shop",terms:""},"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,outfitter,outdoor equipment,outdoor supplies"},"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/water":{name:"Drinking Water 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/enforcement":{name:"Enforcement",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/riverbank":{name:"Riverbank",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/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_airphoto":{attribution:{text:"GSI Japan"},description:"Japan GSI airphoto Imagery. Not fully orthorectified, but a bit newer and/or differently covered than GSI ortho Imagery.",name:"Japan GSI airphoto 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-iran-aparat":{name:"OpenStreetMap Iran Aparat",description:"Subscribe to our channel at {url}",extendedDescription:"A good resource of videos about anything related to OpenStreetMap. Mainly in Persian."},"osm-iran-forum":{name:"OpenStreetMap Iran web forum",description:"OpenStreetMap Iran web forum",extendedDescription:"A web forum for OpenStreetMap users in Iran. Feel free to ask questions and discuss with others!"},"osm-iran-telegram":{name:"OpenStreetMap Iran Telegram",description:"You're welcome to join our Telegram channel at {url}. We also have a supergroup of many OSMers interested in Iran. Find its link in bio of channel."},"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-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-Asia-mailinglist":{name:"OpenStreetMap Asia Mailinglist",description:"Talk-asia is the official Mailinglist for Asian Community"},"osm-asia-telegram":{name:"OpenStreetMap Asia Telegram",description:"Join our family: {url}"},"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-south-korea-telegram":{name:"OSM South Korea Telegram",description:"Unofficial Channnel for OpenStreetMap contributors, communities, and users in South Korea to share and discuss."},"OSM-sri-lanka-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"},"no-telegram":{name:"@OSM_no on Telegram",description:"OpenStreetMap Norway Telegram chat"},"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"}}}}};
25797
25798   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]]]}},asia_full:{type:"Feature",id:"asia_full",properties:{},geometry:{type:"Polygon",coordinates:[[[51,13.5],[43.5,12.3],[34.25,27.3],[34.9,29.45],[34,31.9],[27,34.7],[25.1,39],[25.6,40.2],[26.33,40.98],[26.33,41.23],[26.63,41.36],[26.58,41.6],[26.32,41.76],[27.2,42.1],[27.55,41.93],[35,43],[38.3,47.6],[38.7,47.7],[38.86,47.86],[39.74,47.82],[40.1,49.6],[38,50],[37.4,50.4],[36.65,50.25],[35.66,50.35],[35.2,51.1],[34.28,51.27],[34.1,51.7],[34.4,51.73],[33.9,52.35],[31.8,52.05],[31.3,53.1],[32.8,53.3],[30.77,54.78],[30.95,55.61],[28.19,56.13],[27.83,57.29],[27.33,57.53],[27.7,57.9],[27.3,58.7],[28.2,59.37],[27.2,60.2],[31.5,62.6],[29,67],[30,67.66],[28.27,68.6],[31,70],[31,90],[180,90],[180,60],[130,7],[130,-0.5],[131.8,-3.5],[132.3,-8],[128,-11.3],[65,-11.3],[51,13.5]]]}},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]]]}},iran:{type:"Feature",properties:{},id:"iran",geometry:{type:"Polygon",coordinates:[[[43.96643,39.42704],[44.36828,39.45104],[44.3518,39.57183],[44.62479,39.89048],[45.02746,39.54218],[45.50433,39.06259],[45.9613,38.92951],[46.50828,38.94537],[47.3236,39.44892],[48.00512,39.77374],[48.4411,39.3641],[48.19977,39.25565],[48.3728,39.10236],[48.30414,38.906],[48.10427,38.85269],[48.67649,38.48336],[49.32106,38.48734],[53.94287,37.48358],[54.43724,37.47487],[54.70691,37.69815],[55.26122,38.10864],[55.91695,38.16284],[56.239,38.26407],[57.28683,38.36073],[57.57896,37.98007],[58.01879,37.91821],[58.41395,37.7018],[58.72191,37.76204],[59.4218,37.59896],[59.63834,37.17964],[60.08422,37.11653],[60.37835,36.70792],[61.23424,36.72619],[61.37598,35.51361],[60.99608,34.29808],[60.63333,34.05914],[60.68847,33.68779],[61.01753,33.53868],[60.68833,33.11604],[60.98034,32.20735],[60.95577,31.5572],[61.7915,31.4486],[61.89696,31.1188],[61.90736,30.81546],[60.99448,29.85451],[61.42455,29.4109],[61.97206,28.63509],[62.8889,28.33884],[62.90715,27.31879],[63.29659,27.35528],[63.40209,27.17648],[63.2895,26.57212],[62.5891,26.47058],[62.29032,26.24108],[61.94822,26.12877],[61.62376,24.73837],[60.55845,24.98624],[58.03141,25.27164],[57.11051,25.5495],[56.54686,26.57238],[55.4988,26.01213],[55.28816,25.6474],[54.37853,25.61961],[53.90126,26.2239],[53.08217,26.52934],[51.26311,27.61327],[50.77328,28.14996],[50.48217,27.81479],[50.17456,27.78564],[49.93835,27.81965],[49.88342,27.975],[49.92187,28.18825],[50.33305,28.67232],[49.4197,29.70202],[48.58632,29.62242],[47.9928,30.44356],[47.98907,30.97004],[47.65869,30.98703],[47.65817,31.39276],[47.76361,31.76875],[47.30962,32.37144],[45.91075,33.02471],[46.06882,33.24741],[45.37024,33.9384],[45.40649,34.48845],[45.61523,34.74162],[45.84765,35.07793],[46.0613,35.21211],[45.91186,35.63945],[46.06018,35.76881],[45.75644,35.74371],[45.3092,35.9317],[45.19226,36.33283],[44.97802,36.46548],[44.95056,36.68605],[44.80224,36.7609],[44.83543,36.92589],[44.74731,37.02887],[44.71435,37.2828],[44.57153,37.38762],[44.51099,37.70537],[44.17537,37.86225],[44.29736,38.30899],[44.10461,39.10449],[43.93976,39.34825],[43.96643,39.42704]]]}},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]]]}},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]]]}},north_korea:{type:"Feature",id:"north_korea",properties:{},geometry:{type:"Polygon",coordinates:[[[125,37.2],[123.5,38.4],[124.38,40.12],[124.87,40.47],[126.05,40.95],[126.6,41.6],[126.9,41.8],[127.25,41.5],[128.2,41.4],[128.3,41.56],[128.04,42.03],[128.95,42.03],[129.35,42.44],[129.69,42.44],[129.88,43],[130.2,42.9],[130.3,42.66],[130.5,42.6],[130.7,42.3],[131,39],[128.33,38.61],[128.28,38.42],[128.08,38.32],[127.14,38.32],[126.99,38.21],[126.95,38.14],[126.88,38.1],[126.82,38],[126.67,37.95],[126.69,37.84],[126.667,37.828],[126.66,37.79],[126.585,37.76],[126.474,37.81],[126.42,37.845],[126.2,37.82],[126.18,37.74],[125,37.2]]]}},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]]]]}},south_korea:{type:"Feature",id:"south_korea",properties:{},geometry:{type:"Polygon",coordinates:[[[125,33],[125,37.2],[126.18,37.74],[126.2,37.82],[126.42,37.845],[126.474,37.81],[126.585,37.76],[126.66,37.79],[126.667,37.828],[126.69,37.84],[126.67,37.95],[126.82,38],[126.88,38.1],[126.95,38.14],[126.99,38.21],[127.14,38.32],[128.08,38.32],[128.28,38.42],[128.33,38.61],[131,39],[131.3,36.6],[127.3,33],[125,33]]]}},sri_lanka:{type:"Feature",id:"sri_lanka",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]]]}}};
25799
25800   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-iran-aparat":{id:"osm-iran-aparat",featureId:"iran",type:"aparat",countryCodes:["ir"],languageCodes:["fa"],name:"OpenStreetMap Iran Aparat",description:"Subscribe to our channel at {url}",extendedDescription:"A good resource of videos about anything related to OpenStreetMap. Mainly in Persian.",url:"https://www.aparat.com/osm_iran",contacts:[{name:"Iman",email:"iriman@chmail.ir"}]},"osm-iran-forum":{id:"osm-iran-forum",featureId:"iran",type:"forum",countryCodes:["ir"],languageCodes:["fa"],name:"OpenStreetMap Iran web forum",description:"OpenStreetMap Iran web forum",extendedDescription:"A web forum for OpenStreetMap users in Iran. Feel free to ask questions and discuss with others!",url:"https://forum.openstreetmap.org/viewforum.php?id=103",contacts:[{name:"Iman",email:"iriman@chmail.ir"}]},"osm-iran-telegram":{id:"osm-iran-telegram",featureId:"iran",type:"telegram",countryCodes:["ir"],languageCodes:["fa"],name:"OpenStreetMap Iran Telegram",description:"You're welcome to join our Telegram channel at {url}. We also have a supergroup of many OSMers interested in Iran. Find its link in bio of channel.",url:"https://t.me/openstreetmapir",contacts:[{name:"Iman",email:"iriman@chmail.ir"}]},"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-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-Asia-mailinglist":{id:"OSM-Asia-mailinglist",featureId:"asia_full",type:"mailinglist",name:"OpenStreetMap Asia Mailinglist",description:"Talk-asia is the official Mailinglist for Asian Community",url:"https://lists.openstreetmap.org/listinfo/talk-asia",contacts:[{name:"Erwin Olario",email:"govvin@gmail.com"}]},"osm-asia-telegram":{id:"osm-asia-telegram",featureId:"asia_full",type:"telegram",name:"OpenStreetMap Asia Telegram",description:"Join our family: {url}",url:"https://t.me/OpenStreetMapAsia",contacts:[{name:"Erwin Olario",email:"govvin@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-south-korea-telegram":{id:"OSM-south-korea-telegram",featureId:"south_korea",type:"telegram",countryCodes:["kr"],languageCodes:["ko","en"],name:"OSM South Korea Telegram",description:"Unofficial Channnel for OpenStreetMap contributors, communities, and users in South 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-sri-lanka-facebook":{id:"OSM-sri-lanka-facebook",featureId:"sri_lanka",type:"facebook",countryCodes:["lk"],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"},"no-telegram":{id:"no-telegram",type:"telegram",featureId:"norway",countryCodes:["no"],languageCodes:["no"],name:"@OSM_no on Telegram",description:"OpenStreetMap Norway Telegram chat",url:"https://t.me/OSM_no",contacts:[{name:"Syver Stensholt",email:"sssandum@gmail.com"}]},"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/"}]}};
25801
25802   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/v2/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:[1,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:"https://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.38,45.5666],[13.63822,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 ©2019 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:"https://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.38,45.5666],[13.63822,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 ©2019 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:"gsi.go.jp_airphoto",name:"Japan GSI airphoto Imagery",type:"tms",template:"http://cyberjapandata.gsi.go.jp/xyz/airphoto/{zoom}/{x}/{y}.png",zoomExtent:[14,18],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.gsi.go.jp/kikakuchousei/kikakuchousei40182.html",terms_text:"GSI Japan",description:"Japan GSI airphoto Imagery. Not fully orthorectified, but a bit newer and/or differently covered than GSI ortho Imagery."},{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"},{id:"Aargau-AGIS-2017",name:"Kanton Aargau 25cm (AGIS 2017)",type:"tms",template:"https://mapproxy.osm.ch/tiles/AGIS2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-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 OF2017",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://tiles.arcgis.com/tiles/hGdibHYSPO59RG1h/arcgis/rest/services/MassGIS_Level3_Parcels/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[15,20],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://kart.miljodirektoratet.no/arcgis/services/vern/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=naturvern_klasser_omrade&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://kart.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:"OSIP_1ft",name:"OSIP 1ft Imagery Most Current Available",type:"wms",template:"https://geo.oit.ohio.gov/arcgis/services/OSIP/osip_best_avail_1ft/ImageServer/WMSServer?FORMAT=image/jpeg&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:"2011-01-01T00:00:00.000Z",zoomExtent:[1,20],polygon:[[[-83.1356,41.75081],[-83.08101,41.7511],[-83.0796,41.62936],[-82.95011,41.54404],[-82.89032,41.54404],[-82.89032,41.69462],[-82.8494,41.7463],[-82.76758,41.73925],[-82.75184,41.63584],[-82.64799,41.62408],[-82.68575,41.50634],[-82.49063,41.40492],[-82.0217,41.53462],[-81.72901,41.52048],[-81.39541,41.7369],[-81.10587,41.84484],[-80.50161,41.99939],[-80.51105,40.62127],[-80.6275,40.59021],[-80.58344,40.49933],[-80.58973,40.2812],[-80.85095,39.625],[-81.19399,39.37974],[-81.38912,39.31159],[-81.45521,39.38704],[-81.515,39.35054],[-81.54333,39.26288],[-81.72586,39.19461],[-81.73216,38.9258],[-81.9021,38.85477],[-81.95875,38.89397],[-81.9084,38.93315],[-82.02799,38.99922],[-82.11611,38.92336],[-82.12555,38.8278],[-82.19794,38.78856],[-82.16647,38.72475],[-82.16017,38.58712],[-82.26718,38.57236],[-82.29865,38.43198],[-82.57875,38.39745],[-82.73925,38.53545],[-82.8494,38.56006],[-82.91235,38.73212],[-83.00676,38.71002],[-83.14524,38.59942],[-83.30575,38.58466],[-83.39387,38.64368],[-83.46625,38.64614],[-83.54178,38.69283],[-83.65193,38.61172],[-83.74635,38.63385],[-83.9635,38.76403],[-84.08624,38.75421],[-84.22157,38.7812],[-84.34117,38.99922],[-84.49223,39.07255],[-84.64015,39.05545],[-84.74086,39.11164],[-84.84471,39.08477],[-84.82898,41.70637],[-83.44737,41.76038],[-83.13438,41.64959],[-83.1356,41.75081]]],terms_url:"https://ogrip.oit.ohio.gov/ProjectsInitiatives/StatewideImagery.aspx",terms_text:"Ohio Statewide Imagery Program",description:"Most recent available 1-foot orthoimagery from the Ohio Statewide Imagery Program."},{id:"OSIP_6in",name:"OSIP 6in Imagery Most Current Available",type:"wms",template:"https://geo.oit.ohio.gov/arcgis/rest/services/OSIP/OSIP_6in_best_avail/ImageServer/exportImage?f=image&bbox={bbox}&imageSR=3857&bboxSR=4326&SR={proj}&size={width}%2C{height}",projection:"EPSG:4326",endDate:"2013-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[1,22],polygon:[[[-84.8172,39.566],[-84.47765,39.56679],[-84.00558,39.56441],[-84.01108,39.25379],[-83.99391,39.25273],[-84.05605,38.77041],[-83.95821,38.78567],[-83.86791,38.75274],[-83.83461,38.7123],[-83.79101,38.69623],[-83.76904,38.65093],[-83.66398,38.62331],[-83.63926,38.63725],[-83.62141,38.67801],[-83.52219,38.70025],[-83.46451,38.6705],[-83.37112,38.65602],[-83.32615,38.63189],[-83.31928,38.60265],[-83.29319,38.59353],[-83.26435,38.61499],[-83.241,38.62545],[-83.20599,38.61311],[-83.14796,38.61848],[-83.12222,38.64342],[-83.10505,38.67184],[-83.05527,38.6906],[-83.02299,38.7257],[-82.97733,38.72195],[-82.89459,38.75382],[-82.87365,38.73721],[-82.88189,38.68765],[-82.84927,38.59111],[-82.78748,38.55595],[-82.72533,38.55595],[-82.69238,38.53608],[-82.65495,38.48988],[-82.60998,38.46757],[-82.59899,38.41836],[-82.55333,38.39926],[-82.40364,38.43584],[-82.37514,38.43154],[-82.32468,38.4431],[-82.30614,38.48343],[-82.29927,38.5205],[-82.28416,38.58414],[-82.35901,38.58682],[-82.35249,38.67747],[-82.47059,38.68417],[-82.46475,38.7415],[-82.48466,38.74391],[-82.48158,38.77336],[-82.58045,38.78192],[-82.57393,38.84532],[-82.75795,38.85709],[-82.75074,38.94606],[-82.80739,38.9506],[-83.02265,38.95994],[-83.2053,38.96208],[-83.21011,38.99037],[-83.24032,39.01785],[-83.26778,39.02052],[-83.31242,39.05438],[-83.38486,39.05785],[-83.61111,39.02052],[-83.70586,39.02398],[-83.8686,39.02345],[-83.86414,39.24449],[-83.83598,39.24316],[-83.83804,39.22082],[-83.80646,39.22161],[-83.78277,39.26044],[-83.59051,39.37757],[-83.37044,39.37545],[-83.26435,39.51675],[-83.25096,39.69609],[-83.65093,39.71907],[-83.64578,39.77688],[-83.73642,39.78269],[-83.73951,39.79034],[-83.82568,39.79983],[-83.825,39.82409],[-83.93898,39.83095],[-83.93761,39.84492],[-84.05125,39.85283],[-84.00867,40.31147],[-84.00181,40.31121],[-83.9994,40.47986],[-83.98979,40.48038],[-83.99151,40.53285],[-83.88439,40.53442],[-83.8813,40.52972],[-83.52184,40.50753],[-83.54176,40.33686],[-83.63857,40.33739],[-83.63617,40.30179],[-83.56647,40.30179],[-83.54656,40.27612],[-83.55343,40.22817],[-83.49609,40.22371],[-83.50674,40.10985],[-83.16788,40.10565],[-83.17028,40.24521],[-83.2465,40.24678],[-83.2465,40.5091],[-83.41267,40.5078],[-83.41782,40.68741],[-83.43773,40.68923],[-83.43842,40.70433],[-83.49335,40.70355],[-83.493,40.81901],[-83.51395,40.82005],[-83.51257,40.90339],[-83.47584,40.90313],[-83.47515,40.94697],[-83.45592,40.94749],[-83.45592,40.99001],[-83.41747,40.99052],[-83.41782,41.16754],[-83.87787,41.17064],[-83.88062,41.41132],[-83.85143,41.41235],[-83.74432,41.4646],[-83.70827,41.49341],[-83.7038,41.52143],[-83.67805,41.54405],[-83.6063,41.56922],[-83.57094,41.61236],[-83.41782,41.61673],[-83.42297,41.25329],[-83.23139,41.25045],[-82.84241,41.25303],[-82.83245,40.99493],[-82.42973,40.99078],[-82.4342,41.06279],[-82.33463,41.06408],[-82.33944,41.28632],[-82.83897,41.29225],[-82.84515,41.43217],[-82.9509,41.4332],[-82.95158,41.48286],[-82.87262,41.48826],[-82.84447,41.49469],[-82.83417,41.45945],[-82.79984,41.4682],[-82.81494,41.49649],[-82.7528,41.50086],[-82.7401,41.48441],[-82.70199,41.49521],[-82.70817,41.55098],[-82.78164,41.54816],[-82.83142,41.59465],[-82.86507,41.57847],[-82.85854,41.5551],[-82.88807,41.52631],[-82.93098,41.51835],[-82.98626,41.53505],[-83.04016,41.5682],[-83.06694,41.60235],[-83.10574,41.6175],[-83.14247,41.61955],[-83.20564,41.63828],[-83.33954,41.70957],[-83.35327,41.69189],[-83.4264,41.69548],[-83.41679,41.70291],[-83.41816,41.7375],[-83.88405,41.72341],[-83.87993,41.62032],[-83.88783,41.62006],[-83.88577,41.48955],[-84.34547,41.48852],[-84.34513,41.42548],[-84.23183,41.42522],[-84.23355,41.16366],[-83.97366,41.16444],[-83.97434,41.17995],[-83.90259,41.17865],[-83.90327,41.16418],[-83.88371,41.16444],[-83.88336,40.92337],[-83.99975,40.92233],[-83.99769,40.90754],[-84.11167,40.90651],[-84.11167,40.8629],[-84.34444,40.86186],[-84.33758,40.90521],[-84.39491,40.90547],[-84.39663,40.98871],[-84.33861,40.98897],[-84.33964,41.21043],[-84.45362,41.21146],[-84.45499,41.25458],[-84.80621,41.2551],[-84.80724,40.72488],[-84.45877,40.7254],[-84.46083,40.35649],[-84.43851,40.35073],[-84.43474,40.17494],[-84.44504,40.15841],[-84.43336,40.15841],[-84.42959,39.92185],[-84.81651,39.91974],[-84.8172,39.57685],[-84.82647,39.56997],[-84.8172,39.566]],[[-82.83211,41.73033],[-82.80945,41.72828],[-82.77374,41.7006],[-82.78198,41.66368],[-82.84309,41.61544],[-82.86713,41.68266],[-82.83211,41.73033]],[[-81.09077,40.89742],[-81.09146,40.9913],[-81.00494,40.99026],[-81.007,41.1373],[-80.51537,41.13574],[-80.51468,40.89794],[-81.09077,40.89742]]],terms_url:"https://ogrip.oit.ohio.gov/ProjectsInitiatives/StatewideImagery.aspx",terms_text:"Ohio Statewide Imagery Program",description:"Most recent available 6-inch orthoimagery from the Ohio Statewide Imagery Program."},{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:"https://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.38,45.5666],[13.63822,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 ©2019 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:"https://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.38,45.5666],[13.63822,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 ©2019 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:"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"}];
25803
25804   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"},attraction:{icon:"maki-star",fields:["name","attraction","operator","opening_hours"],moreFields:["opening_hours","fee","payment_multi","address","website","phone","email","fax"],geometry:["point","vertex","line","area"],tags:{attraction:"*"},searchable:false,name:"Attraction"},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"],moreFields:["material"],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":{icon:"temaki-chairlift",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"],moreFields:["wheelchair","smoking"],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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["website","phone","email","fax","wheelchair"],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"],moreFields:["website","phone","email","fax","wheelchair"],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","website"],moreFields:["fee","payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["name","brand","lit","opening_hours","wheelchair","covered"],geometry:["point","vertex"],terms:["money","cash","machine"],tags:{amenity:"atm"},name:"ATM"},"amenity/bank":{icon:"maki-bank",fields:["name","operator","address","building_area","atm","drive_through"],moreFields:["opening_hours","currency_multi","website","phone","email","fax","wheelchair"],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","address","building_area","outdoor_seating","brewery"],moreFields:["smoking","opening_hours","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["dive","beer","bier","booze"],tags:{amenity:"bar"},name:"Bar"},"amenity/bbq":{icon:"maki-bbq",fields:["covered","fuel","access_simple"],moreFields:["lit"],geometry:["point"],terms:["bbq","grill"],tags:{amenity:"bbq"},name:"Barbecue/Grill"},"amenity/bench":{icon:"temaki-bench",fields:["backrest","material","seats","colour"],moreFields:["access_simple","inscription","lit"],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","fee"],moreFields:["payment_multi","covered"],geometry:["point","vertex","area"],terms:["bike"],tags:{amenity:"bicycle_parking"},name:"Bicycle Parking"},"amenity/bicycle_rental":{icon:"maki-bicycle",fields:["capacity","network","operator","fee","payment_multi"],moreFields:["opening_hours","address","website","phone","email","fax","wheelchair","covered"],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"],moreFields:["payment_multi","covered"],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","outdoor_seating","brewery"],moreFields:["{amenity/bar}"],geometry:["point","area"],tags:{amenity:"biergarten"},terms:["beer","bier","booze"],name:"Biergarten"},"amenity/boat_rental":{icon:"temaki-boating",fields:["name","operator","fee","payment_multi"],moreFields:["address","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"boat_rental"},name:"Boat Rental"},"amenity/bureau_de_change":{icon:"maki-bank",fields:["name","operator","payment_multi","currency_multi","address","building_area"],moreFields:["opening_hours","website","phone","email","fax","wheelchair"],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","outdoor_seating"],moreFields:["diet_multi","takeaway","delivery","capacity","opening_hours","smoking","payment_multi","internet_access","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["bistro","coffee","tea"],tags:{amenity:"cafe"},name:"Cafe"},"amenity/car_pooling":{icon:"maki-car",fields:["name","operator","capacity","address","opening_hours","lit"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"car_pooling"},name:"Car Pooling"},"amenity/car_rental":{icon:"maki-car-rental",fields:["name","operator","address","opening_hours","payment_multi"],moreFields:["brand","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"car_rental"},name:"Car Rental"},"amenity/car_sharing":{icon:"maki-car",fields:["name","operator","capacity","address","payment_multi","supervised"],moreFields:["lit","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"car_sharing"},name:"Car Sharing"},"amenity/car_wash":{icon:"temaki-car_wash",fields:["address","building_area","opening_hours","payment_multi"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"car_wash"},name:"Car Wash"},"amenity/casino":{icon:"maki-casino",fields:["name","operator","address","building_area","opening_hours","smoking"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["gambling","roulette","craps","poker","blackjack"],tags:{amenity:"casino"},name:"Casino"},"amenity/charging_station":{icon:"fas-charging-station",fields:["name","operator","capacity","fee","payment_multi"],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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["website","phone","email","fax","wheelchair"],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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["lit"],geometry:["point","vertex"],tags:{amenity:"clock"},name:"Clock"},"amenity/college":{icon:"maki-college",fields:["name","operator","address","website","internet_access"],moreFields:["religion","denomination","internet_access/fee","internet_access/ssid","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["university","undergraduate school"],tags:{amenity:"college"},name:"College Grounds"},"amenity/community_centre":{icon:"maki-town-hall",fields:["name","operator","address","building_area"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["event","hall"],tags:{amenity:"community_centre"},name:"Community Center"},"amenity/compressed_air":{icon:"maki-car",fields:["operator","fee","payment_multi","lit"],geometry:["point","area"],tags:{amenity:"compressed_air"},name:"Compressed Air"},"amenity/courthouse":{icon:"temaki-courthouse",fields:["name","operator","address","building_area"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"courthouse"},name:"Courthouse"},"amenity/crematorium":{icon:"maki-cemetery",fields:["name","website","phone","opening_hours","wheelchair"],moreFields:["address","website","phone","email","fax","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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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","scuba_diving"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["martial arts","dojang"],tags:{amenity:"dojo"},name:"Dojo / Martial Arts Academy"},"amenity/drinking_water":{icon:"maki-drinking-water",fields:["operator","access_simple","fee","wheelchair"],moreFields:["lit","covered"],geometry:["point"],tags:{amenity:"drinking_water"},terms:["potable water source","water fountain","drinking fountain","bubbler","water tap"],name:"Drinking Water"},"amenity/driving_school":{icon:"maki-car",fields:["name","operator","address","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"driving_school"},name:"Driving School"},"amenity/embassy":{icon:"maki-embassy",fields:["name","country","address","building_area"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"embassy"},name:"Embassy"},"amenity/fast_food":{icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","drive_through"],moreFields:["opening_hours","diet_multi","takeaway","delivery","smoking","capacity","outdoor_seating","internet_access","internet_access/fee","internet_access/ssid","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"fast_food"},terms:["restaurant","takeaway"],name:"Fast Food"},"amenity/fast_food/burger":{icon:"maki-fast-food",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",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",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",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",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",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"],moreFields:["website","phone","email","fax","wheelchair"],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"],moreFields:["smoking","outdoor_seating","capacity","internet_access","internet_access/fee","internet_access/ssid","diet_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["fast food","restaurant","food"],tags:{amenity:"food_court"},name:"Food Court"},"amenity/fountain":{icon:"temaki-fountain",fields:["name","operator","lit"],geometry:["point","area"],tags:{amenity:"fountain"},name:"Fountain"},"amenity/fuel":{icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi"],moreFields:["opening_hours","payment_multi","building","website","phone","email","fax","wheelchair"],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","address"],moreFields:["website","phone","email","fax"],geometry:["point","area"],tags:{amenity:"grave_yard"},name:"Graveyard"},"amenity/grit_bin":{icon:"fas-box",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"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],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","outdoor_seating"],moreFields:["takeaway","delivery","drive_through","internet_access","internet_access/fee","internet_access/ssid","diet_multi","payment_multi","website","phone","email","fax","wheelchair"],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","internet_access","internet_access/fee","internet_access/ssid"],moreFields:["opening_hours","smoking","outdoor_seating","payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["opening_hours","payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["esl"],tags:{amenity:"language_school"},name:"Language School"},"amenity/library":{icon:"maki-library",fields:["name","operator","building_area","address","ref/isil"],moreFields:["opening_hours","internet_access","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair","payment_multi"],geometry:["point","area"],terms:["book"],tags:{amenity:"library"},name:"Library"},"amenity/love_hotel":{icon:"maki-heart",fields:["name","operator","address","building_area","rooms","internet_access"],moreFields:["smoking","payment_multi","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"love_hotel"},name:"Love Hotel"},"amenity/marketplace":{icon:"maki-shop",fields:["name","operator","address","building","opening_hours"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"marketplace"},name:"Marketplace"},"amenity/monastery":{icon:"maki-place-of-worship",fields:["name","religion","denomination","address","building_area"],moreFields:["website","phone","email","fax","wheelchair"],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","payment_multi","currency_multi"],moreFields:["opening_hours","website","phone","email","fax","wheelchair"],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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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:["operator","parking","capacity","access_simple","fee","surface"],moreFields:["name","supervised","park_ride","maxstay","payment_multi","address","website","phone","email","fax","wheelchair","covered"],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:["{amenity/parking}","building","levels","height"],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"],moreFields:["currency_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["currency_multi","wheelchair"],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","dispensing"],moreFields:["opening_hours","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"pharmacy"},addTags:{amenity:"pharmacy",healthcare:"pharmacy"},removeTags:{amenity:"pharmacy",healthcare:"pharmacy"},reference:{key:"amenity",value:"pharmacy"},terms:["apothecary","drug store","drugstore","med*","prescription"],name:"Pharmacy Counter"},"amenity/place_of_worship":{icon:"maki-place-of-worship",fields:["name","religion","denomination","address","building_area","service_times"],moreFields:["opening_hours","internet_access","internet_access/ssid","website","phone","email","fax","wheelchair"],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","religion","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","religion","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:"Christian Church"},"amenity/place_of_worship/hindu":{icon:"temaki-hinduism",fields:["name","religion","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","religion","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:"Jewish Synagogue"},"amenity/place_of_worship/muslim":{icon:"maki-religious-muslim",fields:["name","religion","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:"Muslim Mosque"},"amenity/place_of_worship/shinto":{icon:"temaki-shinto",fields:["name","religion","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","religion","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","religion","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"],moreFields:["fee","payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["badge","constable","constabulary","cop","detective","fed","law","enforcement","officer","patrol"],tags:{amenity:"police"},name:"Police"},"amenity/post_box":{icon:"temaki-post_box",fields:["operator","collection_times","drive_through","ref"],moreFields:["wheelchair"],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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["letter","mail"],tags:{amenity:"post_office"},name:"Post Office"},"amenity/prison":{icon:"maki-prison",fields:["name","operator","address"],moreFields:["website","phone","email","fax","wheelchair"],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","brewery"],moreFields:["outdoor_seating","diet_multi","payment_multi","internet_access","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],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","fee"],moreFields:["opening_hours","payment_multi","website","phone","email","fax","wheelchair"],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","lit"],moreFields:["wheelchair"],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"],moreFields:["website","phone","email","fax","wheelchair"],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"],moreFields:["fee","payment_multi","website","phone","email","fax","wheelchair"],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","outdoor_seating"],moreFields:["takeaway","delivery","capacity","diet_multi","smoking","internet_access","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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"],moreFields:["payment_multi"],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","website"],moreFields:["internet_access","internet_access/ssid","phone","email","fax","wheelchair"],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"],moreFields:["lit","wheelchair"],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:["opening_hours","fee","supervised","building_area","access_simple","wheelchair"],moreFields:["operator","gender","payment_multi"],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"],moreFields:["lit","wheelchair","covered"],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"],moreFields:["opening_hours","wheelchair","internet_access","internet_access/fee","internet_access/ssid","website","phone","email","fax"],geometry:["point","area"],terms:[],tags:{amenity:"social_facility"},name:"Social Facility"},"amenity/social_facility/food_bank":{icon:"temaki-social_facility",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:["{amenity/social_facility}","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",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:["{amenity/social_facility}","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"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["recording","radio","television"],tags:{amenity:"studio"},name:"Studio"},"amenity/taxi":{icon:"fas-taxi",fields:["name","operator","capacity"],moreFields:["address","opening_hours","wheelchair"],geometry:["point","vertex","area"],terms:["cab"],tags:{amenity:"taxi"},name:"Taxi Stand"},"amenity/telephone":{icon:"maki-telephone",fields:["operator","phone","fee","payment_multi","booth"],moreFields:["covered","indoor","lit","wheelchair"],geometry:["point","vertex"],tags:{amenity:"telephone"},terms:["phone"],name:"Telephone"},"amenity/theatre":{icon:"maki-theatre",fields:["name","operator","address","building_area"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","payment_multi","website","phone","email","fax","wheelchair"],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","building_area","access_simple","gender","diaper","wheelchair"],moreFields:["fee","opening_hours","operator","payment_multi"],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"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["village","city","government","courthouse","municipal"],tags:{amenity:"townhall"},name:"Town Hall"},"amenity/university":{icon:"maki-college",fields:["{amenity/college}"],moreFields:["{amenity/college}"],geometry:["point","area"],terms:["college","graduate school","PhD program","master's degree program"],tags:{amenity:"university"},name:"University Grounds"},"amenity/vehicle_inspection":{icon:"maki-car",fields:["name","operator","address","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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",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",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",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",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",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",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:["{amenity/vending_machine}","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",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",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",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",matchScore:0.5},"amenity/vending_machine/ice_cream":{icon:"temaki-vending_machine",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",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",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",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",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:"temaki-veterinary_care",fields:["name","operator","address","building_area","opening_hours"],moreFields:["fee","payment_multi","website","phone","email","fax","wheelchair"],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:["operator","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","fee","payment_multi"],moreFields:["website","phone","email","fax","wheelchair"],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",fields:["operator","fee","payment_multi"],geometry:["area","vertex","point"],tags:{amenity:"water_point"},name:"RV Drinking Water"},"amenity/watering_place":{icon:"maki-drinking-water",fields:["operator","fee","payment_multi"],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",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:["{attraction}","height"],geometry:["point"],terms:["ferris wheel","theme park","amusement ride"],tags:{attraction:"big_wheel"},name:"Big Wheel"},"attraction/bumper_car":{icon:"maki-car",geometry:["point","area"],terms:["theme park","dodgem cars","autoscooter"],tags:{attraction:"bumper_car"},name:"Bumper Car"},"attraction/bungee_jumping":{icon:"maki-pitch",fields:["{attraction}","height"],geometry:["point","area"],terms:["theme park","bungy jumping","jumping platform"],tags:{attraction:"bungee_jumping"},name:"Bungee Jumping"},"attraction/carousel":{icon:"temaki-amusement_park",fields:["{attraction}","building_area"],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:["{attraction}","building_area"],geometry:["point","line","area"],terms:["theme park","ghost train"],tags:{attraction:"dark_ride"},name:"Dark Ride"},"attraction/drop_tower":{icon:"temaki-tower",fields:["{attraction}","height"],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",geometry:["point","area"],terms:["theme park","amusement ride","labyrinth"],tags:{attraction:"maze"},name:"Maze"},"attraction/pirate_ship":{icon:"maki-danger",geometry:["point"],terms:["theme park","carnival ride","amusement ride"],tags:{attraction:"pirate_ship"},name:"Pirate Ship"},"attraction/river_rafting":{icon:"maki-ferry",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",geometry:["point","area"],terms:["theme park","amusement ride"],tags:{attraction:"roller_coaster"},name:"Roller Coaster"},"attraction/summer_toboggan":{geometry:["line"],terms:["alpine slide","mountain coaster"],tags:{attraction:"summer_toboggan"},name:"Summer Toboggan"},"attraction/train":{icon:"maki-rail",fields:["{attraction}","fee"],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:["{attraction}","height"],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","material"],geometry:["point","vertex"],tags:{barrier:"block"},name:"Block"},"barrier/bollard":{icon:"maki-roadblock",fields:["access","material"],geometry:["point","vertex","line"],tags:{barrier:"bollard"},name:"Bollard"},"barrier/border_control":{icon:"maki-roadblock",fields:["access","building_area"],moreFields:["address","website","phone","email","fax"],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:"temaki-wall",fields:["height","material"],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","material"],geometry:["line"],tags:{barrier:"fence"},name:"Fence",matchScore:0.25},"barrier/fence/railing":{icon:"temaki-railing",geometry:["line"],tags:{barrier:"fence",fence_type:"railing"},terms:["railing","handrail","guard rail"],name:"Railing",matchScore:0.5},"barrier/gate":{icon:"maki-barrier",fields:["access"],geometry:["vertex","line"],tags:{barrier:"gate"},name:"Gate"},"barrier/guard_rail":{icon:"temaki-guard_rail",fields:["material"],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"],moreFields:["material"],geometry:["vertex","line"],tags:{barrier:"kerb"},name:"Curb"},"barrier/kerb/flush":{icon:"maki-wheelchair",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",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":{icon:"temaki-wall",fields:["height","material"],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","payment_multi","currency_multi"],moreFields:["address","website","phone","email","fax"],geometry:["vertex","area"],tags:{barrier:"toll_booth"},name:"Toll Booth"},"barrier/wall":{icon:"temaki-wall",fields:["wall","height","material"],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"],moreFields:["material","seamark/type"],geometry:["point","vertex","area"],tags:{"bridge:support":"*"},name:"Bridge Support"},"bridge/support/pier":{icon:"fas-archway",fields:["bridge/support"],moreFields:["material","seamark/type"],geometry:["point","vertex","area"],tags:{"bridge:support":"pier"},name:"Bridge Pier"},building:{icon:"maki-home",fields:["name","building","levels","height","address"],moreFields:["architect","building/material","roof/colour","smoking","wheelchair"],geometry:["point","area"],tags:{building:"*"},matchScore:0.6,terms:[],name:"Building"},"building/bunker":{geometry:["area"],tags:{building:"bunker"},matchScore:0.5,name:"Bunker",searchable:false},"building/entrance":{icon:"maki-entrance-alt1",fields:[],moreFields:[],geometry:["vertex"],tags:{building:"entrance"},name:"Entrance/Exit",searchable:false},"building/train_station":{icon:"maki-building",geometry:["point","vertex","area"],tags:{building:"train_station"},matchScore:0.5,name:"Train Station",searchable:false},"building/apartments":{icon:"maki-building",geometry:["area"],tags:{building:"apartments"},matchScore:0.5,name:"Apartment Building"},"building/barn":{icon:"maki-farm",geometry:["area"],tags:{building:"barn"},matchScore:0.5,name:"Barn"},"building/boathouse":{icon:"maki-harbor",geometry:["area"],tags:{building:"boathouse"},matchScore:0.5,terms:[],name:"Boathouse"},"building/bungalow":{icon:"maki-home",geometry:["area"],tags:{building:"bungalow"},terms:["home","detached"],matchScore:0.5,name:"Bungalow"},"building/cabin":{icon:"maki-home",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",geometry:["area"],tags:{building:"cathedral"},matchScore:0.5,name:"Cathedral Building"},"building/chapel":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"chapel"},matchScore:0.5,name:"Chapel Building"},"building/church":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"church"},matchScore:0.5,name:"Church Building"},"building/civic":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],tags:{building:"civic"},matchScore:0.5,name:"Civic Building"},"building/college":{icon:"maki-building",geometry:["area"],terms:["university"],tags:{building:"college"},matchScore:0.5,name:"College Building"},"building/commercial":{icon:"maki-suitcase",fields:["{building}","smoking"],geometry:["area"],tags:{building:"commercial"},matchScore:0.5,name:"Commercial Building"},"building/construction":{icon:"maki-building",geometry:["area"],tags:{building:"construction"},matchScore:0.5,name:"Building Under Construction"},"building/detached":{icon:"maki-home",geometry:["area"],tags:{building:"detached"},terms:["home","single","family","residence","dwelling"],matchScore:0.5,name:"Detached House"},"building/dormitory":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],tags:{building:"dormitory"},matchScore:0.5,name:"Dormitory"},"building/farm_auxiliary":{icon:"maki-farm",geometry:["area"],tags:{building:"farm_auxiliary"},matchScore:0.5,name:"Farm Building"},"building/farm":{icon:"maki-farm",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-centre",geometry:["area"],tags:{building:"greenhouse"},matchScore:0.5,name:"Greenhouse"},"building/hospital":{icon:"maki-building",geometry:["area"],tags:{building:"hospital"},matchScore:0.5,name:"Hospital Building"},"building/hotel":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],tags:{building:"hotel"},matchScore:0.5,name:"Hotel Building"},"building/house":{icon:"maki-home",geometry:["area"],tags:{building:"house"},terms:["home","family","residence","dwelling"],matchScore:0.5,name:"House"},"building/hut":{icon:"maki-home",fields:["name"],geometry:["area"],tags:{building:"hut"},matchScore:0.5,name:"Hut"},"building/industrial":{icon:"maki-industry",geometry:["area"],tags:{building:"industrial"},matchScore:0.5,name:"Industrial Building"},"building/kindergarten":{icon:"maki-building",geometry:["area"],terms:["kindergarden","pre-school"],tags:{building:"kindergarten"},matchScore:0.5,name:"Preschool/Kindergarten Building"},"building/mosque":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"mosque"},matchScore:0.5,name:"Mosque Building"},"building/pavilion":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],terms:["sports"],tags:{building:"pavilion"},matchScore:0.5,name:"Pavilion Building"},"building/public":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],tags:{building:"public"},matchScore:0.5,name:"Public Building"},"building/residential":{icon:"maki-residential-community",geometry:["area"],tags:{building:"residential"},matchScore:0.5,name:"Residential Building"},"building/retail":{icon:"maki-commercial",fields:["{building}","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",geometry:["area"],tags:{building:"ruins"},matchScore:0.5,name:"Building Ruins"},"building/school":{icon:"maki-building",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",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",geometry:["area"],tags:{building:"service"},matchScore:0.5,name:"Service Building"},"building/shed":{icon:"maki-home",geometry:["area"],tags:{building:"shed"},matchScore:0.5,name:"Shed"},"building/stable":{icon:"maki-horse-riding",geometry:["area"],tags:{building:"stable"},matchScore:0.5,name:"Stable"},"building/stadium":{icon:"maki-stadium",fields:["{building}","smoking"],geometry:["area"],tags:{building:"stadium"},matchScore:0.5,name:"Stadium Building"},"building/static_caravan":{icon:"maki-home",geometry:["area"],tags:{building:"static_caravan"},matchScore:0.5,name:"Static Mobile Home"},"building/temple":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"temple"},matchScore:0.5,name:"Temple Building"},"building/terrace":{icon:"maki-building",geometry:["area"],tags:{building:"terrace"},terms:["home","terrace","brownstone","family","residence","dwelling"],matchScore:0.5,name:"Row Houses"},"building/transportation":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],tags:{building:"transportation"},matchScore:0.5,name:"Transportation Building"},"building/university":{icon:"maki-building",geometry:["area"],terms:["college"],tags:{building:"university"},matchScore:0.5,name:"University Building"},"building/warehouse":{icon:"maki-warehouse",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"],moreFields:["access_simple","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{club:"*"},terms:["social"],name:"Club"},"club/sport":{icon:"maki-heart",fields:["name","sport","{club}"],geometry:["point","area"],tags:{club:"sport"},terms:["athletics club","sporting club","sports association","sports society"],name:"Sports Club"},craft:{icon:"temaki-tools",fields:["name","craft","operator","address","building_area","opening_hours"],moreFields:["product","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{craft:"*"},terms:[],name:"Craft"},"craft/jeweler":{icon:"maki-marker-stroked",geometry:["point","area"],tags:{craft:"jeweler"},reference:{key:"shop",value:"jewelry"},name:"Jeweler",searchable:false},"craft/locksmith":{icon:"maki-marker-stroked",geometry:["point","area"],tags:{craft:"locksmith"},reference:{key:"shop",value:"locksmith"},name:"Locksmith",searchable:false},"craft/optician":{icon:"maki-marker-stroked",geometry:["point","area"],tags:{craft:"optician"},reference:{key:"shop",value:"optician"},name:"Optician",searchable:false},"craft/tailor":{icon:"maki-clothing-store",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",geometry:["point","area"],tags:{craft:"basket_maker"},name:"Basket Maker"},"craft/beekeeper":{icon:"maki-farm",geometry:["point","area"],tags:{craft:"beekeeper"},name:"Beekeeper"},"craft/blacksmith":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"blacksmith"},name:"Blacksmith"},"craft/boatbuilder":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"boatbuilder"},matchScore:0.4,name:"Boat Builder"},"craft/bookbinder":{icon:"maki-library",geometry:["point","area"],terms:["book repair"],tags:{craft:"bookbinder"},name:"Bookbinder"},"craft/brewery":{icon:"temaki-storage_tank",fields:["{craft}","product"],geometry:["point","area"],terms:["alcohol","beer","beverage","bier","booze","cider"],tags:{craft:"brewery"},name:"Brewery"},"craft/carpenter":{icon:"temaki-tools",geometry:["point","area"],terms:["woodworker"],tags:{craft:"carpenter"},name:"Carpenter"},"craft/carpet_layer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"carpet_layer"},name:"Carpet Layer"},"craft/caterer":{icon:"maki-restaurant",fields:["name","cuisine","{craft}"],geometry:["point","area"],tags:{craft:"caterer"},name:"Caterer"},"craft/chimney_sweeper":{icon:"temaki-chimney",geometry:["point","area"],tags:{craft:"chimney_sweeper"},name:"Chimney Sweeper"},"craft/clockmaker":{icon:"temaki-clock",geometry:["point","area"],tags:{craft:"clockmaker"},name:"Clockmaker"},"craft/confectionery":{icon:"maki-confectionery",geometry:["point","area"],terms:["sweet","candy"],tags:{craft:"confectionery"},name:"Candy Maker"},"craft/distillery":{icon:"temaki-storage_tank",fields:["{craft}","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",geometry:["point","area"],terms:["seamstress"],tags:{craft:"dressmaker"},name:"Dressmaker"},"craft/electrician":{icon:"temaki-power",geometry:["point","area"],terms:["power","wire"],tags:{craft:"electrician"},name:"Electrician"},"craft/electronics_repair":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"electronics_repair"},name:"Electronics Repair Shop"},"craft/gardener":{icon:"maki-garden-centre",geometry:["point","area"],terms:["landscaper","grounds keeper"],tags:{craft:"gardener"},name:"Gardener"},"craft/glaziery":{icon:"temaki-window",geometry:["point","area"],terms:["glass","stained-glass","window"],tags:{craft:"glaziery"},name:"Glaziery"},"craft/handicraft":{icon:"maki-art-gallery",geometry:["point","area"],tags:{craft:"handicraft"},name:"Handicraft"},"craft/hvac":{icon:"temaki-tools",geometry:["point","area"],terms:["heat*","vent*","air conditioning"],tags:{craft:"hvac"},name:"HVAC"},"craft/insulator":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"insulation"},name:"Insulator"},"craft/key_cutter":{icon:"fas-key",geometry:["point","area"],tags:{craft:"key_cutter"},name:"Key Cutter"},"craft/metal_construction":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"metal_construction"},name:"Metal Construction"},"craft/painter":{icon:"fas-paint-roller",geometry:["point","area"],tags:{craft:"painter"},name:"Painter"},"craft/photographer":{icon:"maki-attraction",geometry:["point","area"],tags:{craft:"photographer"},name:"Photographer"},"craft/photographic_laboratory":{icon:"maki-attraction",geometry:["point","area"],terms:["film"],tags:{craft:"photographic_laboratory"},name:"Photographic Laboratory"},"craft/plasterer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"plasterer"},name:"Plasterer"},"craft/plumber":{icon:"temaki-plumber",geometry:["point","area"],terms:["pipe"],tags:{craft:"plumber"},name:"Plumber"},"craft/pottery":{icon:"maki-art-gallery",geometry:["point","area"],terms:["ceramic"],tags:{craft:"pottery"},name:"Pottery"},"craft/rigger":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"rigger"},name:"Rigger"},"craft/roofer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"roofer"},name:"Roofer"},"craft/saddler":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"saddler"},name:"Saddler"},"craft/sailmaker":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"sailmaker"},name:"Sailmaker"},"craft/sawmill":{icon:"maki-logging",geometry:["point","area"],terms:["lumber"],tags:{craft:"sawmill"},name:"Sawmill"},"craft/scaffolder":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"scaffolder"},name:"Scaffolder"},"craft/sculptor":{icon:"maki-art-gallery",geometry:["point","area"],tags:{craft:"sculptor"},name:"Sculptor"},"craft/shoemaker":{icon:"maki-shoe",geometry:["point","area"],terms:["cobbler"],tags:{craft:"shoemaker"},name:"Shoemaker"},"craft/stonemason":{icon:"temaki-tools",geometry:["point","area"],terms:["masonry"],tags:{craft:"stonemason"},name:"Stonemason"},"craft/tiler":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"tiler"},name:"Tiler"},"craft/tinsmith":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"tinsmith"},name:"Tinsmith"},"craft/upholsterer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"upholsterer"},name:"Upholsterer"},"craft/watchmaker":{icon:"maki-watch",geometry:["point","area"],tags:{craft:"watchmaker"},name:"Watchmaker"},"craft/window_construction":{icon:"temaki-window",geometry:["point","area"],terms:["glass"],tags:{craft:"window_construction"},name:"Window Construction"},"craft/winery":{icon:"maki-alcohol-shop",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"],moreFields:["website","phone","email","fax","wheelchair"],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:["ref","fire_hydrant/type","colour","water_source","couplings"],moreFields:["fire_hydrant/pressure","fire_hydrant/diameter","water_volume","survey/date"],geometry:["point","vertex"],terms:["fire plug","fire water well","hydrant"],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"],moreFields:["opening_hours","payment_multi","brand","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{healthcare:"*"},terms:["clinic","doctor","disease","health","institution","sick","surgery","wellness"],name:"Healthcare Facility"},"healthcare/alternative":{icon:"maki-hospital",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",geometry:["point","area"],terms:["back","pain","spine"],tags:{healthcare:"alternative","healthcare:speciality":"chiropractic"},name:"Chiropractor"},"healthcare/audiologist":{icon:"maki-hospital",geometry:["point","area"],terms:["ear","hearing","sound"],tags:{healthcare:"audiologist"},name:"Audiologist"},"healthcare/birthing_center":{icon:"maki-hospital",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:["{healthcare}","blood_components"],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",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",geometry:["point","area"],terms:["baby","childbirth","delivery","labour","labor","pregnancy"],tags:{healthcare:"midwife"},name:"Midwife"},"healthcare/occupational_therapist":{icon:"maki-hospital",geometry:["point","area"],terms:["therapist","therapy"],tags:{healthcare:"occupational_therapist"},name:"Occupational Therapist"},"healthcare/optometrist":{icon:"maki-hospital",geometry:["point","area"],terms:["eye","glasses","lasik","lenses","vision"],tags:{healthcare:"optometrist"},name:"Optometrist"},"healthcare/physiotherapist":{icon:"temaki-physiotherapist",geometry:["point","area"],terms:["physical","therapist","therapy"],tags:{healthcare:"physiotherapist"},name:"Physiotherapist"},"healthcare/podiatrist":{icon:"maki-hospital",geometry:["point","area"],terms:["foot","feet","nails"],tags:{healthcare:"podiatrist"},name:"Podiatrist"},"healthcare/psychotherapist":{icon:"maki-hospital",geometry:["point","area"],terms:["anxiety","counselor","depression","mental health","mind","suicide","therapist","therapy"],tags:{healthcare:"psychotherapist"},name:"Psychotherapist"},"healthcare/rehabilitation":{icon:"maki-hospital",geometry:["point","area"],terms:["rehab","therapist","therapy"],tags:{healthcare:"rehabilitation"},name:"Rehabilitation Facility"},"healthcare/speech_therapist":{icon:"maki-hospital",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","incline","horse_scale"],moreFields:["wheelchair","lit","smoothness","covered","dog"],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","structure","covered"],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/construction":{icon:"iD-highway-construction",fields:["name","opening_date","check_date","note","oneway","structure","access"],geometry:["line"],tags:{highway:"construction",access:"no"},terms:["closed","closure","construction"],name:"Road Closed"},"highway/corridor":{icon:"iD-highway-footway",fields:["name","width","level","access_simple","wheelchair"],moreFields:["maxheight"],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","width","structure","access","incline"],moreFields:["wheelchair","lit","smoothness","maxspeed","covered","dog"],geometry:["line"],tags:{highway:"cycleway"},terms:["bike"],name:"Cycle Path"},"highway/elevator":{icon:"temaki-elevator",fields:["access_simple","opening_hours","maxweight","ref","wheelchair"],moreFields:["maxheight"],geometry:["vertex"],tags:{highway:"elevator"},terms:["lift"],name:"Elevator"},"highway/footway":{icon:"iD-highway-footway",fields:["name","surface","width","structure","access","incline"],moreFields:["wheelchair","lit","smoothness","covered","dog"],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","wheelchair"],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",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","access"],moreFields:["cycleway","maxheight","covered","lit","smoothness","oneway/bicycle"],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:["destination_oneway","destination/ref_oneway","junction/ref_oneway","oneway","maxspeed","lanes","surface","structure","access"],moreFields:["covered","destination/symbol_oneway","lit","maxheight","maxspeed/advisory","name","ref_road_number","smoothness","toll"],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","access"],moreFields:["toll","maxheight","covered","lit","smoothness","minspeed"],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"],moreFields:["wheelchair","lit","smoothness","trail_visibility","sac_scale","mtb/scale","mtb/scale/uphill","mtb/scale/imba","horse_scale","covered","ref","dog"],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"],moreFields:["covered","smoothness"],geometry:["line"],tags:{highway:"pedestrian"},terms:["center","centre","plaza","quad","square","walkway"],name:"Pedestrian Street"},"highway/primary_link":{icon:"iD-highway-primary-link",fields:["destination_oneway","destination/ref_oneway","oneway","maxspeed","lanes","surface","structure","access"],moreFields:["covered","cycleway","destination/symbol_oneway","junction/ref_oneway","lit","maxheight","maxspeed/advisory","name","oneway/bicycle","ref_road_number","smoothness","toll"],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","ref_road_number","access"],moreFields:["covered","cycleway","lit","maxheight","maxspeed/advisory","oneway/bicycle","smoothness","toll"],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","access"],moreFields:["covered","cycleway","lit","oneway/bicycle","maxheight","maxspeed/advisory","smoothness"],geometry:["line"],tags:{highway:"residential"},terms:["road","street"],name:"Residential Road"},"highway/rest_area":{icon:"maki-car",fields:["name","operator","opening_hours"],moreFields:["address","website","phone","email","fax","wheelchair"],geometry:["point","vertex","area"],tags:{highway:"rest_area"},terms:["rest stop"],name:"Rest Area"},"highway/road":{icon:"iD-highway-road",fields:["{highway/residential}"],moreFields:["{highway/residential}"],geometry:["line"],tags:{highway:"road"},terms:["road","street"],name:"Unknown Road"},"highway/secondary_link":{icon:"iD-highway-secondary-link",fields:["{highway/primary_link}"],moreFields:["{highway/primary_link}"],geometry:["line"],tags:{highway:"secondary_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Secondary Link"},"highway/secondary":{icon:"iD-highway-secondary",fields:["{highway/primary}"],moreFields:["{highway/primary}"],geometry:["line"],tags:{highway:"secondary"},terms:["road","street"],name:"Secondary Road"},"highway/service":{icon:"iD-highway-service",fields:["name","service","oneway","maxspeed","surface","structure","access"],moreFields:["covered","lanes","lit","maxheight","maxspeed/advisory","oneway/bicycle"],geometry:["line"],tags:{highway:"service"},terms:["road","street"],name:"Service Road"},"highway/service/alley":{icon:"iD-highway-service",geometry:["line"],tags:{highway:"service",service:"alley"},reference:{key:"service",value:"alley"},name:"Alley"},"highway/service/drive-through":{icon:"iD-highway-service",fields:["{highway/service}","covered"],geometry:["line"],tags:{highway:"service",service:"drive-through"},reference:{key:"service",value:"drive-through"},name:"Drive-Through"},"highway/service/driveway":{icon:"iD-highway-service",geometry:["line"],tags:{highway:"service",service:"driveway"},reference:{key:"service",value:"driveway"},name:"Driveway"},"highway/service/emergency_access":{icon:"iD-highway-service",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",geometry:["line"],tags:{highway:"service",service:"parking_aisle"},reference:{key:"service",value:"parking_aisle"},name:"Parking Aisle"},"highway/services":{icon:"maki-car",fields:["{highway/rest_area}"],moreFields:["{highway/rest_area}"],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:["{highway/primary_link}"],moreFields:["{highway/primary_link}"],geometry:["line"],tags:{highway:"tertiary_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Tertiary Link"},"highway/tertiary":{icon:"iD-highway-tertiary",fields:["{highway/primary}"],moreFields:["{highway/primary}"],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"],moreFields:["mtb/scale","mtb/scale/uphill","mtb/scale/imba","horse_scale","covered"],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:["{highway/motorway_link}"],moreFields:["{highway/motorway_link}"],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","access"],moreFields:["toll","maxheight","covered","lit","smoothness","minspeed"],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:["{highway/residential}"],moreFields:["{highway/residential}"],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","access_simple"],geometry:["point","vertex","area"],tags:{historic:"archaeological_site"},name:"Archaeological Site"},"historic/boundary_stone":{icon:"temaki-milestone",fields:["name","inscription"],moreFields:["material"],geometry:["point","vertex"],tags:{historic:"boundary_stone"},name:"Boundary Stone"},"historic/castle":{icon:"maki-castle",fields:["name","castle_type","building_area","historic/civilization","access_simple"],geometry:["point","area"],tags:{historic:"castle"},name:"Castle"},"historic/memorial":{icon:"maki-monument",fields:["name","memorial","inscription"],moreFields:["material","website"],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","access_simple"],moreFields:["material"],geometry:["point","vertex","area"],tags:{historic:"monument"},name:"Monument"},"historic/ruins":{icon:"temaki-ruins",fields:["name","historic/civilization","inscription","access_simple"],geometry:["point","vertex","area"],tags:{historic:"ruins"},name:"Ruins"},"historic/tomb":{icon:"maki-cemetery",fields:["name","tomb","building_area","inscription","access_simple"],geometry:["point","area"],tags:{historic:"tomb"},name:"Tomb"},"historic/wayside_cross":{icon:"maki-religious-christian",fields:["name","inscription"],moreFields:["material"],geometry:["point","vertex","area"],tags:{historic:"wayside_cross"},name:"Wayside Cross"},"historic/wayside_shrine":{icon:"maki-landmark",fields:["name","religion","denomination","inscription","access_simple"],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"],moreFields:["seamark/type"],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"},matchScore:0.25,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/basin":{icon:"maki-water",fields:["name","basin","intermittent_yes"],geometry:["area"],tags:{landuse:"basin"},name:"Basin",searchable:false},"landuse/farm":{icon:"maki-farm",fields:["name","operator","crop"],geometry:["point","area"],tags:{landuse:"farm"},name:"Farmland",searchable:false},"landuse/pond":{icon:"maki-water",fields:["name","intermittent"],geometry:["area"],tags:{landuse:"pond"},name:"Pond",searchable:false},"landuse/reservoir":{icon:"maki-water",fields:["name","intermittent"],geometry:["area"],tags:{landuse:"reservoir"},name:"Reservoir",searchable:false},"landuse/allotments":{icon:"maki-garden-centre",geometry:["area"],fields:["name"],moreFields:["address","website","phone","email","fax"],tags:{landuse:"allotments"},terms:["allotment","garden"],name:"Community Garden"},"landuse/aquaculture":{icon:"maki-aquarium",fields:["name","operator","produce"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"aquaculture"},terms:["fish farm","crustacean","algae","aquafarming","shrimp farm","oyster farm","mariculture","algaculture"],name:"Aquaculture"},"landuse/brownfield":{geometry:["area"],fields:["name"],tags:{landuse:"brownfield"},terms:[],matchScore:0.9,name:"Brownfield"},"landuse/cemetery":{icon:"maki-cemetery",fields:["name","religion","denomination"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"cemetery"},terms:[],name:"Cemetery"},"landuse/churchyard":{icon:"maki-religious-christian",fields:["name","religion","denomination"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"churchyard"},terms:[],name:"Churchyard"},"landuse/commercial":{icon:"maki-suitcase",fields:["name"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"commercial"},terms:[],matchScore:0.9,name:"Commercial Area"},"landuse/construction":{icon:"temaki-tools",fields:["name","construction","operator"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"construction"},terms:[],name:"Construction"},"landuse/farmland":{icon:"maki-farm",fields:["name","operator","crop","produce"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"farmland"},terms:["crop","grow","plant"],name:"Farmland"},"landuse/farmyard":{icon:"maki-farm",fields:["name","operator","crop"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"farmyard"},terms:["crop","grow","plant"],name:"Farmyard"},"landuse/forest":{icon:"maki-park-alt1",fields:["name","leaf_type","leaf_cycle","produce"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"forest"},terms:["cut","forest","forestry","lumber","silviculture","tree"],name:"Managed Forest"},"landuse/garages":{icon:"fas-warehouse",geometry:["area"],fields:["name"],moreFields:["address","website","phone","email","fax"],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"],moreFields:["address","website","phone","email","fax"],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"],moreFields:["address","website","phone","email","fax"],geometry:["area"],terms:["boat"],tags:{landuse:"harbour"},name:"Harbor"},"landuse/industrial":{icon:"maki-industry",fields:["name","industrial"],moreFields:["address","website","phone","email","fax"],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"],moreFields:["address","website","phone","email","fax"],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"],moreFields:["address","website","phone","email","fax"],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"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"orchard"},terms:["fruit"],name:"Orchard"},"landuse/plant_nursery":{icon:"maki-garden",fields:["name","operator","plant"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"plant_nursery"},terms:["flower","garden","grow","vivero"],name:"Plant Nursery"},"landuse/quarry":{geometry:["area"],fields:["name"],moreFields:["address","website","phone","email","fax"],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"],moreFields:["address","website","phone","email","fax"],tags:{landuse:"recreation_ground"},terms:["playing fields"],name:"Recreation Ground"},"landuse/religious":{icon:"maki-place-of-worship",geometry:["area"],fields:["name","religion","denomination"],moreFields:["address","website","phone","email","fax"],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/residential/apartments":{icon:"maki-building",fields:["name","operator","address"],geometry:["point","area"],tags:{residential:"apartments"},addTags:{landuse:"residential",residential:"apartments"},removeTags:{landuse:"residential",residential:"apartments"},reference:{key:"residential",value:"apartments"},terms:["flat","residence","tenement"],name:"Apartment Complex"},"landuse/retail":{icon:"maki-commercial",geometry:["area"],fields:["name"],moreFields:["address","website","phone","email","fax"],tags:{landuse:"retail"},matchScore:0.9,name:"Retail Area"},"landuse/vineyard":{fields:["name","operator","grape_variety"],moreFields:["address","website","phone","email","fax"],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:"temaki-casino",fields:["{amenity/casino}"],moreFields:["{amenity/casino}"],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"],moreFields:["opening_hours","payment_multi","smoking","website","phone","email","fax"],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"],moreFields:["website"],geometry:["point","area"],tags:{leisure:"bandstand"},name:"Bandstand"},"leisure/beach_resort":{icon:"maki-beach",fields:["name","address","fee"],moreFields:["opening_hours","payment_multi","smoking","website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"beach_resort"},name:"Beach Resort"},"leisure/bird_hide":{icon:"temaki-binoculars",fields:["name","building_area","address","opening_hours"],moreFields:["website"],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"],moreFields:["opening_hours","payment_multi","smoking","website","phone","email","fax"],geometry:["point","area"],terms:["bowling center"],tags:{leisure:"bowling_alley"},name:"Bowling Alley"},"leisure/common":{icon:"temaki-pedestrian",fields:["name"],moreFields:["website"],geometry:["point","area"],terms:["open space"],tags:{leisure:"common"},name:"Common"},"leisure/dance":{icon:"maki-music",fields:["name","operator","address","building_area","dance/style"],moreFields:["opening_hours","payment_multi","website","phone","email","fax"],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","dance/style"],moreFields:["opening_hours","payment_multi","website","phone","email","fax"],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",fields:["name"],moreFields:["website","phone","email","fax"],geometry:["point","area"],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"],moreFields:["opening_hours","fee","payment_multi","website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"fitness_centre"},terms:["health","gym","leisure","studio"],name:"Gym / Fitness Center"},"leisure/fitness_centre/yoga":{icon:"maki-pitch",geometry:["point","area"],terms:["studio","asanas","modern yoga","meditation"],tags:{leisure:"fitness_centre",sport:"yoga"},reference:{key:"sport",value:"yoga"},name:"Yoga Studio"},"leisure/fitness_station":{icon:"maki-pitch",fields:["fitness_station","ref"],moreFields:["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",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",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",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",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",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",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",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",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",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",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",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","operator","access_simple"],moreFields:["fee","payment_multi","website","phone","email","fax"],geometry:["point","vertex","area"],tags:{leisure:"garden"},name:"Garden"},"leisure/golf_course":{icon:"maki-golf",fields:["name","operator","address","opening_hours"],moreFields:["payment_multi","website","phone","email","fax"],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"],moreFields:["payment_multi","internet_access","internet_access/fee","internet_access/ssid","smoking","phone","email","fax"],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"],moreFields:["opening_hours","payment_multi","website","phone","email","fax"],geometry:["point","area"],terms:["equestrian","stable"],tags:{leisure:"horse_riding"},name:"Horseback Riding Facility"},"leisure/ice_rink":{icon:"fas-skating",fields:["name","seasonal","sport_ice","operator","address","building"],moreFields:["opening_hours","payment_multi","website","phone","email","fax"],geometry:["point","area"],terms:["hockey","skating","curling"],tags:{leisure:"ice_rink"},name:"Ice Rink"},"leisure/marina":{icon:"maki-harbor",fields:["name","operator","capacity","fee","sanitary_dump_station","power_supply"],moreFields:["address","payment_multi","internet_access","internet_access/fee","internet_access/ssid","seamark/type","website","phone","email","fax"],geometry:["point","vertex","area"],terms:["boat"],tags:{leisure:"marina"},name:"Marina"},"leisure/miniature_golf":{icon:"maki-golf",fields:["name","operator","address","opening_hours"],moreFields:["fee","payment_multi","website","phone","email","fax"],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","operator","address","opening_hours"],moreFields:["dog","website","phone","email","fax"],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",fields:["name","operator","address","opening_hours"],moreFields:["dog","smoking","website","phone","email","fax"],geometry:["point","area"],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",fields:["material","lit","bench"],geometry:["point"],tags:{leisure:"picnic_table"},terms:["bench"],name:"Picnic Table"},"leisure/pitch":{icon:"maki-pitch",fields:["name","sport","surface","lit"],moreFields:["access_simple","fee"],geometry:["point","area"],tags:{leisure:"pitch"},terms:["field"],name:"Sport Pitch"},"leisure/pitch/american_football":{icon:"maki-american-football",geometry:["point","area"],tags:{leisure:"pitch",sport:"american_football"},reference:{key:"sport",value:"american_football"},terms:["football","gridiron"],name:"American Football Field"},"leisure/pitch/australian_football":{icon:"maki-american-football",geometry:["point","area"],tags:{leisure:"pitch",sport:"australian_football"},reference:{key:"sport",value:"australian_football"},terms:["Aussie","AFL","football"],name:"Australian Football Field"},"leisure/pitch/badminton":{icon:"maki-tennis",fields:["{leisure/pitch}","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",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",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","{leisure/pitch}"],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",geometry:["point","area"],tags:{leisure:"pitch",sport:"bowls"},reference:{key:"sport",value:"bowls"},terms:[],name:"Bowling Green"},"leisure/pitch/cricket":{icon:"maki-cricket",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:["{leisure/pitch}","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/netball":{icon:"maki-volleyball",geometry:["point","area"],tags:{leisure:"pitch",sport:"netball"},reference:{key:"sport",value:"netball"},terms:[],name:"Netball Court"},"leisure/pitch/rugby_league":{icon:"maki-american-football",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-american-football",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",geometry:["point","area"],tags:{leisure:"pitch",sport:"skateboard"},reference:{key:"sport",value:"skateboard"},terms:[],name:"Skate Park"},"leisure/pitch/soccer":{icon:"maki-soccer",geometry:["point","area"],tags:{leisure:"pitch",sport:"soccer"},reference:{key:"sport",value:"soccer"},terms:["football"],name:"Soccer Field"},"leisure/pitch/softball":{icon:"maki-baseball",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:["{leisure/pitch}","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",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"],moreFields:["payment_multi","website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"resort"},name:"Resort"},"leisure/sauna":{icon:"fas-thermometer-three-quarters",fields:["name","operator","address","opening_hours","access_simple","fee"],moreFields:["payment_multi","website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"sauna"},name:"Sauna"},"leisure/slipway":{icon:"maki-slipway",fields:["name","access_simple","fee"],moreFields:["seamark/type"],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","fee"],moreFields:["opening_hours","payment_multi","website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"sports_centre"},terms:[],name:"Sports Center / Complex"},"leisure/sports_centre/swimming":{icon:"maki-swimming",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"],moreFields:["website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"stadium"},name:"Stadium"},"leisure/swimming_pool":{icon:"maki-swimming",fields:["name","access_simple","lit","location_pool","length","swimming_pool"],moreFields:["operator","address"],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/track/horse_racing":{icon:"maki-horse-riding",fields:["surface","sport_racing_nonmotor","lit","width","lanes"],geometry:["point","line","area"],tags:{leisure:"track",sport:"horse_racing"},terms:["race*","horse","track"],name:"Racetrack (Horse Racing)"},"leisure/track/running":{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/water_park":{icon:"maki-swimming",fields:["name","operator","address"],moreFields:["payment_multi","brand","website","phone","email","fax"],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"],moreFields:["material"],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"],moreFields:["material","seamark/type"],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",fields:["material"],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"],moreFields:["material"],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":{fields:["material"],geometry:["line","area"],tags:{man_made:"groyne"},name:"Groyne"},"man_made/lighthouse":{icon:"maki-lighthouse",fields:["name","operator","building_area","height"],moreFields:["address","website","phone","email","fax","seamark/type"],geometry:["point","area"],tags:{man_made:"lighthouse"},name:"Lighthouse"},"man_made/mast":{icon:"maki-communications-tower",fields:["tower/type","tower/construction","height"],moreFields:["material","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:["{man_made/mast}","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",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",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",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":{fields:["name","operator","address","access_simple","building_area"],moreFields:["website","phone","email","fax"],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"],moreFields:["website","phone","email","fax"],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"],moreFields:["website","phone","email","fax"],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:["name","water","intermittent"],geometry:["area"],tags:{natural:"water"},name:"Water"},"natural/water/basin":{icon:"maki-water",fields:["name","basin","intermittent_yes"],geometry:["area"],tags:{natural:"water",water:"basin"},reference:{key:"water",value:"basin"},terms:["detention","drain","overflow","rain","retention"],name:"Basin"},"natural/water/canal":{icon:"maki-water",geometry:["area"],tags:{natural:"water",water:"canal"},reference:{key:"water",value:"canal"},name:"Canal"},"natural/water/lake":{icon:"maki-water",geometry:["area"],tags:{natural:"water",water:"lake"},reference:{key:"water",value:"lake"},terms:["lakelet","loch","mere"],name:"Lake"},"natural/water/pond":{icon:"maki-water",geometry:["area"],tags:{natural:"water",water:"pond"},reference:{key:"water",value:"pond"},terms:["lakelet","millpond","tarn","pool","mere"],name:"Pond"},"natural/water/reservoir":{icon:"maki-water",geometry:["area"],tags:{natural:"water",water:"reservoir"},reference:{key:"water",value:"reservoir"},name:"Reservoir"},"natural/water/river":{icon:"maki-water",geometry:["area"],tags:{natural:"water",water:"river"},reference:{key:"water",value:"river"},terms:["beck","branch","brook","course","creek","estuary","rill","riverbank","rivulet","run","runnel","stream","tributary","watercourse"],name:"River"},"natural/water/stream":{icon:"maki-water",geometry:["area"],tags:{natural:"water",water:"stream"},reference:{key:"water",value:"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"],name:"Stream"},"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"],moreFields:["operator","smoking","website","phone","email","fax","wheelchair"],geometry:["point","vertex","area"],tags:{office:"*"},terms:[],name:"Office"},"office/administrative":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"administrative"},terms:[],searchable:false,name:"Administrative Office"},"office/physician":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"physician"},searchable:false,name:"Physician"},"office/travel_agent":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"travel_agent"},reference:{key:"shop",value:"travel_agency"},terms:[],name:"Travel Agency",searchable:false},"office/accountant":{icon:"temaki-accounting",geometry:["point","area"],tags:{office:"accountant"},terms:[],name:"Accountant Office"},"office/adoption_agency":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"adoption_agency"},terms:[],name:"Adoption Agency"},"office/advertising_agency":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"advertising_agency"},terms:["ad","ad agency","advert agency","advertising","marketing"],name:"Advertising Agency"},"office/architect":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"architect"},terms:[],name:"Architect Office"},"office/association":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"association"},terms:["association","non-profit","nonprofit","organization","society"],name:"Nonprofit Organization Office"},"office/charity":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"charity"},terms:["charitable organization"],name:"Charity Office"},"office/company":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"company"},terms:[],name:"Corporate Office"},"office/coworking":{icon:"maki-suitcase",fields:["{office}","internet_access"],moreFields:["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",geometry:["point","area"],tags:{office:"educational_institution"},terms:[],name:"Educational Institution"},"office/employment_agency":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"employment_agency"},terms:["job"],name:"Employment Agency"},"office/energy_supplier":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"energy_supplier"},terms:["electricity","energy company","energy utility","gas utility"],name:"Energy Supplier Office"},"office/estate_agent":{icon:"temaki-real_estate_agency",geometry:["point","area"],tags:{office:"estate_agent"},terms:["real estate"],name:"Real Estate Office"},"office/financial":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"financial"},terms:[],name:"Financial Office"},"office/forestry":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"forestry"},terms:["forest","ranger"],name:"Forestry Office"},"office/foundation":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"foundation"},terms:[],name:"Foundation Office"},"office/government":{icon:"maki-town-hall",fields:["name","government","{office}"],geometry:["point","area"],tags:{office:"government"},terms:[],name:"Government Office"},"office/government/register_office":{icon:"maki-town-hall",fields:["{office}","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:["{office}","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",geometry:["point","area"],tags:{office:"guide"},terms:["dive guide","mountain guide","tour guide"],name:"Tour Guide Office"},"office/insurance":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"insurance"},terms:[],name:"Insurance Office"},"office/it":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"it"},terms:["computer","information","software","technology"],name:"Information Technology Office"},"office/lawyer":{icon:"fas-balance-scale",geometry:["point","area"],tags:{office:"lawyer"},terms:[],name:"Law Office"},"office/lawyer/notary":{icon:"maki-suitcase",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",geometry:["point","area"],tags:{office:"moving_company"},terms:["relocation"],name:"Moving Company Office"},"office/newspaper":{icon:"maki-library",geometry:["point","area"],tags:{office:"newspaper"},terms:[],name:"Newspaper Office"},"office/ngo":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"ngo"},terms:["ngo","non government","non-government","organization","organisation"],name:"NGO Office"},"office/notary":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"notary"},terms:["clerk","deeds","estate","signature","wills"],name:"Notary Office"},"office/political_party":{icon:"maki-town-hall",geometry:["point","area"],tags:{office:"political_party"},terms:[],name:"Political Party"},"office/private_investigator":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"private_investigator"},terms:["PI","private eye","private detective"],name:"Private Investigator Office"},"office/quango":{icon:"maki-suitcase",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:["{office}","religion","denomination"],geometry:["point","area"],tags:{office:"religion"},terms:[],name:"Religious Office"},"office/research":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"research"},terms:[],name:"Research Office"},"office/surveyor":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"surveyor"},terms:[],name:"Surveyor Office"},"office/tax_advisor":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"tax_advisor"},terms:["tax","tax consultant"],name:"Tax Advisor Office"},"office/telecommunication":{icon:"maki-telephone",geometry:["point","area"],tags:{office:"telecommunication"},terms:["communication","internet","phone","voice"],name:"Telecom Office"},"office/therapist":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"therapist"},terms:["therapy"],name:"Therapist Office"},"office/water_utility":{icon:"maki-suitcase",fields:["{office}","operator"],geometry:["point","area"],tags:{office:"water_utility"},terms:["water board","utility"],name:"Water Utility Office"},"piste/downhill":{icon:"fas-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/downhill/halfpipe":{icon:"fas-snowboarding",fields:["name","piste/type","piste/difficulty_downhill","piste/grooming_downhill","oneway","lit"],geometry:["line","area"],terms:["ski","alpine","halfpipe","half pipe","snowboard","downhill","piste"],tags:{"piste:type":"downhill",man_made:"piste:halfpipe"},name:"Halfpipe"},"piste/hike":{icon:"temaki-snow_shoeing",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-skating",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:"fas-skiing-nordic",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:"fas-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:"fas-skiing-nordic",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:"temaki-sledding",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-sleigh",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"],moreFields:["website"],geometry:["point","area"],tags:{place:"city_block"},name:"City Block"},"place/city":{icon:"maki-city",fields:["name","population"],moreFields:["website"],geometry:["point","area"],tags:{place:"city"},name:"City"},"place/hamlet":{icon:"maki-triangle-stroked",fields:["name","population"],moreFields:["website"],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"],moreFields:["website"],fields:["name"],tags:{place:"locality"},name:"Locality"},"place/neighbourhood":{icon:"maki-triangle-stroked",fields:["name","population"],moreFields:["website"],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"],moreFields:["website"],geometry:["point","area"],tags:{place:"quarter"},terms:["boro","borough","quarter"],name:"Sub-Borough / Quarter"},"place/square":{geometry:["point","area"],fields:["name"],moreFields:["website"],tags:{place:"square"},name:"Square"},"place/suburb":{icon:"maki-triangle-stroked",fields:["name","population"],moreFields:["website"],geometry:["point","area"],tags:{place:"suburb"},terms:["boro","borough","quarter"],name:"Borough / Suburb"},"place/town":{icon:"maki-town",fields:["name","population"],moreFields:["website"],geometry:["point","area"],tags:{place:"town"},name:"Town"},"place/village":{icon:"maki-village",fields:["name","population"],moreFields:["website"],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","material"],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","material"],geometry:["point","vertex"],terms:["power"],tags:{power:"tower"},name:"High-Voltage Tower"},"power/transformer":{icon:"temaki-power",fields:["ref","operator","transformer","location","rating","devices","phases"],moreFields:["frequency","voltage/primary","voltage/secondary","voltage/tertiary","windings","windings/configuration"],geometry:["point","vertex","area"],tags:{power:"transformer"},name:"Transformer"},"public_transport/linear_platform_aerialway":{icon:"iD-highway-footway",fields:["{public_transport/linear_platform}"],moreFields:["{public_transport/linear_platform}"],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:["{public_transport/linear_platform}"],moreFields:["{public_transport/linear_platform}"],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:["{public_transport/linear_platform}"],moreFields:["{public_transport/linear_platform}"],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:["{public_transport/linear_platform}"],moreFields:["{public_transport/linear_platform}"],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:["{public_transport/linear_platform}"],moreFields:["{public_transport/linear_platform}"],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:["{public_transport/linear_platform}"],moreFields:["{public_transport/linear_platform}"],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:["{public_transport/linear_platform}"],moreFields:["{public_transport/linear_platform}"],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:["{public_transport/linear_platform}"],moreFields:["{public_transport/linear_platform}"],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:["{public_transport/linear_platform}"],moreFields:["{public_transport/linear_platform}"],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"],moreFields:["lit","bench","shelter","passenger_information_display","wheelchair"],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:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],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:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],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:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],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:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],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:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],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:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],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:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],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:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],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:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],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"],moreFields:["lit","bench","shelter","passenger_information_display","wheelchair"],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:["{public_transport/station}","aerialway/access","aerialway/summer/access"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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"],moreFields:["internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],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:"iD-relation",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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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"],moreFields:["covered"],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"],moreFields:["covered"],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"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],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",fields:["name","structure","gauge","electrified","service_rail"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],geometry:["line"],tags:{railway:"miniature"},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"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],geometry:["line"],tags:{railway:"monorail"},terms:[],name:"Monorail"},"railway/narrow_gauge":{icon:"iD-railway-rail",fields:["name","structure","gauge","electrified","service_rail","usage_rail"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],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","service_rail","usage_rail"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],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"],moreFields:["maxspeed","voltage_electrified","frequency_electrified"],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"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],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","seamark/type"],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","seamark/type"],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","seamark/type"],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":{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":{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","seamark/type"],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"],moreFields:["brand","currency_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{shop:"*"},terms:[],name:"Shop"},"shop/fishmonger":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"fishmonger"},reference:{key:"shop",value:"seafood"},name:"Fishmonger",searchable:false},"shop/furnace":{icon:"maki-shop",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:["{shop}","agrarian"],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:["{shop}","drive_through"],geometry:["point","area"],terms:["alcohol","beer","booze","wine"],tags:{shop:"alcohol"},name:"Liquor Store"},"shop/anime":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"anime"},terms:["manga","japan","cosplay","figurine","dakimakura"],name:"Anime Shop"},"shop/antiques":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"antiques"},name:"Antiques Shop"},"shop/appliance":{icon:"maki-shop",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",geometry:["point","area"],terms:["art*","exhibit*","gallery"],tags:{shop:"art"},name:"Art Store"},"shop/baby_goods":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"baby_goods"},name:"Baby Goods Store"},"shop/bag":{icon:"maki-shop",geometry:["point","area"],terms:["handbag","purse"],tags:{shop:"bag"},name:"Bag/Luggage Store"},"shop/bakery":{icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery"},name:"Bakery"},"shop/bathroom_furnishing":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"bathroom_furnishing"},name:"Bathroom Furnishing Store"},"shop/beauty":{icon:"maki-shop",fields:["{shop}","beauty"],geometry:["point","area"],terms:["spa","salon","tanning"],tags:{shop:"beauty"},name:"Beauty Shop"},"shop/beauty/nails":{icon:"maki-shop",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",geometry:["point","area"],tags:{shop:"beauty",beauty:"tanning"},reference:{key:"leisure",value:"tanning_salon"},name:"Tanning Salon"},"shop/bed":{icon:"maki-lodging",geometry:["point","area"],tags:{shop:"bed"},name:"Bedding/Mattress Store"},"shop/beverages":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages"},name:"Beverage Store"},"shop/bicycle":{icon:"maki-bicycle",fields:["{shop}","service/bicycle"],geometry:["point","area"],terms:["bike","repair"],tags:{shop:"bicycle"},name:"Bicycle Shop"},"shop/bookmaker":{icon:"maki-shop",geometry:["point","area"],terms:["betting"],tags:{shop:"bookmaker"},name:"Bookmaker"},"shop/books":{icon:"maki-shop",fields:["{shop}","internet_access"],moreFields:["{shop}","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{shop:"books"},name:"Book Store"},"shop/boutique":{icon:"maki-shop",fields:["name","clothes","{shop}"],geometry:["point","area"],tags:{shop:"boutique"},name:"Boutique"},"shop/butcher":{icon:"maki-slaughterhouse",geometry:["point","area"],terms:["meat"],tags:{shop:"butcher"},name:"Butcher"},"shop/candles":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"candles"},name:"Candle Shop"},"shop/car_parts":{icon:"maki-car",geometry:["point","area"],terms:["auto"],tags:{shop:"car_parts"},name:"Car Parts Store"},"shop/car_repair":{icon:"maki-car-repair",fields:["{shop}","service/vehicle"],geometry:["point","area"],terms:["auto","garage","service"],tags:{shop:"car_repair"},name:"Car Repair Shop"},"shop/car":{icon:"maki-car",fields:["name","brand","{shop}","second_hand","service/vehicle"],geometry:["point","area"],terms:["auto"],tags:{shop:"car"},name:"Car Dealership"},"shop/caravan":{icon:"temaki-rv_park",fields:["name","brand","{shop}","second_hand","service/vehicle"],geometry:["point","area"],terms:["auto"],tags:{shop:"caravan"},name:"RV Dealership"},"shop/carpet":{icon:"maki-shop",geometry:["point","area"],terms:["rug"],tags:{shop:"carpet"},name:"Carpet Store"},"shop/catalogue":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"catalogue"},name:"Catalog Shop"},"shop/charity":{icon:"maki-shop",fields:["{shop}","second_hand"],geometry:["point","area"],terms:["thrift","op shop","nonprofit"],tags:{shop:"charity"},name:"Charity Store"},"shop/cheese":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"cheese"},name:"Cheese Store"},"shop/chemist":{icon:"maki-grocery",geometry:["point","area"],tags:{shop:"chemist"},terms:["apothecary","beauty","drug store","drugstore","gift","hair","med*","pharmacy","prescription","tooth"],name:"Drugstore"},"shop/chocolate":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"chocolate"},name:"Chocolate Store"},"shop/clothes":{icon:"maki-clothing-store",fields:["name","clothes","{shop}"],geometry:["point","area"],tags:{shop:"clothes"},name:"Clothing Store"},"shop/coffee":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"coffee"},name:"Coffee Store"},"shop/computer":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"computer"},name:"Computer Store"},"shop/confectionery":{icon:"maki-confectionery",geometry:["point","area"],terms:["sweet"],tags:{shop:"confectionery"},name:"Candy Store"},"shop/convenience":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience"},name:"Convenience Store"},"shop/copyshop":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"copyshop"},name:"Copy Store"},"shop/cosmetics":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"cosmetics"},name:"Cosmetics Store"},"shop/country_store":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"country_store"},name:"Country Store"},"shop/craft":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"craft"},terms:["art*","paint*","frame"],name:"Arts and Crafts Store"},"shop/curtain":{icon:"maki-shop",geometry:["point","area"],terms:["drape*","window"],tags:{shop:"curtain"},name:"Curtain Store"},"shop/dairy":{icon:"maki-shop",geometry:["point","area"],terms:["milk","egg","cheese"],tags:{shop:"dairy"},name:"Dairy Store"},"shop/deli":{icon:"maki-restaurant",geometry:["point","area"],terms:["lunch","meat","sandwich"],tags:{shop:"deli"},name:"Deli"},"shop/department_store":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store"},name:"Department Store"},"shop/doityourself":{icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself"},name:"DIY Store"},"shop/dry_cleaning":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"dry_cleaning"},name:"Dry Cleaner"},"shop/e-cigarette":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"e-cigarette"},terms:["electronic","vapor"],name:"E-Cigarette Shop"},"shop/electronics":{icon:"maki-shop",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",geometry:["point","area"],terms:["sex","porn"],tags:{shop:"erotic"},name:"Erotic Store"},"shop/fabric":{icon:"maki-shop",geometry:["point","area"],terms:["sew"],tags:{shop:"fabric"},name:"Fabric Store"},"shop/farm":{icon:"maki-shop",geometry:["point","area"],terms:["farm shop","farm stand"],tags:{shop:"farm"},name:"Produce Stand"},"shop/fashion":{icon:"maki-shop",fields:["name","clothes","{shop}"],geometry:["point","area"],tags:{shop:"fashion"},name:"Fashion Store"},"shop/fireplace":{icon:"maki-shop",geometry:["point","area"],terms:["fireplace","stove","masonry heater"],tags:{shop:"fireplace"},name:"Fireplace Store"},"shop/fishing":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"fishing"},name:"Fishing Shop"},"shop/florist":{icon:"maki-florist",geometry:["point","area"],terms:["flower"],tags:{shop:"florist"},name:"Florist"},"shop/frame":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"frame"},terms:["art*","paint*","photo*","frame"],name:"Framing Shop"},"shop/frozen_food":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"frozen_food"},name:"Frozen Food"},"shop/fuel":{icon:"maki-shop",fields:["{shop}","fuel_multi"],geometry:["point","area"],tags:{shop:"fuel"},name:"Fuel Shop",matchScore:0.5},"shop/funeral_directors":{icon:"maki-cemetery",fields:["{shop}","religion","denomination"],geometry:["point","area"],terms:["undertaker","memorial home"],tags:{shop:"funeral_directors"},name:"Funeral Home"},"shop/furniture":{icon:"fas-couch",geometry:["point","area"],terms:["chair","sofa","table"],tags:{shop:"furniture"},name:"Furniture Store"},"shop/garden_centre":{icon:"maki-garden-centre",geometry:["point","area"],terms:["landscape","mulch","shrub","tree"],tags:{shop:"garden_centre"},name:"Garden Center"},"shop/gas":{icon:"maki-shop",geometry:["point","area"],terms:["cng","lpg","natural gas","propane","refill","tank"],tags:{shop:"gas"},name:"Bottled Gas Shop"},"shop/gift":{icon:"maki-gift",geometry:["point","area"],terms:["souvenir"],tags:{shop:"gift"},name:"Gift Shop"},"shop/greengrocer":{icon:"maki-shop",geometry:["point","area"],terms:["fruit","vegetable"],tags:{shop:"greengrocer"},name:"Greengrocer"},"shop/hairdresser_supply":{icon:"maki-shop",geometry:["point","area"],terms:["barber","shampoo","conditioner"],tags:{shop:"hairdresser_supply"},name:"Hairdresser Supply Store"},"shop/hairdresser":{icon:"temaki-beauty_salon",geometry:["point","area"],terms:["barber"],tags:{shop:"hairdresser"},name:"Hairdresser"},"shop/hardware":{icon:"temaki-tools",geometry:["point","area"],tags:{shop:"hardware"},name:"Hardware Store"},"shop/health_food":{icon:"maki-shop",geometry:["point","area"],terms:["wholefood","vitamins","vegetarian","vegan"],tags:{shop:"health_food"},name:"Health Food Shop"},"shop/hearing_aids":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"hearing_aids"},name:"Hearing Aids Store"},"shop/herbalist":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"herbalist"},name:"Herbalist"},"shop/hifi":{icon:"maki-shop",geometry:["point","area"],terms:["stereo","video"],tags:{shop:"hifi"},name:"Hifi Store"},"shop/houseware":{icon:"fas-blender",geometry:["point","area"],terms:["home","household"],tags:{shop:"houseware"},name:"Houseware Store"},"shop/hunting":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"hunting"},name:"Hunting Shop"},"shop/interior_decoration":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"interior_decoration"},name:"Interior Decoration Store"},"shop/jewelry":{icon:"maki-jewelry-store",geometry:["point","area"],terms:["diamond","gem","ring"],tags:{shop:"jewelry"},name:"Jeweler"},"shop/kiosk":{icon:"maki-shop",fields:["{shop}","levels"],geometry:["point","area"],tags:{shop:"kiosk"},name:"Kiosk"},"shop/kitchen":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"kitchen"},name:"Kitchen Design Store"},"shop/laundry":{icon:"maki-laundry",geometry:["point","area"],tags:{shop:"laundry"},name:"Laundry"},"shop/leather":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"leather"},name:"Leather Store"},"shop/locksmith":{icon:"fas-key",geometry:["point","area"],terms:["key","lockpick"],tags:{shop:"locksmith"},name:"Locksmith"},"shop/lottery":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"lottery"},name:"Lottery Shop"},"shop/mall":{icon:"maki-shop",geometry:["point","area"],terms:["shopping"],tags:{shop:"mall"},name:"Mall"},"shop/massage":{icon:"temaki-spa",geometry:["point","area"],tags:{shop:"massage"},name:"Massage Shop"},"shop/medical_supply":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"medical_supply"},name:"Medical Supply Store"},"shop/mobile_phone":{icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone"},name:"Mobile Phone Store"},"shop/money_lender":{icon:"maki-bank",fields:["{shop}","currency_multi"],geometry:["point","area"],tags:{shop:"money_lender"},name:"Money Lender"},"shop/motorcycle_repair":{icon:"fas-motorcycle",fields:["{shop}","service/vehicle"],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","{shop}"],geometry:["point","area"],terms:["bike"],tags:{shop:"motorcycle"},name:"Motorcycle Dealership"},"shop/music":{icon:"maki-music",geometry:["point","area"],terms:["CD","vinyl"],tags:{shop:"music"},name:"Music Store"},"shop/musical_instrument":{icon:"maki-music",geometry:["point","area"],terms:["guitar"],tags:{shop:"musical_instrument"},name:"Musical Instrument Store"},"shop/newsagent":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"newsagent"},name:"Newspaper/Magazine Shop"},"shop/nutrition_supplements":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"nutrition_supplements"},name:"Nutrition Supplements Store"},"shop/optician":{icon:"maki-optician",geometry:["point","area"],terms:["eye","glasses"],tags:{shop:"optician"},name:"Optician"},"shop/organic":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"supermarket",organic:"only"},name:"Organic Goods Store"},"shop/outdoor":{icon:"temaki-compass",geometry:["point","area"],terms:["camping","climbing","hiking","outfitter","outdoor equipment","outdoor supplies"],tags:{shop:"outdoor"},name:"Outdoors Store"},"shop/paint":{icon:"fas-paint-roller",geometry:["point","area"],tags:{shop:"paint"},name:"Paint Store"},"shop/party":{icon:"maki-shop",geometry:["point","area"],terms:["balloons","costumes","decorations","invitations"],tags:{shop:"party"},name:"Party Supply Store"},"shop/pastry":{icon:"maki-bakery",geometry:["point","area"],tags:{shop:"pastry"},terms:["patisserie","cake shop","cakery"],name:"Pastry Shop"},"shop/pawnbroker":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"pawnbroker"},name:"Pawn Shop"},"shop/perfumery":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"perfumery"},name:"Perfume Store"},"shop/pet_grooming":{icon:"maki-dog-park",geometry:["point","area"],terms:["dog"],tags:{shop:"pet_grooming"},name:"Pet Grooming Store"},"shop/pet":{icon:"maki-dog-park",geometry:["point","area"],terms:["animal","cat","dog","fish","kitten","puppy","reptile"],tags:{shop:"pet"},name:"Pet Store"},"shop/photo":{icon:"maki-attraction",geometry:["point","area"],terms:["camera","film"],tags:{shop:"photo"},name:"Photography Store"},"shop/pyrotechnics":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"pyrotechnics"},name:"Fireworks Store"},"shop/radiotechnics":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"radiotechnics"},name:"Radio/Electronic Component Store"},"shop/religion":{icon:"maki-shop",fields:["{shop}","religion","denomination"],geometry:["point","area"],tags:{shop:"religion"},name:"Religious Store"},"shop/scuba_diving":{icon:"maki-swimming",fields:["{shop}","scuba_diving"],geometry:["point","area"],terms:["diving","scuba"],tags:{shop:"scuba_diving"},name:"Scuba Diving Shop"},"shop/seafood":{icon:"maki-shop",geometry:["point","area"],terms:["fishmonger"],tags:{shop:"seafood"},name:"Seafood Shop"},"shop/second_hand":{icon:"maki-shop",fields:["{shop}","second_hand"],geometry:["point","area"],terms:["secondhand","second hand","resale","thrift","used"],tags:{shop:"second_hand"},name:"Consignment/Thrift Store"},"shop/sewing":{icon:"maki-shop",geometry:["point","area"],terms:["haberdashery"],tags:{shop:"sewing"},name:"Sewing Supply Shop"},"shop/shoes":{icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes"},name:"Shoe Store"},"shop/sports":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports"},name:"Sporting Goods Store"},"shop/stationery":{icon:"maki-shop",geometry:["point","area"],terms:["card","paper"],tags:{shop:"stationery"},name:"Stationery Store"},"shop/storage_rental":{icon:"fas-warehouse",geometry:["point","area"],tags:{shop:"storage_rental"},name:"Storage Rental"},"shop/supermarket":{icon:"maki-grocery",moreFields:["diet_multi","{shop}"],geometry:["point","area"],terms:["grocery","store","shop"],tags:{shop:"supermarket"},name:"Supermarket"},"shop/tailor":{icon:"maki-clothing-store",geometry:["point","area"],terms:["clothes","suit"],tags:{shop:"tailor"},name:"Tailor"},"shop/tattoo":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"tattoo"},name:"Tattoo Parlor"},"shop/tea":{icon:"maki-teahouse",geometry:["point","area"],tags:{shop:"tea"},name:"Tea Store"},"shop/ticket":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"ticket"},name:"Ticket Seller"},"shop/tiles":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"tiles"},name:"Tile Shop"},"shop/tobacco":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"tobacco"},name:"Tobacco Shop"},"shop/toys":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"toys"},name:"Toy Store"},"shop/trade":{icon:"maki-shop",fields:["name","trade","{shop}"],geometry:["point","area"],tags:{shop:"trade"},name:"Trade Shop"},"shop/travel_agency":{icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency"},name:"Travel Agency"},"shop/tyres":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"tyres"},name:"Tire Store"},"shop/vacuum_cleaner":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"vacuum_cleaner"},name:"Vacuum Cleaner Store"},"shop/variety_store":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store"},name:"Variety Store"},"shop/video_games":{icon:"maki-gaming",geometry:["point","area"],tags:{shop:"video_games"},name:"Video Game Store"},"shop/video":{icon:"temaki-movie_rental",geometry:["point","area"],terms:["DVD"],tags:{shop:"video"},name:"Video Store"},"shop/watches":{icon:"maki-watch",geometry:["point","area"],tags:{shop:"watches"},name:"Watches Shop"},"shop/water_sports":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"water_sports"},name:"Watersport/Swim Shop"},"shop/water":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"water"},name:"Drinking Water Shop"},"shop/weapons":{icon:"maki-shop",geometry:["point","area"],terms:["ammo","gun","knife","knives"],tags:{shop:"weapons"},name:"Weapon Shop"},"shop/wholesale":{icon:"maki-warehouse",fields:["{shop}","wholesale"],geometry:["point","area"],terms:["warehouse club","cash and carry"],tags:{shop:"wholesale"},name:"Wholesale Store"},"shop/window_blind":{icon:"temaki-window",geometry:["point","area"],tags:{shop:"window_blind"},name:"Window Blind Store"},"shop/wine":{icon:"maki-alcohol-shop",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","fee"],moreFields:["payment_multi","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["climbing hut"],tags:{tourism:"alpine_hut"},name:"Alpine Hut"},"tourism/apartment":{icon:"maki-lodging",fields:["name","operator","address","building_area","rooms","internet_access"],moreFields:["smoking","payment_multi","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{tourism:"apartment"},name:"Guest Apartment / Condo"},"tourism/aquarium":{icon:"maki-aquarium",fields:["name","operator","address","building_area","opening_hours"],moreFields:["fee","payment_multi","smoking","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["fish","sea","water"],tags:{tourism:"aquarium"},name:"Aquarium"},"tourism/artwork":{icon:"maki-art-gallery",fields:["name","artwork_type","artist"],moreFields:["material","website"],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"],moreFields:["payment_multi","internet_access/fee","internet_access/ssid","sanitary_dump_station","power_supply","website","phone","email","fax","wheelchair"],geometry:["point","vertex","area"],terms:["tent","rv"],tags:{tourism:"camp_site"},name:"Campground"},"tourism/caravan_site":{icon:"temaki-rv_park",fields:["name","address","capacity","sanitary_dump_station","power_supply","internet_access"],moreFields:["operator","fee","payment_multi","internet_access/fee","internet_access/ssid","smoking","website","phone","email","fax","wheelchair"],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","internet_access"],moreFields:["smoking","payment_multi","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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","rooms","internet_access"],moreFields:["smoking","payment_multi","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],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","rooms","internet_access"],moreFields:["smoking","payment_multi","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{tourism:"hostel"},name:"Hostel"},"tourism/hotel":{icon:"maki-lodging",fields:["name","brand","address","building_area","rooms","internet_access"],moreFields:["operator","smoking","payment_multi","internet_access/fee","internet_access/ssid","stars","website","phone","email","fax","wheelchair"],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"],moreFields:["material"],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"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],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","address","building_area","rooms","internet_access"],moreFields:["operator","smoking","payment_multi","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{tourism:"motel"},name:"Motel"},"tourism/museum":{icon:"maki-museum",fields:["name","operator","address","building_area","opening_hours"],moreFields:["fee","payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["smoking","fee","payment_multi","website","wheelchair"],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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["address","opening_hours","website","phone","email","fax"],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","fee","fireplace"],moreFields:["payment_multi","wheelchair"],geometry:["point","area"],terms:["wilderness hut","backcountry hut","bothy"],tags:{tourism:"wilderness_hut"},name:"Wilderness Hut"},"tourism/zoo":{icon:"temaki-zoo",fields:["name","operator","address","opening_hours","fee"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["animal"],tags:{tourism:"zoo"},name:"Zoo"},traffic_calming:{icon:"temaki-diamond",fields:["traffic_calming","surface","direction_vertex"],geometry:["vertex","line","area"],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:["surface","direction_vertex"],geometry:["vertex","area"],terms:["driveway link","speed","slow"],tags:{traffic_calming:"chicane"},name:"Traffic Chicane"},"traffic_calming/choker":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","area"],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",fields:["surface"],geometry:["vertex","area"],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","direction_vertex"],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/enforcement":{icon:"iD-relation",fields:["name","enforcement"],geometry:["relation"],tags:{type:"enforcement"},name:"Enforcement"},"type/restriction":{icon:"iD-restriction",fields:["restriction","except"],geometry:["relation"],tags:{type:"restriction"},name:"Restriction"},"type/restriction/no_left_turn":{icon:"iD-restriction-no-left-turn",geometry:["relation"],tags:{type:"restriction",restriction:"no_left_turn"},name:"No Left Turn"},"type/restriction/no_right_turn":{icon:"iD-restriction-no-right-turn",geometry:["relation"],tags:{type:"restriction",restriction:"no_right_turn"},name:"No Right Turn"},"type/restriction/no_straight_on":{icon:"iD-restriction-no-straight-on",geometry:["relation"],tags:{type:"restriction",restriction:"no_straight_on"},name:"No Straight On"},"type/restriction/no_u_turn":{icon:"iD-restriction-no-u-turn",geometry:["relation"],tags:{type:"restriction",restriction:"no_u_turn"},name:"No U-turn"},"type/restriction/only_left_turn":{icon:"iD-restriction-only-left-turn",geometry:["relation"],tags:{type:"restriction",restriction:"only_left_turn"},name:"Only Left Turn"},"type/restriction/only_right_turn":{icon:"iD-restriction-only-right-turn",geometry:["relation"],tags:{type:"restriction",restriction:"only_right_turn"},name:"Only Right Turn"},"type/restriction/only_straight_on":{icon:"iD-restriction-only-straight-on",geometry:["relation"],tags:{type:"restriction",restriction:"only_straight_on"},name:"Only Straight On"},"type/restriction/only_u_turn":{icon:"iD-restriction-only-u-turn",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:{moreFields:["name"],geometry:["vertex"],tags:{},name:"Other",matchScore:0.1},"waterway/riverbank":{icon:"maki-water",geometry:["area"],tags:{waterway:"riverbank"},name:"Riverbank",searchable:false},"waterway/boatyard":{icon:"maki-harbor",fields:["name","operator"],moreFields:["address","website","phone","email","fax","wheelchair"],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"],moreFields:["website"],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"],moreFields:["payment_multi","brand","seamark/type","building","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["petrol","gas","diesel","boat"],tags:{waterway:"fuel"},name:"Marine Fuel Station"},"waterway/milestone":{icon:"temaki-milestone",fields:["distance","direction_vertex"],moreFields:["seamark/type"],geometry:["point","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/sanitary_dump_station":{icon:"temaki-storage_tank",fields:["name","operator","access_simple","fee","water_point"],moreFields:["opening_hours","payment_multi","seamark/type"],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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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 Agrario":{name:"Banco Agrario",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q20013358"},addTags:{amenity:"bank",brand:"Banco Agrario","brand:wikidata":"Q20013358","brand:wikipedia":"en:Banco Agrario de Colombia",name:"Banco Agrario"},removeTags:{amenity:"bank",brand:"Banco Agrario","brand:wikidata":"Q20013358","brand:wikipedia":"en:Banco Agrario de Colombia",name:"Banco Agrario"},matchScore:2,suggestion:true},"amenity/bank/Banco Agrario de Colombia":{name:"Banco Agrario de Colombia",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q20013358"},addTags:{amenity:"bank",brand:"Banco Agrario de Colombia","brand:wikidata":"Q20013358","brand:wikipedia":"en:Banco Agrario de Colombia",name:"Banco Agrario de Colombia"},removeTags:{amenity:"bank",brand:"Banco Agrario de Colombia","brand:wikidata":"Q20013358","brand:wikipedia":"en:Banco Agrario de Colombia",name:"Banco Agrario de Colombia"},matchScore:2,suggestion:true},"amenity/bank/Banco Azteca":{name:"Banco Azteca",icon:"maki-bank",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",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 Caja Social":{name:"Banco Caja Social",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5717869"},addTags:{amenity:"bank",brand:"Banco Caja Social","brand:wikidata":"Q5717869","brand:wikipedia":"es:Banco Caja Social",name:"Banco Caja Social"},removeTags:{amenity:"bank",brand:"Banco Caja Social","brand:wikidata":"Q5717869","brand:wikipedia":"es:Banco Caja Social",name:"Banco Caja Social"},matchScore:2,suggestion:true},"amenity/bank/Banco Ciudad":{name:"Banco Ciudad",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4856204"},addTags:{amenity:"bank",brand:"Banco Ciudad","brand:wikidata":"Q4856204","brand:wikipedia":"en:Bank of the City of Buenos Aires",name:"Banco Ciudad"},removeTags:{amenity:"bank",brand:"Banco Ciudad","brand:wikidata":"Q4856204","brand:wikipedia":"en:Bank of the City of Buenos Aires",name:"Banco Ciudad"},matchScore:2,suggestion:true},"amenity/bank/Banco Continental":{name:"Banco Continental",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4835089"},addTags:{amenity:"bank",brand:"Banco Continental","brand:wikidata":"Q4835089","brand:wikipedia":"en:BBVA Continental",name:"Banco Continental"},removeTags:{amenity:"bank",brand:"Banco Continental","brand:wikidata":"Q4835089","brand:wikipedia":"en:BBVA Continental",name:"Banco Continental"},matchScore:2,suggestion:true},"amenity/bank/Banco Estado":{name:"Banco Estado",icon:"maki-bank",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",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 G&T Continental":{name:"Banco G&T Continental",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5717949"},addTags:{amenity:"bank",brand:"Banco G&T Continental","brand:wikidata":"Q5717949","brand:wikipedia":"es:Banco GYT Continental, S.A.",name:"Banco G&T Continental"},removeTags:{amenity:"bank",brand:"Banco G&T Continental","brand:wikidata":"Q5717949","brand:wikipedia":"es:Banco GYT Continental, S.A.",name:"Banco G&T Continental"},matchScore:2,suggestion:true},"amenity/bank/Banco General":{name:"Banco General",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q27618271"},addTags:{amenity:"bank",brand:"Banco General","brand:wikidata":"Q27618271","brand:wikipedia":"es:Banco General (Panamá)",name:"Banco General"},removeTags:{amenity:"bank",brand:"Banco General","brand:wikidata":"Q27618271","brand:wikipedia":"es:Banco General (Panamá)",name:"Banco General"},matchScore:2,suggestion:true},"amenity/bank/Banco Industrial":{name:"Banco Industrial",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q16489444"},addTags:{amenity:"bank",brand:"Banco Industrial","brand:wikidata":"Q16489444","brand:wikipedia":"es:Banco Industrial",name:"Banco Industrial"},removeTags:{amenity:"bank",brand:"Banco Industrial","brand:wikidata":"Q16489444","brand:wikipedia":"es:Banco Industrial",name:"Banco Industrial"},matchScore:2,suggestion:true},"amenity/bank/Banco Nacional":{name:"Banco Nacional",icon:"maki-bank",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 Nación":{name:"Banco Nación",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2883376"},addTags:{amenity:"bank",brand:"Banco Nación","brand:wikidata":"Q2883376","brand:wikipedia":"en:Banco de la Nación Argentina",name:"Banco Nación"},removeTags:{amenity:"bank",brand:"Banco Nación","brand:wikidata":"Q2883376","brand:wikipedia":"en:Banco de la Nación Argentina",name:"Banco Nación"},matchScore:2,suggestion:true},"amenity/bank/Banco Pastor":{name:"Banco Pastor",icon:"maki-bank",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",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",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",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",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 Santa Fe":{name:"Banco Santa Fe",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6046871"},addTags:{amenity:"bank",brand:"Banco Santa Fe","brand:wikidata":"Q6046871","brand:wikipedia":"es:Nuevo Banco de Santa Fe",name:"Banco Santa Fe"},removeTags:{amenity:"bank",brand:"Banco Santa Fe","brand:wikidata":"Q6046871","brand:wikipedia":"es:Nuevo Banco de Santa Fe",name:"Banco Santa Fe"},matchScore:2,suggestion:true},"amenity/bank/Banco Santander":{name:"Banco Santander",icon:"maki-bank",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",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",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 Desarrollo Banrural":{name:"Banco de Desarrollo Banrural",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5719130"},addTags:{amenity:"bank",brand:"Banco de Desarrollo Banrural","brand:wikidata":"Q5719130","brand:wikipedia":"es:Banrural",name:"Banco de Desarrollo Banrural"},removeTags:{amenity:"bank",brand:"Banco de Desarrollo Banrural","brand:wikidata":"Q5719130","brand:wikipedia":"es:Banrural",name:"Banco de Desarrollo Banrural"},matchScore:2,suggestion:true},"amenity/bank/Banco de Occidente":{name:"Banco de Occidente",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854127"},addTags:{amenity:"bank",brand:"Banco de Occidente","brand:wikidata":"Q4854127","brand:wikipedia":"es:Banco de Occidente (Colombia)",name:"Banco de Occidente"},removeTags:{amenity:"bank",brand:"Banco de Occidente","brand:wikidata":"Q4854127","brand:wikipedia":"es:Banco de Occidente (Colombia)",name:"Banco de Occidente"},matchScore:2,suggestion:true},"amenity/bank/Banco de Venezuela":{name:"Banco de Venezuela",icon:"maki-bank",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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 Mandiri Syariah":{name:"Bank Mandiri Syariah",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q12474533"},addTags:{amenity:"bank",brand:"Bank Mandiri Syariah","brand:wikidata":"Q12474533","brand:wikipedia":"id:Bank Syariah Mandiri",name:"Bank Mandiri Syariah"},removeTags:{amenity:"bank",brand:"Bank Mandiri Syariah","brand:wikidata":"Q12474533","brand:wikipedia":"id:Bank Syariah Mandiri",name:"Bank Mandiri Syariah"},matchScore:2,suggestion:true},"amenity/bank/Bank Mega":{name:"Bank Mega",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q12474504"},addTags:{amenity:"bank",brand:"Bank Mega","brand:wikidata":"Q12474504","brand:wikipedia":"id:Bank Mega",name:"Bank Mega"},removeTags:{amenity:"bank",brand:"Bank Mega","brand:wikidata":"Q12474504","brand:wikipedia":"id:Bank Mega",name:"Bank Mega"},matchScore:2,suggestion:true},"amenity/bank/Bank Muamalat":{name:"Bank Muamalat",icon:"maki-bank",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",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",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",short_name:"BOA"},removeTags:{amenity:"bank",brand:"Bank of Africa","brand:wikidata":"Q2882627","brand:wikipedia":"en:Bank of Africa Group",name:"Bank of Africa",short_name:"BOA"},matchScore:2,suggestion:true},"amenity/bank/Bank of America":{name:"Bank of America",icon:"maki-bank",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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/Berliner Volksbank":{name:"Berliner Volksbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q821855"},addTags:{amenity:"bank",brand:"Berliner Volksbank","brand:wikidata":"Q821855","brand:wikipedia":"de:Berliner Volksbank",name:"Berliner Volksbank"},removeTags:{amenity:"bank",brand:"Berliner Volksbank","brand:wikidata":"Q821855","brand:wikipedia":"de:Berliner Volksbank",name:"Berliner Volksbank"},matchScore:2,suggestion:true},"amenity/bank/Bicentenario":{name:"Bicentenario",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5728123"},addTags:{amenity:"bank",brand:"Bicentenario","brand:wikidata":"Q5728123","brand:wikipedia":"es:Bicentenario Banco Universal",name:"Bicentenario"},removeTags:{amenity:"bank",brand:"Bicentenario","brand:wikidata":"Q5728123","brand:wikipedia":"es:Bicentenario Banco Universal",name:"Bicentenario"},matchScore:2,suggestion:true},"amenity/bank/Bicici":{name:"Bicici",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1667302"},addTags:{amenity:"bank",brand:"Bicici","brand:wikidata":"Q1667302","brand:wikipedia":"fr:Banque internationale pour le commerce et l'industrie de la Côte d'Ivoire",name:"Bicici"},removeTags:{amenity:"bank",brand:"Bicici","brand:wikidata":"Q1667302","brand:wikipedia":"fr:Banque internationale pour le commerce et l'industrie de la Côte d'Ivoire",name:"Bicici"},matchScore:2,suggestion:true},"amenity/bank/Bradesco":{name:"Bradesco",icon:"maki-bank",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",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/CBAO":{name:"CBAO",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q532104"},addTags:{amenity:"bank",brand:"CBAO","brand:wikidata":"Q532104","brand:wikipedia":"fr:CBAO Groupe Attijariwafa bank",name:"CBAO"},removeTags:{amenity:"bank",brand:"CBAO","brand:wikidata":"Q532104","brand:wikipedia":"fr:CBAO Groupe Attijariwafa bank",name:"CBAO"},matchScore:2,suggestion:true},"amenity/bank/CEC Bank":{name:"CEC Bank",icon:"maki-bank",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",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",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/CIC":{name:"CIC",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q746525"},addTags:{amenity:"bank",brand:"CIC","brand:wikidata":"Q746525","brand:wikipedia":"en:Crédit Industriel et Commercial",name:"CIC"},removeTags:{amenity:"bank",brand:"CIC","brand:wikidata":"Q746525","brand:wikipedia":"en:Crédit Industriel et Commercial",name:"CIC"},matchScore:2,suggestion:true},"amenity/bank/CIH Bank":{name:"CIH Bank",icon:"maki-bank",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",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",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/CNEP":{name:"CNEP",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2931752"},addTags:{amenity:"bank",brand:"CNEP","brand:wikidata":"Q2931752","brand:wikipedia":"fr:CNEP-Banque",name:"CNEP"},removeTags:{amenity:"bank",brand:"CNEP","brand:wikidata":"Q2931752","brand:wikipedia":"fr:CNEP-Banque",name:"CNEP"},matchScore:2,suggestion:true},"amenity/bank/Caisse Desjardins":{name:"Caisse Desjardins",icon:"maki-bank",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/Caisse d'Épargne":{name:"Caisse d'Épargne",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1547738"},addTags:{amenity:"bank",brand:"Caisse d'Épargne","brand:wikidata":"Q1547738","brand:wikipedia":"en:Groupe Caisse d'Épargne",name:"Caisse d'Épargne"},removeTags:{amenity:"bank",brand:"Caisse d'Épargne","brand:wikidata":"Q1547738","brand:wikipedia":"en:Groupe Caisse d'Épargne",name:"Caisse d'Épargne"},matchScore:2,suggestion:true},"amenity/bank/Caixa Econômica Federal":{name:"Caixa Econômica Federal",icon:"maki-bank",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",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",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/Caja España":{name:"Caja España",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q966985"},addTags:{amenity:"bank",brand:"Caja España","brand:wikidata":"Q966985","brand:wikipedia":"es:Caja España",name:"Caja España"},removeTags:{amenity:"bank",brand:"Caja España","brand:wikidata":"Q966985","brand:wikipedia":"es:Caja España",name:"Caja España"},matchScore:2,suggestion:true},"amenity/bank/Caja Rural":{name:"Caja Rural",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3649971"},addTags:{amenity:"bank",brand:"Caja Rural","brand:wikidata":"Q3649971","brand:wikipedia":"es:Caja Rural",name:"Caja Rural"},removeTags:{amenity:"bank",brand:"Caja Rural","brand:wikidata":"Q3649971","brand:wikipedia":"es:Caja Rural",name:"Caja Rural"},matchScore:2,suggestion:true},"amenity/bank/Caja Rural de Jaén":{name:"Caja Rural de Jaén",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q18720350"},addTags:{amenity:"bank",brand:"Caja Rural de Jaén","brand:wikidata":"Q18720350","brand:wikipedia":"es:Caja Rural de Jaén",name:"Caja Rural de Jaén"},removeTags:{amenity:"bank",brand:"Caja Rural de Jaén","brand:wikidata":"Q18720350","brand:wikipedia":"es:Caja Rural de Jaén",name:"Caja Rural de Jaén"},matchScore:2,suggestion:true},"amenity/bank/CajaSur":{name:"CajaSur",icon:"maki-bank",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/Cajamar":{name:"Cajamar",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q8254971"},addTags:{amenity:"bank",brand:"Cajamar","brand:wikidata":"Q8254971","brand:wikipedia":"es:Cajamar",name:"Cajamar"},removeTags:{amenity:"bank",brand:"Cajamar","brand:wikidata":"Q8254971","brand:wikipedia":"es:Cajamar",name:"Cajamar"},matchScore:2,suggestion:true},"amenity/bank/Canara Bank":{name:"Canara Bank",icon:"maki-bank",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",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/Carige":{name:"Carige",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3633695"},addTags:{amenity:"bank",brand:"Carige","brand:wikidata":"Q3633695","brand:wikipedia":"en:Banca Carige",name:"Carige"},removeTags:{amenity:"bank",brand:"Carige","brand:wikidata":"Q3633695","brand:wikipedia":"en:Banca Carige",name:"Carige"},matchScore:2,suggestion:true},"amenity/bank/Cariparma":{name:"Cariparma",icon:"maki-bank",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",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",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",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",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",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":{name:"China Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5100080"},addTags:{amenity:"bank",brand:"China Bank","brand:wikidata":"Q5100080","brand:wikipedia":"en:Chinabank",name:"China Bank"},removeTags:{amenity:"bank",brand:"China Bank","brand:wikidata":"Q5100080","brand:wikipedia":"en:Chinabank",name:"China Bank"},matchScore:2,suggestion:true},"amenity/bank/China Bank Savings":{name:"China Bank Savings",icon:"maki-bank",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",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",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",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/Clydesdale Bank":{name:"Clydesdale Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q971680"},addTags:{amenity:"bank",brand:"Clydesdale Bank","brand:wikipedia":"en:Clydesdale Bank","brand:wikidata":"Q971680",name:"Clydesdale Bank"},removeTags:{amenity:"bank",brand:"Clydesdale Bank","brand:wikipedia":"en:Clydesdale Bank","brand:wikidata":"Q971680",name:"Clydesdale Bank"},matchScore:2,suggestion:true},"amenity/bank/Comerica Bank":{name:"Comerica Bank",icon:"maki-bank",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/Commercial Bank of Ceylon PLC":{name:"Commercial Bank of Ceylon PLC",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5152468"},addTags:{amenity:"bank",brand:"Commercial Bank of Ceylon PLC","brand:wikidata":"Q5152468","brand:wikipedia":"en:Commercial Bank of Ceylon",name:"Commercial Bank of Ceylon PLC"},removeTags:{amenity:"bank",brand:"Commercial Bank of Ceylon PLC","brand:wikidata":"Q5152468","brand:wikipedia":"en:Commercial Bank of Ceylon",name:"Commercial Bank of Ceylon PLC"},matchScore:2,suggestion:true},"amenity/bank/Commerzbank":{name:"Commerzbank",icon:"maki-bank",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",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",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",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",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",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",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",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",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",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",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 Mutuel de Bretagne":{name:"Crédit Mutuel de Bretagne",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3006236"},addTags:{amenity:"bank",brand:"Crédit Mutuel de Bretagne","brand:wikidata":"Q3006236","brand:wikipedia":"fr:Crédit mutuel Arkéa",name:"Crédit Mutuel de Bretagne"},removeTags:{amenity:"bank",brand:"Crédit Mutuel de Bretagne","brand:wikidata":"Q3006236","brand:wikipedia":"fr:Crédit mutuel Arkéa",name:"Crédit Mutuel de Bretagne"},matchScore:2,suggestion:true},"amenity/bank/Crédit du Nord":{name:"Crédit du Nord",icon:"maki-bank",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/Crédito Agrícola":{name:"Crédito Agrícola",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q10262017"},addTags:{amenity:"bank",brand:"Crédito Agrícola","brand:wikidata":"Q10262017","brand:wikipedia":"pt:Crédito Agrícola",name:"Crédito Agrícola"},removeTags:{amenity:"bank",brand:"Crédito Agrícola","brand:wikidata":"Q10262017","brand:wikipedia":"pt:Crédito Agrícola",name:"Crédito Agrícola"},matchScore:2,suggestion:true},"amenity/bank/Cбербанк":{name:"Cбербанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q205012"},addTags:{amenity:"bank",brand:"Cбербанк","brand:wikidata":"Q205012","brand:wikipedia":"en:Sberbank of Russia",name:"Cбербанк"},removeTags:{amenity:"bank",brand:"Cбербанк","brand:wikidata":"Q205012","brand:wikipedia":"en:Sberbank of Russia",name:"Cбербанк"},matchScore:2,suggestion:true},"amenity/bank/Danske Bank":{name:"Danske Bank",icon:"maki-bank",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",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",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/Desjardins":{name:"Desjardins",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2933350"},addTags:{amenity:"bank",brand:"Desjardins","brand:wikidata":"Q2933350","brand:wikipedia":"en:Desjardins Group",name:"Desjardins"},removeTags:{amenity:"bank",brand:"Desjardins","brand:wikidata":"Q2933350","brand:wikipedia":"en:Desjardins Group",name:"Desjardins"},matchScore:2,suggestion:true},"amenity/bank/Deutsche Bank":{name:"Deutsche Bank",icon:"maki-bank",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",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",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/EastWest Unibank":{name:"EastWest Unibank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5327595"},addTags:{amenity:"bank",brand:"EastWest Unibank","brand:wikidata":"Q5327595","brand:wikipedia":"en:EastWest Bank",name:"EastWest Unibank"},removeTags:{amenity:"bank",brand:"EastWest Unibank","brand:wikidata":"Q5327595","brand:wikipedia":"en:EastWest Bank",name:"EastWest Unibank"},matchScore:2,suggestion:true},"amenity/bank/Ecobank":{name:"Ecobank",icon:"maki-bank",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",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",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",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",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",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",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",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/Frost Bank":{name:"Frost Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5506152"},addTags:{amenity:"bank",brand:"Frost Bank","brand:wikidata":"Q5506152","brand:wikipedia":"en:Frost Bank",name:"Frost Bank"},removeTags:{amenity:"bank",brand:"Frost Bank","brand:wikidata":"Q5506152","brand:wikipedia":"en:Frost Bank",name:"Frost Bank"},matchScore:2,suggestion:true},"amenity/bank/GCB Bank":{name:"GCB Bank",icon:"maki-bank",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/Galicia":{name:"Galicia",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5717952"},addTags:{amenity:"bank",brand:"Galicia","brand:wikidata":"Q5717952","brand:wikipedia":"es:Banco Galicia",name:"Galicia"},removeTags:{amenity:"bank",brand:"Galicia","brand:wikidata":"Q5717952","brand:wikipedia":"es:Banco Galicia",name:"Galicia"},matchScore:2,suggestion:true},"amenity/bank/Garanti":{name:"Garanti",icon:"maki-bank",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",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",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",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",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",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",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/HNB":{name:"HNB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3532080"},addTags:{amenity:"bank",brand:"HNB","brand:wikidata":"Q3532080","brand:wikipedia":"en:Hatton National Bank",name:"HNB"},removeTags:{amenity:"bank",brand:"HNB","brand:wikidata":"Q3532080","brand:wikipedia":"en:Hatton National Bank",name:"HNB"},matchScore:2,suggestion:true},"amenity/bank/HSBC":{name:"HSBC",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q190464"},addTags:{amenity:"bank",brand:"HSBC","brand:wikidata":"Q190464","brand:wikipedia":"en:HSBC",name:"HSBC"},removeTags:{amenity:"bank",brand:"HSBC","brand:wikidata":"Q190464","brand:wikipedia":"en:HSBC",name:"HSBC"},matchScore:2,suggestion:true},"amenity/bank/Halifax":{name:"Halifax",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3310164"},addTags:{amenity:"bank",brand:"Halifax","brand:wikidata":"Q3310164","brand:wikipedia":"en:Halifax (bank)",name:"Halifax"},removeTags:{amenity:"bank",brand:"Halifax","brand:wikidata":"Q3310164","brand:wikipedia":"en:Halifax (bank)",name:"Halifax"},matchScore:2,suggestion:true},"amenity/bank/Halkbank":{name:"Halkbank",icon:"maki-bank",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",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",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",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",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/Huntington Bank":{name:"Huntington Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q798819"},addTags:{amenity:"bank",brand:"Huntington Bank","brand:wikidata":"Q798819","brand:wikipedia":"en:Huntington Bancshares",name:"Huntington Bank"},removeTags:{amenity:"bank",brand:"Huntington Bank","brand:wikidata":"Q798819","brand:wikipedia":"en:Huntington Bancshares",name:"Huntington Bank"},matchScore:2,suggestion:true},"amenity/bank/HypoVereinsbank":{name:"HypoVereinsbank",icon:"maki-bank",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/ICBC":{name:"ICBC",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q26463"},addTags:{amenity:"bank",brand:"ICBC","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"ICBC"},removeTags:{amenity:"bank",brand:"ICBC","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"ICBC"},matchScore:2,suggestion:true},"amenity/bank/ICICI Bank":{name:"ICICI Bank",icon:"maki-bank",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",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",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",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",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",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",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",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",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",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",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/Janata Bank Limited জনতা ব্যাংক লিমিটেড":{name:"Janata Bank Limited জনতা ব্যাংক লিমিটেড",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3347028"},addTags:{amenity:"bank",brand:"Janata Bank Limited জনতা ব্যাংক লিমিটেড","brand:wikidata":"Q3347028","brand:wikipedia":"en:Janata Bank",name:"Janata Bank Limited জনতা ব্যাংক লিমিটেড"},removeTags:{amenity:"bank",brand:"Janata Bank Limited জনতা ব্যাংক লিমিটেড","brand:wikidata":"Q3347028","brand:wikipedia":"en:Janata Bank",name:"Janata Bank Limited জনতা ব্যাংক লিমিটেড"},matchScore:2,suggestion:true},"amenity/bank/Jyske Bank":{name:"Jyske Bank",icon:"maki-bank",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",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/KBC":{name:"KBC",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q941020"},addTags:{amenity:"bank",brand:"KBC","brand:wikidata":"Q941020","brand:wikipedia":"en:KBC Bank",name:"KBC"},removeTags:{amenity:"bank",brand:"KBC","brand:wikidata":"Q941020","brand:wikipedia":"en:KBC Bank",name:"KBC"},matchScore:2,suggestion:true},"amenity/bank/KBZ Bank":{name:"KBZ Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6360949"},addTags:{amenity:"bank",brand:"KBZ Bank","brand:wikidata":"Q6360949","brand:wikipedia":"en:Kanbawza Bank",name:"KBZ Bank"},removeTags:{amenity:"bank",brand:"KBZ Bank","brand:wikidata":"Q6360949","brand:wikipedia":"en:Kanbawza Bank",name:"KBZ Bank"},matchScore:2,suggestion:true},"amenity/bank/Karnataka Bank":{name:"Karnataka Bank",icon:"maki-bank",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",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/Key Bank":{name:"Key Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1740314"},addTags:{amenity:"bank",brand:"Key Bank","brand:wikidata":"Q1740314","brand:wikipedia":"en:KeyBank",name:"Key Bank"},removeTags:{amenity:"bank",brand:"Key Bank","brand:wikidata":"Q1740314","brand:wikipedia":"en:KeyBank",name:"Key Bank"},matchScore:2,suggestion:true},"amenity/bank/Komerční banka":{name:"Komerční banka",icon:"maki-bank",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",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",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/LCL":{name:"LCL",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q779722"},addTags:{amenity:"bank",brand:"LCL","brand:wikidata":"Q779722","brand:wikipedia":"en:Crédit Lyonnais",name:"LCL"},removeTags:{amenity:"bank",brand:"LCL","brand:wikidata":"Q779722","brand:wikipedia":"en:Crédit Lyonnais",name:"LCL"},matchScore:2,suggestion:true},"amenity/bank/La Banque Postale":{name:"La Banque Postale",icon:"maki-bank",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",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",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",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",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",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",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",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/MONETA Money Bank":{name:"MONETA Money Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q24282966"},addTags:{amenity:"bank",brand:"MONETA Money Bank","brand:wikidata":"Q24282966","brand:wikipedia":"cs:Moneta Money Bank",name:"MONETA Money Bank"},removeTags:{amenity:"bank",brand:"MONETA Money Bank","brand:wikidata":"Q24282966","brand:wikipedia":"cs:Moneta Money Bank",name:"MONETA Money Bank"},matchScore:2,suggestion:true},"amenity/bank/Maybank":{name:"Maybank",icon:"maki-bank",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",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",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",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",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",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",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",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",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",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",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",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",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",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/OLB":{name:"OLB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q879591"},addTags:{amenity:"bank",brand:"OLB","brand:wikidata":"Q879591","brand:wikipedia":"en:Oldenburgische Landesbank",name:"OLB"},removeTags:{amenity:"bank",brand:"OLB","brand:wikidata":"Q879591","brand:wikipedia":"en:Oldenburgische Landesbank",name:"OLB"},matchScore:2,suggestion:true},"amenity/bank/OTP":{name:"OTP",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q912778"},addTags:{amenity:"bank",brand:"OTP","brand:wikidata":"Q912778","brand:wikipedia":"en:OTP Bank",name:"OTP"},removeTags:{amenity:"bank",brand:"OTP","brand:wikidata":"Q912778","brand:wikipedia":"en:OTP Bank",name:"OTP"},matchScore:2,suggestion:true},"amenity/bank/Oberbank":{name:"Oberbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2009139"},addTags:{amenity:"bank",brand:"Oberbank","brand:wikidata":"Q2009139","brand:wikipedia":"de:Oberbank",name:"Oberbank"},removeTags:{amenity:"bank",brand:"Oberbank","brand:wikidata":"Q2009139","brand:wikipedia":"de:Oberbank",name:"Oberbank"},matchScore:2,suggestion:true},"amenity/bank/Occidental de Descuento":{name:"Occidental de Descuento",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854108"},addTags:{amenity:"bank",brand:"Occidental de Descuento","brand:wikidata":"Q4854108","brand:wikipedia":"en:Banco Occidental de Descuento",name:"Occidental de Descuento"},removeTags:{amenity:"bank",brand:"Occidental de Descuento","brand:wikidata":"Q4854108","brand:wikipedia":"en:Banco Occidental de Descuento",name:"Occidental de Descuento"},matchScore:2,suggestion:true},"amenity/bank/Oldenburgische Landesbank":{name:"Oldenburgische Landesbank",icon:"maki-bank",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",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",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/PBZ":{name:"PBZ",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7246343"},addTags:{amenity:"bank",brand:"PBZ","brand:wikidata":"Q7246343","brand:wikipedia":"en:Privredna banka Zagreb",name:"PBZ"},removeTags:{amenity:"bank",brand:"PBZ","brand:wikidata":"Q7246343","brand:wikipedia":"en:Privredna banka Zagreb",name:"PBZ"},matchScore:2,suggestion:true},"amenity/bank/PKO BP":{name:"PKO BP",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q578832"},addTags:{amenity:"bank",brand:"PKO BP","brand:wikidata":"Q578832","brand:wikipedia":"en:PKO Bank Polski",name:"PKO BP"},removeTags:{amenity:"bank",brand:"PKO BP","brand:wikidata":"Q578832","brand:wikipedia":"en:PKO Bank Polski",name:"PKO BP"},matchScore:2,suggestion:true},"amenity/bank/PNC Bank":{name:"PNC Bank",icon:"maki-bank",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/PSBank":{name:"PSBank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7185203"},addTags:{amenity:"bank",brand:"PSBank","brand:wikidata":"Q7185203","brand:wikipedia":"en:Philippine Savings Bank",name:"PSBank"},removeTags:{amenity:"bank",brand:"PSBank","brand:wikidata":"Q7185203","brand:wikipedia":"en:Philippine Savings Bank",name:"PSBank"},matchScore:2,suggestion:true},"amenity/bank/Panin Bank":{name:"Panin Bank",icon:"maki-bank",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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/SEB":{name:"SEB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q975655"},addTags:{amenity:"bank",brand:"SEB","brand:wikidata":"Q975655","brand:wikipedia":"en:SEB Group",name:"SEB"},removeTags:{amenity:"bank",brand:"SEB","brand:wikidata":"Q975655","brand:wikipedia":"en:SEB Group",name:"SEB"},matchScore:2,suggestion:true},"amenity/bank/SGBCI":{name:"SGBCI",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3488360"},addTags:{amenity:"bank",brand:"SGBCI","brand:wikidata":"Q3488360","brand:wikipedia":"fr:Société générale de banques en Côte d'Ivoire",name:"SGBCI"},removeTags:{amenity:"bank",brand:"SGBCI","brand:wikidata":"Q3488360","brand:wikipedia":"fr:Société générale de banques en Côte d'Ivoire",name:"SGBCI"},matchScore:2,suggestion:true},"amenity/bank/SNS Bank":{name:"SNS Bank",icon:"maki-bank",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",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",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",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",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",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",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",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",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",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/Sicredi":{name:"Sicredi",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3483060"},addTags:{amenity:"bank",brand:"Sicredi","brand:wikidata":"Q3483060","brand:wikipedia":"pt:Sistema de Crédito Cooperativo",name:"Sicredi"},removeTags:{amenity:"bank",brand:"Sicredi","brand:wikidata":"Q3483060","brand:wikipedia":"pt:Sistema de Crédito Cooperativo",name:"Sicredi"},matchScore:2,suggestion:true},"amenity/bank/Slovenská sporiteľňa":{name:"Slovenská sporiteľňa",icon:"maki-bank",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",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",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",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",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",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",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",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",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",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",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/Supervielle":{name:"Supervielle",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5718035"},addTags:{amenity:"bank",brand:"Supervielle","brand:wikidata":"Q5718035","brand:wikipedia":"es:Banco Supervielle",name:"Supervielle"},removeTags:{amenity:"bank",brand:"Supervielle","brand:wikidata":"Q5718035","brand:wikipedia":"es:Banco Supervielle",name:"Supervielle"},matchScore:2,suggestion:true},"amenity/bank/Swedbank":{name:"Swedbank",icon:"maki-bank",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",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",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",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",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/TEB":{name:"TEB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7862447"},addTags:{amenity:"bank",brand:"TEB","brand:wikidata":"Q7862447","brand:wikipedia":"en:Türk Ekonomi Bankası",name:"TEB"},removeTags:{amenity:"bank",brand:"TEB","brand:wikidata":"Q7862447","brand:wikipedia":"en:Türk Ekonomi Bankası",name:"TEB"},matchScore:2,suggestion:true},"amenity/bank/TSB":{name:"TSB",icon:"maki-bank",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",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",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",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/UBA":{name:"UBA",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q513457"},addTags:{amenity:"bank",brand:"UBA","brand:wikidata":"Q513457","brand:wikipedia":"en:United Bank for Africa",name:"UBA"},removeTags:{amenity:"bank",brand:"UBA","brand:wikidata":"Q513457","brand:wikipedia":"en:United Bank for Africa",name:"UBA"},matchScore:2,suggestion:true},"amenity/bank/UBI Banca":{name:"UBI Banca",icon:"maki-bank",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",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",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",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/UCPB":{name:"UCPB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7887615"},addTags:{amenity:"bank",brand:"UCPB","brand:wikidata":"Q7887615","brand:wikipedia":"en:United Coconut Planters Bank",name:"UCPB"},removeTags:{amenity:"bank",brand:"UCPB","brand:wikidata":"Q7887615","brand:wikipedia":"en:United Coconut Planters Bank",name:"UCPB"},matchScore:2,suggestion:true},"amenity/bank/UOB":{name:"UOB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2064074"},addTags:{amenity:"bank",brand:"UOB","brand:wikidata":"Q2064074","brand:wikipedia":"en:United Overseas Bank",name:"UOB"},removeTags:{amenity:"bank",brand:"UOB","brand:wikidata":"Q2064074","brand:wikipedia":"en:United Overseas Bank",name:"UOB"},matchScore:2,suggestion:true},"amenity/bank/US Bank":{name:"US Bank",icon:"maki-bank",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",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",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",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",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",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 (Philippines)":{name:"UnionBank (Philippines)",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7885403"},addTags:{amenity:"bank",brand:"UnionBank","brand:wikidata":"Q7885403","brand:wikipedia":"en:Union Bank of the Philippines",name:"UnionBank"},removeTags:{amenity:"bank",brand:"UnionBank","brand:wikidata":"Q7885403","brand:wikipedia":"en:Union Bank of the Philippines",name:"UnionBank"},matchScore:2,suggestion:true},"amenity/bank/UnionBank (USA)":{name:"UnionBank (USA)",icon:"maki-bank",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",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",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",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",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/VÚB":{name:"VÚB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q12778981"},addTags:{amenity:"bank",brand:"VÚB","brand:wikidata":"Q12778981","brand:wikipedia":"en:Všeobecná úverová banka",name:"VÚB"},removeTags:{amenity:"bank",brand:"VÚB","brand:wikidata":"Q12778981","brand:wikipedia":"en:Všeobecná úverová banka",name:"VÚB"},matchScore:2,suggestion:true},"amenity/bank/Washington Federal":{name:"Washington Federal",icon:"maki-bank",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",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",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",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/Yapı Kredi":{name:"Yapı Kredi",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q8049138"},addTags:{amenity:"bank",brand:"Yapı Kredi","brand:wikidata":"Q8049138","brand:wikipedia":"en:Yapı ve Kredi Bankası",name:"Yapı Kredi"},removeTags:{amenity:"bank",brand:"Yapı Kredi","brand:wikidata":"Q8049138","brand:wikipedia":"en:Yapı ve Kredi Bankası",name:"Yapı Kredi"},matchScore:2,suggestion:true},"amenity/bank/Yorkshire Bank":{name:"Yorkshire Bank",icon:"maki-bank",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4081940"},addTags:{amenity:"bank",brand:"Белинвестбанк","brand:wikidata":"Q4081940","brand:wikipedia":"ru:Белинвестбанк",name:"Белинвестбанк"},removeTags:{amenity:"bank",brand:"Белинвестбанк","brand:wikidata":"Q4081940","brand:wikipedia":"ru:Белинвестбанк",name:"Белинвестбанк"},matchScore:2,suggestion:true},"amenity/bank/Бинбанк":{name:"Бинбанк",icon:"maki-bank",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",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",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4114952"},addTags:{amenity:"bank",brand:"Возрождение","brand:wikidata":"Q4114952","brand:wikipedia":"en:Возрождение (банк)",name:"Возрождение"},removeTags:{amenity:"bank",brand:"Возрождение","brand:wikidata":"Q4114952","brand:wikipedia":"en:Возрождение (банк)",name:"Возрождение"},matchScore:2,suggestion:true},"amenity/bank/Газпромбанк":{name:"Газпромбанк",icon:"maki-bank",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",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",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",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",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",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",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",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",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",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",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",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",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q16912944"},addTags:{amenity:"bank",brand:"РНКБ","brand:wikidata":"Q16912944","brand:wikipedia":"en:Russian National Commercial Bank",name:"РНКБ"},removeTags:{amenity:"bank",brand:"РНКБ","brand:wikidata":"Q16912944","brand:wikipedia":"en:Russian National Commercial Bank",name:"РНКБ"},matchScore:2,suggestion:true},"amenity/bank/Райффайзен":{name:"Райффайзен",icon:"maki-bank",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11281447"},addTags:{amenity:"bank",brand:"りそな銀行","brand:wikidata":"Q11281447","brand:wikipedia":"ja:りそな銀行",name:"りそな銀行"},removeTags:{amenity:"bank",brand:"りそな銀行","brand:wikidata":"Q11281447","brand:wikipedia":"ja:りそな銀行",name:"りそな銀行"},matchScore:2,suggestion:true},"amenity/bank/三井住友銀行":{name:"三井住友銀行",icon:"maki-bank",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",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",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",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",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",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",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",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",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",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",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q10883132"},addTags:{amenity:"bank",brand:"京城商業銀行","brand:wikidata":"Q10883132","brand:wikipedia":"zh:京城商業銀行",name:"京城商業銀行"},removeTags:{amenity:"bank",brand:"京城商業銀行","brand:wikidata":"Q10883132","brand:wikipedia":"zh:京城商業銀行",name:"京城商業銀行"},matchScore:2,suggestion:true},"amenity/bank/京都中央信用金庫":{name:"京都中央信用金庫",icon:"maki-bank",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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/Café Martínez":{name:"Café Martínez",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q16540032"},addTags:{amenity:"cafe",brand:"Café Martínez","brand:wikidata":"Q16540032","brand:wikipedia":"es:Café Martínez",name:"Café Martínez"},removeTags:{amenity:"cafe",brand:"Café Martínez","brand:wikidata":"Q16540032","brand:wikipedia":"es:Café Martínez",name:"Café Martínez"},matchScore:2,suggestion:true},"amenity/cafe/Caribou Coffee":{name:"Caribou Coffee",icon:"maki-cafe",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",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",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",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 Island":{name:"Coffee Island",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q60867333"},addTags:{amenity:"cafe",brand:"Coffee Island","brand:wikidata":"Q60867333","brand:wikipedia":"en:Coffee Island",name:"Coffee Island"},removeTags:{amenity:"cafe",brand:"Coffee Island","brand:wikidata":"Q60867333","brand:wikipedia":"en:Coffee Island",name:"Coffee Island"},matchScore:2,suggestion:true},"amenity/cafe/Coffee Time":{name:"Coffee Time",icon:"maki-cafe",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",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",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",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",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/Insomnia":{name:"Insomnia",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q6038271"},addTags:{amenity:"cafe",brand:"Insomnia","brand:wikidata":"Q6038271","brand:wikipedia":"en:Insomnia Coffee Company",name:"Insomnia"},removeTags:{amenity:"cafe",brand:"Insomnia","brand:wikidata":"Q6038271","brand:wikipedia":"en:Insomnia Coffee Company",name:"Insomnia"},matchScore:2,suggestion:true},"amenity/cafe/Joe & The Juice":{name:"Joe & The Juice",icon:"maki-cafe",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",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/Mado":{name:"Mado",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q17116336"},addTags:{amenity:"cafe",brand:"Mado","brand:wikidata":"Q17116336","brand:wikipedia":"en:Mado (food company)",name:"Mado"},removeTags:{amenity:"cafe",brand:"Mado","brand:wikidata":"Q17116336","brand:wikipedia":"en:Mado (food company)",name:"Mado"},matchScore:2,suggestion:true},"amenity/cafe/McCafé":{name:"McCafé",icon:"maki-cafe",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",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q22101966"},addTags:{amenity:"cafe",brand:"Patisserie Valerie","brand:wikidata":"Q22101966","brand:wikipedia":"en:Patisserie Valerie",cuisine:"cake",name:"Patisserie Valerie"},removeTags:{amenity:"cafe",brand:"Patisserie Valerie","brand:wikidata":"Q22101966","brand:wikipedia":"en:Patisserie Valerie",cuisine:"cake",name:"Patisserie Valerie"},matchScore:2,suggestion:true},"amenity/cafe/Peet's Coffee":{name:"Peet's Coffee",icon:"maki-cafe",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/Pret A Manger":{name:"Pret A Manger",icon:"maki-cafe",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/Pumpkin":{name:"Pumpkin",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q27825961"},addTags:{amenity:"cafe",brand:"Pumpkin","brand:wikidata":"Q27825961","brand:wikipedia":"en:Pumpkin Café Shop",name:"Pumpkin"},removeTags:{amenity:"cafe",brand:"Pumpkin","brand:wikidata":"Q27825961","brand:wikipedia":"en:Pumpkin Café Shop",name:"Pumpkin"},matchScore:2,suggestion:true},"amenity/cafe/Second Cup":{name:"Second Cup",icon:"maki-cafe",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",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",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",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",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",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/Traveler's Coffee":{name:"Traveler's Coffee",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q4051716"},addTags:{amenity:"cafe",brand:"Traveler's Coffee","brand:wikidata":"Q4051716","brand:wikipedia":"ru:Traveler’s Coffee",name:"Traveler's Coffee"},removeTags:{amenity:"cafe",brand:"Traveler's Coffee","brand:wikidata":"Q4051716","brand:wikipedia":"ru:Traveler’s Coffee",name:"Traveler's Coffee"},matchScore:2,suggestion:true},"amenity/cafe/Wayne's Coffee":{name:"Wayne's Coffee",icon:"maki-cafe",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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/burger/A&W (Canada)":{name:"A&W (Canada)",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/A&W (USA)":{name:"A&W (USA)",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Arby's":{name:"Arby's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","brand:wikidata":"Q630866"},addTags:{amenity:"fast_food",brand:"Arby's","brand:wikidata":"Q630866","brand:wikipedia":"en:Arby's",cuisine:"sandwich",name:"Arby's"},removeTags:{amenity:"fast_food",brand:"Arby's","brand:wikidata":"Q630866","brand:wikipedia":"en:Arby's",cuisine:"sandwich",name:"Arby's"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/Auntie Anne's":{name:"Auntie Anne's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q4822010"},addTags:{amenity:"fast_food",brand:"Auntie Anne's","brand:wikidata":"Q4822010","brand:wikipedia":"en:Auntie Anne's",cuisine:"pretzel",name:"Auntie Anne's"},removeTags:{amenity:"fast_food",brand:"Auntie Anne's","brand:wikidata":"Q4822010","brand:wikipedia":"en:Auntie Anne's",cuisine:"pretzel",name:"Auntie Anne's"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Bob's":{name:"Bob's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/Bojangles'":{name:"Bojangles'",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","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'"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/Booster Juice":{name:"Booster Juice",icon:"maki-fast-food",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",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/Braum's":{name:"Braum's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q4958263"},addTags:{amenity:"fast_food",brand:"Braum's","brand:wikidata":"Q4958263","brand:wikipedia":"en:Braum's",name:"Braum's"},removeTags:{amenity:"fast_food",brand:"Braum's","brand:wikidata":"Q4958263","brand:wikipedia":"en:Braum's",name:"Braum's"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Burger King":{name:"Burger King",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Burger Machine":{name:"Burger Machine",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/BurgerFi":{name:"BurgerFi",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q39045496"},addTags:{amenity:"fast_food",brand:"BurgerFi","brand:wikidata":"Q39045496","brand:wikipedia":"en:BurgerFi",cuisine:"burger",name:"BurgerFi"},removeTags:{amenity:"fast_food",brand:"BurgerFi","brand:wikidata":"Q39045496","brand:wikipedia":"en:BurgerFi",cuisine:"burger",name:"BurgerFi"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/Captain D's":{name:"Captain D's",icon:"maki-fast-food",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/burger/Carl's Jr.":{name:"Carl's Jr.",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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."},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Checkers":{name:"Checkers",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/Chick-fil-A":{name:"Chick-fil-A",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","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"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/Chicken Express":{name:"Chicken Express",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","brand:wikidata":"Q5096235"},addTags:{amenity:"fast_food",brand:"Chicken Express","brand:wikidata":"Q5096235","brand:wikipedia":"en:Chicken Express",cuisine:"chicken",name:"Chicken Express"},removeTags:{amenity:"fast_food",brand:"Chicken Express","brand:wikidata":"Q5096235","brand:wikipedia":"en:Chicken Express",cuisine:"chicken",name:"Chicken Express"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/Chipotle":{name:"Chipotle",icon:"maki-fast-food",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",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1076816"},addTags:{amenity:"fast_food",brand:"Chowking","brand:wikidata":"Q1076816","brand:wikipedia":"en:Chowking",cuisine:"asian",name:"Chowking"},removeTags:{amenity:"fast_food",brand:"Chowking","brand:wikidata":"Q1076816","brand:wikipedia":"en:Chowking",cuisine:"asian",name:"Chowking"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/Church's Chicken":{name:"Church's Chicken",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","brand:wikidata":"Q1089932"},addTags:{amenity:"fast_food",brand:"Church's Chicken","brand:wikidata":"Q1089932","brand:wikipedia":"en:Church's Chicken",cuisine:"chicken",name:"Church's Chicken"},removeTags:{amenity:"fast_food",brand:"Church's Chicken","brand:wikidata":"Q1089932","brand:wikipedia":"en:Church's Chicken",cuisine:"chicken",name:"Church's Chicken"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/CoCo壱番屋":{name:"CoCo壱番屋",icon:"maki-fast-food",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",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)",cuisine:"american",name:"Cook Out"},removeTags:{amenity:"fast_food",brand:"Cook Out","brand:wikidata":"Q5166992","brand:wikipedia":"en:Cook Out (restaurant)",cuisine:"american",name:"Cook Out"},matchScore:2,suggestion:true},"amenity/fast_food/Culver's":{name:"Culver's",icon:"maki-fast-food",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",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",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",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/pizza/Domino's Pizza":{name:"Domino's Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","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"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Dunkin' Donuts":{name:"Dunkin' Donuts",icon:"maki-fast-food",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",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",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",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",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/sandwich/Firehouse Subs":{name:"Firehouse Subs",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","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"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Five Guys":{name:"Five Guys",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Freddy's":{name:"Freddy's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q5496837"},addTags:{amenity:"fast_food",brand:"Freddy's","brand:wikidata":"Q5496837","brand:wikipedia":"en:Freddy's Frozen Custard & Steakburgers",cuisine:"burger",name:"Freddy's"},removeTags:{amenity:"fast_food",brand:"Freddy's","brand:wikidata":"Q5496837","brand:wikipedia":"en:Freddy's Frozen Custard & Steakburgers",cuisine:"burger",name:"Freddy's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/Freebirds":{name:"Freebirds",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q5500367"},addTags:{amenity:"fast_food",brand:"Freebirds","brand:wikidata":"Q5500367","brand:wikipedia":"en:Freebirds World Burrito",cuisine:"mexican",name:"Freebirds"},removeTags:{amenity:"fast_food",brand:"Freebirds","brand:wikidata":"Q5500367","brand:wikipedia":"en:Freebirds World Burrito",cuisine:"mexican",name:"Freebirds"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Greenwich":{name:"Greenwich",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q2691308"},addTags:{amenity:"fast_food",brand:"Greenwich","brand:wikidata":"Q2691308","brand:wikipedia":"en:Greenwich Pizza",cuisine:"pizza",name:"Greenwich"},removeTags:{amenity:"fast_food",brand:"Greenwich","brand:wikidata":"Q2691308","brand:wikipedia":"en:Greenwich Pizza",cuisine:"pizza",name:"Greenwich"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Habib's":{name:"Habib's",icon:"maki-fast-food",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/pizza/Hallo Pizza":{name:"Hallo Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","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"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Hardee's":{name:"Hardee's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Harvey's":{name:"Harvey's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Hesburger":{name:"Hesburger",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Hungry Jacks":{name:"Hungry Jacks",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/In-N-Out Burger":{name:"In-N-Out Burger",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Jack in the Box":{name:"Jack in the Box",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/Jamba Juice":{name:"Jamba Juice",icon:"maki-fast-food",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/sandwich/Jersey Mike's Subs":{name:"Jersey Mike's Subs",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","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"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Jimmy John's":{name:"Jimmy John's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","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"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Jollibee":{name:"Jollibee",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/KFC":{name:"KFC",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","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"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Kochlöffel":{name:"Kochlöffel",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q315539"},addTags:{amenity:"fast_food",brand:"Kochlöffel","brand:wikidata":"Q315539","brand:wikipedia":"en:Kochlöffel",cuisine:"burger",name:"Kochlöffel"},removeTags:{amenity:"fast_food",brand:"Kochlöffel","brand:wikidata":"Q315539","brand:wikipedia":"en:Kochlöffel",cuisine:"burger",name:"Kochlöffel"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Kotipizza":{name:"Kotipizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","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"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Krispy Kreme":{name:"Krispy Kreme",icon:"maki-fast-food",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/burger/Krystal":{name:"Krystal",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q472195"},addTags:{amenity:"fast_food",brand:"Krystal","brand:wikidata":"Q472195","brand:wikipedia":"en:Krystal (restaurant)",cuisine:"burger",name:"Krystal"},removeTags:{amenity:"fast_food",brand:"Krystal","brand:wikidata":"Q472195","brand:wikipedia":"en:Krystal (restaurant)",cuisine:"burger",name:"Krystal"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Little Caesars":{name:"Little Caesars",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","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"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Long John Silver's":{name:"Long John Silver's",icon:"maki-fast-food",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/burger/Lotteria":{name:"Lotteria",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/Mang Inasal":{name:"Mang Inasal",icon:"maki-fast-food",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/burger/Max":{name:"Max",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1912172"},addTags:{amenity:"fast_food",brand:"Max","brand:wikidata":"Q1912172","brand:wikipedia":"en:Max Hamburgers",cuisine:"burger",name:"Max"},removeTags:{amenity:"fast_food",brand:"Max","brand:wikidata":"Q1912172","brand:wikipedia":"en:Max Hamburgers",cuisine:"burger",name:"Max"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/McDonald's":{name:"McDonald's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/Moe's Southwest Grill":{name:"Moe's Southwest Grill",icon:"maki-fast-food",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/sandwich/Mr. Sub":{name:"Mr. Sub",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","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"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/New York Pizza":{name:"New York Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q2639128"},addTags:{amenity:"fast_food",brand:"New York Pizza","brand:wikidata":"Q2639128","brand:wikipedia":"nl:New York Pizza",cuisine:"pizza",name:"New York Pizza"},removeTags:{amenity:"fast_food",brand:"New York Pizza","brand:wikidata":"Q2639128","brand:wikipedia":"nl:New York Pizza",cuisine:"pizza",name:"New York Pizza"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Nordsee":{name:"Nordsee",icon:"maki-fast-food",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",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/burger/Pal's":{name:"Pal's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q7126094"},addTags:{amenity:"fast_food",brand:"Pal's","brand:wikidata":"Q7126094","brand:wikipedia":"en:Pal's",cuisine:"burger",name:"Pal's"},removeTags:{amenity:"fast_food",brand:"Pal's","brand:wikidata":"Q7126094","brand:wikipedia":"en:Pal's",cuisine:"burger",name:"Pal's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Panago":{name:"Panago",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","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"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Panda Express":{name:"Panda Express",icon:"maki-fast-food",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/sandwich/Panera Bread":{name:"Panera Bread",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","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"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Papa John's":{name:"Papa John's",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","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"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Papa Murphy's":{name:"Papa Murphy's",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","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"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Philly Pretzel Factory":{name:"Philly Pretzel Factory",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q60097339"},addTags:{amenity:"fast_food",brand:"Philly Pretzel Factory","brand:wikidata":"Q60097339",cuisine:"pretzel",name:"Philly Pretzel Factory"},removeTags:{amenity:"fast_food",brand:"Philly Pretzel Factory","brand:wikidata":"Q60097339",cuisine:"pretzel",name:"Philly Pretzel Factory"},matchScore:2,suggestion:true},"amenity/fast_food/Pita Pit":{name:"Pita Pit",icon:"maki-fast-food",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/Pizza Hut Delivery":{name:"Pizza Hut Delivery",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","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"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Pizza Hut Express":{name:"Pizza Hut Express",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","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"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Pizza Nova":{name:"Pizza Nova",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","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"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Pizza Pizza":{name:"Pizza Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","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"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/Pollo Campero":{name:"Pollo Campero",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","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"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/Popeye's":{name:"Popeye's",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","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"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Potbelly":{name:"Potbelly",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","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"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/Qdoba":{name:"Qdoba",icon:"maki-fast-food",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/burger/Quick":{name:"Quick",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Quiznos":{name:"Quiznos",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","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"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/Raising Cane's":{name:"Raising Cane's",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","brand:wikidata":"Q7285144"},addTags:{amenity:"fast_food",brand:"Raising Cane's","brand:wikidata":"Q7285144","brand:wikipedia":"en:Raising Cane's Chicken Fingers",cuisine:"chicken",name:"Raising Cane's"},removeTags:{amenity:"fast_food",brand:"Raising Cane's","brand:wikidata":"Q7285144","brand:wikipedia":"en:Raising Cane's Chicken Fingers",cuisine:"chicken",name:"Raising Cane's"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Rally's":{name:"Rally's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/Red Rooster":{name:"Red Rooster",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","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"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Sbarro":{name:"Sbarro",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","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"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Schlotzsky's":{name:"Schlotzsky's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","brand:wikidata":"Q2244796"},addTags:{amenity:"fast_food",brand:"Schlotzsky's","brand:wikidata":"Q2244796","brand:wikipedia":"en:Schlotzsky's",cuisine:"sandwich",name:"Schlotzsky's"},removeTags:{amenity:"fast_food",brand:"Schlotzsky's","brand:wikidata":"Q2244796","brand:wikipedia":"en:Schlotzsky's",cuisine:"sandwich",name:"Schlotzsky's"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Shake Shack":{name:"Shake Shack",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1058722"},addTags:{amenity:"fast_food",brand:"Shake Shack","brand:wikidata":"Q1058722","brand:wikipedia":"en:Shake Shack",cuisine:"burger",name:"Shake Shack"},removeTags:{amenity:"fast_food",brand:"Shake Shack","brand:wikidata":"Q1058722","brand:wikipedia":"en:Shake Shack",cuisine:"burger",name:"Shake Shack"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Sibylla":{name:"Sibylla",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q488643"},addTags:{amenity:"fast_food",brand:"Sibylla","brand:wikidata":"Q488643","brand:wikipedia":"en:Sibylla (fast food)",cuisine:"burger",name:"Sibylla"},removeTags:{amenity:"fast_food",brand:"Sibylla","brand:wikidata":"Q488643","brand:wikipedia":"en:Sibylla (fast food)",cuisine:"burger",name:"Sibylla"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Smashburger":{name:"Smashburger",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/Smoothie King":{name:"Smoothie King",icon:"maki-fast-food",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/burger/Sonic":{name:"Sonic",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Steers":{name:"Steers",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Subway":{name:"Subway",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","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"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Supermac's":{name:"Supermac's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q7643750"},addTags:{amenity:"fast_food",brand:"Supermac's","brand:wikidata":"Q7643750","brand:wikipedia":"en:Supermac's",cuisine:"burger",name:"Supermac's"},removeTags:{amenity:"fast_food",brand:"Supermac's","brand:wikidata":"Q7643750","brand:wikipedia":"en:Supermac's",cuisine:"burger",name:"Supermac's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/Taco Bell":{name:"Taco Bell",icon:"maki-fast-food",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:"tex-mex",name:"Taco Bell"},removeTags:{amenity:"fast_food",brand:"Taco Bell","brand:wikidata":"Q752941","brand:wikipedia":"en:Taco Bell",cuisine:"tex-mex",name:"Taco Bell"},matchScore:2,suggestion:true},"amenity/fast_food/Taco Bueno":{name:"Taco Bueno",icon:"maki-fast-food",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",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",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",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",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/pizza/Telepizza":{name:"Telepizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","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"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Thai Express":{name:"Thai Express",icon:"maki-fast-food",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/pizza/The Pizza Company":{name:"The Pizza Company",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","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"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Wendy's":{name:"Wendy's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Whataburger":{name:"Whataburger",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/White Castle":{name:"White Castle",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/Wienerschnitzel":{name:"Wienerschnitzel",icon:"maki-fast-food",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/burger/Wimpy":{name:"Wimpy",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/Zaxby's":{name:"Zaxby's",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","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"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Бургер Кинг":{name:"Бургер Кинг",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/Крошка Картошка":{name:"Крошка Картошка",icon:"maki-fast-food",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/burger/Макдоналдс":{name:"Макдоналдс",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Папа Джонс":{name:"Папа Джонс",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","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"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Стардог!s":{name:"Стардог!s",icon:"maki-fast-food",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:Стардогс",cuisine:"sausage",name:"Стардог!s","name:en":"Stardog!s"},removeTags:{amenity:"fast_food",brand:"Стардог!s","brand:en":"Stardog!s","brand:wikidata":"Q4439856","brand:wikipedia":"ru:Стардогс",cuisine:"sausage",name:"Стардог!s","name:en":"Stardog!s"},matchScore:2,suggestion:true},"amenity/fast_food/Суши Wok":{name:"Суши Wok",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q25444754"},addTags:{amenity:"fast_food",brand:"Суши Wok","brand:en":"Sushi Wok","brand:wikidata":"Q25444754","brand:wikipedia":"uk:Суши Wok (мережа магазинів)",cuisine:"asian",name:"Суши Wok","name:en":"Sushi Wok"},removeTags:{amenity:"fast_food",brand:"Суши Wok","brand:en":"Sushi Wok","brand:wikidata":"Q25444754","brand:wikipedia":"uk:Суши Wok (мережа магазинів)",cuisine:"asian",name:"Суши Wok","name:en":"Sushi Wok"},matchScore:2,suggestion:true},"amenity/fast_food/Теремок":{name:"Теремок",icon:"maki-fast-food",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/burger/מקדונלד'ס":{name:"מקדונלד'ס",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/かっぱ寿司":{name:"かっぱ寿司",icon:"maki-fast-food",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",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",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",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",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",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",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",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",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/chicken/ケンタッキーフライドチキン":{name:"ケンタッキーフライドチキン",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","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"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/サブウェイ":{name:"サブウェイ",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","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"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/スシロー":{name:"スシロー",icon:"maki-fast-food",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/pizza/ピザハット":{name:"ピザハット",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","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"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/burger/マクドナルド":{name:"マクドナルド",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/ミスタードーナツ":{name:"ミスタードーナツ",icon:"maki-fast-food",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/burger/モスバーガー":{name:"モスバーガー",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/ロッテリア":{name:"ロッテリア",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/吉野家":{name:"吉野家",icon:"maki-fast-food",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",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",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/burger/摩斯漢堡":{name:"摩斯漢堡",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/松屋":{name:"松屋",icon:"maki-fast-food",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",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/burger/麥當勞":{name:"麥當勞",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/麦当劳":{name:"麦当劳",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/롯데리아":{name:"롯데리아",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","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"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fuel/1-2-3":{name:"1-2-3",icon:"maki-fuel",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/7-Eleven":{name:"7-Eleven",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q259340"},addTags:{amenity:"fuel",brand:"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"7-Eleven"},removeTags:{amenity:"fuel",brand:"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"7-Eleven"},matchScore:2,suggestion:true},"amenity/fuel/ABC":{name:"ABC",icon:"maki-fuel",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",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",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",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/Agrola":{name:"Agrola",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q397351"},addTags:{amenity:"fuel",brand:"Agrola","brand:wikidata":"Q397351","brand:wikipedia":"de:Agrola",name:"Agrola"},removeTags:{amenity:"fuel",brand:"Agrola","brand:wikidata":"Q397351","brand:wikipedia":"de:Agrola",name:"Agrola"},matchScore:2,suggestion:true},"amenity/fuel/Api":{name:"Api",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q466043"},addTags:{amenity:"fuel",brand:"Api","brand:wikidata":"Q466043","brand:wikipedia":"en:American Petroleum Institute",name:"Api"},removeTags:{amenity:"fuel",brand:"Api","brand:wikidata":"Q466043","brand:wikipedia":"en:American Petroleum Institute",name:"Api"},matchScore:2,suggestion:true},"amenity/fuel/Aral":{name:"Aral",icon:"maki-fuel",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",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/Asda":{name:"Asda",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q297410"},addTags:{amenity:"fuel",brand:"Asda","brand:wikidata":"Q297410","brand:wikipedia":"en:Asda",name:"Asda"},removeTags:{amenity:"fuel",brand:"Asda","brand:wikidata":"Q297410","brand:wikipedia":"en:Asda",name:"Asda"},matchScore:2,suggestion:true},"amenity/fuel/Auchan":{name:"Auchan",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q758603"},addTags:{amenity:"fuel",brand:"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"en:Auchan",name:"Auchan"},removeTags:{amenity:"fuel",brand:"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"en:Auchan",name:"Auchan"},matchScore:2,suggestion:true},"amenity/fuel/Avanti":{name:"Avanti",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q168238"},addTags:{amenity:"fuel",brand:"Avanti","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"Avanti"},removeTags:{amenity:"fuel",brand:"Avanti","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"Avanti"},matchScore:2,suggestion:true},"amenity/fuel/Avia":{name:"Avia",icon:"maki-fuel",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/Avin":{name:"Avin",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q19903165"},addTags:{amenity:"fuel",brand:"Avin","brand:wikidata":"Q19903165","brand:wikipedia":"en:Avin International",name:"Avin"},removeTags:{amenity:"fuel",brand:"Avin","brand:wikidata":"Q19903165","brand:wikipedia":"en:Avin International",name:"Avin"},matchScore:2,suggestion:true},"amenity/fuel/BP":{name:"BP",icon:"maki-fuel",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/Bangchak":{name:"Bangchak",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q6579719"},addTags:{amenity:"fuel",brand:"Bangchak","brand:wikidata":"Q6579719","brand:wikipedia":"zh:曼差石油股份",name:"Bangchak"},removeTags:{amenity:"fuel",brand:"Bangchak","brand:wikidata":"Q6579719","brand:wikipedia":"zh:曼差石油股份",name:"Bangchak"},matchScore:2,suggestion:true},"amenity/fuel/Bharat Petroleum":{name:"Bharat Petroleum",icon:"maki-fuel",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",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",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",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",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",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/Carrefour Market":{name:"Carrefour Market",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q217599"},addTags:{amenity:"fuel",brand:"Carrefour Market","brand:wikidata":"Q217599","brand:wikipedia":"en:Carrefour",name:"Carrefour Market"},removeTags:{amenity:"fuel",brand:"Carrefour Market","brand:wikidata":"Q217599","brand:wikipedia":"en:Carrefour",name:"Carrefour Market"},matchScore:2,suggestion:true},"amenity/fuel/Casey's General Store":{name:"Casey's General Store",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2940968"},addTags:{amenity:"fuel",brand:"Casey's General Store","brand:wikidata":"Q2940968","brand:wikipedia":"en:Casey's General Stores",name:"Casey's General Store"},removeTags:{amenity:"fuel",brand:"Casey's General Store","brand:wikidata":"Q2940968","brand:wikipedia":"en:Casey's General Stores",name:"Casey's General Store"},matchScore:2,suggestion:true},"amenity/fuel/Cenex":{name:"Cenex",icon:"maki-fuel",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/Ceypetco":{name:"Ceypetco",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5065795"},addTags:{amenity:"fuel",brand:"Ceypetco","brand:wikidata":"Q5065795","brand:wikipedia":"en:Ceylon Petroleum Corporation",name:"Ceypetco"},removeTags:{amenity:"fuel",brand:"Ceypetco","brand:wikidata":"Q5065795","brand:wikipedia":"en:Ceylon Petroleum Corporation",name:"Ceypetco"},matchScore:2,suggestion:true},"amenity/fuel/Chevron":{name:"Chevron",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q319642"},addTags:{amenity:"fuel",brand:"Chevron","brand:wikidata":"Q319642","brand:wikipedia":"en:Chevron Corporation",name:"Chevron"},removeTags:{amenity:"fuel",brand:"Chevron","brand:wikidata":"Q319642","brand:wikipedia":"en:Chevron Corporation",name:"Chevron"},matchScore:2,suggestion:true},"amenity/fuel/Circle K":{name:"Circle K",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3268010"},addTags:{amenity:"fuel",brand:"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"Circle K"},removeTags:{amenity:"fuel",brand:"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"Circle K"},matchScore:2,suggestion:true},"amenity/fuel/Citgo":{name:"Citgo",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2974437"},addTags:{amenity:"fuel",brand:"Citgo","brand:wikidata":"Q2974437","brand:wikipedia":"en:Citgo",name:"Citgo"},removeTags:{amenity:"fuel",brand:"Citgo","brand:wikidata":"Q2974437","brand:wikipedia":"en:Citgo",name:"Citgo"},matchScore:2,suggestion:true},"amenity/fuel/Clark":{name:"Clark",icon:"maki-fuel",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",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/Coles Express":{name:"Coles Express",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5144653"},addTags:{amenity:"fuel",brand:"Coles Express","brand:wikidata":"Q5144653","brand:wikipedia":"en:Coles Express",name:"Coles Express"},removeTags:{amenity:"fuel",brand:"Coles Express","brand:wikidata":"Q5144653","brand:wikipedia":"en:Coles Express",name:"Coles Express"},matchScore:2,suggestion:true},"amenity/fuel/Conoco":{name:"Conoco",icon:"maki-fuel",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/Copec":{name:"Copec",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q11681461"},addTags:{amenity:"fuel",brand:"Copec","brand:wikidata":"Q11681461","brand:wikipedia":"en:Empresas Copec",name:"Copec"},removeTags:{amenity:"fuel",brand:"Copec","brand:wikidata":"Q11681461","brand:wikipedia":"en:Empresas Copec",name:"Copec"},matchScore:2,suggestion:true},"amenity/fuel/Cosmo":{name:"Cosmo",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2498318"},addTags:{amenity:"fuel",brand:"Cosmo","brand:wikidata":"Q2498318","brand:wikipedia":"en:Cosmo Oil Company",name:"Cosmo"},removeTags:{amenity:"fuel",brand:"Cosmo","brand:wikidata":"Q2498318","brand:wikipedia":"en:Cosmo Oil Company",name:"Cosmo"},matchScore:2,suggestion:true},"amenity/fuel/Costco Gasoline":{name:"Costco Gasoline",icon:"maki-fuel",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/Couche-Tard":{name:"Couche-Tard",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2836957"},addTags:{amenity:"fuel",brand:"Couche-Tard","brand:wikidata":"Q2836957","brand:wikipedia":"en:Alimentation Couche-Tard",name:"Couche-Tard"},removeTags:{amenity:"fuel",brand:"Couche-Tard","brand:wikidata":"Q2836957","brand:wikipedia":"en:Alimentation Couche-Tard",name:"Couche-Tard"},matchScore:2,suggestion:true},"amenity/fuel/Cumberland Farms":{name:"Cumberland Farms",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1143685"},addTags:{amenity:"fuel",brand:"Cumberland Farms","brand:wikidata":"Q1143685","brand:wikipedia":"en:Cumberland Farms",name:"Cumberland Farms"},removeTags:{amenity:"fuel",brand:"Cumberland Farms","brand:wikidata":"Q1143685","brand:wikipedia":"en:Cumberland Farms",name:"Cumberland Farms"},matchScore:2,suggestion:true},"amenity/fuel/Diamond Shamrock":{name:"Diamond Shamrock",icon:"maki-fuel",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/Domo":{name:"Domo",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5291326"},addTags:{amenity:"fuel",brand:"Domo","brand:wikidata":"Q5291326","brand:wikipedia":"en:Domo Gasoline",name:"Domo"},removeTags:{amenity:"fuel",brand:"Domo","brand:wikidata":"Q5291326","brand:wikipedia":"en:Domo Gasoline",name:"Domo"},matchScore:2,suggestion:true},"amenity/fuel/EKO (Canada)":{name:"EKO (Canada)",icon:"maki-fuel",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",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",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",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/Engen":{name:"Engen",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3054251"},addTags:{amenity:"fuel",brand:"Engen","brand:wikidata":"Q3054251","brand:wikipedia":"en:Engen Petroleum",name:"Engen"},removeTags:{amenity:"fuel",brand:"Engen","brand:wikidata":"Q3054251","brand:wikipedia":"en:Engen Petroleum",name:"Engen"},matchScore:2,suggestion:true},"amenity/fuel/Eni":{name:"Eni",icon:"maki-fuel",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/Erg":{name:"Erg",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q739503"},addTags:{amenity:"fuel",brand:"Erg","brand:wikidata":"Q739503","brand:wikipedia":"it:ERG (azienda)",name:"Erg"},removeTags:{amenity:"fuel",brand:"Erg","brand:wikidata":"Q739503","brand:wikipedia":"it:ERG (azienda)",name:"Erg"},matchScore:2,suggestion:true},"amenity/fuel/Esso":{name:"Esso",icon:"maki-fuel",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",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",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/Firezone":{name:"Firezone",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q14628080"},addTags:{amenity:"fuel",brand:"Firezone","brand:wikidata":"Q14628080","brand:wikipedia":"nl:Firezone",name:"Firezone"},removeTags:{amenity:"fuel",brand:"Firezone","brand:wikidata":"Q14628080","brand:wikipedia":"nl:Firezone",name:"Firezone"},matchScore:2,suggestion:true},"amenity/fuel/Flying J":{name:"Flying J",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1434601"},addTags:{amenity:"fuel",brand:"Flying J","brand:wikidata":"Q1434601","brand:wikipedia":"en:Pilot Flying J",name:"Flying J"},removeTags:{amenity:"fuel",brand:"Flying J","brand:wikidata":"Q1434601","brand:wikipedia":"en:Pilot Flying J",name:"Flying J"},matchScore:2,suggestion:true},"amenity/fuel/Freie Tankstelle":{name:"Freie Tankstelle",icon:"maki-fuel",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/GALP":{name:"GALP",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1492739"},addTags:{amenity:"fuel",brand:"GALP","brand:wikidata":"Q1492739","brand:wikipedia":"en:Galp Energia",name:"GALP"},removeTags:{amenity:"fuel",brand:"GALP","brand:wikidata":"Q1492739","brand:wikipedia":"en:Galp Energia",name:"GALP"},matchScore:2,suggestion:true},"amenity/fuel/Gazprom":{name:"Gazprom",icon:"maki-fuel",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",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",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/Gulf":{name:"Gulf",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1296860"},addTags:{amenity:"fuel",brand:"Gulf","brand:wikidata":"Q1296860","brand:wikipedia":"en:Gulf Oil",name:"Gulf"},removeTags:{amenity:"fuel",brand:"Gulf","brand:wikidata":"Q1296860","brand:wikipedia":"en:Gulf Oil",name:"Gulf"},matchScore:2,suggestion:true},"amenity/fuel/Gull":{name:"Gull",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5617739"},addTags:{amenity:"fuel",brand:"Gull","brand:wikidata":"Q5617739","brand:wikipedia":"en:Gull Petroleum",name:"Gull"},removeTags:{amenity:"fuel",brand:"Gull","brand:wikidata":"Q5617739","brand:wikipedia":"en:Gull Petroleum",name:"Gull"},matchScore:2,suggestion:true},"amenity/fuel/H-E-B Fuel":{name:"H-E-B Fuel",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q830621"},addTags:{amenity:"fuel",brand:"H-E-B Fuel","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",name:"H-E-B Fuel"},removeTags:{amenity:"fuel",brand:"H-E-B Fuel","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",name:"H-E-B Fuel"},matchScore:2,suggestion:true},"amenity/fuel/HEM":{name:"HEM",icon:"maki-fuel",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/Hess":{name:"Hess",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1615684"},addTags:{amenity:"fuel",brand:"Hess","brand:wikidata":"Q1615684","brand:wikipedia":"en:Hess Corporation",name:"Hess"},removeTags:{amenity:"fuel",brand:"Hess","brand:wikidata":"Q1615684","brand:wikipedia":"en:Hess Corporation",name:"Hess"},matchScore:2,suggestion:true},"amenity/fuel/Hindustan Petroleum":{name:"Hindustan Petroleum",icon:"maki-fuel",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/Hofer":{name:"Hofer",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q15815751"},addTags:{amenity:"fuel",brand:"Hofer","brand:wikidata":"Q15815751","brand:wikipedia":"de:Hofer KG",name:"Hofer"},removeTags:{amenity:"fuel",brand:"Hofer","brand:wikidata":"Q15815751","brand:wikipedia":"de:Hofer KG",name:"Hofer"},matchScore:2,suggestion:true},"amenity/fuel/Holiday":{name:"Holiday",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5880490"},addTags:{amenity:"fuel",brand:"Holiday","brand:wikidata":"Q5880490","brand:wikipedia":"en:Holiday Stationstores",name:"Holiday"},removeTags:{amenity:"fuel",brand:"Holiday","brand:wikidata":"Q5880490","brand:wikipedia":"en:Holiday Stationstores",name:"Holiday"},matchScore:2,suggestion:true},"amenity/fuel/IP":{name:"IP",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q646807"},addTags:{amenity:"fuel",brand:"IP","brand:wikidata":"Q646807","brand:wikipedia":"en:Anonima Petroli Italiana",name:"IP"},removeTags:{amenity:"fuel",brand:"IP","brand:wikidata":"Q646807","brand:wikipedia":"en:Anonima Petroli Italiana",name:"IP"},matchScore:2,suggestion:true},"amenity/fuel/Indian Oil":{name:"Indian Oil",icon:"maki-fuel",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",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",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",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/Irving":{name:"Irving",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1673286"},addTags:{amenity:"fuel",brand:"Irving","brand:wikidata":"Q1673286","brand:wikipedia":"en:Irving Oil",name:"Irving"},removeTags:{amenity:"fuel",brand:"Irving","brand:wikidata":"Q1673286","brand:wikipedia":"en:Irving Oil",name:"Irving"},matchScore:2,suggestion:true},"amenity/fuel/JA-SS":{name:"JA-SS",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q11225213"},addTags:{amenity:"fuel",brand:"JA-SS","brand:wikidata":"Q11225213","brand:wikipedia":"ja:JA-SS",name:"JA-SS"},removeTags:{amenity:"fuel",brand:"JA-SS","brand:wikidata":"Q11225213","brand:wikipedia":"ja:JA-SS",name:"JA-SS"},matchScore:2,suggestion:true},"amenity/fuel/Jet":{name:"Jet",icon:"maki-fuel",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/Kobil":{name:"Kobil",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q22906119"},addTags:{amenity:"fuel",brand:"Kobil","brand:wikidata":"Q22906119","brand:wikipedia":"en:KenolKobil",name:"Kobil"},removeTags:{amenity:"fuel",brand:"Kobil","brand:wikidata":"Q22906119","brand:wikipedia":"en:KenolKobil",name:"Kobil"},matchScore:2,suggestion:true},"amenity/fuel/Kroger":{name:"Kroger",icon:"maki-fuel",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/Kum & Go":{name:"Kum & Go",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q6443340"},addTags:{amenity:"fuel",brand:"Kum & Go","brand:wikidata":"Q6443340","brand:wikipedia":"en:Kum & Go",name:"Kum & Go"},removeTags:{amenity:"fuel",brand:"Kum & Go","brand:wikidata":"Q6443340","brand:wikipedia":"en:Kum & Go",name:"Kum & Go"},matchScore:2,suggestion:true},"amenity/fuel/Kwik Trip":{name:"Kwik Trip",icon:"maki-fuel",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/Lotos":{name:"Lotos",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1256909"},addTags:{amenity:"fuel",brand:"Lotos","brand:wikidata":"Q1256909","brand:wikipedia":"en:Grupa Lotos",name:"Lotos"},removeTags:{amenity:"fuel",brand:"Lotos","brand:wikidata":"Q1256909","brand:wikipedia":"en:Grupa Lotos",name:"Lotos"},matchScore:2,suggestion:true},"amenity/fuel/Love's":{name:"Love's",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1872496"},addTags:{amenity:"fuel",brand:"Love's","brand:wikidata":"Q1872496","brand:wikipedia":"en:Love's Travel Stops & Country Stores",name:"Love's"},removeTags:{amenity:"fuel",brand:"Love's","brand:wikidata":"Q1872496","brand:wikipedia":"en:Love's Travel Stops & Country Stores",name:"Love's"},matchScore:2,suggestion:true},"amenity/fuel/Lukoil":{name:"Lukoil",icon:"maki-fuel",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/MOL":{name:"MOL",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q549181"},addTags:{amenity:"fuel",brand:"MOL","brand:wikidata":"Q549181","brand:wikipedia":"en:MOL (company)",name:"MOL"},removeTags:{amenity:"fuel",brand:"MOL","brand:wikidata":"Q549181","brand:wikipedia":"en:MOL (company)",name:"MOL"},matchScore:2,suggestion:true},"amenity/fuel/MRS":{name:"MRS",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q56274919"},addTags:{amenity:"fuel",brand:"MRS","brand:wikidata":"Q56274919","brand:wikipedia":"en:MRS Oil Nigeria Plc",name:"MRS"},removeTags:{amenity:"fuel",brand:"MRS","brand:wikidata":"Q56274919","brand:wikipedia":"en:MRS Oil Nigeria Plc",name:"MRS"},matchScore:2,suggestion:true},"amenity/fuel/Mac's":{name:"Mac's",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q4043527"},addTags:{amenity:"fuel",brand:"Mac's","brand:wikidata":"Q4043527","brand:wikipedia":"en:Mac's Convenience Stores",name:"Mac's"},removeTags:{amenity:"fuel",brand:"Mac's","brand:wikidata":"Q4043527","brand:wikipedia":"en:Mac's Convenience Stores",name:"Mac's"},matchScore:2,suggestion:true},"amenity/fuel/Marathon":{name:"Marathon",icon:"maki-fuel",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/Maverik":{name:"Maverik",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q16974822"},addTags:{amenity:"fuel",brand:"Maverik","brand:wikidata":"Q16974822","brand:wikipedia":"en:FJ Management",name:"Maverik"},removeTags:{amenity:"fuel",brand:"Maverik","brand:wikidata":"Q16974822","brand:wikipedia":"en:FJ Management",name:"Maverik"},matchScore:2,suggestion:true},"amenity/fuel/Maxol":{name:"Maxol",icon:"maki-fuel",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/Migrol":{name:"Migrol",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1747771"},addTags:{amenity:"fuel",brand:"Migrol","brand:wikidata":"Q1747771","brand:wikipedia":"de:Migrol",name:"Migrol"},removeTags:{amenity:"fuel",brand:"Migrol","brand:wikidata":"Q1747771","brand:wikipedia":"de:Migrol",name:"Migrol"},matchScore:2,suggestion:true},"amenity/fuel/Mobil":{name:"Mobil",icon:"maki-fuel",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/Morrisons":{name:"Morrisons",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q922344"},addTags:{amenity:"fuel",brand:"Morrisons","brand:wikidata":"Q922344","brand:wikipedia":"en:Morrisons",name:"Morrisons"},removeTags:{amenity:"fuel",brand:"Morrisons","brand:wikidata":"Q922344","brand:wikipedia":"en:Morrisons",name:"Morrisons"},matchScore:2,suggestion:true},"amenity/fuel/Murphy USA":{name:"Murphy USA",icon:"maki-fuel",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/NP":{name:"NP",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7842382"},addTags:{amenity:"fuel",brand:"NP","brand:wikidata":"Q7842382","brand:wikipedia":"en:Trinidad & Tobago National Petroleum Marketing Company Limited",name:"NP"},removeTags:{amenity:"fuel",brand:"NP","brand:wikidata":"Q7842382","brand:wikipedia":"en:Trinidad & Tobago National Petroleum Marketing Company Limited",name:"NP"},matchScore:2,suggestion:true},"amenity/fuel/Neste":{name:"Neste",icon:"maki-fuel",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",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",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/OKQ8":{name:"OKQ8",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1634762"},addTags:{amenity:"fuel",brand:"OKQ8","brand:wikidata":"Q1634762","brand:wikipedia":"en:Kuwait Petroleum Corporation",name:"OKQ8"},removeTags:{amenity:"fuel",brand:"OKQ8","brand:wikidata":"Q1634762","brand:wikipedia":"en:Kuwait Petroleum Corporation",name:"OKQ8"},matchScore:2,suggestion:true},"amenity/fuel/OMV":{name:"OMV",icon:"maki-fuel",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",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",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/Orlen":{name:"Orlen",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q971649"},addTags:{amenity:"fuel",brand:"Orlen","brand:wikidata":"Q971649","brand:wikipedia":"en:PKN Orlen",name:"Orlen"},removeTags:{amenity:"fuel",brand:"Orlen","brand:wikidata":"Q971649","brand:wikipedia":"en:PKN Orlen",name:"Orlen"},matchScore:2,suggestion:true},"amenity/fuel/Oxxo":{name:"Oxxo",icon:"maki-fuel",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/PSO":{name:"PSO",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2741455"},addTags:{amenity:"fuel",brand:"PSO","brand:wikidata":"Q2741455","brand:wikipedia":"en:Pakistan State Oil",name:"PSO"},removeTags:{amenity:"fuel",brand:"PSO","brand:wikidata":"Q2741455","brand:wikipedia":"en:Pakistan State Oil",name:"PSO"},matchScore:2,suggestion:true},"amenity/fuel/PTT":{name:"PTT",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1810389"},addTags:{amenity:"fuel",brand:"PTT","brand:wikidata":"Q1810389","brand:wikipedia":"en:PTT Public Company Limited",name:"PTT"},removeTags:{amenity:"fuel",brand:"PTT","brand:wikidata":"Q1810389","brand:wikipedia":"en:PTT Public Company Limited",name:"PTT"},matchScore:2,suggestion:true},"amenity/fuel/PV Oil":{name:"PV Oil",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2089536"},addTags:{amenity:"fuel",brand:"PV Oil","brand:wikidata":"Q2089536","brand:wikipedia":"en:Petrovietnam",name:"PV Oil"},removeTags:{amenity:"fuel",brand:"PV Oil","brand:wikidata":"Q2089536","brand:wikipedia":"en:Petrovietnam",name:"PV Oil"},matchScore:2,suggestion:true},"amenity/fuel/Pacific Pride":{name:"Pacific Pride",icon:"maki-fuel",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",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",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",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",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",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",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",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",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",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/Petron":{name:"Petron",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7179011"},addTags:{amenity:"fuel",brand:"Petron","brand:wikidata":"Q7179011","brand:wikipedia":"en:Petron Corporation",name:"Petron"},removeTags:{amenity:"fuel",brand:"Petron","brand:wikidata":"Q7179011","brand:wikipedia":"en:Petron Corporation",name:"Petron"},matchScore:2,suggestion:true},"amenity/fuel/Petronas":{name:"Petronas",icon:"maki-fuel",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",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",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/Phoenix":{name:"Phoenix",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7186949"},addTags:{amenity:"fuel",brand:"Phoenix","brand:wikidata":"Q7186949","brand:wikipedia":"en:Phoenix Petroleum",name:"Phoenix"},removeTags:{amenity:"fuel",brand:"Phoenix","brand:wikidata":"Q7186949","brand:wikipedia":"en:Phoenix Petroleum",name:"Phoenix"},matchScore:2,suggestion:true},"amenity/fuel/Pioneer":{name:"Pioneer",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7196684"},addTags:{amenity:"fuel",brand:"Pioneer","brand:wikidata":"Q7196684","brand:wikipedia":"en:Pioneer Energy",name:"Pioneer"},removeTags:{amenity:"fuel",brand:"Pioneer","brand:wikidata":"Q7196684","brand:wikipedia":"en:Pioneer Energy",name:"Pioneer"},matchScore:2,suggestion:true},"amenity/fuel/Preem":{name:"Preem",icon:"maki-fuel",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/Puma":{name:"Puma",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7259769"},addTags:{amenity:"fuel",brand:"Puma","brand:wikidata":"Q7259769","brand:wikipedia":"en:Puma Energy",name:"Puma"},removeTags:{amenity:"fuel",brand:"Puma","brand:wikidata":"Q7259769","brand:wikipedia":"en:Puma Energy",name:"Puma"},matchScore:2,suggestion:true},"amenity/fuel/Q8":{name:"Q8",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1634762"},addTags:{amenity:"fuel",brand:"Q8","brand:wikidata":"Q1634762","brand:wikipedia":"en:Kuwait Petroleum Corporation",name:"Q8"},removeTags:{amenity:"fuel",brand:"Q8","brand:wikidata":"Q1634762","brand:wikipedia":"en:Kuwait Petroleum Corporation",name:"Q8"},matchScore:2,suggestion:true},"amenity/fuel/Q8 Easy":{name:"Q8 Easy",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1806948"},addTags:{amenity:"fuel",brand:"Q8 Easy","brand:wikidata":"Q1806948","brand:wikipedia":"nl:Q8 Easy",name:"Q8 Easy"},removeTags:{amenity:"fuel",brand:"Q8 Easy","brand:wikidata":"Q1806948","brand:wikipedia":"nl:Q8 Easy",name:"Q8 Easy"},matchScore:2,suggestion:true},"amenity/fuel/QT":{name:"QT",icon:"maki-fuel",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/Qstar":{name:"Qstar",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q10647961"},addTags:{amenity:"fuel",brand:"Qstar","brand:wikidata":"Q10647961","brand:wikipedia":"sv:Qstar",name:"Qstar"},removeTags:{amenity:"fuel",brand:"Qstar","brand:wikidata":"Q10647961","brand:wikipedia":"sv:Qstar",name:"Qstar"},matchScore:2,suggestion:true},"amenity/fuel/QuikTrip":{name:"QuikTrip",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7271953"},addTags:{amenity:"fuel",brand:"QuikTrip","brand:wikidata":"Q7271953","brand:wikipedia":"en:QuikTrip",name:"QuikTrip"},removeTags:{amenity:"fuel",brand:"QuikTrip","brand:wikidata":"Q7271953","brand:wikipedia":"en:QuikTrip",name:"QuikTrip"},matchScore:2,suggestion:true},"amenity/fuel/Race Trac":{name:"Race Trac",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q735942"},addTags:{amenity:"fuel",brand:"Race Trac","brand:wikidata":"Q735942","brand:wikipedia":"en:RaceTrac",name:"Race Trac"},removeTags:{amenity:"fuel",brand:"Race Trac","brand:wikidata":"Q735942","brand:wikipedia":"en:RaceTrac",name:"Race Trac"},matchScore:2,suggestion:true},"amenity/fuel/Repsol":{name:"Repsol",icon:"maki-fuel",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",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/Royal Farms":{name:"Royal Farms",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7374169"},addTags:{amenity:"fuel",brand:"Royal Farms","brand:wikidata":"Q7374169","brand:wikipedia":"en:Royal Farms",name:"Royal Farms"},removeTags:{amenity:"fuel",brand:"Royal Farms","brand:wikidata":"Q7374169","brand:wikipedia":"en:Royal Farms",name:"Royal Farms"},matchScore:2,suggestion:true},"amenity/fuel/Rubis":{name:"Rubis",icon:"maki-fuel",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",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/Sainsbury's":{name:"Sainsbury's",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q152096"},addTags:{amenity:"fuel",brand:"Sainsbury's","brand:wikidata":"Q152096","brand:wikipedia":"en:Sainsbury's",name:"Sainsbury's"},removeTags:{amenity:"fuel",brand:"Sainsbury's","brand:wikidata":"Q152096","brand:wikipedia":"en:Sainsbury's",name:"Sainsbury's"},matchScore:2,suggestion:true},"amenity/fuel/Sam's Club":{name:"Sam's Club",icon:"maki-fuel",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",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",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",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",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",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/Sinclair":{name:"Sinclair",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1290900"},addTags:{amenity:"fuel",brand:"Sinclair","brand:wikidata":"Q1290900","brand:wikipedia":"en:Sinclair Oil Corporation",name:"Sinclair"},removeTags:{amenity:"fuel",brand:"Sinclair","brand:wikidata":"Q1290900","brand:wikipedia":"en:Sinclair Oil Corporation",name:"Sinclair"},matchScore:2,suggestion:true},"amenity/fuel/Sinopec":{name:"Sinopec",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q831445"},addTags:{amenity:"fuel",brand:"Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"en:Sinopec",name:"Sinopec"},removeTags:{amenity:"fuel",brand:"Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"en:Sinopec",name:"Sinopec"},matchScore:2,suggestion:true},"amenity/fuel/Slovnaft":{name:"Slovnaft",icon:"maki-fuel",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",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",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",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",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",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",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",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/Stewart's":{name:"Stewart's",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7615690"},addTags:{amenity:"fuel",brand:"Stewart's","brand:wikidata":"Q7615690","brand:wikipedia":"en:Stewart's Shops",name:"Stewart's"},removeTags:{amenity:"fuel",brand:"Stewart's","brand:wikidata":"Q7615690","brand:wikipedia":"en:Stewart's Shops",name:"Stewart's"},matchScore:2,suggestion:true},"amenity/fuel/Sunoco":{name:"Sunoco",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1423218"},addTags:{amenity:"fuel",brand:"Sunoco","brand:wikidata":"Q1423218","brand:wikipedia":"en:Sunoco",name:"Sunoco"},removeTags:{amenity:"fuel",brand:"Sunoco","brand:wikidata":"Q1423218","brand:wikipedia":"en:Sunoco",name:"Sunoco"},matchScore:2,suggestion:true},"amenity/fuel/Super U":{name:"Super U",icon:"maki-fuel",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",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/Tango":{name:"Tango",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2423920"},addTags:{amenity:"fuel",brand:"Tango","brand:wikidata":"Q2423920","brand:wikipedia":"nl:Tango CV",name:"Tango"},removeTags:{amenity:"fuel",brand:"Tango","brand:wikidata":"Q2423920","brand:wikipedia":"nl:Tango CV",name:"Tango"},matchScore:2,suggestion:true},"amenity/fuel/Tanka":{name:"Tanka",icon:"maki-fuel",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",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",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/Tesco":{name:"Tesco",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q17145596"},addTags:{amenity:"fuel",brand:"Tesco","brand:wikidata":"Q17145596","brand:wikipedia":"en:Tesco Corporation",name:"Tesco"},removeTags:{amenity:"fuel",brand:"Tesco","brand:wikidata":"Q17145596","brand:wikipedia":"en:Tesco Corporation",name:"Tesco"},matchScore:2,suggestion:true},"amenity/fuel/Texaco":{name:"Texaco",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q775060"},addTags:{amenity:"fuel",brand:"Texaco","brand:wikidata":"Q775060","brand:wikipedia":"en:Texaco",name:"Texaco"},removeTags:{amenity:"fuel",brand:"Texaco","brand:wikidata":"Q775060","brand:wikipedia":"en:Texaco",name:"Texaco"},matchScore:2,suggestion:true},"amenity/fuel/Tinq":{name:"Tinq",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2132028"},addTags:{amenity:"fuel",brand:"Tinq","brand:wikidata":"Q2132028","brand:wikipedia":"nl:Tinq",name:"Tinq"},removeTags:{amenity:"fuel",brand:"Tinq","brand:wikidata":"Q2132028","brand:wikipedia":"nl:Tinq",name:"Tinq"},matchScore:2,suggestion:true},"amenity/fuel/Topaz":{name:"Topaz",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7824764"},addTags:{amenity:"fuel",brand:"Topaz","brand:wikidata":"Q7824764","brand:wikipedia":"en:Topaz Energy",name:"Topaz"},removeTags:{amenity:"fuel",brand:"Topaz","brand:wikidata":"Q7824764","brand:wikipedia":"en:Topaz Energy",name:"Topaz"},matchScore:2,suggestion:true},"amenity/fuel/Total":{name:"Total",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q154037"},addTags:{amenity:"fuel",brand:"Total","brand:wikidata":"Q154037","brand:wikipedia":"fr:Total (entreprise)",name:"Total"},removeTags:{amenity:"fuel",brand:"Total","brand:wikidata":"Q154037","brand:wikipedia":"fr:Total (entreprise)",name:"Total"},matchScore:2,suggestion:true},"amenity/fuel/Turkey Hill":{name:"Turkey Hill",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q42376970"},addTags:{amenity:"fuel",brand:"Turkey Hill","brand:wikidata":"Q42376970","brand:wikipedia":"en:Turkey Hill Minit Markets",name:"Turkey Hill"},removeTags:{amenity:"fuel",brand:"Turkey Hill","brand:wikidata":"Q42376970","brand:wikipedia":"en:Turkey Hill Minit Markets",name:"Turkey Hill"},matchScore:2,suggestion:true},"amenity/fuel/Turmöl":{name:"Turmöl",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1473279"},addTags:{amenity:"fuel",brand:"Turmöl","brand:wikidata":"Q1473279","brand:wikipedia":"de:Turmöl",name:"Turmöl"},removeTags:{amenity:"fuel",brand:"Turmöl","brand:wikidata":"Q1473279","brand:wikipedia":"de:Turmöl",name:"Turmöl"},matchScore:2,suggestion:true},"amenity/fuel/UDF Fuel":{name:"UDF Fuel",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7887677"},addTags:{amenity:"fuel",brand:"United Dairy Farmers","brand:wikidata":"Q7887677","brand:wikipedia":"en:United Dairy Farmers",name:"UDF Fuel",short_name:"UDF"},removeTags:{amenity:"fuel",brand:"United Dairy Farmers","brand:wikidata":"Q7887677","brand:wikipedia":"en:United Dairy Farmers",name:"UDF Fuel",short_name:"UDF"},matchScore:2,suggestion:true},"amenity/fuel/Ultramar":{name:"Ultramar",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3548078"},addTags:{amenity:"fuel",brand:"Ultramar","brand:wikidata":"Q3548078","brand:wikipedia":"en:Ultramar",name:"Ultramar"},removeTags:{amenity:"fuel",brand:"Ultramar","brand:wikidata":"Q3548078","brand:wikipedia":"en:Ultramar",name:"Ultramar"},matchScore:2,suggestion:true},"amenity/fuel/United":{name:"United",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q28224393"},addTags:{amenity:"fuel",brand:"United","brand:wikidata":"Q28224393","brand:wikipedia":"en:United Petroleum",name:"United"},removeTags:{amenity:"fuel",brand:"United","brand:wikidata":"Q28224393","brand:wikipedia":"en:United Petroleum",name:"United"},matchScore:2,suggestion:true},"amenity/fuel/Uno-X":{name:"Uno-X",icon:"maki-fuel",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/Valero":{name:"Valero",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1283291"},addTags:{amenity:"fuel",brand:"Valero","brand:wikidata":"Q1283291","brand:wikipedia":"en:Valero Energy",name:"Valero"},removeTags:{amenity:"fuel",brand:"Valero","brand:wikidata":"Q1283291","brand:wikipedia":"en:Valero Energy",name:"Valero"},matchScore:2,suggestion:true},"amenity/fuel/Viada":{name:"Viada",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q12663942"},addTags:{amenity:"fuel",brand:"Viada","brand:wikidata":"Q12663942","brand:wikipedia":"en:Lukoil Baltija",name:"Viada"},removeTags:{amenity:"fuel",brand:"Viada","brand:wikidata":"Q12663942","brand:wikipedia":"en:Lukoil Baltija",name:"Viada"},matchScore:2,suggestion:true},"amenity/fuel/WOG":{name:"WOG",icon:"maki-fuel",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",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",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",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",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/Z":{name:"Z",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q8063337"},addTags:{amenity:"fuel",brand:"Z","brand:wikidata":"Q8063337","brand:wikipedia":"en:Z Energy",name:"Z"},removeTags:{amenity:"fuel",brand:"Z","brand:wikidata":"Q8063337","brand:wikipedia":"en:Z Energy",name:"Z"},matchScore:2,suggestion:true},"amenity/fuel/bft":{name:"bft",icon:"maki-fuel",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",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q12122687"},addTags:{amenity:"fuel",brand:"АЗС","brand:wikidata":"Q12122687","brand:wikipedia":"uk:Мережа АЗС Приват",name:"АЗС"},removeTags:{amenity:"fuel",brand:"АЗС","brand:wikidata":"Q12122687","brand:wikipedia":"uk:Мережа АЗС Приват",name:"АЗС"},matchScore:2,suggestion:true},"amenity/fuel/БРСМ-Нафта":{name:"БРСМ-Нафта",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q56356523"},addTags:{amenity:"fuel",brand:"БРСМ-Нафта","brand:wikidata":"Q56356523","brand:wikipedia":"uk:БРСМ-Нафта",name:"БРСМ-Нафта"},removeTags:{amenity:"fuel",brand:"БРСМ-Нафта","brand:wikidata":"Q56356523","brand:wikipedia":"uk:БРСМ-Нафта",name:"БРСМ-Нафта"},matchScore:2,suggestion:true},"amenity/fuel/Башнефть":{name:"Башнефть",icon:"maki-fuel",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",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q4082693"},addTags:{amenity:"fuel",brand:"Белоруснефть","brand:wikidata":"Q4082693","brand:wikipedia":"ru:Белоруснефть",name:"Белоруснефть"},removeTags:{amenity:"fuel",brand:"Белоруснефть","brand:wikidata":"Q4082693","brand:wikipedia":"ru:Белоруснефть",name:"Белоруснефть"},matchScore:2,suggestion:true},"amenity/fuel/КазМунайГаз":{name:"КазМунайГаз",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1417227"},addTags:{amenity:"fuel",brand:"КазМунайГаз","brand:wikidata":"Q1417227","brand:wikipedia":"en:KazMunayGas",name:"КазМунайГаз"},removeTags:{amenity:"fuel",brand:"КазМунайГаз","brand:wikidata":"Q1417227","brand:wikipedia":"en:KazMunayGas",name:"КазМунайГаз"},matchScore:2,suggestion:true},"amenity/fuel/Лукойл":{name:"Лукойл",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q329347"},addTags:{amenity:"fuel",brand:"Лукойл","brand:wikidata":"Q329347","brand:wikipedia":"ru:Лукойл",name:"Лукойл"},removeTags:{amenity:"fuel",brand:"Лукойл","brand:wikidata":"Q329347","brand:wikipedia":"ru:Лукойл",name:"Лукойл"},matchScore:2,suggestion:true},"amenity/fuel/Макпетрол":{name:"Макпетрол",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1886438"},addTags:{amenity:"fuel",brand:"Макпетрол","brand:wikidata":"Q1886438","brand:wikipedia":"en:Makpetrol",name:"Макпетрол"},removeTags:{amenity:"fuel",brand:"Макпетрол","brand:wikidata":"Q1886438","brand:wikipedia":"en:Makpetrol",name:"Макпетрол"},matchScore:2,suggestion:true},"amenity/fuel/НК Альянс":{name:"НК Альянс",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q4063700"},addTags:{amenity:"fuel",brand:"НК Альянс","brand:wikidata":"Q4063700","brand:wikipedia":"ru:Альянс (компания)",name:"НК Альянс"},removeTags:{amenity:"fuel",brand:"НК Альянс","brand:wikidata":"Q4063700","brand:wikipedia":"ru:Альянс (компания)",name:"НК Альянс"},matchScore:2,suggestion:true},"amenity/fuel/ОККО":{name:"ОККО",icon:"maki-fuel",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",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",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q24315"},addTags:{amenity:"fuel",brand:"Петрол","brand:wikidata":"Q24315","brand:wikipedia":"en:Petrol AD",name:"Петрол"},removeTags:{amenity:"fuel",brand:"Петрол","brand:wikidata":"Q24315","brand:wikipedia":"en:Petrol AD",name:"Петрол"},matchScore:2,suggestion:true},"amenity/fuel/Роснефть":{name:"Роснефть",icon:"maki-fuel",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",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",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",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",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",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",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",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",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",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",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/中国石化 Sinopec":{name:"中国石化 Sinopec",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q831445"},addTags:{amenity:"fuel",brand:"中国石化 Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"zh:中国石化",name:"中国石化 Sinopec"},removeTags:{amenity:"fuel",brand:"中国石化 Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"zh:中国石化",name:"中国石化 Sinopec"},matchScore:2,suggestion:true},"amenity/fuel/中国石油":{name:"中国石油",icon:"maki-fuel",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",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",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",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",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",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",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",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",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/Rita's Italian Ice":{name:"Rita's Italian Ice",icon:"maki-ice-cream",geometry:["point","area"],tags:{amenity:"ice_cream","brand:wikidata":"Q7336456"},addTags:{amenity:"ice_cream",brand:"Rita's Italian Ice","brand:wikidata":"Q7336456","brand:wikipedia":"en:Rita's Italian Ice",cuisine:"ice_cream",name:"Rita's Italian Ice"},removeTags:{amenity:"ice_cream",brand:"Rita's Italian Ice","brand:wikidata":"Q7336456","brand:wikipedia":"en:Rita's Italian Ice",cuisine:"ice_cream",name:"Rita's Italian Ice"},matchScore:2,suggestion:true},"amenity/ice_cream/sweetFrog":{name:"sweetFrog",icon:"maki-ice-cream",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",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",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/Abitab":{name:"Abitab",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"payment_centre","brand:wikidata":"Q16488129"},addTags:{amenity:"payment_centre",brand:"Abitab","brand:wikidata":"Q16488129","brand:wikipedia":"es:Abitab",name:"Abitab"},removeTags:{amenity:"payment_centre",brand:"Abitab","brand:wikidata":"Q16488129","brand:wikipedia":"es:Abitab",name:"Abitab"},matchScore:2,suggestion:true},"amenity/payment_centre/Rapipago":{name:"Rapipago",icon:"maki-bank",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",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/payment_terminal/ПриватБанк":{name:"ПриватБанк",icon:"maki-bank",geometry:["point"],tags:{amenity:"payment_terminal","brand:wikidata":"Q1515015"},addTags:{amenity:"payment_terminal",brand:"ПриватБанк","brand:wikidata":"Q1515015","brand:wikipedia":"en:PrivatBank",name:"ПриватБанк"},removeTags:{amenity:"payment_terminal",brand:"ПриватБанк","brand:wikidata":"Q1515015","brand:wikipedia":"en:PrivatBank",name:"ПриватБанк"},matchScore:2,suggestion:true},"amenity/payment_terminal/Элекснет":{name:"Элекснет",icon:"maki-bank",geometry:["point"],tags:{amenity:"payment_terminal","brand:wikidata":"Q4530795"},addTags:{amenity:"payment_terminal",brand:"Элекснет","brand:wikidata":"Q4530795","brand:wikipedia":"ru:Элекснет",name:"Элекснет"},removeTags:{amenity:"payment_terminal",brand:"Элекснет","brand:wikidata":"Q4530795","brand:wikipedia":"ru:Элекснет",name:"Элекснет"},matchScore:2,suggestion:true},"amenity/pharmacy/36,6":{name:"36,6",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q226889"},addTags:{amenity:"pharmacy",brand:"36,6","brand:wikidata":"Q226889","brand:wikipedia":"ru:36,6 (аптечная сеть)",healthcare:"pharmacy",name:"36,6"},removeTags:{amenity:"pharmacy",brand:"36,6","brand:wikidata":"Q226889","brand:wikipedia":"ru:36,6 (аптечная сеть)",healthcare:"pharmacy",name:"36,6"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Apotek Hjärtat":{name:"Apotek Hjärtat",icon:"maki-pharmacy",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",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/Benavides":{name:"Benavides",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5435613"},addTags:{amenity:"pharmacy",brand:"Benavides","brand:wikidata":"Q5435613","brand:wikipedia":"en:Farmacias Benavides",healthcare:"pharmacy",name:"Benavides"},removeTags:{amenity:"pharmacy",brand:"Benavides","brand:wikidata":"Q5435613","brand:wikipedia":"en:Farmacias Benavides",healthcare:"pharmacy",name:"Benavides"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Boots":{name:"Boots",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q6123139"},addTags:{amenity:"pharmacy",brand:"Boots","brand:wikidata":"Q6123139","brand:wikipedia":"en:Boots UK",healthcare:"pharmacy",name:"Boots"},removeTags:{amenity:"pharmacy",brand:"Boots","brand:wikidata":"Q6123139","brand:wikipedia":"en:Boots UK",healthcare:"pharmacy",name:"Boots"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Brookshire Brothers Pharmacy":{name:"Brookshire Brothers Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q4975084"},addTags:{amenity:"pharmacy",brand:"Brookshire Brothers Pharmacy","brand:wikidata":"Q4975084","brand:wikipedia":"en:Brookshire Brothers",healthcare:"pharmacy",name:"Brookshire Brothers Pharmacy"},removeTags:{amenity:"pharmacy",brand:"Brookshire Brothers Pharmacy","brand:wikidata":"Q4975084","brand:wikipedia":"en:Brookshire Brothers",healthcare:"pharmacy",name:"Brookshire Brothers Pharmacy"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/CVS":{name:"CVS",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q2078880"},addTags:{amenity:"pharmacy",brand:"CVS","brand:wikidata":"Q2078880","brand:wikipedia":"en:CVS Pharmacy",healthcare:"pharmacy",name:"CVS"},removeTags:{amenity:"pharmacy",brand:"CVS","brand:wikidata":"Q2078880","brand:wikipedia":"en:CVS Pharmacy",healthcare:"pharmacy",name:"CVS"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Catena":{name:"Catena",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q24035728"},addTags:{amenity:"pharmacy",brand:"Catena","brand:wikidata":"Q24035728","brand:wikipedia":"ro:Farmacia Catena",healthcare:"pharmacy",name:"Catena"},removeTags:{amenity:"pharmacy",brand:"Catena","brand:wikidata":"Q24035728","brand:wikipedia":"ro:Farmacia Catena",healthcare:"pharmacy",name:"Catena"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Chemist Warehouse":{name:"Chemist Warehouse",icon:"maki-pharmacy",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",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/Cruz Verde":{name:"Cruz Verde",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5856071"},addTags:{amenity:"pharmacy",brand:"Cruz Verde","brand:wikidata":"Q5856071","brand:wikipedia":"es:Farmacias Cruz Verde",healthcare:"pharmacy",name:"Cruz Verde"},removeTags:{amenity:"pharmacy",brand:"Cruz Verde","brand:wikidata":"Q5856071","brand:wikipedia":"es:Farmacias Cruz Verde",healthcare:"pharmacy",name:"Cruz Verde"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Droga Raia":{name:"Droga Raia",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q10357101"},addTags:{amenity:"pharmacy",brand:"Droga Raia","brand:wikidata":"Q10357101","brand:wikipedia":"pt:RaiaDrogasil",healthcare:"pharmacy",name:"Droga Raia"},removeTags:{amenity:"pharmacy",brand:"Droga Raia","brand:wikidata":"Q10357101","brand:wikipedia":"pt:RaiaDrogasil",healthcare:"pharmacy",name:"Droga Raia"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Drogaria São Paulo":{name:"Drogaria São Paulo",icon:"maki-pharmacy",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",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",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",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 Benavides":{name:"Farmacia Benavides",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5435613"},addTags:{amenity:"pharmacy",brand:"Farmacia Benavides","brand:wikidata":"Q5435613","brand:wikipedia":"en:Farmacias Benavides",healthcare:"pharmacy",name:"Farmacia Benavides"},removeTags:{amenity:"pharmacy",brand:"Farmacia Benavides","brand:wikidata":"Q5435613","brand:wikipedia":"en:Farmacias Benavides",healthcare:"pharmacy",name:"Farmacia Benavides"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Farmacia Guadalajara":{name:"Farmacia Guadalajara",icon:"maki-pharmacy",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/Farmacias Ahumada":{name:"Farmacias Ahumada",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5856069"},addTags:{amenity:"pharmacy",brand:"Farmacias Ahumada","brand:wikidata":"Q5856069","brand:wikipedia":"es:Farmacias Ahumada",healthcare:"pharmacy",name:"Farmacias Ahumada"},removeTags:{amenity:"pharmacy",brand:"Farmacias Ahumada","brand:wikidata":"Q5856069","brand:wikipedia":"es:Farmacias Ahumada",healthcare:"pharmacy",name:"Farmacias Ahumada"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Farmacias Cruz Verde":{name:"Farmacias Cruz Verde",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5856071"},addTags:{amenity:"pharmacy",brand:"Farmacias Cruz Verde","brand:wikidata":"Q5856071","brand:wikipedia":"es:Farmacias Cruz Verde",healthcare:"pharmacy",name:"Farmacias Cruz Verde"},removeTags:{amenity:"pharmacy",brand:"Farmacias Cruz Verde","brand:wikidata":"Q5856071","brand:wikipedia":"es:Farmacias Cruz Verde",healthcare:"pharmacy",name:"Farmacias Cruz Verde"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Farmacias SalcoBrand":{name:"Farmacias SalcoBrand",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q2877054"},addTags:{amenity:"pharmacy",brand:"Farmacias SalcoBrand","brand:wikidata":"Q2877054","brand:wikipedia":"es:Farmacias Salcobrand",healthcare:"pharmacy",name:"Farmacias SalcoBrand"},removeTags:{amenity:"pharmacy",brand:"Farmacias SalcoBrand","brand:wikidata":"Q2877054","brand:wikipedia":"es:Farmacias Salcobrand",healthcare:"pharmacy",name:"Farmacias SalcoBrand"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Farmacity":{name:"Farmacity",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5856076"},addTags:{amenity:"pharmacy",brand:"Farmacity","brand:wikidata":"Q5856076","brand:wikipedia":"es:Farmacity",healthcare:"pharmacy",name:"Farmacity"},removeTags:{amenity:"pharmacy",brand:"Farmacity","brand:wikidata":"Q5856076","brand:wikipedia":"es:Farmacity",healthcare:"pharmacy",name:"Farmacity"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Farmahorro":{name:"Farmahorro",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q20015002"},addTags:{amenity:"pharmacy",brand:"Farmahorro","brand:wikidata":"Q20015002","brand:wikipedia":"es:Farmahorro",healthcare:"pharmacy",name:"Farmahorro"},removeTags:{amenity:"pharmacy",brand:"Farmahorro","brand:wikidata":"Q20015002","brand:wikipedia":"es:Farmahorro",healthcare:"pharmacy",name:"Farmahorro"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Farmatodo":{name:"Farmatodo",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5856092"},addTags:{amenity:"pharmacy",brand:"Farmatodo","brand:wikidata":"Q5856092","brand:wikipedia":"es:Farmatodo",healthcare:"pharmacy",name:"Farmatodo"},removeTags:{amenity:"pharmacy",brand:"Farmatodo","brand:wikidata":"Q5856092","brand:wikipedia":"es:Farmatodo",healthcare:"pharmacy",name:"Farmatodo"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Gintarinė vaistinė":{name:"Gintarinė vaistinė",icon:"maki-pharmacy",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/Guardian":{name:"Guardian",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q13646560"},addTags:{amenity:"pharmacy",brand:"Guardian","brand:wikidata":"Q13646560","brand:wikipedia":"en:Mannings",healthcare:"pharmacy",name:"Guardian"},removeTags:{amenity:"pharmacy",brand:"Guardian","brand:wikidata":"Q13646560","brand:wikipedia":"en:Mannings",healthcare:"pharmacy",name:"Guardian"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/H-E-B Pharmacy":{name:"H-E-B Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q830621"},addTags:{amenity:"pharmacy",brand:"H-E-B Pharmacy","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",healthcare:"pharmacy",name:"H-E-B Pharmacy"},removeTags:{amenity:"pharmacy",brand:"H-E-B Pharmacy","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",healthcare:"pharmacy",name:"H-E-B Pharmacy"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Hy-Vee Pharmacy":{name:"Hy-Vee Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q1639719"},addTags:{amenity:"pharmacy",brand:"Hy-Vee Pharmacy","brand:wikidata":"Q1639719","brand:wikipedia":"en:Hy-Vee",healthcare:"pharmacy",name:"Hy-Vee Pharmacy"},removeTags:{amenity:"pharmacy",brand:"Hy-Vee Pharmacy","brand:wikidata":"Q1639719","brand:wikipedia":"en:Hy-Vee",healthcare:"pharmacy",name:"Hy-Vee Pharmacy"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Inkafarma":{name:"Inkafarma",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q10997748"},addTags:{amenity:"pharmacy",brand:"Inkafarma","brand:wikidata":"Q10997748","brand:wikipedia":"es:Inkafarma",healthcare:"pharmacy",name:"Inkafarma"},removeTags:{amenity:"pharmacy",brand:"Inkafarma","brand:wikidata":"Q10997748","brand:wikipedia":"es:Inkafarma",healthcare:"pharmacy",name:"Inkafarma"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Jean Coutu":{name:"Jean Coutu",icon:"maki-pharmacy",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",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",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",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",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",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/Mēness aptieka":{name:"Mēness aptieka",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q57583051"},addTags:{amenity:"pharmacy",brand:"Mēness aptieka","brand:wikidata":"Q57583051",healthcare:"pharmacy",name:"Mēness aptieka"},removeTags:{amenity:"pharmacy",brand:"Mēness aptieka","brand:wikidata":"Q57583051",healthcare:"pharmacy",name:"Mēness aptieka"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Pague Menos":{name:"Pague Menos",icon:"maki-pharmacy",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/Pharmacie Principale":{name:"Pharmacie Principale",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q1547749"},addTags:{amenity:"pharmacy",brand:"Pharmacie Principale","brand:wikidata":"Q1547749","brand:wikipedia":"fr:PP Holding Group",healthcare:"pharmacy",name:"Pharmacie Principale"},removeTags:{amenity:"pharmacy",brand:"Pharmacie Principale","brand:wikidata":"Q1547749","brand:wikipedia":"fr:PP Holding Group",healthcare:"pharmacy",name:"Pharmacie Principale"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Pharmaprix":{name:"Pharmaprix",icon:"maki-pharmacy",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",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",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/Rite Aid":{name:"Rite Aid",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q3433273"},addTags:{amenity:"pharmacy",brand:"Rite Aid","brand:wikidata":"Q3433273","brand:wikipedia":"en:Rite Aid",healthcare:"pharmacy",name:"Rite Aid"},removeTags:{amenity:"pharmacy",brand:"Rite Aid","brand:wikidata":"Q3433273","brand:wikipedia":"en:Rite Aid",healthcare:"pharmacy",name:"Rite Aid"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/SalcoBrand":{name:"SalcoBrand",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q2877054"},addTags:{amenity:"pharmacy",brand:"SalcoBrand","brand:wikidata":"Q2877054","brand:wikipedia":"es:Farmacias Salcobrand",healthcare:"pharmacy",name:"SalcoBrand"},removeTags:{amenity:"pharmacy",brand:"SalcoBrand","brand:wikidata":"Q2877054","brand:wikipedia":"es:Farmacias Salcobrand",healthcare:"pharmacy",name:"SalcoBrand"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Sensiblu":{name:"Sensiblu",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q12740640"},addTags:{amenity:"pharmacy",brand:"Sensiblu","brand:wikidata":"Q12740640","brand:wikipedia":"ro:Sensiblu",healthcare:"pharmacy",name:"Sensiblu"},removeTags:{amenity:"pharmacy",brand:"Sensiblu","brand:wikidata":"Q12740640","brand:wikipedia":"ro:Sensiblu",healthcare:"pharmacy",name:"Sensiblu"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Shoppers Drug Mart":{name:"Shoppers Drug Mart",icon:"maki-pharmacy",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",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/Superdrug":{name:"Superdrug",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q7643261"},addTags:{amenity:"pharmacy",brand:"Superdrug","brand:wikidata":"Q7643261","brand:wikipedia":"en:Superdrug",healthcare:"pharmacy",name:"Superdrug"},removeTags:{amenity:"pharmacy",brand:"Superdrug","brand:wikidata":"Q7643261","brand:wikipedia":"en:Superdrug",healthcare:"pharmacy",name:"Superdrug"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Uniprix":{name:"Uniprix",icon:"maki-pharmacy",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",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",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/Watsons":{name:"Watsons",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q7974785"},addTags:{amenity:"pharmacy",brand:"Watsons","brand:wikidata":"Q7974785","brand:wikipedia":"en:Watsons",healthcare:"pharmacy",name:"Watsons"},removeTags:{amenity:"pharmacy",brand:"Watsons","brand:wikidata":"Q7974785","brand:wikipedia":"en:Watsons",healthcare:"pharmacy",name:"Watsons"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Well Pharmacy":{name:"Well Pharmacy",icon:"maki-pharmacy",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/pharmacy/くすりの福太郎":{name:"くすりの福太郎",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q17214460"},addTags:{amenity:"pharmacy",brand:"くすりの福太郎","brand:wikidata":"Q17214460","brand:wikipedia":"ja:くすりの福太郎",healthcare:"pharmacy",name:"くすりの福太郎"},removeTags:{amenity:"pharmacy",brand:"くすりの福太郎","brand:wikidata":"Q17214460","brand:wikipedia":"ja:くすりの福太郎",healthcare:"pharmacy",name:"くすりの福太郎"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/ウエルシア":{name:"ウエルシア",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11288684"},addTags:{amenity:"pharmacy",brand:"ウエルシア","brand:wikidata":"Q11288684","brand:wikipedia":"ja:ウエルシアホールディングス",healthcare:"pharmacy",name:"ウエルシア"},removeTags:{amenity:"pharmacy",brand:"ウエルシア","brand:wikidata":"Q11288684","brand:wikipedia":"ja:ウエルシアホールディングス",healthcare:"pharmacy",name:"ウエルシア"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/ウエルシア薬局":{name:"ウエルシア薬局",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11288687"},addTags:{amenity:"pharmacy",brand:"ウエルシア薬局","brand:wikidata":"Q11288687","brand:wikipedia":"ja:ウエルシア薬局",healthcare:"pharmacy",name:"ウエルシア薬局"},removeTags:{amenity:"pharmacy",brand:"ウエルシア薬局","brand:wikidata":"Q11288687","brand:wikipedia":"ja:ウエルシア薬局",healthcare:"pharmacy",name:"ウエルシア薬局"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/カワチ薬品":{name:"カワチ薬品",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11295397"},addTags:{amenity:"pharmacy",brand:"カワチ薬品","brand:wikidata":"Q11295397","brand:wikipedia":"ja:カワチ薬品",healthcare:"pharmacy",name:"カワチ薬品"},removeTags:{amenity:"pharmacy",brand:"カワチ薬品","brand:wikidata":"Q11295397","brand:wikipedia":"ja:カワチ薬品",healthcare:"pharmacy",name:"カワチ薬品"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/キリン堂":{name:"キリン堂",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11297751"},addTags:{amenity:"pharmacy",brand:"キリン堂","brand:wikidata":"Q11297751","brand:wikipedia":"ja:キリン堂",healthcare:"pharmacy",name:"キリン堂"},removeTags:{amenity:"pharmacy",brand:"キリン堂","brand:wikidata":"Q11297751","brand:wikipedia":"ja:キリン堂",healthcare:"pharmacy",name:"キリン堂"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/ココカラファイン":{name:"ココカラファイン",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11301948"},addTags:{amenity:"pharmacy",brand:"ココカラファイン","brand:wikidata":"Q11301948","brand:wikipedia":"ja:ココカラファイン",healthcare:"pharmacy",name:"ココカラファイン"},removeTags:{amenity:"pharmacy",brand:"ココカラファイン","brand:wikidata":"Q11301948","brand:wikipedia":"ja:ココカラファイン",healthcare:"pharmacy",name:"ココカラファイン"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/サンドラッグ":{name:"サンドラッグ",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11305867"},addTags:{amenity:"pharmacy",brand:"サンドラッグ","brand:wikidata":"Q11305867","brand:wikipedia":"ja:サンドラッグ",healthcare:"pharmacy",name:"サンドラッグ"},removeTags:{amenity:"pharmacy",brand:"サンドラッグ","brand:wikidata":"Q11305867","brand:wikipedia":"ja:サンドラッグ",healthcare:"pharmacy",name:"サンドラッグ"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/セイジョー":{name:"セイジョー",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11314133"},addTags:{amenity:"pharmacy",brand:"セイジョー","brand:wikidata":"Q11314133","brand:wikipedia":"ja:セイジョー",healthcare:"pharmacy",name:"セイジョー"},removeTags:{amenity:"pharmacy",brand:"セイジョー","brand:wikidata":"Q11314133","brand:wikipedia":"ja:セイジョー",healthcare:"pharmacy",name:"セイジョー"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/マツモトキヨシ":{name:"マツモトキヨシ",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q8014776"},addTags:{amenity:"pharmacy",brand:"マツモトキヨシ","brand:wikidata":"Q8014776","brand:wikipedia":"ja:マツモトキヨシ",healthcare:"pharmacy",name:"マツモトキヨシ"},removeTags:{amenity:"pharmacy",brand:"マツモトキヨシ","brand:wikidata":"Q8014776","brand:wikipedia":"ja:マツモトキヨシ",healthcare:"pharmacy",name:"マツモトキヨシ"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/post_box/Deutsche Post":{name:"Deutsche Post",icon:"temaki-post_box",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:"temaki-post_box",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q2662336"},addTags:{amenity:"post_office",brand:"Белпочта","brand:wikidata":"Q2662336","brand:wikipedia":"en:Belposhta",name:"Белпочта"},removeTags:{amenity:"post_office",brand:"Белпочта","brand:wikidata":"Q2662336","brand:wikipedia":"en:Belposhta",name:"Белпочта"},matchScore:2,suggestion:true},"amenity/post_office/Казпочта":{name:"Казпочта",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q746263"},addTags:{amenity:"post_office",brand:"Казпочта","brand:wikidata":"Q746263","brand:wikipedia":"ru:Казпочта",name:"Казпочта"},removeTags:{amenity:"post_office",brand:"Казпочта","brand:wikidata":"Q746263","brand:wikipedia":"ru:Казпочта",name:"Казпочта"},matchScore:2,suggestion:true},"amenity/post_office/Нова Пошта №1":{name:"Нова Пошта №1",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q12133863"},addTags:{amenity:"post_office",brand:"Нова Пошта №1","brand:wikidata":"Q12133863","brand:wikipedia":"uk:Нова пошта",name:"Нова Пошта №1"},removeTags:{amenity:"post_office",brand:"Нова Пошта №1","brand:wikidata":"Q12133863","brand:wikipedia":"uk:Нова пошта",name:"Нова Пошта №1"},matchScore:2,suggestion:true},"amenity/post_office/Почта России":{name:"Почта России",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q1502763"},addTags:{amenity:"post_office",brand:"Почта России","brand:wikidata":"Q1502763","brand:wikipedia":"ru:Почта России",name:"Почта России"},removeTags:{amenity:"post_office",brand:"Почта России","brand:wikidata":"Q1502763","brand:wikipedia":"ru:Почта России",name:"Почта России"},matchScore:2,suggestion:true},"amenity/post_office/Укрпошта":{name:"Укрпошта",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q2470783"},addTags:{amenity:"post_office",brand:"Укрпошта","brand:wikidata":"Q2470783","brand:wikipedia":"en:Ukrposhta",name:"Укрпошта"},removeTags:{amenity:"post_office",brand:"Укрпошта","brand:wikidata":"Q2470783","brand:wikipedia":"en:Ukrposhta",name:"Укрпошта"},matchScore:2,suggestion:true},"amenity/post_office/中国邮政":{name:"中国邮政",icon:"maki-post",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",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",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/italian/ASK Italian":{name:"ASK Italian",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"italian","brand:wikidata":"Q4807056"},addTags:{amenity:"restaurant",brand:"ASK Italian","brand:wikipedia":"en:ASK Italian","brand:wikidata":"Q4807056",cuisine:"italian",name:"ASK Italian"},removeTags:{amenity:"restaurant",brand:"ASK Italian","brand:wikipedia":"en:ASK Italian","brand:wikidata":"Q4807056",cuisine:"italian",name:"ASK Italian"},reference:{key:"cuisine",value:"italian"},matchScore:2,suggestion:true},"amenity/restaurant/american/Applebee’s Neighborhood Grill & Bar":{name:"Applebee’s Neighborhood Grill & Bar",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","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"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Autogrill":{name:"Autogrill",icon:"maki-restaurant",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",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",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/american/Black Bear Diner":{name:"Black Bear Diner",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q4920343"},addTags:{amenity:"restaurant",brand:"Black Bear Diner","brand:wikidata":"Q4920343","brand:wikipedia":"en:Black Bear Diner",cuisine:"american",name:"Black Bear Diner"},removeTags:{amenity:"restaurant",brand:"Black Bear Diner","brand:wikidata":"Q4920343","brand:wikipedia":"en:Black Bear Diner",cuisine:"american",name:"Black Bear Diner"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Bob Evans":{name:"Bob Evans",icon:"maki-restaurant",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/seafood/Bonefish Grill":{name:"Bonefish Grill",icon:"maki-restaurant-seafood",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"seafood","brand:wikidata":"Q4941599"},addTags:{amenity:"restaurant",brand:"Bonefish Grill","brand:wikidata":"Q4941599","brand:wikipedia":"en:Bonefish Grill",cuisine:"seafood",name:"Bonefish Grill"},removeTags:{amenity:"restaurant",brand:"Bonefish Grill","brand:wikidata":"Q4941599","brand:wikipedia":"en:Bonefish Grill",cuisine:"seafood",name:"Bonefish Grill"},reference:{key:"cuisine",value:"seafood"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Boston Pizza":{name:"Boston Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","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"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/Buffalo Grill":{name:"Buffalo Grill",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q944655"},addTags:{amenity:"restaurant",brand:"Buffalo Grill","brand:wikidata":"Q944655","brand:wikipedia":"en:Buffalo Grill",cuisine:"steak_house",name:"Buffalo Grill"},removeTags:{amenity:"restaurant",brand:"Buffalo Grill","brand:wikidata":"Q944655","brand:wikipedia":"en:Buffalo Grill",cuisine:"steak_house",name:"Buffalo Grill"},matchScore:2,suggestion:true},"amenity/restaurant/Buffalo Wild Wings":{name:"Buffalo Wild Wings",icon:"maki-restaurant",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",cuisine:"wings",name:"Buffalo Wild Wings"},removeTags:{amenity:"restaurant",brand:"Buffalo Wild Wings","brand:wikidata":"Q509255","brand:wikipedia":"en:Buffalo Wild Wings",cuisine:"wings",name:"Buffalo Wild Wings"},matchScore:2,suggestion:true},"amenity/restaurant/mexican/Cafe Rio":{name:"Cafe Rio",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"mexican","brand:wikidata":"Q5017108"},addTags:{amenity:"restaurant",brand:"Cafe Rio","brand:wikidata":"Q5017108","brand:wikipedia":"en:Cafe Rio",cuisine:"mexican",name:"Cafe Rio"},removeTags:{amenity:"restaurant",brand:"Cafe Rio","brand:wikidata":"Q5017108","brand:wikipedia":"en:Cafe Rio",cuisine:"mexican",name:"Cafe Rio"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/California Pizza Kitchen":{name:"California Pizza Kitchen",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","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"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/italian/Carluccio's":{name:"Carluccio's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"italian","brand:wikidata":"Q25111797"},addTags:{amenity:"restaurant",brand:"Carluccio's","brand:wikidata":"Q25111797","brand:wikipedia":"en:Carluccio's Ltd",cuisine:"italian",name:"Carluccio's"},removeTags:{amenity:"restaurant",brand:"Carluccio's","brand:wikidata":"Q25111797","brand:wikipedia":"en:Carluccio's Ltd",cuisine:"italian",name:"Carluccio's"},reference:{key:"cuisine",value:"italian"},matchScore:2,suggestion:true},"amenity/restaurant/italian/Carrabba's Italian Grill":{name:"Carrabba's Italian Grill",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"italian","brand:wikidata":"Q5045999"},addTags:{amenity:"restaurant",brand:"Carrabba's Italian Grill","brand:wikidata":"Q5045999","brand:wikipedia":"en:Carrabba's Italian Grill",cuisine:"italian",name:"Carrabba's Italian Grill"},removeTags:{amenity:"restaurant",brand:"Carrabba's Italian Grill","brand:wikidata":"Q5045999","brand:wikipedia":"en:Carrabba's Italian Grill",cuisine:"italian",name:"Carrabba's Italian Grill"},reference:{key:"cuisine",value:"italian"},matchScore:2,suggestion:true},"amenity/restaurant/american/Cheesecake Factory":{name:"Cheesecake Factory",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q1045842"},addTags:{amenity:"restaurant",brand:"Cheesecake Factory","brand:wikidata":"Q1045842","brand:wikipedia":"en:The Cheesecake Factory",cuisine:"american",name:"Cheesecake Factory"},removeTags:{amenity:"restaurant",brand:"Cheesecake Factory","brand:wikidata":"Q1045842","brand:wikipedia":"en:The Cheesecake Factory",cuisine:"american",name:"Cheesecake Factory"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Chili's":{name:"Chili's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1072948"},addTags:{amenity:"restaurant",brand:"Chili's","brand:wikidata":"Q1072948","brand:wikipedia":"en:Chili's",cuisine:"tex-mex",name:"Chili's"},removeTags:{amenity:"restaurant",brand:"Chili's","brand:wikidata":"Q1072948","brand:wikipedia":"en:Chili's",cuisine:"tex-mex",name:"Chili's"},matchScore:2,suggestion:true},"amenity/restaurant/Chiquito":{name:"Chiquito",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5101775"},addTags:{amenity:"restaurant",brand:"Chiquito","brand:wikidata":"Q5101775","brand:wikipedia":"en:Chiquito (restaurant)",cuisine:"tex-mex",name:"Chiquito"},removeTags:{amenity:"restaurant",brand:"Chiquito","brand:wikidata":"Q5101775","brand:wikipedia":"en:Chiquito (restaurant)",cuisine:"tex-mex",name:"Chiquito"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Chuck E. Cheese's":{name:"Chuck E. Cheese's",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","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"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Cici's Pizza":{name:"Cici's Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","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"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/french/Courtepaille":{name:"Courtepaille",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"french","brand:wikidata":"Q3116688"},addTags:{amenity:"restaurant",brand:"Courtepaille","brand:wikidata":"Q3116688","brand:wikipedia":"fr:Grill Courtepaille",cuisine:"french",name:"Courtepaille"},removeTags:{amenity:"restaurant",brand:"Courtepaille","brand:wikidata":"Q3116688","brand:wikipedia":"fr:Grill Courtepaille",cuisine:"french",name:"Courtepaille"},reference:{key:"cuisine",value:"french"},matchScore:2,suggestion:true},"amenity/restaurant/american/Cracker Barrel":{name:"Cracker Barrel",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q4492609"},addTags:{amenity:"restaurant",brand:"Cracker Barrel","brand:wikidata":"Q4492609","brand:wikipedia":"en:Cracker Barrel",cuisine:"american",name:"Cracker Barrel"},removeTags:{amenity:"restaurant",brand:"Cracker Barrel","brand:wikidata":"Q4492609","brand:wikipedia":"en:Cracker Barrel",cuisine:"american",name:"Cracker Barrel"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/american/Denny's":{name:"Denny's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q1189695"},addTags:{amenity:"restaurant",brand:"Denny's","brand:wikidata":"Q1189695","brand:wikipedia":"en:Denny's",cuisine:"american",name:"Denny's"},removeTags:{amenity:"restaurant",brand:"Denny's","brand:wikidata":"Q1189695","brand:wikipedia":"en:Denny's",cuisine:"american",name:"Denny's"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Dickey's Barbecue Pit":{name:"Dickey's Barbecue Pit",icon:"maki-restaurant",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",cuisine:"barbecue",name:"Dickey's Barbecue Pit"},removeTags:{amenity:"restaurant",brand:"Dickey's Barbecue Pit","brand:wikidata":"Q19880747","brand:wikipedia":"en:Dickey's Barbecue Pit",cuisine:"barbecue",name:"Dickey's Barbecue Pit"},matchScore:2,suggestion:true},"amenity/restaurant/italian/East Side Mario's":{name:"East Side Mario's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"italian","brand:wikidata":"Q5329375"},addTags:{amenity:"restaurant",brand:"East Side Mario's","brand:wikidata":"Q5329375","brand:wikipedia":"en:East Side Mario's",cuisine:"italian",name:"East Side Mario's"},removeTags:{amenity:"restaurant",brand:"East Side Mario's","brand:wikidata":"Q5329375","brand:wikipedia":"en:East Side Mario's",cuisine:"italian",name:"East Side Mario's"},reference:{key:"cuisine",value:"italian"},matchScore:2,suggestion:true},"amenity/restaurant/Famous Dave's":{name:"Famous Dave's",icon:"maki-restaurant",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",cuisine:"barbecue",name:"Famous Dave's"},removeTags:{amenity:"restaurant",brand:"Famous Dave's","brand:wikidata":"Q5433448","brand:wikipedia":"en:Famous Dave's",cuisine:"barbecue",name:"Famous Dave's"},matchScore:2,suggestion:true},"amenity/restaurant/french/Flunch":{name:"Flunch",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"french","brand:wikidata":"Q629326"},addTags:{amenity:"restaurant",brand:"Flunch","brand:wikidata":"Q629326","brand:wikipedia":"en:Flunch",cuisine:"french",name:"Flunch"},removeTags:{amenity:"restaurant",brand:"Flunch","brand:wikidata":"Q629326","brand:wikipedia":"en:Flunch",cuisine:"french",name:"Flunch"},reference:{key:"cuisine",value:"french"},matchScore:2,suggestion:true},"amenity/restaurant/american/Foster's Hollywood":{name:"Foster's Hollywood",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q5864366"},addTags:{amenity:"restaurant",brand:"Foster's Hollywood","brand:wikidata":"Q5864366","brand:wikipedia":"en:Foster's Hollywood",cuisine:"american",name:"Foster's Hollywood"},removeTags:{amenity:"restaurant",brand:"Foster's Hollywood","brand:wikidata":"Q5864366","brand:wikipedia":"en:Foster's Hollywood",cuisine:"american",name:"Foster's Hollywood"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/italian/Frankie & Benny's":{name:"Frankie & Benny's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"italian","brand:wikidata":"Q5490892"},addTags:{amenity:"restaurant",brand:"Frankie & Benny's","brand:wikidata":"Q5490892","brand:wikipedia":"en:Frankie & Benny's",cuisine:"italian",name:"Frankie & Benny's"},removeTags:{amenity:"restaurant",brand:"Frankie & Benny's","brand:wikidata":"Q5490892","brand:wikipedia":"en:Frankie & Benny's",cuisine:"italian",name:"Frankie & Benny's"},reference:{key:"cuisine",value:"italian"},matchScore:2,suggestion:true},"amenity/restaurant/american/Friendly's":{name:"Friendly's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q1464513"},addTags:{amenity:"restaurant",brand:"Friendly's","brand:wikidata":"Q1464513","brand:wikipedia":"en:Friendly's",cuisine:"american",name:"Friendly's"},removeTags:{amenity:"restaurant",brand:"Friendly's","brand:wikidata":"Q1464513","brand:wikipedia":"en:Friendly's",cuisine:"american",name:"Friendly's"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Fuddruckers":{name:"Fuddruckers",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5507056"},addTags:{amenity:"restaurant",brand:"Fuddruckers","brand:wikidata":"Q5507056","brand:wikipedia":"en:Fuddruckers",cuisine:"burger",name:"Fuddruckers"},removeTags:{amenity:"restaurant",brand:"Fuddruckers","brand:wikidata":"Q5507056","brand:wikipedia":"en:Fuddruckers",cuisine:"burger",name:"Fuddruckers"},matchScore:2,suggestion:true},"amenity/restaurant/american/Golden Corral":{name:"Golden Corral",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q4039560"},addTags:{amenity:"restaurant",brand:"Golden Corral","brand:wikidata":"Q4039560","brand:wikipedia":"en:Golden Corral",cuisine:"american",name:"Golden Corral"},removeTags:{amenity:"restaurant",brand:"Golden Corral","brand:wikidata":"Q4039560","brand:wikipedia":"en:Golden Corral",cuisine:"american",name:"Golden Corral"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Gourmet Burger Kitchen":{name:"Gourmet Burger Kitchen",icon:"maki-restaurant",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",cuisine:"burger",name:"Gourmet Burger Kitchen"},removeTags:{amenity:"restaurant",brand:"Gourmet Burger Kitchen","brand:wikidata":"Q5588445","brand:wikipedia":"en:Gourmet Burger Kitchen",cuisine:"burger",name:"Gourmet Burger Kitchen"},matchScore:2,suggestion:true},"amenity/restaurant/Hard Rock Cafe":{name:"Hard Rock Cafe",icon:"maki-restaurant",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/american/Harvester":{name:"Harvester",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q5676915"},addTags:{amenity:"restaurant",brand:"Harvester","brand:wikidata":"Q5676915","brand:wikipedia":"en:Harvester (restaurant)",cuisine:"american",name:"Harvester"},removeTags:{amenity:"restaurant",brand:"Harvester","brand:wikidata":"Q5676915","brand:wikipedia":"en:Harvester (restaurant)",cuisine:"american",name:"Harvester"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Hippopotamus":{name:"Hippopotamus",icon:"maki-restaurant",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",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1025921"},addTags:{amenity:"restaurant",brand:"Hooters","brand:wikidata":"Q1025921","brand:wikipedia":"en:Hooters",cuisine:"burger",name:"Hooters"},removeTags:{amenity:"restaurant",brand:"Hooters","brand:wikidata":"Q1025921","brand:wikipedia":"en:Hooters",cuisine:"burger",name:"Hooters"},matchScore:2,suggestion:true},"amenity/restaurant/american/Huddle House":{name:"Huddle House",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q5928324"},addTags:{amenity:"restaurant",brand:"Huddle House","brand:wikidata":"Q5928324","brand:wikipedia":"en:Huddle House",cuisine:"american",name:"Huddle House"},removeTags:{amenity:"restaurant",brand:"Huddle House","brand:wikidata":"Q5928324","brand:wikipedia":"en:Huddle House",cuisine:"american",name:"Huddle House"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/IHOP":{name:"IHOP",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1185675"},addTags:{amenity:"restaurant",brand:"IHOP","brand:wikidata":"Q1185675","brand:wikipedia":"en:IHOP",cuisine:"pancake",name:"IHOP"},removeTags:{amenity:"restaurant",brand:"IHOP","brand:wikidata":"Q1185675","brand:wikipedia":"en:IHOP",cuisine:"pancake",name:"IHOP"},matchScore:2,suggestion:true},"amenity/restaurant/american/IL Патио":{name:"IL Патио",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q4397763"},addTags:{amenity:"restaurant",brand:"IL Патио","brand:wikidata":"Q4397763","brand:wikipedia":"en:Росинтер",cuisine:"american",name:"IL Патио"},removeTags:{amenity:"restaurant",brand:"IL Патио","brand:wikidata":"Q4397763","brand:wikipedia":"en:Росинтер",cuisine:"american",name:"IL Патио"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Jason's Deli":{name:"Jason's Deli",icon:"maki-restaurant",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/pizza/Jet's Pizza":{name:"Jet's Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","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"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/seafood/Joe's Crab Shack":{name:"Joe's Crab Shack",icon:"maki-restaurant-seafood",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"seafood","brand:wikidata":"Q6208210"},addTags:{amenity:"restaurant",brand:"Joe's Crab Shack","brand:wikidata":"Q6208210","brand:wikipedia":"en:Joe's Crab Shack",cuisine:"seafood",name:"Joe's Crab Shack"},removeTags:{amenity:"restaurant",brand:"Joe's Crab Shack","brand:wikidata":"Q6208210","brand:wikipedia":"en:Joe's Crab Shack",cuisine:"seafood",name:"Joe's Crab Shack"},reference:{key:"cuisine",value:"seafood"},matchScore:2,suggestion:true},"amenity/restaurant/Kelsey's":{name:"Kelsey's",icon:"maki-restaurant",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/Kudu":{name:"Kudu",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q6441777"},addTags:{amenity:"restaurant",brand:"Kudu","brand:wikidata":"Q6441777","brand:wikipedia":"en:Kudu (restaurant)",cuisine:"sandwich",name:"Kudu"},removeTags:{amenity:"restaurant",brand:"Kudu","brand:wikidata":"Q6441777","brand:wikipedia":"en:Kudu (restaurant)",cuisine:"sandwich",name:"Kudu"},matchScore:2,suggestion:true},"amenity/restaurant/Logan's Roadhouse":{name:"Logan's Roadhouse",icon:"maki-restaurant",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",cuisine:"america",name:"Logan's Roadhouse"},removeTags:{amenity:"restaurant",brand:"Logan's Roadhouse","brand:wikidata":"Q6666872","brand:wikipedia":"en:Logan's Roadhouse",cuisine:"america",name:"Logan's Roadhouse"},matchScore:2,suggestion:true},"amenity/restaurant/LongHorn Steakhouse":{name:"LongHorn Steakhouse",icon:"maki-restaurant",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",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",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",cuisine:"friture",name:"Léon de Bruxelles"},removeTags:{amenity:"restaurant",brand:"Léon de Bruxelles","brand:wikidata":"Q21041507","brand:wikipedia":"en:Léon de Bruxelles",cuisine:"friture",name:"Léon de Bruxelles"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/MOD Pizza":{name:"MOD Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","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"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Marco's Pizza":{name:"Marco's Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","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"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/asian/Max's Restaurant":{name:"Max's Restaurant",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"asian","brand:wikidata":"Q6794477"},addTags:{amenity:"restaurant",brand:"Max's Restaurant","brand:wikidata":"Q6794477","brand:wikipedia":"en:Max's of Manila",cuisine:"asian",name:"Max's Restaurant"},removeTags:{amenity:"restaurant",brand:"Max's Restaurant","brand:wikidata":"Q6794477","brand:wikipedia":"en:Max's of Manila",cuisine:"asian",name:"Max's Restaurant"},reference:{key:"cuisine",value:"asian"},matchScore:2,suggestion:true},"amenity/restaurant/McAlister's Deli":{name:"McAlister's Deli",icon:"maki-restaurant",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/pizza/Mellow Mushroom":{name:"Mellow Mushroom",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q17021360"},addTags:{amenity:"restaurant",brand:"Mellow Mushroom","brand:wikidata":"Q17021360","brand:wikipedia":"en:Mellow Mushroom",cuisine:"pizza",name:"Mellow Mushroom"},removeTags:{amenity:"restaurant",brand:"Mellow Mushroom","brand:wikidata":"Q17021360","brand:wikipedia":"en:Mellow Mushroom",cuisine:"pizza",name:"Mellow Mushroom"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/french/Mimi's Cafe":{name:"Mimi's Cafe",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"french","brand:wikidata":"Q17022081"},addTags:{amenity:"restaurant",brand:"Mimi's Cafe",cuisine:"french","brand:wikidata":"Q17022081","brand:wikipedia":"en:Mimi's Cafe",name:"Mimi's Cafe"},removeTags:{amenity:"restaurant",brand:"Mimi's Cafe",cuisine:"french","brand:wikidata":"Q17022081","brand:wikipedia":"en:Mimi's Cafe",name:"Mimi's Cafe"},reference:{key:"cuisine",value:"french"},matchScore:2,suggestion:true},"amenity/restaurant/Nando's":{name:"Nando's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q3472954"},addTags:{amenity:"restaurant",brand:"Nando's","brand:wikidata":"Q3472954","brand:wikipedia":"en:Nando's",cuisine:"portuguese",name:"Nando's"},removeTags:{amenity:"restaurant",brand:"Nando's","brand:wikidata":"Q3472954","brand:wikipedia":"en:Nando's",cuisine:"portuguese",name:"Nando's"},matchScore:2,suggestion:true},"amenity/restaurant/Noodles & Company":{name:"Noodles & Company",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7049673"},addTags:{amenity:"restaurant",brand:"Noodles & Company","brand:wikidata":"Q7049673","brand:wikipedia":"en:Noodles & Company",cuisine:"pasta",name:"Noodles & Company"},removeTags:{amenity:"restaurant",brand:"Noodles & Company","brand:wikidata":"Q7049673","brand:wikipedia":"en:Noodles & Company",cuisine:"pasta",name:"Noodles & Company"},matchScore:2,suggestion:true},"amenity/restaurant/O'Charley's":{name:"O'Charley's",icon:"maki-restaurant",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/pizza/Old Chicago":{name:"Old Chicago",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q5180522"},addTags:{amenity:"restaurant",brand:"Old Chicago","brand:wikidata":"Q5180522","brand:wikipedia":"en:CraftWorks Restaurants & Breweries",cuisine:"pizza",name:"Old Chicago"},removeTags:{amenity:"restaurant",brand:"Old Chicago","brand:wikidata":"Q5180522","brand:wikipedia":"en:CraftWorks Restaurants & Breweries",cuisine:"pizza",name:"Old Chicago"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/american/Old Wild West":{name:"Old Wild West",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q25402475"},addTags:{amenity:"restaurant",brand:"Old Wild West","brand:wikidata":"Q25402475","brand:wikipedia":"it:Old Wild West",cuisine:"american",name:"Old Wild West"},removeTags:{amenity:"restaurant",brand:"Old Wild West","brand:wikidata":"Q25402475","brand:wikipedia":"it:Old Wild West",cuisine:"american",name:"Old Wild West"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/italian/Olive Garden":{name:"Olive Garden",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"italian","brand:wikidata":"Q3045312"},addTags:{amenity:"restaurant",brand:"Olive Garden","brand:wikidata":"Q3045312","brand:wikipedia":"en:Olive Garden",cuisine:"italian",name:"Olive Garden"},removeTags:{amenity:"restaurant",brand:"Olive Garden","brand:wikidata":"Q3045312","brand:wikipedia":"en:Olive Garden",cuisine:"italian",name:"Olive Garden"},reference:{key:"cuisine",value:"italian"},matchScore:2,suggestion:true},"amenity/restaurant/american/Outback Steakhouse":{name:"Outback Steakhouse",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q1064893"},addTags:{amenity:"restaurant",brand:"Outback Steakhouse","brand:wikidata":"Q1064893","brand:wikipedia":"en:Outback Steakhouse",cuisine:"american",name:"Outback Steakhouse"},removeTags:{amenity:"restaurant",brand:"Outback Steakhouse","brand:wikidata":"Q1064893","brand:wikipedia":"en:Outback Steakhouse",cuisine:"american",name:"Outback Steakhouse"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/asian/P.F. Chang's":{name:"P.F. Chang's",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"asian","brand:wikidata":"Q5360181"},addTags:{amenity:"restaurant",brand:"P.F. Chang's","brand:wikidata":"Q5360181","brand:wikipedia":"en:P. F. Chang's China Bistro",cuisine:"asian",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",cuisine:"asian",name:"P.F. Chang's"},reference:{key:"cuisine",value:"asian"},matchScore:2,suggestion:true},"amenity/restaurant/asian/Pei Wei":{name:"Pei Wei",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"asian","brand:wikidata":"Q7160898"},addTags:{amenity:"restaurant",brand:"Pei Wei","brand:wikidata":"Q7160898","brand:wikipedia":"en:Pei Wei Asian Diner",cuisine:"asian",name:"Pei Wei"},removeTags:{amenity:"restaurant",brand:"Pei Wei","brand:wikidata":"Q7160898","brand:wikipedia":"en:Pei Wei Asian Diner",cuisine:"asian",name:"Pei Wei"},reference:{key:"cuisine",value:"asian"},matchScore:2,suggestion:true},"amenity/restaurant/american/Perkins":{name:"Perkins",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q7169056"},addTags:{amenity:"restaurant",brand:"Perkins","brand:wikidata":"Q7169056","brand:wikipedia":"en:Perkins Restaurant and Bakery",cuisine:"american",name:"Perkins"},removeTags:{amenity:"restaurant",brand:"Perkins","brand:wikidata":"Q7169056","brand:wikipedia":"en:Perkins Restaurant and Bakery",cuisine:"american",name:"Perkins"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Pizza Factory":{name:"Pizza Factory",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","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"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Pizza Hut":{name:"Pizza Hut",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","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"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Pizza Ranch":{name:"Pizza Ranch",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","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"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/PizzaExpress":{name:"PizzaExpress",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","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"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/french/Poivre Rouge":{name:"Poivre Rouge",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"french","brand:wikidata":"Q7316076"},addTags:{amenity:"restaurant",brand:"Poivre Rouge","brand:wikidata":"Q7316076","brand:wikipedia":"fr:Poivre Rouge (restauration)",cuisine:"french",name:"Poivre Rouge"},removeTags:{amenity:"restaurant",brand:"Poivre Rouge","brand:wikidata":"Q7316076","brand:wikipedia":"fr:Poivre Rouge (restauration)",cuisine:"french",name:"Poivre Rouge"},reference:{key:"cuisine",value:"french"},matchScore:2,suggestion:true},"amenity/restaurant/italian/Prezzo":{name:"Prezzo",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"italian","brand:wikidata":"Q7242489"},addTags:{amenity:"restaurant",brand:"Prezzo","brand:wikidata":"Q7242489","brand:wikipedia":"en:Prezzo (restaurant)",cuisine:"italian",name:"Prezzo"},removeTags:{amenity:"restaurant",brand:"Prezzo","brand:wikidata":"Q7242489","brand:wikipedia":"en:Prezzo (restaurant)",cuisine:"italian",name:"Prezzo"},reference:{key:"cuisine",value:"italian"},matchScore:2,suggestion:true},"amenity/restaurant/seafood/Red Lobster":{name:"Red Lobster",icon:"maki-restaurant-seafood",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"seafood","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"},reference:{key:"cuisine",value:"seafood"},matchScore:2,suggestion:true},"amenity/restaurant/Red Robin":{name:"Red Robin",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7304886"},addTags:{amenity:"restaurant",brand:"Red Robin","brand:wikidata":"Q7304886","brand:wikipedia":"en:Red Robin",cuisine:"burger",name:"Red Robin"},removeTags:{amenity:"restaurant",brand:"Red Robin","brand:wikidata":"Q7304886","brand:wikipedia":"en:Red Robin",cuisine:"burger",name:"Red Robin"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Round Table Pizza":{name:"Round Table Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","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"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/Ruby Tuesday":{name:"Ruby Tuesday",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7376400"},addTags:{amenity:"restaurant",brand:"Ruby Tuesday","brand:wikidata":"Q7376400","brand:wikipedia":"en:Ruby Tuesday (restaurant)",cuisine:"america",name:"Ruby Tuesday"},removeTags:{amenity:"restaurant",brand:"Ruby Tuesday","brand:wikidata":"Q7376400","brand:wikipedia":"en:Ruby Tuesday (restaurant)",cuisine:"america",name:"Ruby Tuesday"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Shakey's":{name:"Shakey's",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q6134929"},addTags:{amenity:"restaurant",brand:"Shakey's","brand:wikidata":"Q6134929","brand:wikipedia":"en:Shakey's Pizza",cuisine:"pizza",name:"Shakey's"},removeTags:{amenity:"restaurant",brand:"Shakey's","brand:wikidata":"Q6134929","brand:wikipedia":"en:Shakey's Pizza",cuisine:"pizza",name:"Shakey's"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/american/Shari's":{name:"Shari's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q7489612"},addTags:{amenity:"restaurant",brand:"Shari's","brand:wikidata":"Q7489612","brand:wikipedia":"en:Shari's Cafe & Pies",cuisine:"american",name:"Shari's"},removeTags:{amenity:"restaurant",brand:"Shari's","brand:wikidata":"Q7489612","brand:wikipedia":"en:Shari's Cafe & Pies",cuisine:"american",name:"Shari's"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/american/Shoney's":{name:"Shoney's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q7500392"},addTags:{amenity:"restaurant",brand:"Shoney's","brand:wikidata":"Q7500392","brand:wikipedia":"en:Shoney's",cuisine:"american",name:"Shoney's"},removeTags:{amenity:"restaurant",brand:"Shoney's","brand:wikidata":"Q7500392","brand:wikipedia":"en:Shoney's",cuisine:"american",name:"Shoney's"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Sizzler":{name:"Sizzler",icon:"maki-restaurant",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/american/Skyline Chili":{name:"Skyline Chili",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q151224"},addTags:{amenity:"restaurant",brand:"Skyline Chili","brand:wikidata":"Q151224","brand:wikipedia":"en:Skyline Chili",cuisine:"american",name:"Skyline Chili"},removeTags:{amenity:"restaurant",brand:"Skyline Chili","brand:wikidata":"Q151224","brand:wikipedia":"en:Skyline Chili",cuisine:"american",name:"Skyline Chili"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Smitty's":{name:"Smitty's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7545728"},addTags:{amenity:"restaurant",brand:"Smitty's","brand:wikidata":"Q7545728","brand:wikipedia":"en:Smitty's",cuisine:"pancake",name:"Smitty's"},removeTags:{amenity:"restaurant",brand:"Smitty's","brand:wikidata":"Q7545728","brand:wikipedia":"en:Smitty's",cuisine:"pancake",name:"Smitty's"},matchScore:2,suggestion:true},"amenity/restaurant/Spur":{name:"Spur",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7581546"},addTags:{amenity:"restaurant",brand:"Spur","brand:wikidata":"Q7581546","brand:wikipedia":"en:Spur Steak Ranches",cuisine:"steak_house",name:"Spur"},removeTags:{amenity:"restaurant",brand:"Spur","brand:wikidata":"Q7581546","brand:wikipedia":"en:Spur Steak Ranches",cuisine:"steak_house",name:"Spur"},matchScore:2,suggestion:true},"amenity/restaurant/Steak 'n Shake":{name:"Steak 'n Shake",icon:"maki-restaurant",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",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",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/american/TGI Friday's":{name:"TGI Friday's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q1524184"},addTags:{amenity:"restaurant",brand:"TGI Friday's","brand:wikidata":"Q1524184","brand:wikipedia":"en:TGI Fridays",cuisine:"american",name:"TGI Friday's"},removeTags:{amenity:"restaurant",brand:"TGI Friday's","brand:wikidata":"Q1524184","brand:wikipedia":"en:TGI Fridays",cuisine:"american",name:"TGI Friday's"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Texas Roadhouse":{name:"Texas Roadhouse",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7707945"},addTags:{amenity:"restaurant",brand:"Texas Roadhouse","brand:wikidata":"Q7707945","brand:wikipedia":"en:Texas Roadhouse",cuisine:"steak_house",name:"Texas Roadhouse"},removeTags:{amenity:"restaurant",brand:"Texas Roadhouse","brand:wikidata":"Q7707945","brand:wikipedia":"en:Texas Roadhouse",cuisine:"steak_house",name:"Texas Roadhouse"},matchScore:2,suggestion:true},"amenity/restaurant/The Cheesecake Factory":{name:"The Cheesecake Factory",icon:"maki-restaurant",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",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7744066"},addTags:{amenity:"restaurant",brand:"The Keg","brand:wikidata":"Q7744066","brand:wikipedia":"en:The Keg",cuisine:"steak_house",name:"The Keg"},removeTags:{amenity:"restaurant",brand:"The Keg","brand:wikidata":"Q7744066","brand:wikipedia":"en:The Keg",cuisine:"steak_house",name:"The Keg"},matchScore:2,suggestion:true},"amenity/restaurant/Toby Carvery":{name:"Toby Carvery",icon:"maki-restaurant",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/mexican/Toks":{name:"Toks",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"mexican","brand:wikidata":"Q48835586"},addTags:{amenity:"restaurant",brand:"Toks","brand:wikidata":"Q48835586","brand:wikipedia":"en:Toks",cuisine:"mexican",name:"Toks"},removeTags:{amenity:"restaurant",brand:"Toks","brand:wikidata":"Q48835586","brand:wikipedia":"en:Toks",cuisine:"mexican",name:"Toks"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/restaurant/Tony Roma's":{name:"Tony Roma's",icon:"maki-restaurant",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",cuisine:"barbecue",name:"Tony Roma's"},removeTags:{amenity:"restaurant",brand:"Tony Roma's","brand:wikidata":"Q2213883","brand:wikipedia":"en:Tony Roma's",cuisine:"barbecue",name:"Tony Roma's"},matchScore:2,suggestion:true},"amenity/restaurant/italian/Vapiano":{name:"Vapiano",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"italian","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"},reference:{key:"cuisine",value:"italian"},matchScore:2,suggestion:true},"amenity/restaurant/american/Village Inn":{name:"Village Inn",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q7930659"},addTags:{amenity:"restaurant",brand:"Village Inn","brand:wikidata":"Q7930659","brand:wikipedia":"en:Village Inn",cuisine:"american",name:"Village Inn"},removeTags:{amenity:"restaurant",brand:"Village Inn","brand:wikidata":"Q7930659","brand:wikipedia":"en:Village Inn",cuisine:"american",name:"Village Inn"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Vips":{name:"Vips",icon:"maki-restaurant",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/american/Waffle House":{name:"Waffle House",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q1701206"},addTags:{amenity:"restaurant",brand:"Waffle House","brand:wikidata":"Q1701206","brand:wikipedia":"en:Waffle House",cuisine:"american",name:"Waffle House"},removeTags:{amenity:"restaurant",brand:"Waffle House","brand:wikidata":"Q1701206","brand:wikipedia":"en:Waffle House",cuisine:"american",name:"Waffle House"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/asian/Wagamama":{name:"Wagamama",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"asian","brand:wikidata":"Q503715"},addTags:{amenity:"restaurant",brand:"Wagamama","brand:wikidata":"Q503715","brand:wikipedia":"en:Wagamama",cuisine:"asian",name:"Wagamama"},removeTags:{amenity:"restaurant",brand:"Wagamama","brand:wikidata":"Q503715","brand:wikipedia":"en:Wagamama",cuisine:"asian",name:"Wagamama"},reference:{key:"cuisine",value:"asian"},matchScore:2,suggestion:true},"amenity/restaurant/japanese/Wasabi":{name:"Wasabi",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"japanese","brand:wikidata":"Q23891278"},addTags:{amenity:"restaurant",brand:"Wasabi","brand:wikidata":"Q23891278","brand:wikipedia":"en:Wasabi (restaurant)",cuisine:"japanese",name:"Wasabi"},removeTags:{amenity:"restaurant",brand:"Wasabi","brand:wikidata":"Q23891278","brand:wikipedia":"en:Wasabi (restaurant)",cuisine:"japanese",name:"Wasabi"},reference:{key:"cuisine",value:"japanese"},matchScore:2,suggestion:true},"amenity/restaurant/White Spot":{name:"White Spot",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7995414"},addTags:{amenity:"restaurant",brand:"White Spot","brand:wikidata":"Q7995414","brand:wikipedia":"en:White Spot",cuisine:"burger",name:"White Spot"},removeTags:{amenity:"restaurant",brand:"White Spot","brand:wikidata":"Q7995414","brand:wikipedia":"en:White Spot",cuisine:"burger",name:"White Spot"},matchScore:2,suggestion:true},"amenity/restaurant/Wingstop":{name:"Wingstop",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q8025339"},addTags:{amenity:"restaurant",brand:"Wingstop","brand:wikidata":"Q8025339","brand:wikipedia":"en:Wingstop",cuisine:"wings",name:"Wingstop"},removeTags:{amenity:"restaurant",brand:"Wingstop","brand:wikidata":"Q8025339","brand:wikipedia":"en:Wingstop",cuisine:"wings",name:"Wingstop"},matchScore:2,suggestion:true},"amenity/restaurant/sushi/YO! Sushi":{name:"YO! Sushi",icon:"fas-fish",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"sushi","brand:wikidata":"Q3105441"},addTags:{amenity:"restaurant",brand:"YO! Sushi","brand:wikidata":"Q3105441","brand:wikipedia":"en:YO! Sushi",cuisine:"sushi",name:"YO! Sushi"},removeTags:{amenity:"restaurant",brand:"YO! Sushi","brand:wikidata":"Q3105441","brand:wikipedia":"en:YO! Sushi",cuisine:"sushi",name:"YO! Sushi"},reference:{key:"cuisine",value:"sushi"},matchScore:2,suggestion:true},"amenity/restaurant/italian/Zizzi":{name:"Zizzi",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"italian","brand:wikidata":"Q8072944"},addTags:{amenity:"restaurant",brand:"Zizzi","brand:wikidata":"Q8072944","brand:wikipedia":"en:Zizzi",cuisine:"italian",name:"Zizzi"},removeTags:{amenity:"restaurant",brand:"Zizzi","brand:wikidata":"Q8072944","brand:wikipedia":"en:Zizzi",cuisine:"italian",name:"Zizzi"},reference:{key:"cuisine",value:"italian"},matchScore:2,suggestion:true},"amenity/restaurant/はなまるうどん":{name:"はなまるうどん",icon:"maki-restaurant",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",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",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",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",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",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",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",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",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",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",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",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",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",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/noodle/丸亀製麺":{name:"丸亀製麺",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"noodle","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":"마루가메 제면"},reference:{key:"cuisine",value:"noodle"},matchScore:2,suggestion:true},"amenity/restaurant/和食さと":{name:"和食さと",icon:"maki-restaurant",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",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/japanese/大戸屋":{name:"大戸屋",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"japanese","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"},reference:{key:"cuisine",value:"japanese"},matchScore:2,suggestion:true},"amenity/restaurant/大阪王将":{name:"大阪王将",icon:"maki-restaurant",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",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",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/noodle/日高屋":{name:"日高屋",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"noodle","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"},reference:{key:"cuisine",value:"noodle"},matchScore:2,suggestion:true},"amenity/restaurant/牛角":{name:"牛角",icon:"maki-restaurant",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",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/parcel_pickup_dropoff/DHL Packstation":{name:"DHL Packstation",icon:"temaki-vending_machine",geometry:["point"],tags:{amenity:"vending_machine",vending:"parcel_pickup;parcel_mail_in","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"},reference:{key:"vending",value:"parcel_pickup;parcel_mail_in"},matchScore:2,suggestion:true},"amenity/vending_machine/public_transport_tickets/KKM":{name:"KKM",icon:"temaki-vending_machine",geometry:["point"],tags:{amenity:"vending_machine",vending:"public_transport_tickets","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"},reference:{key:"vending",value:"public_transport_tickets"},matchScore:2,suggestion:true},"amenity/vending_machine/parcel_pickup_dropoff/Paczkomat InPost":{name:"Paczkomat InPost",icon:"temaki-vending_machine",geometry:["point"],tags:{amenity:"vending_machine",vending:"parcel_pickup;parcel_mail_in","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"},reference:{key:"vending",value:"parcel_pickup;parcel_mail_in"},matchScore:2,suggestion:true},"amenity/vending_machine/Redbox":{name:"Redbox",icon:"temaki-vending_machine",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/vending_machine/Robidog":{name:"Robidog",icon:"temaki-vending_machine",geometry:["point"],tags:{amenity:"vending_machine","brand:wikidata":"Q2159689"},addTags:{amenity:"vending_machine",brand:"Robidog","brand:wikidata":"Q2159689","brand:wikipedia":"de:Robidog",name:"Robidog"},removeTags:{amenity:"vending_machine",brand:"Robidog","brand:wikidata":"Q2159689","brand:wikipedia":"de:Robidog",name:"Robidog"},matchScore:2,suggestion:true},"amenity/veterinary/Banfield Pet Hospital":{name:"Banfield Pet Hospital",icon:"temaki-veterinary_care",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",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",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",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",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",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",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/PureGym":{name:"PureGym",icon:"fas-dumbbell",geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q18345898"},addTags:{brand:"PureGym","brand:wikidata":"Q18345898","brand:wikipedia":"en:PureGym",leisure:"fitness_centre",name:"PureGym"},removeTags:{brand:"PureGym","brand:wikidata":"Q18345898","brand:wikipedia":"en:PureGym",leisure:"fitness_centre",name:"PureGym"},matchScore:2,suggestion:true},"leisure/fitness_centre/Snap Fitness":{name:"Snap Fitness",icon:"fas-dumbbell",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",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",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",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",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",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",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/Gall & Gall":{name:"Gall & Gall",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q13639185"},addTags:{brand:"Gall & Gall","brand:wikidata":"Q13639185","brand:wikipedia":"nl:Gall & Gall",name:"Gall & Gall",shop:"alcohol"},removeTags:{brand:"Gall & Gall","brand:wikidata":"Q13639185","brand:wikipedia":"nl:Gall & Gall",name:"Gall & Gall",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/LCBO":{name:"LCBO",icon:"maki-alcohol-shop",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",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",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/SAQ":{name:"SAQ",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q3488077"},addTags:{brand:"SAQ","brand:wikidata":"Q3488077","brand:wikipedia":"en:Société des alcools du Québec",name:"SAQ",shop:"alcohol"},removeTags:{brand:"SAQ","brand:wikidata":"Q3488077","brand:wikipedia":"en:Société des alcools du Québec",name:"SAQ",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Spec's":{name:"Spec's",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q7574415"},addTags:{brand:"Spec's","brand:wikidata":"Q7574415","brand:wikipedia":"en:Spec's Wine, Spirits & Finer Foods",name:"Spec's",shop:"alcohol"},removeTags:{brand:"Spec's","brand:wikidata":"Q7574415","brand:wikipedia":"en:Spec's Wine, Spirits & Finer Foods",name:"Spec's",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Systembolaget":{name:"Systembolaget",icon:"maki-alcohol-shop",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",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/Total Wine":{name:"Total Wine",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q7828084"},addTags:{brand:"Total Wine","brand:wikidata":"Q7828084","brand:wikipedia":"en:Total Wine & More",name:"Total Wine",shop:"alcohol"},removeTags:{brand:"Total Wine","brand:wikidata":"Q7828084","brand:wikipedia":"en:Total Wine & More",name:"Total Wine",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Vinmonopolet":{name:"Vinmonopolet",icon:"maki-alcohol-shop",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/Virginia ABC":{name:"Virginia ABC",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q7934236"},addTags:{brand:"Virginia ABC","brand:wikidata":"Q7934236","brand:wikipedia":"en:Virginia Alcoholic Beverage Control Authority",name:"Virginia ABC",shop:"alcohol"},removeTags:{brand:"Virginia ABC","brand:wikidata":"Q7934236","brand:wikipedia":"en:Virginia Alcoholic Beverage Control Authority",name:"Virginia ABC",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Красное & Белое":{name:"Красное & Белое",icon:"maki-alcohol-shop",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",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/BabyOne":{name:"BabyOne",icon:"maki-shop",geometry:["point","area"],tags:{shop:"baby_goods","brand:wikidata":"Q57540408"},addTags:{brand:"BabyOne","brand:wikidata":"Q57540408",name:"BabyOne",shop:"baby_goods"},removeTags:{brand:"BabyOne","brand:wikidata":"Q57540408",name:"BabyOne",shop:"baby_goods"},matchScore:2,suggestion:true},"shop/baby_goods/Mothercare":{name:"Mothercare",icon:"maki-shop",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",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/Bakker Bart":{name:"Bakker Bart",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q2177445"},addTags:{brand:"Bakker Bart","brand:wikidata":"Q2177445","brand:wikipedia":"nl:Bakker Bart",name:"Bakker Bart",shop:"bakery"},removeTags:{brand:"Bakker Bart","brand:wikidata":"Q2177445","brand:wikipedia":"nl:Bakker Bart",name:"Bakker Bart",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Banette":{name:"Banette",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q2882405"},addTags:{brand:"Banette","brand:wikidata":"Q2882405","brand:wikipedia":"fr:Banette (entreprise)",name:"Banette",shop:"bakery"},removeTags:{brand:"Banette","brand:wikidata":"Q2882405","brand:wikipedia":"fr:Banette (entreprise)",name:"Banette",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Bäckerei Fuchs":{name:"Bäckerei Fuchs",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q42825993"},addTags:{brand:"Bäckerei Fuchs","brand:wikidata":"Q42825993","brand:wikipedia":"de:Harald Fuchs Bäckerei – Konditorei",name:"Bäckerei Fuchs",shop:"bakery"},removeTags:{brand:"Bäckerei Fuchs","brand:wikidata":"Q42825993","brand:wikipedia":"de:Harald Fuchs Bäckerei – Konditorei",name:"Bäckerei Fuchs",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Cooplands":{name:"Cooplands",icon:"maki-bakery",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",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",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/Fornetti":{name:"Fornetti",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q1003020"},addTags:{brand:"Fornetti","brand:wikidata":"Q1003020","brand:wikipedia":"en:Fornetti",name:"Fornetti",shop:"bakery"},removeTags:{brand:"Fornetti","brand:wikidata":"Q1003020","brand:wikipedia":"en:Fornetti",name:"Fornetti",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Goldilocks":{name:"Goldilocks",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q5580198"},addTags:{brand:"Goldilocks","brand:wikidata":"Q5580198","brand:wikipedia":"en:Goldilocks Bakeshop",name:"Goldilocks",shop:"bakery"},removeTags:{brand:"Goldilocks","brand:wikidata":"Q5580198","brand:wikipedia":"en:Goldilocks Bakeshop",name:"Goldilocks",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Greggs":{name:"Greggs",icon:"maki-bakery",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",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/Ihle":{name:"Ihle",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q881821"},addTags:{brand:"Ihle","brand:wikidata":"Q881821","brand:wikipedia":"en:Ihle",name:"Ihle",shop:"bakery"},removeTags:{brand:"Ihle","brand:wikidata":"Q881821","brand:wikipedia":"en:Ihle",name:"Ihle",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/K&U Bäckerei":{name:"K&U Bäckerei",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q1719433"},addTags:{brand:"K&U Bäckerei","brand:wikidata":"Q1719433","brand:wikipedia":"de:K & U Bäckerei",name:"K&U Bäckerei",shop:"bakery"},removeTags:{brand:"K&U Bäckerei","brand:wikidata":"Q1719433","brand:wikipedia":"de:K & U Bäckerei",name:"K&U Bäckerei",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Kamps":{name:"Kamps",icon:"maki-bakery",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",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/Le Crobag":{name:"Le Crobag",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q1558025"},addTags:{brand:"Le Crobag","brand:wikidata":"Q1558025","brand:wikipedia":"de:Le Crobag",name:"Le Crobag",shop:"bakery"},removeTags:{brand:"Le Crobag","brand:wikidata":"Q1558025","brand:wikipedia":"de:Le Crobag",name:"Le Crobag",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Lila Bäcker":{name:"Lila Bäcker",icon:"maki-bakery",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/Musmanni":{name:"Musmanni",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q19382082"},addTags:{brand:"Musmanni","brand:wikidata":"Q19382082","brand:wikipedia":"no:Musmanni",name:"Musmanni",shop:"bakery"},removeTags:{brand:"Musmanni","brand:wikidata":"Q19382082","brand:wikipedia":"no:Musmanni",name:"Musmanni",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Paul":{name:"Paul",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q3370417"},addTags:{brand:"Paul","brand:wikidata":"Q3370417","brand:wikipedia":"en:Paul (bakery)",name:"Paul",shop:"bakery"},removeTags:{brand:"Paul","brand:wikidata":"Q3370417","brand:wikipedia":"en:Paul (bakery)",name:"Paul",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Red Ribbon":{name:"Red Ribbon",icon:"maki-bakery",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/Ronde des Pains":{name:"Ronde des Pains",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q3441707"},addTags:{brand:"Ronde des Pains","brand:wikidata":"Q3441707","brand:wikipedia":"fr:Ronde des Pains",name:"Ronde des Pains",shop:"bakery"},removeTags:{brand:"Ronde des Pains","brand:wikidata":"Q3441707","brand:wikipedia":"fr:Ronde des Pains",name:"Ronde des Pains",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Sehne":{name:"Sehne",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q1314761"},addTags:{brand:"Sehne","brand:wikidata":"Q1314761","brand:wikipedia":"de:Sehne Backwaren",name:"Sehne",shop:"bakery"},removeTags:{brand:"Sehne","brand:wikidata":"Q1314761","brand:wikipedia":"de:Sehne Backwaren",name:"Sehne",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Steinecke":{name:"Steinecke",icon:"maki-bakery",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/Ströck":{name:"Ströck",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q2357607"},addTags:{brand:"Ströck","brand:wikidata":"Q2357607","brand:wikipedia":"de:Ströck-Brot",name:"Ströck",shop:"bakery"},removeTags:{brand:"Ströck","brand:wikidata":"Q2357607","brand:wikipedia":"de:Ströck-Brot",name:"Ströck",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Wiener Feinbäcker":{name:"Wiener Feinbäcker",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q15854357"},addTags:{brand:"Wiener Feinbäcker","brand:wikidata":"Q15854357","brand:wikipedia":"de:Wiener Feinbäckerei Heberer",name:"Wiener Feinbäcker",shop:"bakery"},removeTags:{brand:"Wiener Feinbäcker","brand:wikidata":"Q15854357","brand:wikipedia":"de:Wiener Feinbäckerei Heberer",name:"Wiener Feinbäcker",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/von Allwörden":{name:"von Allwörden",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q60411349"},addTags:{brand:"von Allwörden","brand:wikidata":"Q60411349","brand:wikipedia":"nds:Heinrich von Allwörden GmbH",name:"von Allwörden",shop:"bakery"},removeTags:{brand:"von Allwörden","brand:wikidata":"Q60411349","brand:wikipedia":"nds:Heinrich von Allwörden GmbH",name:"von Allwörden",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/뚜레쥬르":{name:"뚜레쥬르",icon:"maki-bakery",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",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",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",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",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/Dreams":{name:"Dreams",icon:"maki-lodging",geometry:["point","area"],tags:{shop:"bed","brand:wikidata":"Q5306688"},addTags:{brand:"Dreams","brand:wikidata":"Q5306688","brand:wikipedia":"en:Dreams (bed retailer)",name:"Dreams",shop:"bed"},removeTags:{brand:"Dreams","brand:wikidata":"Q5306688","brand:wikipedia":"en:Dreams (bed retailer)",name:"Dreams",shop:"bed"},matchScore:2,suggestion:true},"shop/bed/Matratzen Concord":{name:"Matratzen Concord",icon:"maki-lodging",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",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",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",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/Dursty":{name:"Dursty",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q1267518"},addTags:{brand:"Dursty","brand:wikidata":"Q1267518","brand:wikipedia":"de:Dursty Getränkemärkte",name:"Dursty",shop:"beverages"},removeTags:{brand:"Dursty","brand:wikidata":"Q1267518","brand:wikipedia":"de:Dursty Getränkemärkte",name:"Dursty",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/Edeka Getränkemarkt":{name:"Edeka Getränkemarkt",icon:"maki-shop",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/Fristo Getränkemarkt":{name:"Fristo Getränkemarkt",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q1465151"},addTags:{brand:"Fristo Getränkemarkt","brand:wikidata":"Q1465151","brand:wikipedia":"de:Fristo",name:"Fristo Getränkemarkt",shop:"beverages"},removeTags:{brand:"Fristo Getränkemarkt","brand:wikidata":"Q1465151","brand:wikipedia":"de:Fristo",name:"Fristo Getränkemarkt",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/Getränke Hoffmann":{name:"Getränke Hoffmann",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q19284021"},addTags:{brand:"Getränke Hoffmann","brand:wikidata":"Q19284021","brand:wikipedia":"de:Getränke Hoffmann",name:"Getränke Hoffmann",shop:"beverages"},removeTags:{brand:"Getränke Hoffmann","brand:wikidata":"Q19284021","brand:wikipedia":"de:Getränke Hoffmann",name:"Getränke Hoffmann",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/Hol'ab":{name:"Hol'ab",icon:"maki-shop",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/Orterer Getränkemarkt":{name:"Orterer Getränkemarkt",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q23787118"},addTags:{brand:"Orterer Getränkemarkt","brand:wikidata":"Q23787118","brand:wikipedia":"de:Orterer Gruppe",name:"Orterer Getränkemarkt",shop:"beverages"},removeTags:{brand:"Orterer Getränkemarkt","brand:wikidata":"Q23787118","brand:wikipedia":"de:Orterer Gruppe",name:"Orterer Getränkemarkt",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/Rewe Getränkemarkt":{name:"Rewe Getränkemarkt",icon:"maki-shop",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",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",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",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/bicycle/Fri BikeShop":{name:"Fri BikeShop",icon:"maki-bicycle",geometry:["point","area"],tags:{shop:"bicycle","brand:wikidata":"Q26721030"},addTags:{brand:"Fri BikeShop","brand:wikidata":"Q26721030",name:"Fri BikeShop",shop:"bicycle"},removeTags:{brand:"Fri BikeShop","brand:wikidata":"Q26721030",name:"Fri BikeShop",shop:"bicycle"},matchScore:2,suggestion:true},"shop/bicycle/サイクルベースあさひ":{name:"サイクルベースあさひ",icon:"maki-bicycle",geometry:["point","area"],tags:{shop:"bicycle","brand:wikidata":"Q11257202"},addTags:{brand:"サイクルベースあさひ","brand:wikidata":"Q11257202","brand:wikipedia":"ja:あさひ (企業)",name:"サイクルベースあさひ",shop:"bicycle"},removeTags:{brand:"サイクルベースあさひ","brand:wikidata":"Q11257202","brand:wikipedia":"ja:あさひ (企業)",name:"サイクルベースあさひ",shop:"bicycle"},matchScore:2,suggestion:true},"shop/bookmaker/Betfred":{name:"Betfred",icon:"maki-shop",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",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",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",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",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",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",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/bookmaker/Фонбет":{name:"Фонбет",icon:"maki-shop",geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q49137910"},addTags:{brand:"Фонбет","brand:wikidata":"Q49137910","brand:wikipedia":"ru:Фонбет",name:"Фонбет",shop:"bookmaker"},removeTags:{brand:"Фонбет","brand:wikidata":"Q49137910","brand:wikipedia":"ru:Фонбет",name:"Фонбет",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/books/Akademibokhandeln":{name:"Akademibokhandeln",icon:"maki-shop",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",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/Bruna":{name:"Bruna",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q3317555"},addTags:{brand:"Bruna","brand:wikidata":"Q3317555","brand:wikipedia":"nl:Bruna (retail chain)",name:"Bruna",shop:"books"},removeTags:{brand:"Bruna","brand:wikidata":"Q3317555","brand:wikipedia":"nl:Bruna (retail chain)",name:"Bruna",shop:"books"},matchScore:2,suggestion:true},"shop/books/Chapters":{name:"Chapters",icon:"maki-shop",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",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",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",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",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",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/Standaard Boekhandel":{name:"Standaard Boekhandel",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q3496554"},addTags:{brand:"Standaard Boekhandel","brand:wikidata":"Q3496554","brand:wikipedia":"nl:Standaard Boekhandel",name:"Standaard Boekhandel",shop:"books"},removeTags:{brand:"Standaard Boekhandel","brand:wikidata":"Q3496554","brand:wikipedia":"nl:Standaard Boekhandel",name:"Standaard Boekhandel",shop:"books"},matchScore:2,suggestion:true},"shop/books/TSUTAYA":{name:"TSUTAYA",icon:"maki-shop",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",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/The Works":{name:"The Works",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q7775853"},addTags:{brand:"The Works","brand:wikidata":"Q7775853","brand:wikipedia":"en:The Works (retailer)",name:"The Works",shop:"books"},removeTags:{brand:"The Works","brand:wikidata":"Q7775853","brand:wikipedia":"en:The Works (retailer)",name:"The Works",shop:"books"},matchScore:2,suggestion:true},"shop/books/Waterstones":{name:"Waterstones",icon:"maki-shop",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",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",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q4098549"},addTags:{brand:"Буквоед","brand:wikidata":"Q4098549","brand:wikipedia":"ru:Буквоед",name:"Буквоед",shop:"books"},removeTags:{brand:"Буквоед","brand:wikidata":"Q4098549","brand:wikipedia":"ru:Буквоед",name:"Буквоед",shop:"books"},matchScore:2,suggestion:true},"shop/books/Читай-город":{name:"Читай-город",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q4516645"},addTags:{brand:"Читай-город","brand:wikidata":"Q4516645","brand:wikipedia":"ru:Читай-город",name:"Читай-город",shop:"books"},removeTags:{brand:"Читай-город","brand:wikidata":"Q4516645","brand:wikipedia":"ru:Читай-город",name:"Читай-город",shop:"books"},matchScore:2,suggestion:true},"shop/books/ブックオフ":{name:"ブックオフ",icon:"maki-shop",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",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/Coqivoire":{name:"Coqivoire",icon:"maki-slaughterhouse",geometry:["point","area"],tags:{shop:"butcher","brand:wikidata":"Q60183284"},addTags:{brand:"Coqivoire","brand:wikidata":"Q60183284",butcher:"poultry",name:"Coqivoire",shop:"butcher"},removeTags:{brand:"Coqivoire","brand:wikidata":"Q60183284",butcher:"poultry",name:"Coqivoire",shop:"butcher"},matchScore:2,suggestion:true},"shop/butcher/Foani":{name:"Foani",icon:"maki-slaughterhouse",geometry:["point","area"],tags:{shop:"butcher","brand:wikidata":"Q60183335"},addTags:{brand:"Foani","brand:wikidata":"Q60183335",butcher:"poultry",name:"Foani",shop:"butcher"},removeTags:{brand:"Foani","brand:wikidata":"Q60183335",butcher:"poultry",name:"Foani",shop:"butcher"},matchScore:2,suggestion:true},"shop/butcher/Vinzenzmurr":{name:"Vinzenzmurr",icon:"maki-slaughterhouse",geometry:["point","area"],tags:{shop:"butcher","brand:wikidata":"Q2527361"},addTags:{brand:"Vinzenzmurr","brand:wikidata":"Q2527361","brand:wikipedia":"de:Vinzenzmurr",name:"Vinzenzmurr",shop:"butcher"},removeTags:{brand:"Vinzenzmurr","brand:wikidata":"Q2527361","brand:wikipedia":"de:Vinzenzmurr",name:"Vinzenzmurr",shop:"butcher"},matchScore:2,suggestion:true},"shop/butcher/Великолукский мясокомбинат":{name:"Великолукский мясокомбинат",icon:"maki-slaughterhouse",geometry:["point","area"],tags:{shop:"butcher","brand:wikidata":"Q18401767"},addTags:{brand:"Великолукский мясокомбинат","brand:wikidata":"Q18401767","brand:wikipedia":"ru:Великолукский мясокомбинат",name:"Великолукский мясокомбинат",shop:"butcher"},removeTags:{brand:"Великолукский мясокомбинат","brand:wikidata":"Q18401767","brand:wikipedia":"ru:Великолукский мясокомбинат",name:"Великолукский мясокомбинат",shop:"butcher"},matchScore:2,suggestion:true},"shop/butcher/Родинна ковбаска":{name:"Родинна ковбаска",icon:"maki-slaughterhouse",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",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",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",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",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",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",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",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_parts/Автомир":{name:"Автомир",icon:"maki-car",geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q4056321"},addTags:{brand:"Автомир","brand:wikidata":"Q4056321","brand:wikipedia":"ru:Автомир (автодилер)",name:"Автомир",shop:"car_parts"},removeTags:{brand:"Автомир","brand:wikidata":"Q4056321","brand:wikipedia":"ru:Автомир (автодилер)",name:"Автомир",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/イエローハット":{name:"イエローハット",icon:"maki-car",geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q11285915"},addTags:{brand:"イエローハット","brand:wikidata":"Q11285915","brand:wikipedia":"ja:イエローハット",name:"イエローハット",shop:"car_parts"},removeTags:{brand:"イエローハット","brand:wikidata":"Q11285915","brand:wikipedia":"ja:イエローハット",name:"イエローハット",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/オートバックス":{name:"オートバックス",icon:"maki-car",geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q7886426"},addTags:{brand:"オートバックス","brand:wikidata":"Q7886426","brand:wikipedia":"ja:オートバックスセブン",name:"オートバックス",shop:"car_parts"},removeTags:{brand:"オートバックス","brand:wikidata":"Q7886426","brand:wikipedia":"ja:オートバックスセブン",name:"オートバックス",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/タイヤ館":{name:"タイヤ館",icon:"maki-car",geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q11315808"},addTags:{brand:"タイヤ館","brand:wikidata":"Q11315808","brand:wikipedia":"ja:タイヤ館",name:"タイヤ館",shop:"car_parts"},removeTags:{brand:"タイヤ館","brand:wikidata":"Q11315808","brand:wikipedia":"ja:タイヤ館",name:"タイヤ館",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_repair/A.T.U":{name:"A.T.U",icon:"maki-car-repair",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",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",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",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/Feu Vert":{name:"Feu Vert",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q3070922"},addTags:{brand:"Feu Vert","brand:wikidata":"Q3070922","brand:wikipedia":"fr:Feu Vert (entreprise)",name:"Feu Vert",shop:"car_repair"},removeTags:{brand:"Feu Vert","brand:wikidata":"Q3070922","brand:wikipedia":"fr:Feu Vert (entreprise)",name:"Feu Vert",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Firestone":{name:"Firestone",icon:"maki-car-repair",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",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",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",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",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",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",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",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/Mekonomen":{name:"Mekonomen",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q10580079"},addTags:{brand:"Mekonomen","brand:wikidata":"Q10580079","brand:wikipedia":"sv:Mekonomen",name:"Mekonomen",shop:"car_repair"},removeTags:{brand:"Mekonomen","brand:wikidata":"Q10580079","brand:wikipedia":"sv:Mekonomen",name:"Mekonomen",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Midas":{name:"Midas",icon:"maki-car-repair",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",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",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",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",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/Point S":{name:"Point S",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q3393358"},addTags:{brand:"Point S","brand:wikidata":"Q3393358","brand:wikipedia":"fr:Point S",name:"Point S",shop:"car_repair"},removeTags:{brand:"Point S","brand:wikidata":"Q3393358","brand:wikipedia":"fr:Point S",name:"Point S",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Renault":{name:"Renault",icon:"maki-car-repair",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",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/Safelite AutoGlass":{name:"Safelite AutoGlass",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q28797369"},addTags:{brand:"Safelite AutoGlass","brand:wikidata":"Q28797369","brand:wikipedia":"en:Safelite",operator:"Belron","operator:wikidata":"Q785614","operator:wikipedia":"en:Belron",name:"Safelite AutoGlass",shop:"car_repair"},removeTags:{brand:"Safelite AutoGlass","brand:wikidata":"Q28797369","brand:wikipedia":"en:Safelite",operator:"Belron","operator:wikidata":"Q785614","operator:wikipedia":"en:Belron",name:"Safelite AutoGlass",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Toyota":{name:"Toyota",icon:"maki-car-repair",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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/Etos":{name:"Etos",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q2609459"},addTags:{brand:"Etos","brand:wikidata":"Q2609459","brand:wikipedia":"en:Etos",name:"Etos",shop:"chemist"},removeTags:{brand:"Etos","brand:wikidata":"Q2609459","brand:wikipedia":"en:Etos",name:"Etos",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/Kruidvat":{name:"Kruidvat",icon:"maki-grocery",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",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",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/Teta":{name:"Teta",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q20860823"},addTags:{brand:"Teta","brand:wikidata":"Q20860823","brand:wikipedia":"cs:Teta drogerie",name:"Teta",shop:"chemist"},removeTags:{brand:"Teta","brand:wikidata":"Q20860823","brand:wikipedia":"cs:Teta drogerie",name:"Teta",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/Trekpleister":{name:"Trekpleister",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q2551576"},addTags:{brand:"Trekpleister","brand:wikidata":"Q2551576","brand:wikipedia":"nl:Trekpleister (drogisterij)",name:"Trekpleister",shop:"chemist"},removeTags:{brand:"Trekpleister","brand:wikidata":"Q2551576","brand:wikipedia":"nl:Trekpleister (drogisterij)",name:"Trekpleister",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/dm":{name:"dm",icon:"maki-grocery",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",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",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",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",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",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",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",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",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",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",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/Armand Thiery":{name:"Armand Thiery",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2861975"},addTags:{brand:"Armand Thiery","brand:wikidata":"Q2861975","brand:wikipedia":"fr:Armand Thiery",name:"Armand Thiery",shop:"clothes"},removeTags:{brand:"Armand Thiery","brand:wikidata":"Q2861975","brand:wikipedia":"fr:Armand Thiery",name:"Armand Thiery",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Banana Republic":{name:"Banana Republic",icon:"maki-clothing-store",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",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/Betty Barclay":{name:"Betty Barclay",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q850250"},addTags:{brand:"Betty Barclay","brand:wikidata":"Q850250","brand:wikipedia":"de:Betty Barclay",name:"Betty Barclay",shop:"clothes"},removeTags:{brand:"Betty Barclay","brand:wikidata":"Q850250","brand:wikipedia":"de:Betty Barclay",name:"Betty Barclay",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Big Star":{name:"Big Star",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q9171569"},addTags:{brand:"Big Star","brand:wikidata":"Q9171569","brand:wikipedia":"pl:Big Star Limited",name:"Big Star",shop:"clothes"},removeTags:{brand:"Big Star","brand:wikidata":"Q9171569","brand:wikipedia":"pl:Big Star Limited",name:"Big Star",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Bonita":{name:"Bonita",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q945463"},addTags:{brand:"Bonita","brand:wikidata":"Q945463","brand:wikipedia":"en:Bonia (fashion)",name:"Bonita",shop:"clothes"},removeTags:{brand:"Bonita","brand:wikidata":"Q945463","brand:wikipedia":"en:Bonia (fashion)",name:"Bonita",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Bonobo":{name:"Bonobo",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q4942546"},addTags:{brand:"Bonobo","brand:wikidata":"Q4942546","brand:wikipedia":"en:Bonobos (apparel)",name:"Bonobo",shop:"clothes"},removeTags:{brand:"Bonobo","brand:wikidata":"Q4942546","brand:wikipedia":"en:Bonobos (apparel)",name:"Bonobo",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Brooks Brothers":{name:"Brooks Brothers",icon:"maki-clothing-store",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",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",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",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",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/COS":{name:"COS",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q60772401"},addTags:{brand:"COS","brand:wikidata":"Q60772401","brand:wikipedia":"en:COS (Collection Of Style)",name:"COS",shop:"clothes"},removeTags:{brand:"COS","brand:wikidata":"Q60772401","brand:wikipedia":"en:COS (Collection Of Style)",name:"COS",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Calvin Klein":{name:"Calvin Klein",icon:"maki-clothing-store",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",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",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",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",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/Cato":{name:"Cato",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q16956136"},addTags:{brand:"Cato","brand:wikidata":"Q16956136","brand:wikipedia":"en:Cato Corporation",name:"Cato",shop:"clothes"},removeTags:{brand:"Cato","brand:wikidata":"Q16956136","brand:wikipedia":"en:Cato Corporation",name:"Cato",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Celio":{name:"Celio",icon:"maki-clothing-store",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",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",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",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",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/Colin's":{name:"Colin's",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q28729658"},addTags:{brand:"Colin's","brand:wikidata":"Q28729658",name:"Colin's",shop:"clothes"},removeTags:{brand:"Colin's","brand:wikidata":"Q28729658",name:"Colin's",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Columbia":{name:"Columbia",icon:"maki-clothing-store",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",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",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",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/Devred":{name:"Devred",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3025542"},addTags:{brand:"Devred","brand:wikidata":"Q3025542","brand:wikipedia":"fr:Devred 1902",name:"Devred",shop:"clothes"},removeTags:{brand:"Devred","brand:wikidata":"Q3025542","brand:wikipedia":"fr:Devred 1902",name:"Devred",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Diesel":{name:"Diesel",icon:"maki-clothing-store",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/Diverse":{name:"Diverse",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q11694298"},addTags:{brand:"Diverse","brand:wikidata":"Q11694298","brand:wikipedia":"pl:Diverse",name:"Diverse",shop:"clothes"},removeTags:{brand:"Diverse","brand:wikidata":"Q11694298","brand:wikipedia":"pl:Diverse",name:"Diverse",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Dorothy Perkins":{name:"Dorothy Perkins",icon:"maki-clothing-store",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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/Gémo":{name:"Gémo",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3122954"},addTags:{brand:"Gémo","brand:wikidata":"Q3122954","brand:wikipedia":"fr:Gémo",name:"Gémo",shop:"clothes"},removeTags:{brand:"Gémo","brand:wikidata":"Q3122954","brand:wikipedia":"fr:Gémo",name:"Gémo",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/H&M":{name:"H&M",icon:"maki-clothing-store",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",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",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",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",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",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",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/JBC":{name:"JBC",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2671470"},addTags:{brand:"JBC","brand:wikidata":"Q2671470","brand:wikipedia":"nl:JBC",name:"JBC",shop:"clothes"},removeTags:{brand:"JBC","brand:wikidata":"Q2671470","brand:wikipedia":"nl:JBC",name:"JBC",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Jack & Jones":{name:"Jack & Jones",icon:"maki-clothing-store",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/Jack Wills":{name:"Jack Wills",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6115814"},addTags:{brand:"Jack Wills","brand:wikidata":"Q6115814","brand:wikipedia":"en:Jack Wills",name:"Jack Wills",shop:"clothes"},removeTags:{brand:"Jack Wills","brand:wikidata":"Q6115814","brand:wikipedia":"en:Jack Wills",name:"Jack Wills",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Jeans Fritz":{name:"Jeans Fritz",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1686071"},addTags:{brand:"Jeans Fritz","brand:wikidata":"Q1686071","brand:wikipedia":"de:Jeans Fritz",name:"Jeans Fritz",shop:"clothes"},removeTags:{brand:"Jeans Fritz","brand:wikidata":"Q1686071","brand:wikipedia":"de:Jeans Fritz",name:"Jeans Fritz",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Jennyfer":{name:"Jennyfer",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3177174"},addTags:{brand:"Jennyfer","brand:wikidata":"Q3177174","brand:wikipedia":"fr:Jennyfer",name:"Jennyfer",shop:"clothes"},removeTags:{brand:"Jennyfer","brand:wikidata":"Q3177174","brand:wikipedia":"fr:Jennyfer",name:"Jennyfer",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Jigsaw":{name:"Jigsaw",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6192383"},addTags:{brand:"Jigsaw","brand:wikidata":"Q6192383","brand:wikipedia":"en:Jigsaw (clothing retailer)",name:"Jigsaw",shop:"clothes"},removeTags:{brand:"Jigsaw","brand:wikidata":"Q6192383","brand:wikipedia":"en:Jigsaw (clothing retailer)",name:"Jigsaw",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Joules":{name:"Joules",icon:"maki-clothing-store",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/KappAhl":{name:"KappAhl",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q4349016"},addTags:{brand:"KappAhl","brand:wikidata":"Q4349016","brand:wikipedia":"sv:Kappahl",name:"KappAhl",shop:"clothes"},removeTags:{brand:"KappAhl","brand:wikidata":"Q4349016","brand:wikipedia":"sv:Kappahl",name:"KappAhl",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/KiK":{name:"KiK",icon:"maki-clothing-store",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/Kiabi":{name:"Kiabi",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3196299"},addTags:{brand:"Kiabi","brand:wikidata":"Q3196299","brand:wikipedia":"fr:Kiabi",name:"Kiabi",shop:"clothes"},removeTags:{brand:"Kiabi","brand:wikidata":"Q3196299","brand:wikipedia":"fr:Kiabi",name:"Kiabi",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/LC Waikiki":{name:"LC Waikiki",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3205965"},addTags:{brand:"LC Waikiki","brand:wikidata":"Q3205965","brand:wikipedia":"fr:LC Waikiki",name:"LC Waikiki",shop:"clothes"},removeTags:{brand:"LC Waikiki","brand:wikidata":"Q3205965","brand:wikipedia":"fr:LC Waikiki",name:"LC Waikiki",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/La Senza":{name:"La Senza",icon:"maki-clothing-store",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",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",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",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",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",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",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",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",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/Mark's":{name:"Mark's",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6766373"},addTags:{brand:"Mark's","brand:wikidata":"Q6766373","brand:wikipedia":"en:Mark's",name:"Mark's",shop:"clothes"},removeTags:{brand:"Mark's","brand:wikidata":"Q6766373","brand:wikipedia":"en:Mark's",name:"Mark's",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Massimo Dutti":{name:"Massimo Dutti",icon:"maki-clothing-store",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",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",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",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",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",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",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",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/Mr Price":{name:"Mr Price",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6929120"},addTags:{brand:"Mr Price","brand:wikidata":"Q6929120","brand:wikipedia":"en:Mr. Price",name:"Mr Price",shop:"clothes"},removeTags:{brand:"Mr Price","brand:wikidata":"Q6929120","brand:wikipedia":"en:Mr. Price",name:"Mr Price",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/NKD":{name:"NKD",icon:"maki-clothing-store",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/Naf Naf":{name:"Naf Naf",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3334188"},addTags:{brand:"Naf Naf","brand:wikidata":"Q3334188","brand:wikipedia":"fr:Naf Naf",name:"Naf Naf",shop:"clothes"},removeTags:{brand:"Naf Naf","brand:wikidata":"Q3334188","brand:wikipedia":"fr:Naf Naf",name:"Naf Naf",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/New Look":{name:"New Look",icon:"maki-clothing-store",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",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",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",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",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",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/Okaïdi":{name:"Okaïdi",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3350027"},addTags:{brand:"Okaïdi","brand:wikidata":"Q3350027","brand:wikipedia":"fr:Okaïdi",name:"Okaïdi",shop:"clothes"},removeTags:{brand:"Okaïdi","brand:wikidata":"Q3350027","brand:wikipedia":"fr:Okaïdi",name:"Okaïdi",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Old Navy":{name:"Old Navy",icon:"maki-clothing-store",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/Orchestra":{name:"Orchestra",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q28042940"},addTags:{brand:"Orchestra","brand:wikidata":"Q28042940","brand:wikipedia":"fr:Orchestra Prémaman",name:"Orchestra",shop:"clothes"},removeTags:{brand:"Orchestra","brand:wikidata":"Q28042940","brand:wikipedia":"fr:Orchestra Prémaman",name:"Orchestra",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Orsay":{name:"Orsay",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q883245"},addTags:{brand:"Orsay","brand:wikidata":"Q883245","brand:wikipedia":"de:Orsay (Modeunternehmen)",name:"Orsay",shop:"clothes"},removeTags:{brand:"Orsay","brand:wikidata":"Q883245","brand:wikipedia":"de:Orsay (Modeunternehmen)",name:"Orsay",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Outfit":{name:"Outfit",icon:"maki-clothing-store",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",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/Palmers":{name:"Palmers",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1509985"},addTags:{brand:"Palmers","brand:wikidata":"Q1509985","brand:wikipedia":"de:Palmers",name:"Palmers",shop:"clothes"},removeTags:{brand:"Palmers","brand:wikidata":"Q1509985","brand:wikipedia":"de:Palmers",name:"Palmers",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Peacocks":{name:"Peacocks",icon:"maki-clothing-store",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",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",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",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",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",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",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",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",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",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/Rainbow":{name:"Rainbow",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7284708"},addTags:{brand:"Rainbow","brand:wikidata":"Q7284708","brand:wikipedia":"en:Rainbow Shops",name:"Rainbow",shop:"clothes"},removeTags:{brand:"Rainbow","brand:wikidata":"Q7284708","brand:wikipedia":"en:Rainbow Shops",name:"Rainbow",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Reitmans":{name:"Reitmans",icon:"maki-clothing-store",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",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",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",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/Sisley":{name:"Sisley",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q12054325"},addTags:{brand:"Sisley","brand:wikidata":"Q12054325","brand:wikipedia":"cs:Sisley",name:"Sisley",shop:"clothes"},removeTags:{brand:"Sisley","brand:wikidata":"Q12054325","brand:wikipedia":"cs:Sisley",name:"Sisley",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Springfield":{name:"Springfield",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q958209"},addTags:{brand:"Springfield","brand:wikidata":"Q958209","brand:wikipedia":"es:Springfield (cadena de tiendas)",name:"Springfield",shop:"clothes"},removeTags:{brand:"Springfield","brand:wikidata":"Q958209","brand:wikipedia":"es:Springfield (cadena de tiendas)",name:"Springfield",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Stefanel":{name:"Stefanel",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2338087"},addTags:{brand:"Stefanel","brand:wikidata":"Q2338087","brand:wikipedia":"ro:Stefanel (companie)",name:"Stefanel",shop:"clothes"},removeTags:{brand:"Stefanel","brand:wikidata":"Q2338087","brand:wikipedia":"ro:Stefanel (companie)",name:"Stefanel",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Stradivarius":{name:"Stradivarius",icon:"maki-clothing-store",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",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",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",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",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",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",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",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/Tezenis":{name:"Tezenis",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q28056374"},addTags:{brand:"Tezenis","brand:wikidata":"Q28056374",name:"Tezenis",shop:"clothes"},removeTags:{brand:"Tezenis","brand:wikidata":"Q28056374",name:"Tezenis",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/The Children's Place":{name:"The Children's Place",icon:"maki-clothing-store",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",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/The Sting":{name:"The Sting",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2518794"},addTags:{brand:"The Sting","brand:wikidata":"Q2518794","brand:wikipedia":"nl:The Sting Companies",name:"The Sting",shop:"clothes"},removeTags:{brand:"The Sting","brand:wikidata":"Q2518794","brand:wikipedia":"nl:The Sting Companies",name:"The Sting",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Timberland":{name:"Timberland",icon:"maki-clothing-store",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",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",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",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",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/Triumph":{name:"Triumph",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q671216"},addTags:{brand:"Triumph","brand:wikidata":"Q671216","brand:wikipedia":"en:Triumph International",name:"Triumph",shop:"clothes"},removeTags:{brand:"Triumph","brand:wikidata":"Q671216","brand:wikipedia":"en:Triumph International",name:"Triumph",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Truworths":{name:"Truworths",icon:"maki-clothing-store",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",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",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",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",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/Vero Moda":{name:"Vero Moda",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q594721"},addTags:{brand:"Vero Moda","brand:wikidata":"Q594721","brand:wikipedia":"en:Bestseller (company)",name:"Vero Moda",shop:"clothes"},removeTags:{brand:"Vero Moda","brand:wikidata":"Q594721","brand:wikipedia":"en:Bestseller (company)",name:"Vero Moda",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Victoria's Secret":{name:"Victoria's Secret",icon:"maki-clothing-store",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",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",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",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",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",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",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/Yamamay":{name:"Yamamay",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2599214"},addTags:{brand:"Yamamay","brand:wikidata":"Q2599214","brand:wikipedia":"it:Yamamay",name:"Yamamay",shop:"clothes"},removeTags:{brand:"Yamamay","brand:wikidata":"Q2599214","brand:wikipedia":"it:Yamamay",name:"Yamamay",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Zara":{name:"Zara",icon:"maki-clothing-store",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",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",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/mister*lady":{name:"mister*lady",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q18640136"},addTags:{brand:"mister*lady","brand:wikidata":"Q18640136","brand:wikipedia":"de:mister*lady",name:"mister*lady",shop:"clothes"},removeTags:{brand:"mister*lady","brand:wikidata":"Q18640136","brand:wikipedia":"de:mister*lady",name:"mister*lady",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/rue21":{name:"rue21",icon:"maki-clothing-store",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",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",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7758173"},addTags:{brand:"しまむら","brand:wikidata":"Q7758173","brand:wikipedia":"ja:しまむら",name:"しまむら",shop:"clothes"},removeTags:{brand:"しまむら","brand:wikidata":"Q7758173","brand:wikipedia":"ja:しまむら",name:"しまむら",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/ユニクロ":{name:"ユニクロ",icon:"maki-clothing-store",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/clothes/ワークマン":{name:"ワークマン",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q11351660"},addTags:{brand:"ワークマン","brand:wikidata":"Q11351660","brand:wikipedia":"ja:ワークマン",name:"ワークマン",shop:"clothes"},removeTags:{brand:"ワークマン","brand:wikidata":"Q11351660","brand:wikipedia":"ja:ワークマン",name:"ワークマン",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/洋服の青山":{name:"洋服の青山",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q11661241"},addTags:{brand:"洋服の青山","brand:wikidata":"Q11661241","brand:wikipedia":"ja:青山商事",name:"洋服の青山",shop:"clothes"},removeTags:{brand:"洋服の青山","brand:wikidata":"Q11661241","brand:wikipedia":"ja:青山商事",name:"洋服の青山",shop:"clothes"},matchScore:2,suggestion:true},"shop/coffee/Nespresso":{name:"Nespresso",icon:"maki-shop",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",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",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-confectionery",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/Hussel":{name:"Hussel",icon:"maki-confectionery",geometry:["point","area"],tags:{shop:"confectionery","brand:wikidata":"Q17123688"},addTags:{brand:"Hussel","brand:wikidata":"Q17123688","brand:wikipedia":"de:Hussel",name:"Hussel",shop:"confectionery"},removeTags:{brand:"Hussel","brand:wikidata":"Q17123688","brand:wikipedia":"de:Hussel",name:"Hussel",shop:"confectionery"},matchScore:2,suggestion:true},"shop/confectionery/Thorntons":{name:"Thorntons",icon:"maki-confectionery",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/confectionery/Вацак":{name:"Вацак",icon:"maki-confectionery",geometry:["point","area"],tags:{shop:"confectionery","brand:wikidata":"Q30966576"},addTags:{brand:"Вацак","brand:wikidata":"Q30966576","brand:wikipedia":"uk:Кондитерський Дім «Вацак»",name:"Вацак",shop:"confectionery"},removeTags:{brand:"Вацак","brand:wikidata":"Q30966576","brand:wikipedia":"uk:Кондитерський Дім «Вацак»",name:"Вацак",shop:"confectionery"},matchScore:2,suggestion:true},"shop/confectionery/シャトレーゼ":{name:"シャトレーゼ",icon:"maki-confectionery",geometry:["point","area"],tags:{shop:"confectionery","brand:wikidata":"Q11307696"},addTags:{brand:"シャトレーゼ","brand:wikidata":"Q11307696","brand:wikipedia":"ja:シャトレーゼ",name:"シャトレーゼ",shop:"confectionery"},removeTags:{brand:"シャトレーゼ","brand:wikidata":"Q11307696","brand:wikipedia":"ja:シャトレーゼ",name:"シャトレーゼ",shop:"confectionery"},matchScore:2,suggestion:true},"shop/convenience/7-Eleven":{name:"7-Eleven",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q259340"},addTags:{brand:"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"7-Eleven",shop:"convenience"},removeTags:{brand:"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"7-Eleven",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/8 à Huit":{name:"8 à Huit",icon:"maki-shop",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",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/Aibė":{name:"Aibė",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1022952"},addTags:{brand:"Aibė","brand:wikidata":"Q1022952","brand:wikipedia":"de:Aibė",name:"Aibė",shop:"convenience"},removeTags:{brand:"Aibė","brand:wikidata":"Q1022952","brand:wikipedia":"de:Aibė",name:"Aibė",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Albert Heijn to go":{name:"Albert Heijn to go",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1653985"},addTags:{brand:"Albert Heijn to go","brand:wikidata":"Q1653985","brand:wikipedia":"en:Albert Heijn",name:"Albert Heijn to go",shop:"convenience"},removeTags:{brand:"Albert Heijn to go","brand:wikidata":"Q1653985","brand:wikipedia":"en:Albert Heijn",name:"Albert Heijn to go",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Alfamidi":{name:"Alfamidi",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q12471462"},addTags:{brand:"Alfamidi","brand:wikidata":"Q12471462","brand:wikipedia":"id:Alfamidi",name:"Alfamidi",shop:"convenience"},removeTags:{brand:"Alfamidi","brand:wikidata":"Q12471462","brand:wikipedia":"id:Alfamidi",name:"Alfamidi",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/BP Shop":{name:"BP Shop",icon:"maki-shop",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/Buc-ee's":{name:"Buc-ee's",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q4982335"},addTags:{brand:"Buc-ee's","brand:wikidata":"Q4982335","brand:wikipedia":"en:Buc-ee's",name:"Buc-ee's",shop:"convenience"},removeTags:{brand:"Buc-ee's","brand:wikidata":"Q4982335","brand:wikipedia":"en:Buc-ee's",name:"Buc-ee's",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/COOP Jednota":{name:"COOP Jednota",icon:"maki-shop",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/Circle K":{name:"Circle K",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q3268010"},addTags:{brand:"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"Circle K",shop:"convenience"},removeTags:{brand:"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"Circle K",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Co-op":{name:"Co-op",icon:"maki-shop",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/Coop Pronto":{name:"Coop Pronto",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1129777"},addTags:{brand:"Coop Pronto","brand:wikidata":"Q1129777","brand:wikipedia":"de:Coop Mineraloel",name:"Coop Pronto",shop:"convenience"},removeTags:{brand:"Coop Pronto","brand:wikidata":"Q1129777","brand:wikipedia":"de:Coop Mineraloel",name:"Coop Pronto",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/FamilyMart":{name:"FamilyMart",icon:"maki-shop",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/Four Square":{name:"Four Square",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q5475558"},addTags:{brand:"Four Square","brand:wikidata":"Q5475558","brand:wikipedia":"en:Four Square (supermarket)",name:"Four Square",shop:"convenience"},removeTags:{brand:"Four Square","brand:wikidata":"Q5475558","brand:wikipedia":"en:Four Square (supermarket)",name:"Four Square",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Hasty Market":{name:"Hasty Market",icon:"maki-shop",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",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/Jacksons":{name:"Jacksons",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q6117880"},addTags:{brand:"Jacksons","brand:wikidata":"Q6117880","brand:wikipedia":"en:Jacksons Stores",name:"Jacksons",shop:"convenience"},removeTags:{brand:"Jacksons","brand:wikidata":"Q6117880","brand:wikipedia":"en:Jacksons Stores",name:"Jacksons",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/K-Market":{name:"K-Market",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11868562"},addTags:{brand:"K-Market","brand:wikidata":"Q11868562","brand:wikipedia":"fi:K-Market",name:"K-Market",shop:"convenience"},removeTags:{brand:"K-Market","brand:wikidata":"Q11868562","brand:wikipedia":"fi:K-Market",name:"K-Market",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Kwik Trip":{name:"Kwik Trip",icon:"maki-shop",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",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/Mace":{name:"Mace",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q17089386"},addTags:{brand:"Mace","brand:wikidata":"Q17089386","brand:wikipedia":"en:Mace (shop)",name:"Mace",shop:"convenience"},removeTags:{brand:"Mace","brand:wikidata":"Q17089386","brand:wikipedia":"en:Mace (shop)",name:"Mace",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Marathon":{name:"Marathon",icon:"maki-shop",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",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",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/Migrolino":{name:"Migrolino",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q56745088"},addTags:{brand:"Migrolino","brand:wikidata":"Q56745088","brand:wikipedia":"de:Migrolino",name:"Migrolino",shop:"convenience"},removeTags:{brand:"Migrolino","brand:wikidata":"Q56745088","brand:wikipedia":"de:Migrolino",name:"Migrolino",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Ministop":{name:"Ministop",icon:"maki-shop",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",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/Nisa":{name:"Nisa",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q16999069"},addTags:{brand:"Nisa","brand:wikidata":"Q16999069","brand:wikipedia":"en:Nisa (retailer)",name:"Nisa",shop:"convenience"},removeTags:{brand:"Nisa","brand:wikidata":"Q16999069","brand:wikipedia":"en:Nisa (retailer)",name:"Nisa",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Nisa Local":{name:"Nisa Local",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q16999069"},addTags:{brand:"Nisa Local","brand:wikidata":"Q16999069","brand:wikipedia":"en:Nisa (retailer)",name:"Nisa Local",shop:"convenience"},removeTags:{brand:"Nisa Local","brand:wikidata":"Q16999069","brand:wikipedia":"en:Nisa (retailer)",name:"Nisa Local",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/OK便利商店":{name:"OK便利商店",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q3268010"},addTags:{brand:"OK便利商店","brand:en":"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"zh:OK便利店",name:"OK便利商店","name:en":"Circle K",shop:"convenience"},removeTags:{brand:"OK便利商店","brand:en":"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"zh:OK便利店",name:"OK便利商店","name:en":"Circle K",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/On the Run":{name:"On the Run",icon:"maki-shop",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",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",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/Premier":{name:"Premier",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q7240340"},addTags:{brand:"Premier","brand:wikidata":"Q7240340","brand:wikipedia":"en:Premier Stores",name:"Premier",shop:"convenience"},removeTags:{brand:"Premier","brand:wikidata":"Q7240340","brand:wikipedia":"en:Premier Stores",name:"Premier",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Sainsbury's Local":{name:"Sainsbury's Local",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q13218434"},addTags:{brand:"Sainsbury's Local","brand:wikidata":"Q13218434","brand:wikipedia":"en:Sainsbury's Local",name:"Sainsbury's Local",shop:"convenience"},removeTags:{brand:"Sainsbury's Local","brand:wikidata":"Q13218434","brand:wikipedia":"en:Sainsbury's Local",name:"Sainsbury's Local",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Sheetz":{name:"Sheetz",icon:"maki-shop",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",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/Siwa":{name:"Siwa",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11893827"},addTags:{brand:"Siwa","brand:wikidata":"Q11893827",name:"Siwa",shop:"convenience"},removeTags:{brand:"Siwa","brand:wikidata":"Q11893827",name:"Siwa",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Speedway":{name:"Speedway",icon:"maki-shop",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/Stripes":{name:"Stripes",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q7624135"},addTags:{brand:"Stripes","brand:wikidata":"Q7624135","brand:wikipedia":"en:Stripes Convenience Stores",name:"Stripes",shop:"convenience"},removeTags:{brand:"Stripes","brand:wikidata":"Q7624135","brand:wikipedia":"en:Stripes Convenience Stores",name:"Stripes",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/The Co-operative Food":{name:"The Co-operative Food",icon:"maki-shop",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",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",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q7887677"},addTags:{amenity:"ice_cream",brand:"United Dairy Farmers","brand:wikidata":"Q7887677","brand:wikipedia":"en:United Dairy Farmers",name:"United Dairy Farmers",shop:"convenience",short_name:"UDF"},removeTags:{amenity:"ice_cream",brand:"United Dairy Farmers","brand:wikidata":"Q7887677","brand:wikipedia":"en:United Dairy Farmers",name:"United Dairy Farmers",shop:"convenience",short_name:"UDF"},matchScore:2,suggestion:true},"shop/convenience/Utile":{name:"Utile",icon:"maki-shop",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/VinMart+":{name:"VinMart+",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q60245505"},addTags:{brand:"VinMart","brand:wikidata":"Q60245505","brand:wikipedia":"vi:VinMart",name:"VinMart+",shop:"convenience"},removeTags:{brand:"VinMart","brand:wikidata":"Q60245505","brand:wikipedia":"vi:VinMart",name:"VinMart+",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Wawa":{name:"Wawa",icon:"maki-shop",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/Weltladen":{name:"Weltladen",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1640782"},addTags:{brand:"Weltladen","brand:wikidata":"Q1640782","brand:wikipedia":"de:Weltladen",name:"Weltladen",shop:"convenience"},removeTags:{brand:"Weltladen","brand:wikidata":"Q1640782","brand:wikipedia":"de:Weltladen",name:"Weltladen",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Woolworths Petrol":{name:"Woolworths Petrol",icon:"maki-shop",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",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",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",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",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q57271676"},addTags:{brand:"ВкусВилл","brand:wikidata":"Q57271676","brand:wikipedia":"ru:ВкусВилл",name:"ВкусВилл",shop:"convenience"},removeTags:{brand:"ВкусВилл","brand:wikidata":"Q57271676","brand:wikipedia":"ru:ВкусВилл",name:"ВкусВилл",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Копейка":{name:"Копейка",icon:"maki-shop",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",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/Сельпо":{name:"Сельпо",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q4419434"},addTags:{brand:"Сельпо","brand:wikidata":"Q4419434","brand:wikipedia":"ru:Сильпо",name:"Сельпо",shop:"convenience"},removeTags:{brand:"Сельпо","brand:wikidata":"Q4419434","brand:wikipedia":"ru:Сильпо",name:"Сельпо",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/サンクス":{name:"サンクス",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q16141064"},addTags:{brand:"サンクス","brand:en":"Sunkus","brand:wikidata":"Q16141064","brand:wikipedia":"ja:サークルKサンクス",name:"サンクス","name:en":"Sunkus",shop:"convenience"},removeTags:{brand:"サンクス","brand:en":"Sunkus","brand:wikidata":"Q16141064","brand:wikipedia":"ja:サークルKサンクス",name:"サンクス","name:en":"Sunkus",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/サークルK":{name:"サークルK",icon:"maki-shop",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",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11313419"},addTags:{brand:"スリーエフ","brand:en":"Three F","brand:wikidata":"Q11313419","brand:wikipedia":"ja:スリーエフ",name:"スリーエフ","name:en":"Three F",shop:"convenience"},removeTags:{brand:"スリーエフ","brand:en":"Three F","brand:wikidata":"Q11313419","brand:wikipedia":"ja:スリーエフ",name:"スリーエフ","name:en":"Three F",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/セイコーマート":{name:"セイコーマート",icon:"maki-shop",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",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",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",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",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",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",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",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",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",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",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",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q10891564"},addTags:{brand:"全家便利商店","brand:wikidata":"Q10891564","brand:wikipedia":"zh:全家便利商店",name:"全家便利商店",shop:"convenience"},removeTags:{brand:"全家便利商店","brand:wikidata":"Q10891564","brand:wikipedia":"zh:全家便利商店",name:"全家便利商店",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/萊爾富":{name:"萊爾富",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11326216"},addTags:{brand:"萊爾富","brand:wikidata":"Q11326216","brand:wikipedia":"zh:萊爾富",name:"萊爾富",shop:"convenience"},removeTags:{brand:"萊爾富","brand:wikidata":"Q11326216","brand:wikipedia":"zh:萊爾富",name:"萊爾富",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/세븐일레븐":{name:"세븐일레븐",icon:"maki-shop",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/copyshop/FedEx Office":{name:"FedEx Office",icon:"maki-shop",geometry:["point","area"],tags:{shop:"copyshop","brand:wikidata":"Q474379"},addTags:{brand:"FedEx Office","brand:wikidata":"Q474379","brand:wikipedia":"en:FedEx Office",name:"FedEx Office",shop:"copyshop"},removeTags:{brand:"FedEx Office","brand:wikidata":"Q474379","brand:wikipedia":"en:FedEx Office",name:"FedEx Office",shop:"copyshop"},matchScore:2,suggestion:true},"shop/cosmetics/KIKO Milano":{name:"KIKO Milano",icon:"maki-shop",geometry:["point","area"],tags:{shop:"cosmetics","brand:wikidata":"Q3812045"},addTags:{brand:"KIKO Milano","brand:wikidata":"Q3812045","brand:wikipedia":"it:KIKO",name:"KIKO Milano",shop:"cosmetics"},removeTags:{brand:"KIKO Milano","brand:wikidata":"Q3812045","brand:wikipedia":"it:KIKO",name:"KIKO Milano",shop:"cosmetics"},matchScore:2,suggestion:true},"shop/cosmetics/Lush":{name:"Lush",icon:"maki-shop",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/Nocibé":{name:"Nocibé",icon:"maki-shop",geometry:["point","area"],tags:{shop:"cosmetics","brand:wikidata":"Q3342592"},addTags:{brand:"Nocibé","brand:wikidata":"Q3342592","brand:wikipedia":"fr:Nocibé",name:"Nocibé",shop:"cosmetics"},removeTags:{brand:"Nocibé","brand:wikidata":"Q3342592","brand:wikipedia":"fr:Nocibé",name:"Nocibé",shop:"cosmetics"},matchScore:2,suggestion:true},"shop/cosmetics/Sephora":{name:"Sephora",icon:"maki-shop",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",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",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",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",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",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",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/Hobbycraft":{name:"Hobbycraft",icon:"maki-shop",geometry:["point","area"],tags:{shop:"craft","brand:wikidata":"Q16984508"},addTags:{brand:"Hobbycraft","brand:wikidata":"Q16984508","brand:wikipedia":"en:Hobbycraft",name:"Hobbycraft",shop:"craft"},removeTags:{brand:"Hobbycraft","brand:wikidata":"Q16984508","brand:wikipedia":"en:Hobbycraft",name:"Hobbycraft",shop:"craft"},matchScore:2,suggestion:true},"shop/craft/Jo-Ann":{name:"Jo-Ann",icon:"maki-shop",geometry:["point","area"],tags:{shop:"craft","brand:wikidata":"Q6203968"},addTags:{brand:"Jo-Ann","brand:wikidata":"Q6203968","brand:wikipedia":"en:Jo-Ann Stores",name:"Jo-Ann",shop:"craft"},removeTags:{brand:"Jo-Ann","brand:wikidata":"Q6203968","brand:wikipedia":"en:Jo-Ann Stores",name:"Jo-Ann",shop:"craft"},matchScore:2,suggestion:true},"shop/craft/Michaels":{name:"Michaels",icon:"maki-shop",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",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",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",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",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",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",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",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",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/Falabella":{name:"Falabella",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q5135229"},addTags:{brand:"Falabella","brand:wikidata":"Q5135229","brand:wikipedia":"en:Falabella (retail store)",name:"Falabella",shop:"department_store"},removeTags:{brand:"Falabella","brand:wikidata":"Q5135229","brand:wikipedia":"en:Falabella (retail store)",name:"Falabella",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Galeria Kaufhof":{name:"Galeria Kaufhof",icon:"maki-shop",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",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",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",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",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",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 (Australia)":{name:"Kmart (Australia)",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q6421682"},addTags:{brand:"Kmart","brand:wikidata":"Q6421682","brand:wikipedia":"en:Kmart Australia",name:"Kmart",shop:"department_store"},removeTags:{brand:"Kmart","brand:wikidata":"Q6421682","brand:wikipedia":"en:Kmart Australia",name:"Kmart",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Kmart (USA)":{name:"Kmart (USA)",icon:"maki-shop",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",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",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",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",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",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",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/Neiman Marcus":{name:"Neiman Marcus",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q743497"},addTags:{brand:"Neiman Marcus","brand:wikidata":"Q743497","brand:wikipedia":"en:Neiman Marcus",name:"Neiman Marcus",shop:"department_store"},removeTags:{brand:"Neiman Marcus","brand:wikidata":"Q743497","brand:wikipedia":"en:Neiman Marcus",name:"Neiman Marcus",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Nordstrom":{name:"Nordstrom",icon:"maki-shop",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/Ripley":{name:"Ripley",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q3433040"},addTags:{brand:"Ripley","brand:wikidata":"Q3433040","brand:wikipedia":"en:Ripley S.A.",name:"Ripley",shop:"department_store"},removeTags:{brand:"Ripley","brand:wikidata":"Q3433040","brand:wikipedia":"en:Ripley S.A.",name:"Ripley",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Saks Fifth Avenue":{name:"Saks Fifth Avenue",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q2723882"},addTags:{brand:"Saks Fifth Avenue","brand:wikidata":"Q2723882","brand:wikipedia":"en:Saks Fifth Avenue",name:"Saks Fifth Avenue",shop:"department_store"},removeTags:{brand:"Saks Fifth Avenue","brand:wikidata":"Q2723882","brand:wikipedia":"en:Saks Fifth Avenue",name:"Saks Fifth Avenue",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Saks Off 5th":{name:"Saks Off 5th",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q2723882"},addTags:{brand:"Saks Off 5th","brand:wikidata":"Q2723882","brand:wikipedia":"en:Saks Fifth Avenue",name:"Saks Off 5th",shop:"department_store"},removeTags:{brand:"Saks Off 5th","brand:wikidata":"Q2723882","brand:wikipedia":"en:Saks Fifth Avenue",name:"Saks Off 5th",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Sears":{name:"Sears",icon:"maki-shop",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",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",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",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",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",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",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",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",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",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",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",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",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",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/Bricoman":{name:"Bricoman",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2925142"},addTags:{brand:"Bricoman","brand:wikidata":"Q2925142","brand:wikipedia":"it:Bricoman",name:"Bricoman",shop:"doityourself"},removeTags:{brand:"Bricoman","brand:wikidata":"Q2925142","brand:wikipedia":"it:Bricoman",name:"Bricoman",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Bricomarché":{name:"Bricomarché",icon:"temaki-tools",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",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",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",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",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/Easy":{name:"Easy",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q5331091"},addTags:{brand:"Easy","brand:wikidata":"Q5331091","brand:wikipedia":"en:Easy (store)",name:"Easy",shop:"doityourself"},removeTags:{brand:"Easy","brand:wikidata":"Q5331091","brand:wikipedia":"en:Easy (store)",name:"Easy",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Gamma":{name:"Gamma",icon:"temaki-tools",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",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",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",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",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",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",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",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",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",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",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/Lagerhaus":{name:"Lagerhaus",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q10553211"},addTags:{brand:"Lagerhaus","brand:wikidata":"Q10553211","brand:wikipedia":"sv:Lagerhaus",name:"Lagerhaus",shop:"doityourself"},removeTags:{brand:"Lagerhaus","brand:wikidata":"Q10553211","brand:wikipedia":"sv:Lagerhaus",name:"Lagerhaus",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Leroy Merlin":{name:"Leroy Merlin",icon:"temaki-tools",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",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",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",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",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/Point P":{name:"Point P",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q3393350"},addTags:{brand:"Point P","brand:wikidata":"Q3393350","brand:wikipedia":"fr:Saint-Gobain Distribution Bâtiment France",name:"Point P",shop:"doityourself"},removeTags:{brand:"Point P","brand:wikidata":"Q3393350","brand:wikipedia":"fr:Saint-Gobain Distribution Bâtiment France",name:"Point P",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Praktiker":{name:"Praktiker",icon:"temaki-tools",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/Praxis":{name:"Praxis",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2741995"},addTags:{brand:"Praxis","brand:wikidata":"Q2741995","brand:wikipedia":"nl:Praxis (winkel)",name:"Praxis",shop:"doityourself"},removeTags:{brand:"Praxis","brand:wikidata":"Q2741995","brand:wikipedia":"nl:Praxis (winkel)",name:"Praxis",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Rona":{name:"Rona",icon:"temaki-tools",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",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/Sonderpreis Baumarkt":{name:"Sonderpreis Baumarkt",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q811530"},addTags:{brand:"Sonderpreis Baumarkt","brand:wikidata":"Q811530","brand:wikipedia":"de:Baumarkt",name:"Sonderpreis Baumarkt",shop:"doityourself"},removeTags:{brand:"Sonderpreis Baumarkt","brand:wikidata":"Q811530","brand:wikipedia":"de:Baumarkt",name:"Sonderpreis Baumarkt",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Tekzen":{name:"Tekzen",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q25475379"},addTags:{brand:"Tekzen","brand:wikidata":"Q25475379","brand:wikipedia":"tr:Tekzen",name:"Tekzen",shop:"doityourself"},removeTags:{brand:"Tekzen","brand:wikidata":"Q25475379","brand:wikipedia":"tr:Tekzen",name:"Tekzen",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Toom Baumarkt":{name:"Toom Baumarkt",icon:"temaki-tools",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",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/Weldom":{name:"Weldom",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q16683226"},addTags:{brand:"Weldom","brand:wikidata":"Q16683226","brand:wikipedia":"fr:Weldom",name:"Weldom",shop:"doityourself"},removeTags:{brand:"Weldom","brand:wikidata":"Q16683226","brand:wikipedia":"fr:Weldom",name:"Weldom",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Wickes":{name:"Wickes",icon:"temaki-tools",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/jem & fix":{name:"jem & fix",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q12319200"},addTags:{brand:"jem & fix","brand:wikidata":"Q12319200","brand:wikipedia":"da:jem & fix",name:"jem & fix",shop:"doityourself"},removeTags:{brand:"jem & fix","brand:wikidata":"Q12319200","brand:wikipedia":"da:jem & fix",name:"jem & fix",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Леруа Мерлен":{name:"Леруа Мерлен",icon:"temaki-tools",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",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q11293852"},addTags:{brand:"カインズホーム","brand:en":"Cainz Home","brand:wikidata":"Q11293852","brand:wikipedia":"ja:カインズ",name:"カインズホーム","name:en":"Cainz Home",shop:"doityourself"},removeTags:{brand:"カインズホーム","brand:en":"Cainz Home","brand:wikidata":"Q11293852","brand:wikipedia":"ja:カインズ",name:"カインズホーム","name:en":"Cainz Home",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/コメリ":{name:"コメリ",icon:"temaki-tools",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",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/dry_cleaning/ホワイト急便":{name:"ホワイト急便",icon:"maki-shop",geometry:["point","area"],tags:{shop:"dry_cleaning","brand:wikidata":"Q11505557"},addTags:{brand:"ホワイト急便","brand:en":"White Kyuubin","brand:wikidata":"Q11505557","brand:wikipedia":"ja:日本さわやかグループ",name:"ホワイト急便","name:en":"White Kyuubin",shop:"dry_cleaning"},removeTags:{brand:"ホワイト急便","brand:en":"White Kyuubin","brand:wikidata":"Q11505557","brand:wikipedia":"ja:日本さわやかグループ",name:"ホワイト急便","name:en":"White Kyuubin",shop:"dry_cleaning"},matchScore:2,suggestion:true},"shop/dry_cleaning/白洋舎":{name:"白洋舎",icon:"maki-shop",geometry:["point","area"],tags:{shop:"dry_cleaning","brand:wikidata":"Q11579995"},addTags:{brand:"白洋舎","brand:en":"Hakuyosha","brand:wikidata":"Q11579995","brand:wikipedia":"ja:白洋舎",name:"白洋舎","name:en":"Hakuyosha",shop:"dry_cleaning"},removeTags:{brand:"白洋舎","brand:en":"Hakuyosha","brand:wikidata":"Q11579995","brand:wikipedia":"ja:白洋舎",name:"白洋舎","name:en":"Hakuyosha",shop:"dry_cleaning"},matchScore:2,suggestion:true},"shop/electronics/Apple Store":{name:"Apple Store",icon:"maki-shop",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",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",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",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/CeX":{name:"CeX",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q5055676"},addTags:{brand:"CeX","brand:wikidata":"Q5055676","brand:wikipedia":"en:CeX (company)",name:"CeX",shop:"electronics"},removeTags:{brand:"CeX","brand:wikidata":"Q5055676","brand:wikipedia":"en:CeX (company)",name:"CeX",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Currys":{name:"Currys",icon:"maki-shop",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",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",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",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",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",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",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",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/JB Hi-Fi":{name:"JB Hi-Fi",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q3310113"},addTags:{brand:"JB Hi-Fi","brand:wikidata":"Q3310113","brand:wikipedia":"en:JB Hi-Fi",name:"JB Hi-Fi",shop:"electronics"},removeTags:{brand:"JB Hi-Fi","brand:wikidata":"Q3310113","brand:wikipedia":"en:JB Hi-Fi",name:"JB Hi-Fi",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Kjell & Company":{name:"Kjell & Company",icon:"maki-shop",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",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/La Curacao":{name:"La Curacao",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q5194599"},addTags:{brand:"La Curacao","brand:wikidata":"Q5194599","brand:wikipedia":"en:Curacao (retail store)",name:"La Curacao",shop:"electronics"},removeTags:{brand:"La Curacao","brand:wikidata":"Q5194599","brand:wikipedia":"en:Curacao (retail store)",name:"La Curacao",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Maplin":{name:"Maplin",icon:"maki-shop",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 Expert":{name:"Media Expert",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q11776794"},addTags:{brand:"Media Expert","brand:wikidata":"Q11776794","brand:wikipedia":"pl:Media Expert",name:"Media Expert",shop:"electronics"},removeTags:{brand:"Media Expert","brand:wikidata":"Q11776794","brand:wikipedia":"pl:Media Expert",name:"Media Expert",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Media Markt":{name:"Media Markt",icon:"maki-shop",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",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",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",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",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",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",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",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",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/The Source":{name:"The Source",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q3212934"},addTags:{brand:"The Source","brand:wikidata":"Q3212934","brand:wikipedia":"en:The Source (retailer)",name:"The Source",shop:"electronics"},removeTags:{brand:"The Source","brand:wikidata":"Q3212934","brand:wikipedia":"en:The Source (retailer)",name:"The Source",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Unieuro":{name:"Unieuro",icon:"maki-shop",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",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",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",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q16721578"},addTags:{brand:"Фокстрот","brand:wikidata":"Q16721578","brand:wikipedia":"uk:Фокстрот (торгова мережа)",name:"Фокстрот",shop:"electronics"},removeTags:{brand:"Фокстрот","brand:wikidata":"Q16721578","brand:wikipedia":"uk:Фокстрот (торгова мережа)",name:"Фокстрот",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Эльдорадо":{name:"Эльдорадо",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q4531492"},addTags:{brand:"Эльдорадо","brand:wikidata":"Q4531492","brand:wikipedia":"ru:Эльдорадо (сеть магазинов)",name:"Эльдорадо",shop:"electronics"},removeTags:{brand:"Эльдорадо","brand:wikidata":"Q4531492","brand:wikipedia":"ru:Эльдорадо (сеть магазинов)",name:"Эльдорадо",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/エディオン":{name:"エディオン",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q11290252"},addTags:{brand:"エディオン","brand:en":"EDION","brand:wikidata":"Q11290252","brand:wikipedia":"ja:エディオン",name:"エディオン","name:en":"EDION",shop:"electronics"},removeTags:{brand:"エディオン","brand:en":"EDION","brand:wikidata":"Q11290252","brand:wikipedia":"ja:エディオン",name:"エディオン","name:en":"EDION",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/ケーズデンキ":{name:"ケーズデンキ",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q6322472"},addTags:{brand:"ケーズデンキ","brand:en":"K's Denki","brand:wikidata":"Q6322472","brand:wikipedia":"ja:ケーズホールディングス",name:"ケーズデンキ","name:en":"K's Denki",shop:"electronics"},removeTags:{brand:"ケーズデンキ","brand:en":"K's Denki","brand:wikidata":"Q6322472","brand:wikipedia":"ja:ケーズホールディングス",name:"ケーズデンキ","name:en":"K's Denki",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/コジマ":{name:"コジマ",icon:"maki-shop",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",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",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",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",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",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",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",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",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/florist/Monceau Fleurs":{name:"Monceau Fleurs",icon:"maki-florist",geometry:["point","area"],tags:{shop:"florist","brand:wikidata":"Q17629431"},addTags:{brand:"Monceau Fleurs","brand:wikidata":"Q17629431","brand:wikipedia":"fr:Emova Group",name:"Monceau Fleurs",shop:"florist"},removeTags:{brand:"Monceau Fleurs","brand:wikidata":"Q17629431","brand:wikipedia":"fr:Emova Group",name:"Monceau Fleurs",shop:"florist"},matchScore:2,suggestion:true},"shop/frozen_food/Picard":{name:"Picard",icon:"maki-shop",geometry:["point","area"],tags:{shop:"frozen_food","brand:wikidata":"Q3382454"},addTags:{brand:"Picard","brand:wikidata":"Q3382454","brand:wikipedia":"en:Picard Surgelés",name:"Picard",shop:"frozen_food"},removeTags:{brand:"Picard","brand:wikidata":"Q3382454","brand:wikipedia":"en:Picard Surgelés",name:"Picard",shop:"frozen_food"},matchScore:2,suggestion:true},"shop/funeral_directors/The Co-operative Funeralcare":{name:"The Co-operative Funeralcare",icon:"maki-cemetery",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",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",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",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",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",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",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",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/Fly":{name:"Fly",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q1389184"},addTags:{brand:"Fly","brand:wikidata":"Q1389184","brand:wikipedia":"fr:Fly (entreprise)",name:"Fly",shop:"furniture"},removeTags:{brand:"Fly","brand:wikidata":"Q1389184","brand:wikipedia":"fr:Fly (entreprise)",name:"Fly",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Harveys":{name:"Harveys",icon:"fas-couch",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/Havertys":{name:"Havertys",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q5683881"},addTags:{brand:"Havertys","brand:wikidata":"Q5683881","brand:wikipedia":"en:Havertys",name:"Havertys",shop:"furniture"},removeTags:{brand:"Havertys","brand:wikidata":"Q5683881","brand:wikipedia":"en:Havertys",name:"Havertys",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/IKEA":{name:"IKEA",icon:"fas-couch",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",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/La-Z-Boy":{name:"La-Z-Boy",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q6391583"},addTags:{brand:"La-Z-Boy","brand:wikidata":"Q6391583","brand:wikipedia":"en:La-Z-Boy",name:"La-Z-Boy",shop:"furniture"},removeTags:{brand:"La-Z-Boy","brand:wikidata":"Q6391583","brand:wikipedia":"en:La-Z-Boy",name:"La-Z-Boy",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Rent-A-Center":{name:"Rent-A-Center",icon:"fas-couch",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/Roller":{name:"Roller",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q1621286"},addTags:{brand:"Roller","brand:wikidata":"Q1621286","brand:wikipedia":"de:Roller (Möbelhaus)",name:"Roller",shop:"furniture"},removeTags:{brand:"Roller","brand:wikidata":"Q1621286","brand:wikipedia":"de:Roller (Möbelhaus)",name:"Roller",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Rooms To Go":{name:"Rooms To Go",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q7366329"},addTags:{brand:"Rooms To Go","brand:wikidata":"Q7366329","brand:wikipedia":"en:Rooms To Go",name:"Rooms To Go",shop:"furniture"},removeTags:{brand:"Rooms To Go","brand:wikidata":"Q7366329","brand:wikipedia":"en:Rooms To Go",name:"Rooms To Go",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/ScS":{name:"ScS",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q19654399"},addTags:{brand:"ScS","brand:wikidata":"Q19654399","brand:wikipedia":"en:ScS",name:"ScS",shop:"furniture"},removeTags:{brand:"ScS","brand:wikidata":"Q19654399","brand:wikipedia":"en:ScS",name:"ScS",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/The Brick":{name:"The Brick",icon:"fas-couch",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",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/Dehner":{name:"Dehner",icon:"maki-garden-centre",geometry:["point","area"],tags:{shop:"garden_centre","brand:wikidata":"Q1183029"},addTags:{brand:"Dehner","brand:wikidata":"Q1183029","brand:wikipedia":"de:Dehner",name:"Dehner",shop:"garden_centre"},removeTags:{brand:"Dehner","brand:wikidata":"Q1183029","brand:wikipedia":"de:Dehner",name:"Dehner",shop:"garden_centre"},matchScore:2,suggestion:true},"shop/garden_centre/Gamm Vert":{name:"Gamm Vert",icon:"maki-garden-centre",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-centre",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-centre",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",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",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",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/greengrocer/Produce Junction":{name:"Produce Junction",icon:"maki-shop",geometry:["point","area"],tags:{shop:"greengrocer","brand:wikidata":"Q60583541"},addTags:{brand:"Produce Junction","brand:wikidata":"Q60583541",name:"Produce Junction",shop:"greengrocer"},removeTags:{brand:"Produce Junction","brand:wikidata":"Q60583541",name:"Produce Junction",shop:"greengrocer"},matchScore:2,suggestion:true},"shop/hairdresser_supply/Sally Beauty Supply":{name:"Sally Beauty Supply",icon:"maki-shop",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:"temaki-beauty_salon",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:"temaki-beauty_salon",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:"temaki-beauty_salon",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:"temaki-beauty_salon",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:"temaki-beauty_salon",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:"temaki-beauty_salon",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:"temaki-beauty_salon",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/Klipp":{name:"Klipp",icon:"temaki-beauty_salon",geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q1737304"},addTags:{brand:"Klipp","brand:wikidata":"Q1737304","brand:wikipedia":"de:Klipp Frisör",name:"Klipp",shop:"hairdresser"},removeTags:{brand:"Klipp","brand:wikidata":"Q1737304","brand:wikipedia":"de:Klipp Frisör",name:"Klipp",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Sport Clips":{name:"Sport Clips",icon:"temaki-beauty_salon",geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q7579310"},addTags:{brand:"Sport Clips","brand:wikidata":"Q7579310",name:"Sport Clips",shop:"hairdresser"},removeTags:{brand:"Sport Clips","brand:wikidata":"Q7579310",name:"Sport Clips",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Supercuts":{name:"Supercuts",icon:"temaki-beauty_salon",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:"temaki-beauty_salon",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",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",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",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",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/Audika":{name:"Audika",icon:"maki-shop",geometry:["point","area"],tags:{shop:"hearing_aids","brand:wikidata":"Q2870745"},addTags:{brand:"Audika","brand:wikidata":"Q2870745","brand:wikipedia":"fr:Audika",name:"Audika",shop:"hearing_aids"},removeTags:{brand:"Audika","brand:wikidata":"Q2870745","brand:wikipedia":"fr:Audika",name:"Audika",shop:"hearing_aids"},matchScore:2,suggestion:true},"shop/hearing_aids/Geers":{name:"Geers",icon:"maki-shop",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",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/hearing_aids/Neuroth":{name:"Neuroth",icon:"maki-shop",geometry:["point","area"],tags:{shop:"hearing_aids","brand:wikidata":"Q15836645"},addTags:{brand:"Neuroth","brand:wikidata":"Q15836645",name:"Neuroth",shop:"hearing_aids"},removeTags:{brand:"Neuroth","brand:wikidata":"Q15836645",name:"Neuroth",shop:"hearing_aids"},matchScore:2,suggestion:true},"shop/hifi/Bang & Olufsen":{name:"Bang & Olufsen",icon:"maki-shop",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",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",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",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",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/Marskramer":{name:"Marskramer",icon:"fas-blender",geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q2305917"},addTags:{brand:"Marskramer","brand:wikidata":"Q2305917","brand:wikipedia":"nl:Marskramer (warenhuis)",name:"Marskramer",shop:"houseware"},removeTags:{brand:"Marskramer","brand:wikidata":"Q2305917","brand:wikipedia":"nl:Marskramer (warenhuis)",name:"Marskramer",shop:"houseware"},matchScore:2,suggestion:true},"shop/houseware/WMF":{name:"WMF",icon:"fas-blender",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/houseware/Xenos":{name:"Xenos",icon:"fas-blender",geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q16547960"},addTags:{brand:"Xenos","brand:wikidata":"Q16547960","brand:wikipedia":"nl:Xenos",name:"Xenos",shop:"houseware"},removeTags:{brand:"Xenos","brand:wikidata":"Q16547960","brand:wikipedia":"nl:Xenos",name:"Xenos",shop:"houseware"},matchScore:2,suggestion:true},"shop/interior_decoration/Depot":{name:"Depot",icon:"maki-shop",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",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",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",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",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",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",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",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/H Samuel":{name:"H Samuel",icon:"maki-jewelry-store",geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q5628558"},addTags:{brand:"H Samuel","brand:wikidata":"Q5628558","brand:wikipedia":"en:H. Samuel",name:"H Samuel",shop:"jewelry"},removeTags:{brand:"H Samuel","brand:wikidata":"Q5628558","brand:wikipedia":"en:H. Samuel",name:"H Samuel",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/James Avery Jewelry":{name:"James Avery Jewelry",icon:"maki-jewelry-store",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",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",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",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/Lietuvos spauda":{name:"Lietuvos spauda",icon:"maki-shop",geometry:["point","area"],tags:{shop:"kiosk","brand:wikidata":"Q6514414"},addTags:{brand:"Lietuvos spauda","brand:wikidata":"Q6514414","brand:wikipedia":"lt:Lietuvos spauda",name:"Lietuvos spauda",shop:"kiosk"},removeTags:{brand:"Lietuvos spauda","brand:wikidata":"Q6514414","brand:wikipedia":"lt:Lietuvos spauda",name:"Lietuvos spauda",shop:"kiosk"},matchScore:2,suggestion:true},"shop/kiosk/Narvesen":{name:"Narvesen",icon:"maki-shop",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",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",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",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/kiosk/k kiosk":{name:"k kiosk",icon:"maki-shop",geometry:["point","area"],tags:{shop:"kiosk","brand:wikidata":"Q60381703"},addTags:{brand:"k kiosk","brand:wikidata":"Q60381703","brand:wikipedia":"it:K Kiosk",name:"k kiosk",shop:"kiosk"},removeTags:{brand:"k kiosk","brand:wikidata":"Q60381703","brand:wikipedia":"it:K Kiosk",name:"k kiosk",shop:"kiosk"},matchScore:2,suggestion:true},"shop/kitchen/Cuisinella":{name:"Cuisinella",icon:"maki-shop",geometry:["point","area"],tags:{shop:"kitchen","brand:wikidata":"Q3007012"},addTags:{brand:"Cuisinella","brand:wikidata":"Q3007012","brand:wikipedia":"fr:Cuisinella",name:"Cuisinella",shop:"kitchen"},removeTags:{brand:"Cuisinella","brand:wikidata":"Q3007012","brand:wikipedia":"fr:Cuisinella",name:"Cuisinella",shop:"kitchen"},matchScore:2,suggestion:true},"shop/kitchen/Schmidt":{name:"Schmidt",icon:"maki-shop",geometry:["point","area"],tags:{shop:"kitchen","brand:wikidata":"Q3487620"},addTags:{brand:"Schmidt","brand:wikidata":"Q3487620","brand:wikipedia":"de:Schmidt Groupe",name:"Schmidt",shop:"kitchen"},removeTags:{brand:"Schmidt","brand:wikidata":"Q3487620","brand:wikipedia":"de:Schmidt Groupe",name:"Schmidt",shop:"kitchen"},matchScore:2,suggestion:true},"shop/massage/Massage Envy":{name:"Massage Envy",icon:"temaki-spa",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/3 Store":{name:"3 Store",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q407009"},addTags:{brand:"3 Store","brand:wikidata":"Q407009","brand:wikipedia":"en:3 (telecommunications)",name:"3 Store",shop:"mobile_phone"},removeTags:{brand:"3 Store","brand:wikidata":"Q407009","brand:wikipedia":"en:3 (telecommunications)",name:"3 Store",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/AT&T":{name:"AT&T",icon:"maki-mobile-phone",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",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",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",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/Claro":{name:"Claro",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q1770208"},addTags:{brand:"Claro","brand:wikidata":"Q1770208","brand:wikipedia":"en:Claro (company)",name:"Claro",shop:"mobile_phone"},removeTags:{brand:"Claro","brand:wikidata":"Q1770208","brand:wikipedia":"en:Claro (company)",name:"Claro",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Cricket Wireless":{name:"Cricket Wireless",icon:"maki-mobile-phone",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",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",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",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/MTN":{name:"MTN",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q1813361"},addTags:{brand:"MTN","brand:wikidata":"Q1813361","brand:wikipedia":"en:MTN Group",name:"MTN",shop:"mobile_phone"},removeTags:{brand:"MTN","brand:wikidata":"Q1813361","brand:wikipedia":"en:MTN Group",name:"MTN",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/MetroPCS":{name:"MetroPCS",icon:"maki-mobile-phone",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",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/Moov":{name:"Moov",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q3323637"},addTags:{brand:"Moov","brand:wikidata":"Q3323637","brand:wikipedia":"fr:Moov Côte d'Ivoire",name:"Moov",shop:"mobile_phone"},removeTags:{brand:"Moov","brand:wikidata":"Q3323637","brand:wikipedia":"fr:Moov Côte d'Ivoire",name:"Moov",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Movistar":{name:"Movistar",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q967735"},addTags:{brand:"Movistar","brand:wikidata":"Q967735","brand:wikipedia":"en:Movistar",name:"Movistar",shop:"mobile_phone"},removeTags:{brand:"Movistar","brand:wikidata":"Q967735","brand:wikipedia":"en:Movistar",name:"Movistar",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/O2":{name:"O2",icon:"maki-mobile-phone",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/Orange":{name:"Orange",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q1431486"},addTags:{brand:"Orange","brand:wikidata":"Q1431486","brand:wikipedia":"fr:Orange S.A.",name:"Orange",shop:"mobile_phone"},removeTags:{brand:"Orange","brand:wikidata":"Q1431486","brand:wikipedia":"fr:Orange S.A.",name:"Orange",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Phone House":{name:"Phone House",icon:"maki-mobile-phone",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",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",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",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",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",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",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",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",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",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",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",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/Telstra":{name:"Telstra",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q721162"},addTags:{brand:"Telstra","brand:wikidata":"Q721162","brand:wikipedia":"en:Telstra",name:"Telstra",shop:"mobile_phone"},removeTags:{brand:"Telstra","brand:wikidata":"Q721162","brand:wikipedia":"en:Telstra",name:"Telstra",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Telus":{name:"Telus",icon:"maki-mobile-phone",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",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",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",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",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",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/Wind":{name:"Wind",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q650467"},addTags:{brand:"Wind","brand:wikidata":"Q650467","brand:wikipedia":"en:WIND (Italy)",name:"Wind",shop:"mobile_phone"},removeTags:{brand:"Wind","brand:wikidata":"Q650467","brand:wikipedia":"en:WIND (Italy)",name:"Wind",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Yoigo":{name:"Yoigo",icon:"maki-mobile-phone",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",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",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q18683057"},addTags:{brand:"Алло","brand:wikidata":"Q18683057","brand:wikipedia":"uk:Алло (торгова мережа)",name:"Алло",shop:"mobile_phone"},removeTags:{brand:"Алло","brand:wikidata":"Q18683057","brand:wikipedia":"uk:Алло (торгова мережа)",name:"Алло",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Билайн":{name:"Билайн",icon:"maki-mobile-phone",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",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",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",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",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",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",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",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",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/mobile_phone/ドコモショップ":{name:"ドコモショップ",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q853958"},addTags:{brand:"ドコモショップ","brand:en":"DoCoMo Shop","brand:wikidata":"Q853958","brand:wikipedia":"ja:NTTドコモ",name:"ドコモショップ","name:en":"DoCoMo Shop",shop:"mobile_phone"},removeTags:{brand:"ドコモショップ","brand:en":"DoCoMo Shop","brand:wikidata":"Q853958","brand:wikipedia":"ja:NTTドコモ",name:"ドコモショップ","name:en":"DoCoMo Shop",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/money_lender/Money Mart":{name:"Money Mart",icon:"maki-bank",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",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",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",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",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",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",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",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",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",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/Kolporter":{name:"Kolporter",icon:"maki-shop",geometry:["point","area"],tags:{shop:"newsagent","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/newsagent/読売新聞":{name:"読売新聞",icon:"maki-shop",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",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",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",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",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",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",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/Grand Optical":{name:"Grand Optical",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q3113677"},addTags:{brand:"Grand Optical","brand:wikidata":"Q3113677","brand:wikipedia":"fr:Grand Optical",name:"Grand Optical",shop:"optician"},removeTags:{brand:"Grand Optical","brand:wikidata":"Q3113677","brand:wikipedia":"fr:Grand Optical",name:"Grand Optical",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Hakim Optical":{name:"Hakim Optical",icon:"maki-optician",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/Hans Anders":{name:"Hans Anders",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q1884976"},addTags:{brand:"Hans Anders","brand:wikidata":"Q1884976","brand:wikipedia":"nl:Hans Anders",name:"Hans Anders",shop:"optician"},removeTags:{brand:"Hans Anders","brand:wikidata":"Q1884976","brand:wikipedia":"nl:Hans Anders",name:"Hans Anders",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Krys":{name:"Krys",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q3119538"},addTags:{brand:"Krys","brand:wikidata":"Q3119538","brand:wikipedia":"fr:Krys Group",name:"Krys",shop:"optician"},removeTags:{brand:"Krys","brand:wikidata":"Q3119538","brand:wikipedia":"fr:Krys Group",name:"Krys",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/LensCrafters":{name:"LensCrafters",icon:"maki-optician",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",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",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",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",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",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",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",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",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",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",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",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:"temaki-compass",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/Kathmandu":{name:"Kathmandu",icon:"temaki-compass",geometry:["point","area"],tags:{shop:"outdoor","brand:wikidata":"Q1736294"},addTags:{brand:"Kathmandu","brand:wikidata":"Q1736294","brand:wikipedia":"en:Kathmandu (company)",name:"Kathmandu",shop:"outdoor"},removeTags:{brand:"Kathmandu","brand:wikidata":"Q1736294","brand:wikipedia":"en:Kathmandu (company)",name:"Kathmandu",shop:"outdoor"},matchScore:2,suggestion:true},"shop/outdoor/Mountain Warehouse":{name:"Mountain Warehouse",icon:"temaki-compass",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:"temaki-compass",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:"temaki-compass",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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/second_hand/Value Village":{name:"Value Village",icon:"maki-shop",geometry:["point","area"],tags:{shop:"second_hand","brand:wikidata":"Q7428188"},addTags:{brand:"Value Village","brand:wikidata":"Q7428188","brand:wikipedia":"en:Savers",name:"Value Village",shop:"second_hand"},removeTags:{brand:"Value Village","brand:wikidata":"Q7428188","brand:wikipedia":"en:Savers",name:"Value Village",shop:"second_hand"},matchScore:2,suggestion:true},"shop/shoes/Aldo":{name:"Aldo",icon:"maki-shoe",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",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",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",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",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",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",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",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",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",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",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",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",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",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/Dosenbach":{name:"Dosenbach",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2677329"},addTags:{brand:"Dosenbach","brand:wikidata":"Q2677329","brand:wikipedia":"de:Dosenbach-Ochsner",name:"Dosenbach",shop:"shoes"},removeTags:{brand:"Dosenbach","brand:wikidata":"Q2677329","brand:wikipedia":"de:Dosenbach-Ochsner",name:"Dosenbach",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Ecco":{name:"Ecco",icon:"maki-shoe",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",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",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",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",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",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",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",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",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",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",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",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",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",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/San Marina":{name:"San Marina",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q3471558"},addTags:{brand:"San Marina","brand:wikidata":"Q3471558","brand:wikipedia":"fr:San Marina",name:"San Marina",shop:"shoes"},removeTags:{brand:"San Marina","brand:wikidata":"Q3471558","brand:wikipedia":"fr:San Marina",name:"San Marina",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Scapino":{name:"Scapino",icon:"maki-shoe",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",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",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",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",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",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",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/shoes/Éram":{name:"Éram",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q16684192"},addTags:{brand:"Éram","brand:wikidata":"Q16684192","brand:wikipedia":"fr:Éram",name:"Éram",shop:"shoes"},removeTags:{brand:"Éram","brand:wikidata":"Q16684192","brand:wikipedia":"fr:Éram",name:"Éram",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/ЦентрОбувь":{name:"ЦентрОбувь",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q4504072"},addTags:{brand:"ЦентрОбувь","brand:wikidata":"Q4504072","brand:wikipedia":"ru:ЦентрОбувь",name:"ЦентрОбувь",shop:"shoes"},removeTags:{brand:"ЦентрОбувь","brand:wikidata":"Q4504072","brand:wikipedia":"ru:ЦентрОбувь",name:"ЦентрОбувь",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/東京靴流通センター":{name:"東京靴流通センター",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q11318515"},addTags:{brand:"東京靴流通センター","brand:en":"Tokyo Shoes Retailing Center","brand:wikidata":"Q11318515","brand:wikipedia":"ja:チヨダ",name:"東京靴流通センター","name:en":"Tokyo Shoes Retailing Center",shop:"shoes"},removeTags:{brand:"東京靴流通センター","brand:en":"Tokyo Shoes Retailing Center","brand:wikidata":"Q11318515","brand:wikipedia":"ja:チヨダ",name:"東京靴流通センター","name:en":"Tokyo Shoes Retailing Center",shop:"shoes"},matchScore:2,suggestion:true},"shop/sports/Adidas":{name:"Adidas",icon:"maki-shop",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",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",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",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",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",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",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",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",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",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",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",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",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",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/sports/Спортмастер":{name:"Спортмастер",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q4438176"},addTags:{brand:"Спортмастер","brand:wikidata":"Q4438176","brand:wikipedia":"ru:Спортмастер",name:"Спортмастер",shop:"sports"},removeTags:{brand:"Спортмастер","brand:wikidata":"Q4438176","brand:wikipedia":"ru:Спортмастер",name:"Спортмастер",shop:"sports"},matchScore:2,suggestion:true},"shop/stationery/Bureau Vallée":{name:"Bureau Vallée",icon:"maki-shop",geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q18385014"},addTags:{brand:"Bureau Vallée","brand:wikidata":"Q18385014","brand:wikipedia":"fr:Bureau Vallée",name:"Bureau Vallée",shop:"stationery"},removeTags:{brand:"Bureau Vallée","brand:wikidata":"Q18385014","brand:wikipedia":"fr:Bureau Vallée",name:"Bureau Vallée",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/McPaper":{name:"McPaper",icon:"maki-shop",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",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",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",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",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",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",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",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",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/Extra Space Storage":{name:"Extra Space Storage",icon:"fas-warehouse",geometry:["point","area"],tags:{shop:"storage_rental","brand:wikidata":"Q5422162"},addTags:{brand:"Extra Space Storage","brand:wikidata":"Q5422162","brand:wikipedia":"en:Extra Space Storage",name:"Extra Space Storage",shop:"storage_rental"},removeTags:{brand:"Extra Space Storage","brand:wikidata":"Q5422162","brand:wikipedia":"en:Extra Space Storage",name:"Extra Space Storage",shop:"storage_rental"},matchScore:2,suggestion:true},"shop/storage_rental/Public Storage":{name:"Public Storage",icon:"fas-warehouse",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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/Brookshire's":{name:"Brookshire's",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4975085"},addTags:{brand:"Brookshire's","brand:wikidata":"Q4975085","brand:wikipedia":"en:Brookshire Grocery Company",name:"Brookshire's",shop:"supermarket"},removeTags:{brand:"Brookshire's","brand:wikidata":"Q4975085","brand:wikipedia":"en:Brookshire Grocery Company",name:"Brookshire's",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Budgens":{name:"Budgens",icon:"maki-grocery",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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/Coles":{name:"Coles",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1108172"},addTags:{brand:"Coles","brand:wikidata":"Q1108172","brand:wikipedia":"en:Coles Supermarkets",name:"Coles",shop:"supermarket"},removeTags:{brand:"Coles","brand:wikidata":"Q1108172","brand:wikipedia":"en:Coles Supermarkets",name:"Coles",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Colruyt":{name:"Colruyt",icon:"maki-grocery",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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/Despar":{name:"Despar",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q610492"},addTags:{brand:"Despar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Despar",shop:"supermarket"},removeTags:{brand:"Despar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Despar",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Dia":{name:"Dia",icon:"maki-grocery",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",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",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",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",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",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/E. Leclerc Drive":{name:"E. Leclerc Drive",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1273376"},addTags:{brand:"E. Leclerc Drive","brand:wikidata":"Q1273376","brand:wikipedia":"fr:E.Leclerc",name:"E. Leclerc Drive",shop:"supermarket"},removeTags:{brand:"E. Leclerc Drive","brand:wikidata":"Q1273376","brand:wikipedia":"fr:E.Leclerc",name:"E. Leclerc Drive",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/EMTÉ":{name:"EMTÉ",icon:"maki-grocery",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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/Gadis":{name:"Gadis",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q12389151"},addTags:{brand:"Gadis","brand:wikidata":"Q12389151","brand:wikipedia":"gl:Gadisa",name:"Gadis",shop:"supermarket"},removeTags:{brand:"Gadis","brand:wikidata":"Q12389151","brand:wikipedia":"gl:Gadisa",name:"Gadis",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Giant Eagle":{name:"Giant Eagle",icon:"maki-grocery",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",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",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",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",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/H-E-B":{name:"H-E-B",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q830621"},addTags:{brand:"H-E-B","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",name:"H-E-B",shop:"supermarket"},removeTags:{brand:"H-E-B","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",name:"H-E-B",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/HIT":{name:"HIT",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1548713"},addTags:{brand:"HIT","brand:wikidata":"Q1548713","brand:wikipedia":"de:HIT Handelsgruppe",name:"HIT",shop:"supermarket"},removeTags:{brand:"HIT","brand:wikidata":"Q1548713","brand:wikipedia":"de:HIT Handelsgruppe",name:"HIT",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Hannaford":{name:"Hannaford",icon:"maki-grocery",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",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",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",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",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",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",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",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",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",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",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/IDEA":{name:"IDEA",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q23461622"},addTags:{brand:"IDEA","brand:wikidata":"Q23461622","brand:wikipedia":"en:Idea (supermarkets)",name:"IDEA",shop:"supermarket"},removeTags:{brand:"IDEA","brand:wikidata":"Q23461622","brand:wikipedia":"en:Idea (supermarkets)",name:"IDEA",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/IGA":{name:"IGA",icon:"maki-grocery",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",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",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",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",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/Interspar":{name:"Interspar",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q15820339"},addTags:{brand:"Interspar","brand:wikidata":"Q15820339","brand:wikipedia":"de:Interspar (Österreich)",name:"Interspar",shop:"supermarket"},removeTags:{brand:"Interspar","brand:wikidata":"Q15820339","brand:wikipedia":"de:Interspar (Österreich)",name:"Interspar",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Irma":{name:"Irma",icon:"maki-grocery",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",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/Joker":{name:"Joker",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q716328"},addTags:{brand:"Joker","brand:wikidata":"Q716328","brand:wikipedia":"en:Joker (store)",name:"Joker",shop:"supermarket"},removeTags:{brand:"Joker","brand:wikidata":"Q716328","brand:wikipedia":"en:Joker (store)",name:"Joker",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Jumbo":{name:"Jumbo",icon:"maki-grocery",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",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",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",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",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",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 Anónima":{name:"La Anónima",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6135985"},addTags:{brand:"La Anónima","brand:wikidata":"Q6135985","brand:wikipedia":"es:La Anónima",name:"La Anónima",shop:"supermarket"},removeTags:{brand:"La Anónima","brand:wikidata":"Q6135985","brand:wikipedia":"es:La Anónima",name:"La Anónima",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/La Plaza de DIA":{name:"La Plaza de DIA",icon:"maki-grocery",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",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/Landi":{name:"Landi",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1803010"},addTags:{brand:"Landi","brand:wikidata":"Q1803010","brand:wikipedia":"en:Landi (Unternehmen)",name:"Landi",shop:"supermarket"},removeTags:{brand:"Landi","brand:wikidata":"Q1803010","brand:wikipedia":"en:Landi (Unternehmen)",name:"Landi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Leader Price":{name:"Leader Price",icon:"maki-grocery",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",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",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",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",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",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",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",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",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",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",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",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/Martin's Super Markets":{name:"Martin's Super Markets",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6774803"},addTags:{brand:"Martin's Super Markets","brand:wikidata":"Q6774803","brand:wikipedia":"en:Martin's Super Markets",name:"Martin's Super Markets",shop:"supermarket"},removeTags:{brand:"Martin's Super Markets","brand:wikidata":"Q6774803","brand:wikipedia":"en:Martin's Super Markets",name:"Martin's Super Markets",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Match":{name:"Match",icon:"maki-grocery",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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/Mix Markt":{name:"Mix Markt",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q327854"},addTags:{brand:"Mix Markt","brand:wikidata":"Q327854","brand:wikipedia":"de:Mix Markt",name:"Mix Markt",shop:"supermarket"},removeTags:{brand:"Mix Markt","brand:wikidata":"Q327854","brand:wikipedia":"de:Mix Markt",name:"Mix Markt",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Monoprix":{name:"Monoprix",icon:"maki-grocery",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/More":{name:"More",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6910891"},addTags:{brand:"More","brand:wikidata":"Q6910891","brand:wikipedia":"en:More (store)",name:"More",shop:"supermarket"},removeTags:{brand:"More","brand:wikidata":"Q6910891","brand:wikipedia":"en:More (store)",name:"More",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Morrisons":{name:"Morrisons",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q922344"},addTags:{brand:"Morrisons","brand:wikidata":"Q922344","brand:wikipedia":"en:Morrisons",name:"Morrisons",shop:"supermarket"},removeTags:{brand:"Morrisons","brand:wikidata":"Q922344","brand:wikipedia":"en:Morrisons",name:"Morrisons",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Nah & Frisch":{name:"Nah & Frisch",icon:"maki-grocery",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",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",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",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",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",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",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",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",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",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",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",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",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",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/Pam":{name:"Pam",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3777398"},addTags:{brand:"Pam","brand:wikidata":"Q3777398","brand:wikipedia":"it:Gruppo PAM",name:"Pam",shop:"supermarket"},removeTags:{brand:"Pam","brand:wikidata":"Q3777398","brand:wikipedia":"it:Gruppo PAM",name:"Pam",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Pavilions":{name:"Pavilions",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7155886"},addTags:{brand:"Pavilions","brand:wikidata":"Q7155886","brand:wikipedia":"en:Pavilions (supermarket)",name:"Pavilions",shop:"supermarket"},removeTags:{brand:"Pavilions","brand:wikidata":"Q7155886","brand:wikipedia":"en:Pavilions (supermarket)",name:"Pavilions",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Penny":{name:"Penny",icon:"maki-grocery",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",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",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",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",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",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",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",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",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",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",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",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",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/Proxy Delhaize":{name:"Proxy Delhaize",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q14903417"},addTags:{brand:"Proxy Delhaize","brand:wikidata":"Q14903417","brand:wikipedia":"en:Delhaize Group",name:"Proxy Delhaize",shop:"supermarket"},removeTags:{brand:"Proxy Delhaize","brand:wikidata":"Q14903417","brand:wikipedia":"en:Delhaize Group",name:"Proxy Delhaize",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Publix":{name:"Publix",icon:"maki-grocery",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",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",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",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",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",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",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",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/Redner's Markets":{name:"Redner's Markets",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7306166"},addTags:{brand:"Redner's Markets","brand:wikidata":"Q7306166","brand:wikipedia":"en:Redner's Markets",name:"Redner's Markets",shop:"supermarket"},removeTags:{brand:"Redner's Markets","brand:wikidata":"Q7306166","brand:wikipedia":"en:Redner's Markets",name:"Redner's Markets",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Reliance Fresh":{name:"Reliance Fresh",icon:"maki-grocery",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",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",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",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",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",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",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/Sainsbury's":{name:"Sainsbury's",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q152096"},addTags:{brand:"Sainsbury's","brand:wikidata":"Q152096","brand:wikipedia":"en:Sainsbury's",name:"Sainsbury's",shop:"supermarket"},removeTags:{brand:"Sainsbury's","brand:wikidata":"Q152096","brand:wikipedia":"en:Sainsbury's",name:"Sainsbury's",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Santa Isabel":{name:"Santa Isabel",icon:"maki-grocery",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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/VinMart":{name:"VinMart",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q60245505"},addTags:{brand:"VinMart","brand:wikidata":"Q60245505","brand:wikipedia":"vi:VinMart",name:"VinMart",shop:"supermarket"},removeTags:{brand:"VinMart","brand:wikidata":"Q60245505","brand:wikipedia":"vi:VinMart",name:"VinMart",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Vons":{name:"Vons",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7941609"},addTags:{brand:"Vons","brand:wikidata":"Q7941609","brand:wikipedia":"en:Vons",name:"Vons",shop:"supermarket"},removeTags:{brand:"Vons","brand:wikidata":"Q7941609","brand:wikipedia":"en:Vons",name:"Vons",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Waitrose":{name:"Waitrose",icon:"maki-grocery",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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/tea/T2":{name:"T2",icon:"maki-teahouse",geometry:["point","area"],tags:{shop:"tea","brand:wikidata":"Q48802134"},addTags:{brand:"T2","brand:wikidata":"Q48802134","brand:wikipedia":"en:T2 (Australian company)",name:"T2",shop:"tea"},removeTags:{brand:"T2","brand:wikidata":"Q48802134","brand:wikipedia":"en:T2 (Australian company)",name:"T2",shop:"tea"},matchScore:2,suggestion:true},"shop/ticket/Boutique Grandes Lignes":{name:"Boutique Grandes Lignes",icon:"maki-shop",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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:"temaki-movie_rental",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:"temaki-movie_rental",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:"temaki-movie_rental",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:"temaki-movie_rental",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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",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}};
25805
25806   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/enforcement","type/site","relation"]};
25807
25808   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"]}};
25809
25810   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",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"},architect:{key:"architect",type:"text",label:"Architect"},"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"},attraction:{key:"attraction",type:"typeCombo",label:"Type"},backrest:{key:"backrest",type:"check",label:"Backrest"},barrier:{key:"barrier",type:"typeCombo",label:"Type"},basin:{key:"basin",type:"combo",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:"Beauty Specialty"},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"},"building/material":{key:"building:material",type:"combo",label:"Material"},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"},check_date:{key:"check_date",type:"text",label:"Last Checked Date"},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"},couplings:{key:"couplings",type:"number",minValue:1,label:"Couplings",placeholder:"1, 2, 3..."},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","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",prerequisiteTag:{key:"religion"}},denotation:{key:"denotation",type:"combo",label:"Denotation"},description:{key:"description",type:"textarea",label:"Description",universal:true},design:{key:"design",type:"combo",label:"Design"},destination_oneway:{key:"destination",type:"semiCombo",label:"Destinations",prerequisiteTag:{key:"oneway",value:"yes"}},"destination/ref_oneway":{key:"destination:ref",type:"semiCombo",label:"Destination Road Numbers",prerequisiteTag:{key:"oneway",value:"yes"}},"destination/symbol_oneway":{key:"destination:symbol",type:"semiCombo",label:"Destination Symbols",prerequisiteTag:{key:"oneway",value:"yes"}},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"]},diet_multi:{key:"diet:",type:"multiCombo",label:"Diet Types"},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"},dog:{key:"dog",type:"combo",label:"Dogs",strings:{options:{yes:"Allowed",leashed:"Leashed Only",no:"Not Allowed"}}},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",label:"Email"},embankment:{key:"embankment",type:"typeCombo",label:"Type",placeholder:"Default"},emergency:{key:"emergency",type:"check",label:"Emergency"},enforcement:{key:"enforcement",type:"combo",label:"Type"},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",placeholder:"+31 42 123 4567"},fee:{key:"fee",type:"check",label:"Fee"},fence_type:{key:"fence_type",type:"combo",label:"Type"},"fire_hydrant/diameter":{key:"fire_hydrant:diameter",type:"combo",label:"Diameter (mm, in, or letters)",snake_case:false},"fire_hydrant/pressure":{key:"fire_hydrant:pressure",type:"combo",label:"Pressure (bar)",snake_case:false},"fire_hydrant/type":{key:"fire_hydrant:type",type:"combo",label:"Shape",strings:{options:{pillar:"Pillar/Aboveground",underground:"Underground",wall:"Wall",pipe:"Capped Pipe"}}},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_electrified:{key:"frequency",type:"combo",label:"Operating Frequency",prerequisiteTag:{key:"electrified",valueNot:"no"}},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_yes:{key:"intermittent",type:"check",label:"Intermittent","default":"yes"},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",prerequisiteTag:{key:"internet_access",valueNot:"no"}},"internet_access/ssid":{key:"internet_access:ssid",type:"text",label:"SSID (Network Name)",prerequisiteTag:{key:"internet_access",valueNot:"no"}},"junction/ref_oneway":{key:"junction:ref",type:"text",label:"Junction Number",prerequisiteTag:{key:"oneway",value:"yes"}},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",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"},minspeed:{key:"minspeed",type:"maxspeed",label:"Minimum Speed Limit",placeholder:"20, 30, 40..."},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"}}},"oneway/bicycle":{key:"oneway:bicycle",type:"check",label:"One Way (Bicycles)",prerequisiteTag:{key:"oneway"}},opening_date:{key:"opening_date",type:"text",label:"Expected Opening Date"},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"},phases:{key:"phases",type:"number",minValue:1,label:"Phases",placeholder:"1, 2, 3..."},phone:{key:"phone",type:"tel",icon:"maki-telephone",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"},"roof/colour":{key:"roof:colour",type:"combo",label:"Roof Color"},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",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"},"survey/date":{key:"survey:date",type:"text",label:"Last Survey Date"},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:{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_electrified:{key:"voltage",type:"combo",label:"Voltage",prerequisiteTag:{key:"electrified",valueNot:"no"}},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_source:{key:"water_source","default":"main",type:"combo",label:"Water Source"},water_volume:{key:"water_volume",type:"number",label:"Water Reserve Volume (m³)",snake_case:false},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/",label:"Website"},wetland:{key:"wetland",type:"combo",label:"Type"},wheelchair:{key:"wheelchair",type:"radio",options:["yes","limited","no"],icon:"maki-wheelchair",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"}}}};
25811
25812   var quickselect = createCommonjsModule(function (module, exports) {
25813   (function (global, factory) {
25814         module.exports = factory();
25815   }(commonjsGlobal, (function () {
25816   function quickselect(arr, k, left, right, compare) {
25817       quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);
25818   }
25819
25820   function quickselectStep(arr, k, left, right, compare) {
25821
25822       while (right > left) {
25823           if (right - left > 600) {
25824               var n = right - left + 1;
25825               var m = k - left + 1;
25826               var z = Math.log(n);
25827               var s = 0.5 * Math.exp(2 * z / 3);
25828               var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
25829               var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
25830               var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
25831               quickselectStep(arr, k, newLeft, newRight, compare);
25832           }
25833
25834           var t = arr[k];
25835           var i = left;
25836           var j = right;
25837
25838           swap(arr, left, k);
25839           if (compare(arr[right], t) > 0) swap(arr, left, right);
25840
25841           while (i < j) {
25842               swap(arr, i, j);
25843               i++;
25844               j--;
25845               while (compare(arr[i], t) < 0) i++;
25846               while (compare(arr[j], t) > 0) j--;
25847           }
25848
25849           if (compare(arr[left], t) === 0) swap(arr, left, j);
25850           else {
25851               j++;
25852               swap(arr, j, right);
25853           }
25854
25855           if (j <= k) left = j + 1;
25856           if (k <= j) right = j - 1;
25857       }
25858   }
25859
25860   function swap(arr, i, j) {
25861       var tmp = arr[i];
25862       arr[i] = arr[j];
25863       arr[j] = tmp;
25864   }
25865
25866   function defaultCompare(a, b) {
25867       return a < b ? -1 : a > b ? 1 : 0;
25868   }
25869
25870   return quickselect;
25871
25872   })));
25873   });
25874
25875   var rbush_1 = rbush;
25876   var default_1 = rbush;
25877
25878
25879
25880   function rbush(maxEntries, format) {
25881       if (!(this instanceof rbush)) return new rbush(maxEntries, format);
25882
25883       // max entries in a node is 9 by default; min node fill is 40% for best performance
25884       this._maxEntries = Math.max(4, maxEntries || 9);
25885       this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
25886
25887       if (format) {
25888           this._initFormat(format);
25889       }
25890
25891       this.clear();
25892   }
25893
25894   rbush.prototype = {
25895
25896       all: function () {
25897           return this._all(this.data, []);
25898       },
25899
25900       search: function (bbox) {
25901
25902           var node = this.data,
25903               result = [],
25904               toBBox = this.toBBox;
25905
25906           if (!intersects$1(bbox, node)) return result;
25907
25908           var nodesToSearch = [],
25909               i, len, child, childBBox;
25910
25911           while (node) {
25912               for (i = 0, len = node.children.length; i < len; i++) {
25913
25914                   child = node.children[i];
25915                   childBBox = node.leaf ? toBBox(child) : child;
25916
25917                   if (intersects$1(bbox, childBBox)) {
25918                       if (node.leaf) result.push(child);
25919                       else if (contains$2(bbox, childBBox)) this._all(child, result);
25920                       else nodesToSearch.push(child);
25921                   }
25922               }
25923               node = nodesToSearch.pop();
25924           }
25925
25926           return result;
25927       },
25928
25929       collides: function (bbox) {
25930
25931           var node = this.data,
25932               toBBox = this.toBBox;
25933
25934           if (!intersects$1(bbox, node)) return false;
25935
25936           var nodesToSearch = [],
25937               i, len, child, childBBox;
25938
25939           while (node) {
25940               for (i = 0, len = node.children.length; i < len; i++) {
25941
25942                   child = node.children[i];
25943                   childBBox = node.leaf ? toBBox(child) : child;
25944
25945                   if (intersects$1(bbox, childBBox)) {
25946                       if (node.leaf || contains$2(bbox, childBBox)) return true;
25947                       nodesToSearch.push(child);
25948                   }
25949               }
25950               node = nodesToSearch.pop();
25951           }
25952
25953           return false;
25954       },
25955
25956       load: function (data) {
25957           if (!(data && data.length)) return this;
25958
25959           if (data.length < this._minEntries) {
25960               for (var i = 0, len = data.length; i < len; i++) {
25961                   this.insert(data[i]);
25962               }
25963               return this;
25964           }
25965
25966           // recursively build the tree with the given data from scratch using OMT algorithm
25967           var node = this._build(data.slice(), 0, data.length - 1, 0);
25968
25969           if (!this.data.children.length) {
25970               // save as is if tree is empty
25971               this.data = node;
25972
25973           } else if (this.data.height === node.height) {
25974               // split root if trees have the same height
25975               this._splitRoot(this.data, node);
25976
25977           } else {
25978               if (this.data.height < node.height) {
25979                   // swap trees if inserted one is bigger
25980                   var tmpNode = this.data;
25981                   this.data = node;
25982                   node = tmpNode;
25983               }
25984
25985               // insert the small tree into the large tree at appropriate level
25986               this._insert(node, this.data.height - node.height - 1, true);
25987           }
25988
25989           return this;
25990       },
25991
25992       insert: function (item) {
25993           if (item) this._insert(item, this.data.height - 1);
25994           return this;
25995       },
25996
25997       clear: function () {
25998           this.data = createNode([]);
25999           return this;
26000       },
26001
26002       remove: function (item, equalsFn) {
26003           if (!item) return this;
26004
26005           var node = this.data,
26006               bbox = this.toBBox(item),
26007               path = [],
26008               indexes = [],
26009               i, parent, index, goingUp;
26010
26011           // depth-first iterative tree traversal
26012           while (node || path.length) {
26013
26014               if (!node) { // go up
26015                   node = path.pop();
26016                   parent = path[path.length - 1];
26017                   i = indexes.pop();
26018                   goingUp = true;
26019               }
26020
26021               if (node.leaf) { // check current node
26022                   index = findItem(item, node.children, equalsFn);
26023
26024                   if (index !== -1) {
26025                       // item found, remove the item and condense tree upwards
26026                       node.children.splice(index, 1);
26027                       path.push(node);
26028                       this._condense(path);
26029                       return this;
26030                   }
26031               }
26032
26033               if (!goingUp && !node.leaf && contains$2(node, bbox)) { // go down
26034                   path.push(node);
26035                   indexes.push(i);
26036                   i = 0;
26037                   parent = node;
26038                   node = node.children[0];
26039
26040               } else if (parent) { // go right
26041                   i++;
26042                   node = parent.children[i];
26043                   goingUp = false;
26044
26045               } else node = null; // nothing found
26046           }
26047
26048           return this;
26049       },
26050
26051       toBBox: function (item) { return item; },
26052
26053       compareMinX: compareNodeMinX,
26054       compareMinY: compareNodeMinY,
26055
26056       toJSON: function () { return this.data; },
26057
26058       fromJSON: function (data) {
26059           this.data = data;
26060           return this;
26061       },
26062
26063       _all: function (node, result) {
26064           var nodesToSearch = [];
26065           while (node) {
26066               if (node.leaf) result.push.apply(result, node.children);
26067               else nodesToSearch.push.apply(nodesToSearch, node.children);
26068
26069               node = nodesToSearch.pop();
26070           }
26071           return result;
26072       },
26073
26074       _build: function (items, left, right, height) {
26075
26076           var N = right - left + 1,
26077               M = this._maxEntries,
26078               node;
26079
26080           if (N <= M) {
26081               // reached leaf level; return leaf
26082               node = createNode(items.slice(left, right + 1));
26083               calcBBox(node, this.toBBox);
26084               return node;
26085           }
26086
26087           if (!height) {
26088               // target height of the bulk-loaded tree
26089               height = Math.ceil(Math.log(N) / Math.log(M));
26090
26091               // target number of root entries to maximize storage utilization
26092               M = Math.ceil(N / Math.pow(M, height - 1));
26093           }
26094
26095           node = createNode([]);
26096           node.leaf = false;
26097           node.height = height;
26098
26099           // split the items into M mostly square tiles
26100
26101           var N2 = Math.ceil(N / M),
26102               N1 = N2 * Math.ceil(Math.sqrt(M)),
26103               i, j, right2, right3;
26104
26105           multiSelect(items, left, right, N1, this.compareMinX);
26106
26107           for (i = left; i <= right; i += N1) {
26108
26109               right2 = Math.min(i + N1 - 1, right);
26110
26111               multiSelect(items, i, right2, N2, this.compareMinY);
26112
26113               for (j = i; j <= right2; j += N2) {
26114
26115                   right3 = Math.min(j + N2 - 1, right2);
26116
26117                   // pack each entry recursively
26118                   node.children.push(this._build(items, j, right3, height - 1));
26119               }
26120           }
26121
26122           calcBBox(node, this.toBBox);
26123
26124           return node;
26125       },
26126
26127       _chooseSubtree: function (bbox, node, level, path) {
26128
26129           var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
26130
26131           while (true) {
26132               path.push(node);
26133
26134               if (node.leaf || path.length - 1 === level) break;
26135
26136               minArea = minEnlargement = Infinity;
26137
26138               for (i = 0, len = node.children.length; i < len; i++) {
26139                   child = node.children[i];
26140                   area = bboxArea(child);
26141                   enlargement = enlargedArea(bbox, child) - area;
26142
26143                   // choose entry with the least area enlargement
26144                   if (enlargement < minEnlargement) {
26145                       minEnlargement = enlargement;
26146                       minArea = area < minArea ? area : minArea;
26147                       targetNode = child;
26148
26149                   } else if (enlargement === minEnlargement) {
26150                       // otherwise choose one with the smallest area
26151                       if (area < minArea) {
26152                           minArea = area;
26153                           targetNode = child;
26154                       }
26155                   }
26156               }
26157
26158               node = targetNode || node.children[0];
26159           }
26160
26161           return node;
26162       },
26163
26164       _insert: function (item, level, isNode) {
26165
26166           var toBBox = this.toBBox,
26167               bbox = isNode ? item : toBBox(item),
26168               insertPath = [];
26169
26170           // find the best node for accommodating the item, saving all nodes along the path too
26171           var node = this._chooseSubtree(bbox, this.data, level, insertPath);
26172
26173           // put the item into the node
26174           node.children.push(item);
26175           extend$1(node, bbox);
26176
26177           // split on node overflow; propagate upwards if necessary
26178           while (level >= 0) {
26179               if (insertPath[level].children.length > this._maxEntries) {
26180                   this._split(insertPath, level);
26181                   level--;
26182               } else break;
26183           }
26184
26185           // adjust bboxes along the insertion path
26186           this._adjustParentBBoxes(bbox, insertPath, level);
26187       },
26188
26189       // split overflowed node into two
26190       _split: function (insertPath, level) {
26191
26192           var node = insertPath[level],
26193               M = node.children.length,
26194               m = this._minEntries;
26195
26196           this._chooseSplitAxis(node, m, M);
26197
26198           var splitIndex = this._chooseSplitIndex(node, m, M);
26199
26200           var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
26201           newNode.height = node.height;
26202           newNode.leaf = node.leaf;
26203
26204           calcBBox(node, this.toBBox);
26205           calcBBox(newNode, this.toBBox);
26206
26207           if (level) insertPath[level - 1].children.push(newNode);
26208           else this._splitRoot(node, newNode);
26209       },
26210
26211       _splitRoot: function (node, newNode) {
26212           // split root node
26213           this.data = createNode([node, newNode]);
26214           this.data.height = node.height + 1;
26215           this.data.leaf = false;
26216           calcBBox(this.data, this.toBBox);
26217       },
26218
26219       _chooseSplitIndex: function (node, m, M) {
26220
26221           var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
26222
26223           minOverlap = minArea = Infinity;
26224
26225           for (i = m; i <= M - m; i++) {
26226               bbox1 = distBBox(node, 0, i, this.toBBox);
26227               bbox2 = distBBox(node, i, M, this.toBBox);
26228
26229               overlap = intersectionArea(bbox1, bbox2);
26230               area = bboxArea(bbox1) + bboxArea(bbox2);
26231
26232               // choose distribution with minimum overlap
26233               if (overlap < minOverlap) {
26234                   minOverlap = overlap;
26235                   index = i;
26236
26237                   minArea = area < minArea ? area : minArea;
26238
26239               } else if (overlap === minOverlap) {
26240                   // otherwise choose distribution with minimum area
26241                   if (area < minArea) {
26242                       minArea = area;
26243                       index = i;
26244                   }
26245               }
26246           }
26247
26248           return index;
26249       },
26250
26251       // sorts node children by the best axis for split
26252       _chooseSplitAxis: function (node, m, M) {
26253
26254           var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,
26255               compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,
26256               xMargin = this._allDistMargin(node, m, M, compareMinX),
26257               yMargin = this._allDistMargin(node, m, M, compareMinY);
26258
26259           // if total distributions margin value is minimal for x, sort by minX,
26260           // otherwise it's already sorted by minY
26261           if (xMargin < yMargin) node.children.sort(compareMinX);
26262       },
26263
26264       // total margin of all possible split distributions where each node is at least m full
26265       _allDistMargin: function (node, m, M, compare) {
26266
26267           node.children.sort(compare);
26268
26269           var toBBox = this.toBBox,
26270               leftBBox = distBBox(node, 0, m, toBBox),
26271               rightBBox = distBBox(node, M - m, M, toBBox),
26272               margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),
26273               i, child;
26274
26275           for (i = m; i < M - m; i++) {
26276               child = node.children[i];
26277               extend$1(leftBBox, node.leaf ? toBBox(child) : child);
26278               margin += bboxMargin(leftBBox);
26279           }
26280
26281           for (i = M - m - 1; i >= m; i--) {
26282               child = node.children[i];
26283               extend$1(rightBBox, node.leaf ? toBBox(child) : child);
26284               margin += bboxMargin(rightBBox);
26285           }
26286
26287           return margin;
26288       },
26289
26290       _adjustParentBBoxes: function (bbox, path, level) {
26291           // adjust bboxes along the given tree path
26292           for (var i = level; i >= 0; i--) {
26293               extend$1(path[i], bbox);
26294           }
26295       },
26296
26297       _condense: function (path) {
26298           // go through the path, removing empty nodes and updating bboxes
26299           for (var i = path.length - 1, siblings; i >= 0; i--) {
26300               if (path[i].children.length === 0) {
26301                   if (i > 0) {
26302                       siblings = path[i - 1].children;
26303                       siblings.splice(siblings.indexOf(path[i]), 1);
26304
26305                   } else this.clear();
26306
26307               } else calcBBox(path[i], this.toBBox);
26308           }
26309       },
26310
26311       _initFormat: function (format) {
26312           // data format (minX, minY, maxX, maxY accessors)
26313
26314           // uses eval-type function compilation instead of just accepting a toBBox function
26315           // because the algorithms are very sensitive to sorting functions performance,
26316           // so they should be dead simple and without inner calls
26317
26318           var compareArr = ['return a', ' - b', ';'];
26319
26320           this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
26321           this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
26322
26323           this.toBBox = new Function('a',
26324               'return {minX: a' + format[0] +
26325               ', minY: a' + format[1] +
26326               ', maxX: a' + format[2] +
26327               ', maxY: a' + format[3] + '};');
26328       }
26329   };
26330
26331   function findItem(item, items, equalsFn) {
26332       if (!equalsFn) return items.indexOf(item);
26333
26334       for (var i = 0; i < items.length; i++) {
26335           if (equalsFn(item, items[i])) return i;
26336       }
26337       return -1;
26338   }
26339
26340   // calculate node's bbox from bboxes of its children
26341   function calcBBox(node, toBBox) {
26342       distBBox(node, 0, node.children.length, toBBox, node);
26343   }
26344
26345   // min bounding rectangle of node children from k to p-1
26346   function distBBox(node, k, p, toBBox, destNode) {
26347       if (!destNode) destNode = createNode(null);
26348       destNode.minX = Infinity;
26349       destNode.minY = Infinity;
26350       destNode.maxX = -Infinity;
26351       destNode.maxY = -Infinity;
26352
26353       for (var i = k, child; i < p; i++) {
26354           child = node.children[i];
26355           extend$1(destNode, node.leaf ? toBBox(child) : child);
26356       }
26357
26358       return destNode;
26359   }
26360
26361   function extend$1(a, b) {
26362       a.minX = Math.min(a.minX, b.minX);
26363       a.minY = Math.min(a.minY, b.minY);
26364       a.maxX = Math.max(a.maxX, b.maxX);
26365       a.maxY = Math.max(a.maxY, b.maxY);
26366       return a;
26367   }
26368
26369   function compareNodeMinX(a, b) { return a.minX - b.minX; }
26370   function compareNodeMinY(a, b) { return a.minY - b.minY; }
26371
26372   function bboxArea(a)   { return (a.maxX - a.minX) * (a.maxY - a.minY); }
26373   function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }
26374
26375   function enlargedArea(a, b) {
26376       return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *
26377              (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
26378   }
26379
26380   function intersectionArea(a, b) {
26381       var minX = Math.max(a.minX, b.minX),
26382           minY = Math.max(a.minY, b.minY),
26383           maxX = Math.min(a.maxX, b.maxX),
26384           maxY = Math.min(a.maxY, b.maxY);
26385
26386       return Math.max(0, maxX - minX) *
26387              Math.max(0, maxY - minY);
26388   }
26389
26390   function contains$2(a, b) {
26391       return a.minX <= b.minX &&
26392              a.minY <= b.minY &&
26393              b.maxX <= a.maxX &&
26394              b.maxY <= a.maxY;
26395   }
26396
26397   function intersects$1(a, b) {
26398       return b.minX <= a.maxX &&
26399              b.minY <= a.maxY &&
26400              b.maxX >= a.minX &&
26401              b.maxY >= a.minY;
26402   }
26403
26404   function createNode(children) {
26405       return {
26406           children: children,
26407           height: 1,
26408           leaf: true,
26409           minX: Infinity,
26410           minY: Infinity,
26411           maxX: -Infinity,
26412           maxY: -Infinity
26413       };
26414   }
26415
26416   // sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
26417   // combines selection algorithm with binary divide & conquer approach
26418
26419   function multiSelect(arr, left, right, n, compare) {
26420       var stack = [left, right],
26421           mid;
26422
26423       while (stack.length) {
26424           right = stack.pop();
26425           left = stack.pop();
26426
26427           if (right - left <= n) continue;
26428
26429           mid = left + Math.ceil((right - left) / n / 2) * n;
26430           quickselect(arr, mid, left, right, compare);
26431
26432           stack.push(left, mid, mid, right);
26433       }
26434   }
26435   rbush_1.default = default_1;
26436
26437   var lineclip_1 = lineclip;
26438
26439   lineclip.polyline = lineclip;
26440   lineclip.polygon = polygonclip;
26441
26442
26443   // Cohen-Sutherland line clippign algorithm, adapted to efficiently
26444   // handle polylines rather than just segments
26445
26446   function lineclip(points, bbox, result) {
26447
26448       var len = points.length,
26449           codeA = bitCode(points[0], bbox),
26450           part = [],
26451           i, a, b, codeB, lastCode;
26452
26453       if (!result) result = [];
26454
26455       for (i = 1; i < len; i++) {
26456           a = points[i - 1];
26457           b = points[i];
26458           codeB = lastCode = bitCode(b, bbox);
26459
26460           while (true) {
26461
26462               if (!(codeA | codeB)) { // accept
26463                   part.push(a);
26464
26465                   if (codeB !== lastCode) { // segment went outside
26466                       part.push(b);
26467
26468                       if (i < len - 1) { // start a new line
26469                           result.push(part);
26470                           part = [];
26471                       }
26472                   } else if (i === len - 1) {
26473                       part.push(b);
26474                   }
26475                   break;
26476
26477               } else if (codeA & codeB) { // trivial reject
26478                   break;
26479
26480               } else if (codeA) { // a outside, intersect with clip edge
26481                   a = intersect$1(a, b, codeA, bbox);
26482                   codeA = bitCode(a, bbox);
26483
26484               } else { // b outside
26485                   b = intersect$1(a, b, codeB, bbox);
26486                   codeB = bitCode(b, bbox);
26487               }
26488           }
26489
26490           codeA = lastCode;
26491       }
26492
26493       if (part.length) result.push(part);
26494
26495       return result;
26496   }
26497
26498   // Sutherland-Hodgeman polygon clipping algorithm
26499
26500   function polygonclip(points, bbox) {
26501
26502       var result, edge, prev, prevInside, i, p, inside;
26503
26504       // clip against each side of the clip rectangle
26505       for (edge = 1; edge <= 8; edge *= 2) {
26506           result = [];
26507           prev = points[points.length - 1];
26508           prevInside = !(bitCode(prev, bbox) & edge);
26509
26510           for (i = 0; i < points.length; i++) {
26511               p = points[i];
26512               inside = !(bitCode(p, bbox) & edge);
26513
26514               // if segment goes through the clip window, add an intersection
26515               if (inside !== prevInside) result.push(intersect$1(prev, p, edge, bbox));
26516
26517               if (inside) result.push(p); // add a point if it's inside
26518
26519               prev = p;
26520               prevInside = inside;
26521           }
26522
26523           points = result;
26524
26525           if (!points.length) break;
26526       }
26527
26528       return result;
26529   }
26530
26531   // intersect a segment against one of the 4 lines that make up the bbox
26532
26533   function intersect$1(a, b, edge, bbox) {
26534       return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
26535              edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
26536              edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
26537              edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
26538              null;
26539   }
26540
26541   // bit code reflects the point position relative to the bbox:
26542
26543   //         left  mid  right
26544   //    top  1001  1000  1010
26545   //    mid  0001  0000  0010
26546   // bottom  0101  0100  0110
26547
26548   function bitCode(p, bbox) {
26549       var code = 0;
26550
26551       if (p[0] < bbox[0]) code |= 1; // left
26552       else if (p[0] > bbox[2]) code |= 2; // right
26553
26554       if (p[1] < bbox[1]) code |= 4; // bottom
26555       else if (p[1] > bbox[3]) code |= 8; // top
26556
26557       return code;
26558   }
26559
26560   var whichPolygon_1 = whichPolygon;
26561
26562   function whichPolygon(data) {
26563       var bboxes = [];
26564       for (var i = 0; i < data.features.length; i++) {
26565           var feature = data.features[i];
26566           var coords = feature.geometry.coordinates;
26567
26568           if (feature.geometry.type === 'Polygon') {
26569               bboxes.push(treeItem(coords, feature.properties));
26570
26571           } else if (feature.geometry.type === 'MultiPolygon') {
26572               for (var j = 0; j < coords.length; j++) {
26573                   bboxes.push(treeItem(coords[j], feature.properties));
26574               }
26575           }
26576       }
26577
26578       var tree = rbush_1().load(bboxes);
26579
26580       function query(p, multi) {
26581           var output = [],
26582               result = tree.search({
26583                   minX: p[0],
26584                   minY: p[1],
26585                   maxX: p[0],
26586                   maxY: p[1]
26587               });
26588           for (var i = 0; i < result.length; i++) {
26589               if (insidePolygon(result[i].coords, p)) {
26590                   if (multi)
26591                       output.push(result[i].props);
26592                   else
26593                       return result[i].props;
26594               }
26595           }
26596           return multi && output.length ? output : null;
26597       }
26598
26599       query.tree = tree;
26600       query.bbox = function queryBBox(bbox) {
26601           var output = [];
26602           var result = tree.search({
26603               minX: bbox[0],
26604               minY: bbox[1],
26605               maxX: bbox[2],
26606               maxY: bbox[3]
26607           });
26608           for (var i = 0; i < result.length; i++) {
26609               if (polygonIntersectsBBox(result[i].coords, bbox)) {
26610                   output.push(result[i].props);
26611               }
26612           }
26613           return output;
26614       };
26615
26616       return query;
26617   }
26618
26619   function polygonIntersectsBBox(polygon, bbox) {
26620       var bboxCenter = [
26621           (bbox[0] + bbox[2]) / 2,
26622           (bbox[1] + bbox[3]) / 2
26623       ];
26624       if (insidePolygon(polygon, bboxCenter)) return true;
26625       for (var i = 0; i < polygon.length; i++) {
26626           if (lineclip_1(polygon[i], bbox).length > 0) return true;
26627       }
26628       return false;
26629   }
26630
26631   // ray casting algorithm for detecting if point is in polygon
26632   function insidePolygon(rings, p) {
26633       var inside = false;
26634       for (var i = 0, len = rings.length; i < len; i++) {
26635           var ring = rings[i];
26636           for (var j = 0, len2 = ring.length, k = len2 - 1; j < len2; k = j++) {
26637               if (rayIntersect(p, ring[j], ring[k])) inside = !inside;
26638           }
26639       }
26640       return inside;
26641   }
26642
26643   function rayIntersect(p, p1, p2) {
26644       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]);
26645   }
26646
26647   function treeItem(coords, props) {
26648       var item = {
26649           minX: Infinity,
26650           minY: Infinity,
26651           maxX: -Infinity,
26652           maxY: -Infinity,
26653           coords: coords,
26654           props: props
26655       };
26656
26657       for (var i = 0; i < coords[0].length; i++) {
26658           var p = coords[0][i];
26659           item.minX = Math.min(item.minX, p[0]);
26660           item.minY = Math.min(item.minY, p[1]);
26661           item.maxX = Math.max(item.maxX, p[0]);
26662           item.maxY = Math.max(item.maxY, p[1]);
26663       }
26664       return item;
26665   }
26666
26667   // index the osm-community-index
26668   var ociFeatureCollection = values$1(features$2).map(function(feature) {
26669       // workaround for which-polygon: only supports `properties`, not `id`
26670       // https://github.com/mapbox/which-polygon/pull/6
26671       feature.properties = {
26672           id: feature.id,
26673           area: d3_geoArea(feature)   // also precompute areas
26674       };
26675       return feature;
26676   });
26677
26678
26679   var data = {
26680       community: {
26681           features: features$2,
26682           resources: resources,
26683           query: whichPolygon_1({
26684               type: 'FeatureCollection',
26685               features: ociFeatureCollection
26686           })
26687       },
26688       imagery: dataImagery,  //legacy
26689       presets: {
26690           presets: presets,
26691           defaults: defaults,
26692           categories: categories,
26693           fields: fields
26694       }
26695   };
26696
26697   function osmEntity$$1(attrs) {
26698       // For prototypal inheritance.
26699       if (this instanceof osmEntity$$1) return;
26700
26701       // Create the appropriate subtype.
26702       if (attrs && attrs.type) {
26703           return osmEntity$$1[attrs.type].apply(this, arguments);
26704       } else if (attrs && attrs.id) {
26705           return osmEntity$$1[osmEntity$$1.id.type(attrs.id)].apply(this, arguments);
26706       }
26707
26708       // Initialize a generic Entity (used only in tests).
26709       return (new osmEntity$$1()).initialize(arguments);
26710   }
26711
26712
26713   osmEntity$$1.id = function(type) {
26714       return osmEntity$$1.id.fromOSM(type, osmEntity$$1.id.next[type]--);
26715   };
26716
26717
26718   osmEntity$$1.id.next = {
26719       changeset: -1, node: -1, way: -1, relation: -1
26720   };
26721
26722
26723   osmEntity$$1.id.fromOSM = function(type, id) {
26724       return type[0] + id;
26725   };
26726
26727
26728   osmEntity$$1.id.toOSM = function(id) {
26729       return id.slice(1);
26730   };
26731
26732
26733   osmEntity$$1.id.type = function(id) {
26734       return { 'c': 'changeset', 'n': 'node', 'w': 'way', 'r': 'relation' }[id[0]];
26735   };
26736
26737
26738   // A function suitable for use as the second argument to d3.selection#data().
26739   osmEntity$$1.key = function(entity) {
26740       return entity.id + 'v' + (entity.v || 0);
26741   };
26742
26743
26744   osmEntity$$1.prototype = {
26745
26746       tags: {},
26747
26748
26749       initialize: function(sources) {
26750           for (var i = 0; i < sources.length; ++i) {
26751               var source = sources[i];
26752               for (var prop in source) {
26753                   if (Object.prototype.hasOwnProperty.call(source, prop)) {
26754                       if (source[prop] === undefined) {
26755                           delete this[prop];
26756                       } else {
26757                           this[prop] = source[prop];
26758                       }
26759                   }
26760               }
26761           }
26762
26763           if (!this.id && this.type) {
26764               this.id = osmEntity$$1.id(this.type);
26765           }
26766           if (!this.hasOwnProperty('visible')) {
26767               this.visible = true;
26768           }
26769
26770           return this;
26771       },
26772
26773
26774       copy: function(resolver, copies) {
26775           if (copies[this.id])
26776               return copies[this.id];
26777
26778           var copy = osmEntity$$1(this, {id: undefined, user: undefined, version: undefined});
26779           copies[this.id] = copy;
26780
26781           return copy;
26782       },
26783
26784
26785       osmId: function() {
26786           return osmEntity$$1.id.toOSM(this.id);
26787       },
26788
26789
26790       isNew: function() {
26791           return this.osmId() < 0;
26792       },
26793
26794
26795       update: function(attrs) {
26796           return osmEntity$$1(this, attrs, {v: 1 + (this.v || 0)});
26797       },
26798
26799
26800       mergeTags: function(tags) {
26801           var merged = clone(this.tags), changed = false;
26802           for (var k in tags) {
26803               var t1 = merged[k],
26804                   t2 = tags[k];
26805               if (!t1) {
26806                   changed = true;
26807                   merged[k] = t2;
26808               } else if (t1 !== t2) {
26809                   changed = true;
26810                   merged[k] = union(t1.split(/;\s*/), t2.split(/;\s*/)).join(';');
26811               }
26812           }
26813           return changed ? this.update({tags: merged}) : this;
26814       },
26815
26816
26817       intersects: function(extent, resolver) {
26818           return this.extent(resolver).intersects(extent);
26819       },
26820
26821
26822       hasNonGeometryTags: function() {
26823           return without(Object.keys(this.tags), 'area').length > 0;
26824       },
26825
26826       hasParentRelations: function(resolver) {
26827           return resolver.parentRelations(this).length > 0;
26828       },
26829
26830       hasInterestingTags: function() {
26831           return keys$1(this.tags).some(osmIsInterestingTag);
26832       },
26833
26834
26835       isHighwayIntersection: function() {
26836           return false;
26837       },
26838
26839       isDegenerate: function() {
26840           return true;
26841       },
26842
26843       deprecatedTags: function() {
26844           var tags = toPairs(this.tags);
26845           var deprecated = {};
26846
26847           dataDeprecated.forEach(function(d) {
26848               var match = toPairs(d.old)[0];
26849               tags.forEach(function(t) {
26850                   if (t[0] === match[0] &&
26851                       (t[1] === match[1] || match[1] === '*')) {
26852                       deprecated[t[0]] = t[1];
26853                   }
26854               });
26855           });
26856
26857           return deprecated;
26858       }
26859   };
26860
26861   function geoExtent$$1(min, max) {
26862       if (!(this instanceof geoExtent$$1)) {
26863           return new geoExtent$$1(min, max);
26864       } else if (min instanceof geoExtent$$1) {
26865           return min;
26866       } else if (min && min.length === 2 && min[0].length === 2 && min[1].length === 2) {
26867           this[0] = min[0];
26868           this[1] = min[1];
26869       } else {
26870           this[0] = min        || [ Infinity,  Infinity];
26871           this[1] = max || min || [-Infinity, -Infinity];
26872       }
26873   }
26874
26875   geoExtent$$1.prototype = new Array(2);
26876
26877   assignIn(geoExtent$$1.prototype, {
26878
26879       equals: function (obj) {
26880           return this[0][0] === obj[0][0] &&
26881               this[0][1] === obj[0][1] &&
26882               this[1][0] === obj[1][0] &&
26883               this[1][1] === obj[1][1];
26884       },
26885
26886
26887       extend: function(obj) {
26888           if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
26889           return geoExtent$$1(
26890               [Math.min(obj[0][0], this[0][0]), Math.min(obj[0][1], this[0][1])],
26891               [Math.max(obj[1][0], this[1][0]), Math.max(obj[1][1], this[1][1])]
26892           );
26893       },
26894
26895
26896       _extend: function(extent) {
26897           this[0][0] = Math.min(extent[0][0], this[0][0]);
26898           this[0][1] = Math.min(extent[0][1], this[0][1]);
26899           this[1][0] = Math.max(extent[1][0], this[1][0]);
26900           this[1][1] = Math.max(extent[1][1], this[1][1]);
26901       },
26902
26903
26904       area: function() {
26905           return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1]));
26906       },
26907
26908
26909       center: function() {
26910           return [(this[0][0] + this[1][0]) / 2, (this[0][1] + this[1][1]) / 2];
26911       },
26912
26913
26914       rectangle: function() {
26915           return [this[0][0], this[0][1], this[1][0], this[1][1]];
26916       },
26917
26918
26919       bbox: function() {
26920           return { minX: this[0][0], minY: this[0][1], maxX: this[1][0], maxY: this[1][1] };
26921       },
26922
26923
26924       polygon: function() {
26925           return [
26926               [this[0][0], this[0][1]],
26927               [this[0][0], this[1][1]],
26928               [this[1][0], this[1][1]],
26929               [this[1][0], this[0][1]],
26930               [this[0][0], this[0][1]]
26931           ];
26932       },
26933
26934
26935       contains: function(obj) {
26936           if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
26937           return obj[0][0] >= this[0][0] &&
26938                  obj[0][1] >= this[0][1] &&
26939                  obj[1][0] <= this[1][0] &&
26940                  obj[1][1] <= this[1][1];
26941       },
26942
26943
26944       intersects: function(obj) {
26945           if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
26946           return obj[0][0] <= this[1][0] &&
26947                  obj[0][1] <= this[1][1] &&
26948                  obj[1][0] >= this[0][0] &&
26949                  obj[1][1] >= this[0][1];
26950       },
26951
26952
26953       intersection: function(obj) {
26954           if (!this.intersects(obj)) return new geoExtent$$1();
26955           return new geoExtent$$1(
26956               [Math.max(obj[0][0], this[0][0]), Math.max(obj[0][1], this[0][1])],
26957               [Math.min(obj[1][0], this[1][0]), Math.min(obj[1][1], this[1][1])]
26958           );
26959       },
26960
26961
26962       percentContainedIn: function(obj) {
26963           if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
26964           var a1 = this.intersection(obj).area();
26965           var a2 = this.area();
26966
26967           if (a1 === Infinity || a2 === Infinity || a1 === 0 || a2 === 0) {
26968               return 0;
26969           } else {
26970               return a1 / a2;
26971           }
26972       },
26973
26974
26975       padByMeters: function(meters) {
26976           var dLat = geoMetersToLat(meters);
26977           var dLon = geoMetersToLon(meters, this.center()[1]);
26978           return geoExtent$$1(
26979               [this[0][0] - dLon, this[0][1] - dLat],
26980               [this[1][0] + dLon, this[1][1] + dLat]
26981           );
26982       },
26983
26984
26985       toParam: function() {
26986           return this.rectangle().join(',');
26987       }
26988
26989   });
26990
26991   // constants
26992   var TAU = 2 * Math.PI;
26993   var EQUATORIAL_RADIUS = 6356752.314245179;
26994   var POLAR_RADIUS = 6378137.0;
26995
26996
26997   function geoLatToMeters(dLat) {
26998       return dLat * (TAU * POLAR_RADIUS / 360);
26999   }
27000
27001
27002   function geoLonToMeters(dLon, atLat) {
27003       return Math.abs(atLat) >= 90 ? 0 :
27004           dLon * (TAU * EQUATORIAL_RADIUS / 360) * Math.abs(Math.cos(atLat * (Math.PI / 180)));
27005   }
27006
27007
27008   function geoMetersToLat(m) {
27009       return m / (TAU * POLAR_RADIUS / 360);
27010   }
27011
27012
27013   function geoMetersToLon(m, atLat) {
27014       return Math.abs(atLat) >= 90 ? 0 :
27015           m / (TAU * EQUATORIAL_RADIUS / 360) / Math.abs(Math.cos(atLat * (Math.PI / 180)));
27016   }
27017
27018
27019   function geoMetersToOffset(meters, tileSize) {
27020       tileSize = tileSize || 256;
27021       return [
27022           meters[0] * tileSize / (TAU * EQUATORIAL_RADIUS),
27023           -meters[1] * tileSize / (TAU * POLAR_RADIUS)
27024       ];
27025   }
27026
27027
27028   function geoOffsetToMeters(offset, tileSize) {
27029       tileSize = tileSize || 256;
27030       return [
27031           offset[0] * TAU * EQUATORIAL_RADIUS / tileSize,
27032           -offset[1] * TAU * POLAR_RADIUS / tileSize
27033       ];
27034   }
27035
27036
27037   // Equirectangular approximation of spherical distances on Earth
27038   function geoSphericalDistance(a, b) {
27039       var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2);
27040       var y = geoLatToMeters(a[1] - b[1]);
27041       return Math.sqrt((x * x) + (y * y));
27042   }
27043
27044
27045   // scale to zoom
27046   function geoScaleToZoom(k, tileSize) {
27047       tileSize = tileSize || 256;
27048       var log2ts = Math.log(tileSize) * Math.LOG2E;
27049       return Math.log(k * TAU) / Math.LN2 - log2ts;
27050   }
27051
27052
27053   // zoom to scale
27054   function geoZoomToScale(z, tileSize) {
27055       tileSize = tileSize || 256;
27056       return tileSize * Math.pow(2, z) / TAU;
27057   }
27058
27059   /**
27060    * A specialized version of `_.every` for arrays without support for
27061    * iteratee shorthands.
27062    *
27063    * @private
27064    * @param {Array} [array] The array to iterate over.
27065    * @param {Function} predicate The function invoked per iteration.
27066    * @returns {boolean} Returns `true` if all elements pass the predicate check,
27067    *  else `false`.
27068    */
27069   function arrayEvery(array, predicate) {
27070     var index = -1,
27071         length = array == null ? 0 : array.length;
27072
27073     while (++index < length) {
27074       if (!predicate(array[index], index, array)) {
27075         return false;
27076       }
27077     }
27078     return true;
27079   }
27080
27081   /**
27082    * The base implementation of `_.every` without support for iteratee shorthands.
27083    *
27084    * @private
27085    * @param {Array|Object} collection The collection to iterate over.
27086    * @param {Function} predicate The function invoked per iteration.
27087    * @returns {boolean} Returns `true` if all elements pass the predicate check,
27088    *  else `false`
27089    */
27090   function baseEvery(collection, predicate) {
27091     var result = true;
27092     baseEach(collection, function(value, index, collection) {
27093       result = !!predicate(value, index, collection);
27094       return result;
27095     });
27096     return result;
27097   }
27098
27099   /**
27100    * Checks if `predicate` returns truthy for **all** elements of `collection`.
27101    * Iteration is stopped once `predicate` returns falsey. The predicate is
27102    * invoked with three arguments: (value, index|key, collection).
27103    *
27104    * **Note:** This method returns `true` for
27105    * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
27106    * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
27107    * elements of empty collections.
27108    *
27109    * @static
27110    * @memberOf _
27111    * @since 0.1.0
27112    * @category Collection
27113    * @param {Array|Object} collection The collection to iterate over.
27114    * @param {Function} [predicate=_.identity] The function invoked per iteration.
27115    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
27116    * @returns {boolean} Returns `true` if all elements pass the predicate check,
27117    *  else `false`.
27118    * @example
27119    *
27120    * _.every([true, 1, null, 'yes'], Boolean);
27121    * // => false
27122    *
27123    * var users = [
27124    *   { 'user': 'barney', 'age': 36, 'active': false },
27125    *   { 'user': 'fred',   'age': 40, 'active': false }
27126    * ];
27127    *
27128    * // The `_.matches` iteratee shorthand.
27129    * _.every(users, { 'user': 'barney', 'active': false });
27130    * // => false
27131    *
27132    * // The `_.matchesProperty` iteratee shorthand.
27133    * _.every(users, ['active', false]);
27134    * // => true
27135    *
27136    * // The `_.property` iteratee shorthand.
27137    * _.every(users, 'active');
27138    * // => false
27139    */
27140   function every(collection, predicate, guard) {
27141     var func = isArray(collection) ? arrayEvery : baseEvery;
27142     if (guard && isIterateeCall(collection, predicate, guard)) {
27143       predicate = undefined;
27144     }
27145     return func(collection, baseIteratee(predicate, 3));
27146   }
27147
27148   /**
27149    * The base implementation of `_.some` without support for iteratee shorthands.
27150    *
27151    * @private
27152    * @param {Array|Object} collection The collection to iterate over.
27153    * @param {Function} predicate The function invoked per iteration.
27154    * @returns {boolean} Returns `true` if any element passes the predicate check,
27155    *  else `false`.
27156    */
27157   function baseSome(collection, predicate) {
27158     var result;
27159
27160     baseEach(collection, function(value, index, collection) {
27161       result = predicate(value, index, collection);
27162       return !result;
27163     });
27164     return !!result;
27165   }
27166
27167   /**
27168    * Checks if `predicate` returns truthy for **any** element of `collection`.
27169    * Iteration is stopped once `predicate` returns truthy. The predicate is
27170    * invoked with three arguments: (value, index|key, collection).
27171    *
27172    * @static
27173    * @memberOf _
27174    * @since 0.1.0
27175    * @category Collection
27176    * @param {Array|Object} collection The collection to iterate over.
27177    * @param {Function} [predicate=_.identity] The function invoked per iteration.
27178    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
27179    * @returns {boolean} Returns `true` if any element passes the predicate check,
27180    *  else `false`.
27181    * @example
27182    *
27183    * _.some([null, 0, 'yes', false], Boolean);
27184    * // => true
27185    *
27186    * var users = [
27187    *   { 'user': 'barney', 'active': true },
27188    *   { 'user': 'fred',   'active': false }
27189    * ];
27190    *
27191    * // The `_.matches` iteratee shorthand.
27192    * _.some(users, { 'user': 'barney', 'active': false });
27193    * // => false
27194    *
27195    * // The `_.matchesProperty` iteratee shorthand.
27196    * _.some(users, ['active', false]);
27197    * // => true
27198    *
27199    * // The `_.property` iteratee shorthand.
27200    * _.some(users, 'active');
27201    * // => true
27202    */
27203   function some(collection, predicate, guard) {
27204     var func = isArray(collection) ? arraySome : baseSome;
27205     if (guard && isIterateeCall(collection, predicate, guard)) {
27206       predicate = undefined;
27207     }
27208     return func(collection, baseIteratee(predicate, 3));
27209   }
27210
27211   // vector equals
27212   function geoVecEqual(a, b, epsilon) {
27213       if (epsilon) {
27214           return (Math.abs(a[0] - b[0]) <= epsilon) && (Math.abs(a[1] - b[1]) <= epsilon);
27215       } else {
27216           return (a[0] === b[0]) && (a[1] === b[1]);
27217       }
27218   }
27219
27220   // vector addition
27221   function geoVecAdd(a, b) {
27222       return [ a[0] + b[0], a[1] + b[1] ];
27223   }
27224
27225   // vector subtraction
27226   function geoVecSubtract(a, b) {
27227       return [ a[0] - b[0], a[1] - b[1] ];
27228   }
27229
27230   // vector scaling
27231   function geoVecScale(a, mag) {
27232       return [ a[0] * mag, a[1] * mag ];
27233   }
27234
27235   // vector rounding (was: geoRoundCoordinates)
27236   function geoVecFloor(a) {
27237       return [ Math.floor(a[0]), Math.floor(a[1]) ];
27238   }
27239
27240   // linear interpolation
27241   function geoVecInterp(a, b, t) {
27242       return [
27243           a[0] + (b[0] - a[0]) * t,
27244           a[1] + (b[1] - a[1]) * t
27245       ];
27246   }
27247
27248   // http://jsperf.com/id-dist-optimization
27249   function geoVecLength(a, b) {
27250       var x = a[0] - b[0];
27251       var y = a[1] - b[1];
27252       return Math.sqrt((x * x) + (y * y));
27253   }
27254
27255   // Return the counterclockwise angle in the range (-pi, pi)
27256   // between the positive X axis and the line intersecting a and b.
27257   function geoVecAngle(a, b) {
27258       return Math.atan2(b[1] - a[1], b[0] - a[0]);
27259   }
27260
27261   // dot product
27262   function geoVecDot(a, b, origin) {
27263       origin = origin || [0, 0];
27264       return (a[0] - origin[0]) * (b[0] - origin[0]) +
27265           (a[1] - origin[1]) * (b[1] - origin[1]);
27266   }
27267
27268   // 2D cross product of OA and OB vectors, returns magnitude of Z vector
27269   // Returns a positive value, if OAB makes a counter-clockwise turn,
27270   // negative for clockwise turn, and zero if the points are collinear.
27271   function geoVecCross(a, b, origin) {
27272       origin = origin || [0, 0];
27273       return (a[0] - origin[0]) * (b[1] - origin[1]) -
27274           (a[1] - origin[1]) * (b[0] - origin[0]);
27275   }
27276
27277   // Return the counterclockwise angle in the range (-pi, pi)
27278   // between the positive X axis and the line intersecting a and b.
27279   function geoAngle(a, b, projection) {
27280       return geoVecAngle(projection(a.loc), projection(b.loc));
27281   }
27282
27283   function geoEdgeEqual(a, b) {
27284       return (a[0] === b[0] && a[1] === b[1]) ||
27285           (a[0] === b[1] && a[1] === b[0]);
27286   }
27287
27288   // Rotate all points counterclockwise around a pivot point by given angle
27289   function geoRotate(points, angle, around) {
27290       return points.map(function(point) {
27291           var radial = geoVecSubtract(point, around);
27292           return [
27293               radial[0] * Math.cos(angle) - radial[1] * Math.sin(angle) + around[0],
27294               radial[0] * Math.sin(angle) + radial[1] * Math.cos(angle) + around[1]
27295           ];
27296       });
27297   }
27298
27299
27300   // Choose the edge with the minimal distance from `point` to its orthogonal
27301   // projection onto that edge, if such a projection exists, or the distance to
27302   // the closest vertex on that edge. Returns an object with the `index` of the
27303   // chosen edge, the chosen `loc` on that edge, and the `distance` to to it.
27304   function geoChooseEdge(nodes, point, projection, activeID) {
27305       var dist = geoVecLength;
27306       var points = nodes.map(function(n) { return projection(n.loc); });
27307       var ids = nodes.map(function(n) { return n.id; });
27308       var min = Infinity;
27309       var idx;
27310       var loc;
27311
27312       for (var i = 0; i < points.length - 1; i++) {
27313           if (ids[i] === activeID || ids[i + 1] === activeID) continue;
27314
27315           var o = points[i];
27316           var s = geoVecSubtract(points[i + 1], o);
27317           var v = geoVecSubtract(point, o);
27318           var proj = geoVecDot(v, s) / geoVecDot(s, s);
27319           var p;
27320
27321           if (proj < 0) {
27322               p = o;
27323           } else if (proj > 1) {
27324               p = points[i + 1];
27325           } else {
27326               p = [o[0] + proj * s[0], o[1] + proj * s[1]];
27327           }
27328
27329           var d = dist(p, point);
27330           if (d < min) {
27331               min = d;
27332               idx = i + 1;
27333               loc = projection.invert(p);
27334           }
27335       }
27336
27337       if (idx !== undefined) {
27338           return { index: idx, distance: min, loc: loc };
27339       } else {
27340           return null;
27341       }
27342   }
27343
27344
27345   // Test active (dragged or drawing) segments against inactive segments
27346   // This is used to test e.g. multipolygon rings that cross
27347   // `activeNodes` is the ring containing the activeID being dragged.
27348   // `inactiveNodes` is the other ring to test against
27349   function geoHasLineIntersections(activeNodes, inactiveNodes, activeID) {
27350       var actives = [];
27351       var inactives = [];
27352       var j, k, n1, n2, segment;
27353
27354       // gather active segments (only segments in activeNodes that contain the activeID)
27355       for (j = 0; j < activeNodes.length - 1; j++) {
27356           n1 = activeNodes[j];
27357           n2 = activeNodes[j+1];
27358           segment = [n1.loc, n2.loc];
27359           if (n1.id === activeID || n2.id === activeID) {
27360               actives.push(segment);
27361           }
27362       }
27363
27364       // gather inactive segments
27365       for (j = 0; j < inactiveNodes.length - 1; j++) {
27366           n1 = inactiveNodes[j];
27367           n2 = inactiveNodes[j+1];
27368           segment = [n1.loc, n2.loc];
27369           inactives.push(segment);
27370       }
27371
27372       // test
27373       for (j = 0; j < actives.length; j++) {
27374           for (k = 0; k < inactives.length; k++) {
27375               var p = actives[j];
27376               var q = inactives[k];
27377               var hit = geoLineIntersection(p, q);
27378               if (hit) {
27379                   return true;
27380               }
27381           }
27382       }
27383
27384       return false;
27385   }
27386
27387
27388   // Test active (dragged or drawing) segments against inactive segments
27389   // This is used to test whether a way intersects with itself.
27390   function geoHasSelfIntersections(nodes, activeID) {
27391       var actives = [];
27392       var inactives = [];
27393       var j, k;
27394
27395       // group active and passive segments along the nodes
27396       for (j = 0; j < nodes.length - 1; j++) {
27397           var n1 = nodes[j];
27398           var n2 = nodes[j+1];
27399           var segment = [n1.loc, n2.loc];
27400           if (n1.id === activeID || n2.id === activeID) {
27401               actives.push(segment);
27402           } else {
27403               inactives.push(segment);
27404           }
27405       }
27406
27407       // test
27408       for (j = 0; j < actives.length; j++) {
27409           for (k = 0; k < inactives.length; k++) {
27410               var p = actives[j];
27411               var q = inactives[k];
27412               // skip if segments share an endpoint
27413               if (geoVecEqual(p[1], q[0]) || geoVecEqual(p[0], q[1]) ||
27414                   geoVecEqual(p[0], q[0]) || geoVecEqual(p[1], q[1]) ) {
27415                   continue;
27416               }
27417
27418               var hit = geoLineIntersection(p, q);
27419               if (hit) {
27420                   var epsilon = 1e-8;
27421                   // skip if the hit is at the segment's endpoint
27422                   if (geoVecEqual(p[1], hit, epsilon) || geoVecEqual(p[0], hit, epsilon) ||
27423                       geoVecEqual(q[1], hit, epsilon) || geoVecEqual(q[0], hit, epsilon) ) {
27424                       continue;
27425                   } else {
27426                       return true;
27427                   }
27428               }
27429           }
27430       }
27431
27432       return false;
27433   }
27434
27435
27436   // Return the intersection point of 2 line segments.
27437   // From https://github.com/pgkelley4/line-segments-intersect
27438   // This uses the vector cross product approach described below:
27439   //  http://stackoverflow.com/a/565282/786339
27440   function geoLineIntersection(a, b) {
27441       var p = [a[0][0], a[0][1]];
27442       var p2 = [a[1][0], a[1][1]];
27443       var q = [b[0][0], b[0][1]];
27444       var q2 = [b[1][0], b[1][1]];
27445       var r = geoVecSubtract(p2, p);
27446       var s = geoVecSubtract(q2, q);
27447       var uNumerator = geoVecCross(geoVecSubtract(q, p), r);
27448       var denominator = geoVecCross(r, s);
27449
27450       if (uNumerator && denominator) {
27451           var u = uNumerator / denominator;
27452           var t = geoVecCross(geoVecSubtract(q, p), s) / denominator;
27453
27454           if ((t >= 0) && (t <= 1) && (u >= 0) && (u <= 1)) {
27455               return geoVecInterp(p, p2, t);
27456           }
27457       }
27458
27459       return null;
27460   }
27461
27462
27463   function geoPathIntersections(path1, path2) {
27464       var intersections = [];
27465       for (var i = 0; i < path1.length - 1; i++) {
27466           for (var j = 0; j < path2.length - 1; j++) {
27467               var a = [ path1[i], path1[i+1] ];
27468               var b = [ path2[j], path2[j+1] ];
27469               var hit = geoLineIntersection(a, b);
27470               if (hit) {
27471                   intersections.push(hit);
27472               }
27473           }
27474       }
27475       return intersections;
27476   }
27477
27478   function geoPathHasIntersections(path1, path2) {
27479       for (var i = 0; i < path1.length - 1; i++) {
27480           for (var j = 0; j < path2.length - 1; j++) {
27481               var a = [ path1[i], path1[i+1] ];
27482               var b = [ path2[j], path2[j+1] ];
27483               var hit = geoLineIntersection(a, b);
27484               if (hit) {
27485                   return true;
27486               }
27487           }
27488       }
27489       return false;
27490   }
27491
27492
27493   // Return whether point is contained in polygon.
27494   //
27495   // `point` should be a 2-item array of coordinates.
27496   // `polygon` should be an array of 2-item arrays of coordinates.
27497   //
27498   // From https://github.com/substack/point-in-polygon.
27499   // ray-casting algorithm based on
27500   // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
27501   //
27502   function geoPointInPolygon(point, polygon) {
27503       var x = point[0];
27504       var y = point[1];
27505       var inside = false;
27506
27507       for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
27508           var xi = polygon[i][0];
27509           var yi = polygon[i][1];
27510           var xj = polygon[j][0];
27511           var yj = polygon[j][1];
27512
27513           var intersect = ((yi > y) !== (yj > y)) &&
27514               (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
27515           if (intersect) inside = !inside;
27516       }
27517
27518       return inside;
27519   }
27520
27521
27522   function geoPolygonContainsPolygon(outer, inner) {
27523       return every(inner, function(point) {
27524           return geoPointInPolygon(point, outer);
27525       });
27526   }
27527
27528
27529   function geoPolygonIntersectsPolygon(outer, inner, checkSegments) {
27530       function testPoints(outer, inner) {
27531           return some(inner, function(point) {
27532               return geoPointInPolygon(point, outer);
27533           });
27534       }
27535
27536      return testPoints(outer, inner) || (!!checkSegments && geoPathHasIntersections(outer, inner));
27537   }
27538
27539
27540   function geoPathLength(path) {
27541       var length = 0;
27542       for (var i = 0; i < path.length - 1; i++) {
27543           length += geoVecLength(path[i], path[i + 1]);
27544       }
27545       return length;
27546   }
27547
27548
27549   // If the given point is at the edge of the padded viewport,
27550   // return a vector that will nudge the viewport in that direction
27551   function geoViewportEdge(point, dimensions) {
27552       var pad = [80, 20, 50, 20];   // top, right, bottom, left
27553       var x = 0;
27554       var y = 0;
27555
27556       if (point[0] > dimensions[0] - pad[1])
27557           x = -10;
27558       if (point[0] < pad[3])
27559           x = 10;
27560       if (point[1] > dimensions[1] - pad[2])
27561           y = -10;
27562       if (point[1] < pad[0])
27563           y = 10;
27564
27565       if (x || y) {
27566           return [x, y];
27567       } else {
27568           return null;
27569       }
27570   }
27571
27572   /*
27573       Bypasses features of D3's default projection stream pipeline that are unnecessary:
27574       * Antimeridian clipping
27575       * Spherical rotation
27576       * Resampling
27577   */
27578   function geoRawMercator() {
27579       var project = mercatorRaw;
27580       var k = 512 / Math.PI; // scale
27581       var x = 0;
27582       var y = 0; // translate
27583       var clipExtent = [[0, 0], [0, 0]];
27584
27585
27586       function projection$$1(point) {
27587           point = project(point[0] * Math.PI / 180, point[1] * Math.PI / 180);
27588           return [point[0] * k + x, y - point[1] * k];
27589       }
27590
27591
27592       projection$$1.invert = function(point) {
27593           point = project.invert((point[0] - x) / k, (y - point[1]) / k);
27594           return point && [point[0] * 180 / Math.PI, point[1] * 180 / Math.PI];
27595       };
27596
27597
27598       projection$$1.scale = function(_) {
27599           if (!arguments.length) return k;
27600           k = +_;
27601           return projection$$1;
27602       };
27603
27604
27605       projection$$1.translate = function(_) {
27606           if (!arguments.length) return [x, y];
27607           x = +_[0];
27608           y = +_[1];
27609           return projection$$1;
27610       };
27611
27612
27613       projection$$1.clipExtent = function(_) {
27614           if (!arguments.length) return clipExtent;
27615           clipExtent = _;
27616           return projection$$1;
27617       };
27618
27619
27620       projection$$1.transform = function(obj) {
27621           if (!arguments.length) return identity$7.translate(x, y).scale(k);
27622           x = +obj.x;
27623           y = +obj.y;
27624           k = +obj.k;
27625           return projection$$1;
27626       };
27627
27628
27629       projection$$1.stream = d3_geoTransform({
27630           point: function(x, y) {
27631               var vec = projection$$1([x, y]);
27632               this.stream.point(vec[0], vec[1]);
27633           }
27634       }).stream;
27635
27636
27637       return projection$$1;
27638   }
27639
27640   function osmChangeset() {
27641       if (!(this instanceof osmChangeset)) {
27642           return (new osmChangeset()).initialize(arguments);
27643       } else if (arguments.length) {
27644           this.initialize(arguments);
27645       }
27646   }
27647
27648
27649   osmEntity$$1.changeset = osmChangeset;
27650
27651   osmChangeset.prototype = Object.create(osmEntity$$1.prototype);
27652
27653   assignIn(osmChangeset.prototype, {
27654
27655       type: 'changeset',
27656
27657
27658       extent: function() {
27659           return new geoExtent$$1();
27660       },
27661
27662
27663       geometry: function() {
27664           return 'changeset';
27665       },
27666
27667
27668       asJXON: function() {
27669           return {
27670               osm: {
27671                   changeset: {
27672                       tag: map$3(this.tags, function(value, key) {
27673                           return { '@k': key, '@v': value };
27674                       }),
27675                       '@version': 0.6,
27676                       '@generator': 'iD'
27677                   }
27678               }
27679           };
27680       },
27681
27682
27683       // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange)
27684       // XML. Returns a string.
27685       osmChangeJXON: function(changes) {
27686           var changeset_id = this.id;
27687
27688           function nest(x, order) {
27689               var groups = {};
27690               for (var i = 0; i < x.length; i++) {
27691                   var tagName = Object.keys(x[i])[0];
27692                   if (!groups[tagName]) groups[tagName] = [];
27693                   groups[tagName].push(x[i][tagName]);
27694               }
27695               var ordered = {};
27696               order.forEach(function(o) {
27697                   if (groups[o]) ordered[o] = groups[o];
27698               });
27699               return ordered;
27700           }
27701
27702
27703           // sort relations in a changeset by dependencies
27704           function sort(changes) {
27705
27706               // find a referenced relation in the current changeset
27707               function resolve(item) {
27708                   return find$1(relations, function(relation) {
27709                       return item.keyAttributes.type === 'relation'
27710                           && item.keyAttributes.ref === relation['@id'];
27711                   });
27712               }
27713
27714               // a new item is an item that has not been already processed
27715               function isNew(item) {
27716                   return !sorted[ item['@id'] ] && !find$1(processing, function(proc) {
27717                       return proc['@id'] === item['@id'];
27718                   });
27719               }
27720
27721               var processing = [],
27722                   sorted = {},
27723                   relations = changes.relation;
27724
27725               if (!relations) return changes;
27726
27727               for (var i = 0; i < relations.length; i++) {
27728                   var relation = relations[i];
27729
27730                   // skip relation if already sorted
27731                   if (!sorted[relation['@id']]) {
27732                       processing.push(relation);
27733                   }
27734
27735                   while (processing.length > 0) {
27736                       var next = processing[0],
27737                       deps = filter(compact(next.member.map(resolve)), isNew);
27738                       if (deps.length === 0) {
27739                           sorted[next['@id']] = next;
27740                           processing.shift();
27741                       } else {
27742                           processing = deps.concat(processing);
27743                       }
27744                   }
27745               }
27746
27747               changes.relation = values$1(sorted);
27748               return changes;
27749           }
27750
27751           function rep(entity) {
27752               return entity.asJXON(changeset_id);
27753           }
27754
27755           return {
27756               osmChange: {
27757                   '@version': 0.6,
27758                   '@generator': 'iD',
27759                   'create': sort(nest(changes.created.map(rep), ['node', 'way', 'relation'])),
27760                   'modify': nest(changes.modified.map(rep), ['node', 'way', 'relation']),
27761                   'delete': assignIn(nest(changes.deleted.map(rep), ['relation', 'way', 'node']), { '@if-unused': true })
27762               }
27763           };
27764       },
27765
27766
27767       asGeoJSON: function() {
27768           return {};
27769       }
27770
27771   });
27772
27773   function krError() {
27774       if (!(this instanceof krError)) {
27775           return (new krError()).initialize(arguments);
27776       } else if (arguments.length) {
27777           this.initialize(arguments);
27778       }
27779   }
27780
27781
27782   krError.id = function() {
27783       return krError.id.next--;
27784   };
27785
27786
27787   krError.id.next = -1;
27788
27789
27790   assignIn(krError.prototype, {
27791
27792       type: 'krError',
27793
27794       initialize: function(sources) {
27795           for (var i = 0; i < sources.length; ++i) {
27796               var source = sources[i];
27797               for (var prop in source) {
27798                   if (Object.prototype.hasOwnProperty.call(source, prop)) {
27799                       if (source[prop] === undefined) {
27800                           delete this[prop];
27801                       } else {
27802                           this[prop] = source[prop];
27803                       }
27804                   }
27805               }
27806           }
27807
27808           if (!this.id) {
27809               this.id = krError.id() + '';  // as string
27810           }
27811
27812           return this;
27813       },
27814
27815       update: function(attrs) {
27816           return krError(this, attrs); // {v: 1 + (this.v || 0)}
27817       }
27818   });
27819
27820   /**
27821    * Creates a duplicate-free version of an array, using
27822    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
27823    * for equality comparisons, in which only the first occurrence of each element
27824    * is kept. The order of result values is determined by the order they occur
27825    * in the array.
27826    *
27827    * @static
27828    * @memberOf _
27829    * @since 0.1.0
27830    * @category Array
27831    * @param {Array} array The array to inspect.
27832    * @returns {Array} Returns the new duplicate free array.
27833    * @example
27834    *
27835    * _.uniq([2, 1, 2]);
27836    * // => [2, 1]
27837    */
27838   function uniq(array) {
27839     return (array && array.length) ? baseUniq(array) : [];
27840   }
27841
27842   function osmNode() {
27843       if (!(this instanceof osmNode)) {
27844           return (new osmNode()).initialize(arguments);
27845       } else if (arguments.length) {
27846           this.initialize(arguments);
27847       }
27848   }
27849
27850   osmEntity$$1.node = osmNode;
27851
27852   osmNode.prototype = Object.create(osmEntity$$1.prototype);
27853
27854   assignIn(osmNode.prototype, {
27855
27856       type: 'node',
27857
27858
27859       extent: function() {
27860           return new geoExtent$$1(this.loc);
27861       },
27862
27863
27864       geometry: function(graph) {
27865           return graph.transient(this, 'geometry', function() {
27866               return graph.isPoi(this) ? 'point' : 'vertex';
27867           });
27868       },
27869
27870
27871       move: function(loc) {
27872           return this.update({loc: loc});
27873       },
27874
27875
27876       isDegenerate: function() {
27877           return !(
27878               Array.isArray(this.loc) && this.loc.length === 2 &&
27879               this.loc[0] >= -180 && this.loc[0] <= 180 &&
27880               this.loc[1] >= -90 && this.loc[1] <= 90
27881           );
27882       },
27883
27884
27885       // Inspect tags and geometry to determine which direction(s) this node/vertex points
27886       directions: function(resolver, projection) {
27887           var val;
27888           var i;
27889
27890           // which tag to use?
27891           if (this.isHighwayIntersection(resolver) && (this.tags.stop || '').toLowerCase() === 'all') {
27892               // all-way stop tag on a highway intersection
27893               val = 'all';
27894           } else {
27895               // generic direction tag
27896               val = (this.tags.direction || '').toLowerCase();
27897
27898               // better suffix-style direction tag
27899               var re = /:direction$/i;
27900               var keys = Object.keys(this.tags);
27901               for (i = 0; i < keys.length; i++) {
27902                   if (re.test(keys[i])) {
27903                       val = this.tags[keys[i]].toLowerCase();
27904                       break;
27905                   }
27906               }
27907           }
27908
27909           if (val === '') return [];
27910
27911           var cardinal = {
27912               north: 0,               n: 0,
27913               northnortheast: 22,     nne: 22,
27914               northeast: 45,          ne: 45,
27915               eastnortheast: 67,      ene: 67,
27916               east: 90,               e: 90,
27917               eastsoutheast: 112,     ese: 112,
27918               southeast: 135,         se: 135,
27919               southsoutheast: 157,    sse: 157,
27920               south: 180,             s: 180,
27921               southsouthwest: 202,    ssw: 202,
27922               southwest: 225,         sw: 225,
27923               westsouthwest: 247,     wsw: 247,
27924               west: 270,              w: 270,
27925               westnorthwest: 292,     wnw: 292,
27926               northwest: 315,         nw: 315,
27927               northnorthwest: 337,    nnw: 337
27928           };
27929
27930
27931           var values = val.split(';');
27932           var results = [];
27933
27934           values.forEach(function(v) {
27935               // swap cardinal for numeric directions
27936               if (cardinal[v] !== undefined) {
27937                   v = cardinal[v];
27938               }
27939
27940               // numeric direction - just add to results
27941               if (v !== '' && !isNaN(+v)) {
27942                   results.push(+v);
27943                   return;
27944               }
27945
27946               // string direction - inspect parent ways
27947               var lookBackward =
27948                   (this.tags['traffic_sign:backward'] || v === 'backward' || v === 'both' || v === 'all');
27949               var lookForward =
27950                   (this.tags['traffic_sign:forward'] || v === 'forward' || v === 'both' || v === 'all');
27951
27952               if (!lookForward && !lookBackward) return;
27953
27954               var nodeIds = {};
27955               resolver.parentWays(this).forEach(function(parent) {
27956                   var nodes = parent.nodes;
27957                   for (i = 0; i < nodes.length; i++) {
27958                       if (nodes[i] === this.id) {  // match current entity
27959                           if (lookForward && i > 0) {
27960                               nodeIds[nodes[i - 1]] = true;  // look back to prev node
27961                           }
27962                           if (lookBackward && i < nodes.length - 1) {
27963                               nodeIds[nodes[i + 1]] = true;  // look ahead to next node
27964                           }
27965                       }
27966                   }
27967               }, this);
27968
27969               Object.keys(nodeIds).forEach(function(nodeId) {
27970                   // +90 because geoAngle returns angle from X axis, not Y (north)
27971                   results.push(
27972                       (geoAngle(this, resolver.entity(nodeId), projection) * (180 / Math.PI)) + 90
27973                   );
27974               }, this);
27975
27976           }, this);
27977
27978           return uniq(results);
27979       },
27980
27981
27982       isEndpoint: function(resolver) {
27983           return resolver.transient(this, 'isEndpoint', function() {
27984               var id = this.id;
27985               return resolver.parentWays(this).filter(function(parent) {
27986                   return !parent.isClosed() && !!parent.affix(id);
27987               }).length > 0;
27988           });
27989       },
27990
27991
27992       isConnected: function(resolver) {
27993           return resolver.transient(this, 'isConnected', function() {
27994               var parents = resolver.parentWays(this);
27995
27996               function isLine(entity) {
27997                   return entity.geometry(resolver) === 'line' &&
27998                       entity.hasInterestingTags();
27999               }
28000
28001               // vertex is connected to multiple parent lines
28002               if (parents.length > 1 && some(parents, isLine)) {
28003                   return true;
28004
28005               } else if (parents.length === 1) {
28006                   var way = parents[0],
28007                       nodes = way.nodes.slice();
28008                   if (way.isClosed()) { nodes.pop(); }  // ignore connecting node if closed
28009
28010                   // return true if vertex appears multiple times (way is self intersecting)
28011                   return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id);
28012               }
28013
28014               return false;
28015           });
28016       },
28017
28018
28019       isIntersection: function(resolver) {
28020           return resolver.transient(this, 'isIntersection', function() {
28021               return resolver.parentWays(this).filter(function(parent) {
28022                   return (parent.tags.highway ||
28023                       parent.tags.waterway ||
28024                       parent.tags.railway ||
28025                       parent.tags.aeroway) &&
28026                       parent.geometry(resolver) === 'line';
28027               }).length > 1;
28028           });
28029       },
28030
28031
28032       isHighwayIntersection: function(resolver) {
28033           return resolver.transient(this, 'isHighwayIntersection', function() {
28034               return resolver.parentWays(this).filter(function(parent) {
28035                   return parent.tags.highway && parent.geometry(resolver) === 'line';
28036               }).length > 1;
28037           });
28038       },
28039
28040
28041       isOnAddressLine: function(resolver) {
28042           return resolver.transient(this, 'isOnAddressLine', function() {
28043               return resolver.parentWays(this).filter(function(parent) {
28044                   return parent.tags.hasOwnProperty('addr:interpolation') &&
28045                       parent.geometry(resolver) === 'line';
28046               }).length > 0;
28047           });
28048       },
28049
28050
28051       asJXON: function(changeset_id) {
28052           var r = {
28053               node: {
28054                   '@id': this.osmId(),
28055                   '@lon': this.loc[0],
28056                   '@lat': this.loc[1],
28057                   '@version': (this.version || 0),
28058                   tag: map$3(this.tags, function(v, k) {
28059                       return { keyAttributes: { k: k, v: v } };
28060                   })
28061               }
28062           };
28063           if (changeset_id) r.node['@changeset'] = changeset_id;
28064           return r;
28065       },
28066
28067
28068       asGeoJSON: function() {
28069           return {
28070               type: 'Point',
28071               coordinates: this.loc
28072           };
28073       }
28074   });
28075
28076   function osmNote() {
28077       if (!(this instanceof osmNote)) {
28078           return (new osmNote()).initialize(arguments);
28079       } else if (arguments.length) {
28080           this.initialize(arguments);
28081       }
28082   }
28083
28084
28085   osmNote.id = function() {
28086       return osmNote.id.next--;
28087   };
28088
28089
28090   osmNote.id.next = -1;
28091
28092
28093   assignIn(osmNote.prototype, {
28094
28095       type: 'note',
28096
28097       initialize: function(sources) {
28098           for (var i = 0; i < sources.length; ++i) {
28099               var source = sources[i];
28100               for (var prop in source) {
28101                   if (Object.prototype.hasOwnProperty.call(source, prop)) {
28102                       if (source[prop] === undefined) {
28103                           delete this[prop];
28104                       } else {
28105                           this[prop] = source[prop];
28106                       }
28107                   }
28108               }
28109           }
28110
28111           if (!this.id) {
28112               this.id = osmNote.id() + '';  // as string
28113           }
28114
28115           return this;
28116       },
28117
28118       extent: function() {
28119           return new geoExtent$$1(this.loc);
28120       },
28121
28122       update: function(attrs) {
28123           return osmNote(this, attrs); // {v: 1 + (this.v || 0)}
28124       },
28125
28126       isNew: function() {
28127           return this.id < 0;
28128       },
28129
28130       move: function(loc) {
28131           return this.update({ loc: loc });
28132       }
28133
28134   });
28135
28136   /** Error message constants. */
28137   var FUNC_ERROR_TEXT$1 = 'Expected a function';
28138
28139   /**
28140    * Creates a function that negates the result of the predicate `func`. The
28141    * `func` predicate is invoked with the `this` binding and arguments of the
28142    * created function.
28143    *
28144    * @static
28145    * @memberOf _
28146    * @since 3.0.0
28147    * @category Function
28148    * @param {Function} predicate The predicate to negate.
28149    * @returns {Function} Returns the new negated function.
28150    * @example
28151    *
28152    * function isEven(n) {
28153    *   return n % 2 == 0;
28154    * }
28155    *
28156    * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
28157    * // => [1, 3, 5]
28158    */
28159   function negate(predicate) {
28160     if (typeof predicate != 'function') {
28161       throw new TypeError(FUNC_ERROR_TEXT$1);
28162     }
28163     return function() {
28164       var args = arguments;
28165       switch (args.length) {
28166         case 0: return !predicate.call(this);
28167         case 1: return !predicate.call(this, args[0]);
28168         case 2: return !predicate.call(this, args[0], args[1]);
28169         case 3: return !predicate.call(this, args[0], args[1], args[2]);
28170       }
28171       return !predicate.apply(this, args);
28172     };
28173   }
28174
28175   /**
28176    * The opposite of `_.filter`; this method returns the elements of `collection`
28177    * that `predicate` does **not** return truthy for.
28178    *
28179    * @static
28180    * @memberOf _
28181    * @since 0.1.0
28182    * @category Collection
28183    * @param {Array|Object} collection The collection to iterate over.
28184    * @param {Function} [predicate=_.identity] The function invoked per iteration.
28185    * @returns {Array} Returns the new filtered array.
28186    * @see _.filter
28187    * @example
28188    *
28189    * var users = [
28190    *   { 'user': 'barney', 'age': 36, 'active': false },
28191    *   { 'user': 'fred',   'age': 40, 'active': true }
28192    * ];
28193    *
28194    * _.reject(users, function(o) { return !o.active; });
28195    * // => objects for ['fred']
28196    *
28197    * // The `_.matches` iteratee shorthand.
28198    * _.reject(users, { 'age': 40, 'active': true });
28199    * // => objects for ['barney']
28200    *
28201    * // The `_.matchesProperty` iteratee shorthand.
28202    * _.reject(users, ['active', false]);
28203    * // => objects for ['fred']
28204    *
28205    * // The `_.property` iteratee shorthand.
28206    * _.reject(users, 'active');
28207    * // => objects for ['barney']
28208    */
28209   function reject(collection, predicate) {
28210     var func = isArray(collection) ? arrayFilter : baseFilter;
28211     return func(collection, negate(baseIteratee(predicate, 3)));
28212   }
28213
28214   /*
28215   Order the nodes of a way in reverse order and reverse any direction dependent tags
28216   other than `oneway`. (We assume that correcting a backwards oneway is the primary
28217   reason for reversing a way.)
28218
28219   In addition, numeric-valued `incline` tags are negated.
28220
28221   The JOSM implementation was used as a guide, but transformations that were of unclear benefit
28222   or adjusted tags that don't seem to be used in practice were omitted.
28223
28224   References:
28225       http://wiki.openstreetmap.org/wiki/Forward_%26_backward,_left_%26_right
28226       http://wiki.openstreetmap.org/wiki/Key:direction#Steps
28227       http://wiki.openstreetmap.org/wiki/Key:incline
28228       http://wiki.openstreetmap.org/wiki/Route#Members
28229       http://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
28230       http://wiki.openstreetmap.org/wiki/Tag:highway%3Dstop
28231       http://wiki.openstreetmap.org/wiki/Key:traffic_sign#On_a_way_or_area
28232   */
28233   function actionReverse(wayID, options) {
28234       var ignoreKey = /^.*(_|:)?(description|name|note|website|ref|source|comment|watch|attribution)(_|:)?/;
28235       var numeric = /^([+\-]?)(?=[\d.])/;
28236       var keyReplacements = [
28237           [/:right$/, ':left'],
28238           [/:left$/, ':right'],
28239           [/:forward$/, ':backward'],
28240           [/:backward$/, ':forward']
28241       ];
28242       var valueReplacements = {
28243           left: 'right',
28244           right: 'left',
28245           up: 'down',
28246           down: 'up',
28247           forward: 'backward',
28248           backward: 'forward',
28249           forwards: 'backward',
28250           backwards: 'forward',
28251       };
28252       var roleReplacements = {
28253           forward: 'backward',
28254           backward: 'forward',
28255           forwards: 'backward',
28256           backwards: 'forward'
28257       };
28258       var onewayReplacements = {
28259           yes: '-1',
28260           '1': '-1',
28261           '-1': 'yes'
28262       };
28263
28264
28265       function reverseKey(key) {
28266           for (var i = 0; i < keyReplacements.length; ++i) {
28267               var replacement = keyReplacements[i];
28268               if (replacement[0].test(key)) {
28269                   return key.replace(replacement[0], replacement[1]);
28270               }
28271           }
28272           return key;
28273       }
28274
28275
28276       function reverseValue(key, value) {
28277           if (ignoreKey.test(key)) return value;
28278
28279           if (key === 'incline' && numeric.test(value)) {
28280               return value.replace(numeric, function(_, sign) { return sign === '-' ? '' : '-'; });
28281           } else if (options && options.reverseOneway && key === 'oneway') {
28282               return onewayReplacements[value] || value;
28283           } else {
28284               return valueReplacements[value] || value;
28285           }
28286       }
28287
28288
28289       // Reverse the direction of tags attached to the nodes - #3076
28290       function reverseNodeTags(graph, nodeIDs) {
28291           for (var i = 0; i < nodeIDs.length; i++) {
28292               var node = graph.hasEntity(nodeIDs[i]);
28293               if (!node || !Object.keys(node.tags).length) continue;
28294
28295               var tags = {};
28296               for (var key in node.tags) {
28297                   tags[reverseKey(key)] = reverseValue(key, node.tags[key]);
28298               }
28299               graph = graph.replace(node.update({tags: tags}));
28300           }
28301           return graph;
28302       }
28303
28304
28305       return function(graph) {
28306           var way = graph.entity(wayID);
28307           var nodes = way.nodes.slice().reverse();
28308           var tags = {};
28309           var role;
28310
28311           for (var key in way.tags) {
28312               tags[reverseKey(key)] = reverseValue(key, way.tags[key]);
28313           }
28314
28315           graph.parentRelations(way).forEach(function(relation) {
28316               relation.members.forEach(function(member, index) {
28317                   if (member.id === way.id && (role = roleReplacements[member.role])) {
28318                       relation = relation.updateMember({role: role}, index);
28319                       graph = graph.replace(relation);
28320                   }
28321               });
28322           });
28323
28324           // Reverse any associated directions on nodes on the way and then replace
28325           // the way itself with the reversed node ids and updated way tags
28326           return reverseNodeTags(graph, nodes)
28327               .replace(way.update({nodes: nodes, tags: tags}));
28328       };
28329   }
28330
28331   /** `Object#toString` result references. */
28332   var numberTag$4 = '[object Number]';
28333
28334   /**
28335    * Checks if `value` is classified as a `Number` primitive or object.
28336    *
28337    * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
28338    * classified as numbers, use the `_.isFinite` method.
28339    *
28340    * @static
28341    * @memberOf _
28342    * @since 0.1.0
28343    * @category Lang
28344    * @param {*} value The value to check.
28345    * @returns {boolean} Returns `true` if `value` is a number, else `false`.
28346    * @example
28347    *
28348    * _.isNumber(3);
28349    * // => true
28350    *
28351    * _.isNumber(Number.MIN_VALUE);
28352    * // => true
28353    *
28354    * _.isNumber(Infinity);
28355    * // => true
28356    *
28357    * _.isNumber('3');
28358    * // => false
28359    */
28360   function isNumber(value) {
28361     return typeof value == 'number' ||
28362       (isObjectLike(value) && baseGetTag(value) == numberTag$4);
28363   }
28364
28365   /** `Object#toString` result references. */
28366   var stringTag$4 = '[object String]';
28367
28368   /**
28369    * Checks if `value` is classified as a `String` primitive or object.
28370    *
28371    * @static
28372    * @since 0.1.0
28373    * @memberOf _
28374    * @category Lang
28375    * @param {*} value The value to check.
28376    * @returns {boolean} Returns `true` if `value` is a string, else `false`.
28377    * @example
28378    *
28379    * _.isString('abc');
28380    * // => true
28381    *
28382    * _.isString(1);
28383    * // => false
28384    */
28385   function isString(value) {
28386     return typeof value == 'string' ||
28387       (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag$4);
28388   }
28389
28390   /**
28391    * Checks if `value` is `NaN`.
28392    *
28393    * **Note:** This method is based on
28394    * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
28395    * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
28396    * `undefined` and other non-number values.
28397    *
28398    * @static
28399    * @memberOf _
28400    * @since 0.1.0
28401    * @category Lang
28402    * @param {*} value The value to check.
28403    * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
28404    * @example
28405    *
28406    * _.isNaN(NaN);
28407    * // => true
28408    *
28409    * _.isNaN(new Number(NaN));
28410    * // => true
28411    *
28412    * isNaN(undefined);
28413    * // => true
28414    *
28415    * _.isNaN(undefined);
28416    * // => false
28417    */
28418   function isNaN$1(value) {
28419     // An `NaN` primitive is the only value that is not equal to itself.
28420     // Perform the `toStringTag` check first to avoid errors with some
28421     // ActiveX objects in IE.
28422     return isNumber(value) && value != +value;
28423   }
28424
28425   function osmLanes(entity) {
28426       if (entity.type !== 'way') return null;
28427       if (!entity.tags.highway) return null;
28428
28429       var tags = entity.tags;
28430       var isOneWay = entity.isOneWay();
28431       var laneCount = getLaneCount(tags, isOneWay);
28432       var maxspeed = parseMaxspeed(tags);
28433
28434       var laneDirections = parseLaneDirections(tags, isOneWay, laneCount);
28435       var forward = laneDirections.forward;
28436       var backward = laneDirections.backward;
28437       var bothways = laneDirections.bothways;
28438
28439       // parse the piped string 'x|y|z' format
28440       var turnLanes = {};
28441       turnLanes.unspecified = parseTurnLanes(tags['turn:lanes']);
28442       turnLanes.forward = parseTurnLanes(tags['turn:lanes:forward']);
28443       turnLanes.backward = parseTurnLanes(tags['turn:lanes:backward']);
28444
28445       var maxspeedLanes = {};
28446       maxspeedLanes.unspecified = parseMaxspeedLanes(tags['maxspeed:lanes'], maxspeed);
28447       maxspeedLanes.forward = parseMaxspeedLanes(tags['maxspeed:lanes:forward'], maxspeed);
28448       maxspeedLanes.backward = parseMaxspeedLanes(tags['maxspeed:lanes:backward'], maxspeed);
28449
28450       var psvLanes = {};
28451       psvLanes.unspecified = parseMiscLanes(tags['psv:lanes']);
28452       psvLanes.forward = parseMiscLanes(tags['psv:lanes:forward']);
28453       psvLanes.backward = parseMiscLanes(tags['psv:lanes:backward']);
28454
28455       var busLanes = {};
28456       busLanes.unspecified = parseMiscLanes(tags['bus:lanes']);
28457       busLanes.forward = parseMiscLanes(tags['bus:lanes:forward']);
28458       busLanes.backward = parseMiscLanes(tags['bus:lanes:backward']);
28459
28460       var taxiLanes = {};
28461       taxiLanes.unspecified = parseMiscLanes(tags['taxi:lanes']);
28462       taxiLanes.forward = parseMiscLanes(tags['taxi:lanes:forward']);
28463       taxiLanes.backward = parseMiscLanes(tags['taxi:lanes:backward']);
28464
28465       var hovLanes = {};
28466       hovLanes.unspecified = parseMiscLanes(tags['hov:lanes']);
28467       hovLanes.forward = parseMiscLanes(tags['hov:lanes:forward']);
28468       hovLanes.backward = parseMiscLanes(tags['hov:lanes:backward']);
28469
28470       var hgvLanes = {};
28471       hgvLanes.unspecified = parseMiscLanes(tags['hgv:lanes']);
28472       hgvLanes.forward = parseMiscLanes(tags['hgv:lanes:forward']);
28473       hgvLanes.backward = parseMiscLanes(tags['hgv:lanes:backward']);
28474
28475       var bicyclewayLanes = {};
28476       bicyclewayLanes.unspecified = parseBicycleWay(tags['bicycleway:lanes']);
28477       bicyclewayLanes.forward = parseBicycleWay(tags['bicycleway:lanes:forward']);
28478       bicyclewayLanes.backward = parseBicycleWay(tags['bicycleway:lanes:backward']);
28479
28480       var lanesObj = {
28481           forward: [],
28482           backward: [],
28483           unspecified: []
28484       };
28485
28486       // map forward/backward/unspecified of each lane type to lanesObj
28487       mapToLanesObj(lanesObj, turnLanes, 'turnLane');
28488       mapToLanesObj(lanesObj, maxspeedLanes, 'maxspeed');
28489       mapToLanesObj(lanesObj, psvLanes, 'psv');
28490       mapToLanesObj(lanesObj, busLanes, 'bus');
28491       mapToLanesObj(lanesObj, taxiLanes, 'taxi');
28492       mapToLanesObj(lanesObj, hovLanes, 'hov');
28493       mapToLanesObj(lanesObj, hgvLanes, 'hgv');
28494       mapToLanesObj(lanesObj, bicyclewayLanes, 'bicycleway');
28495
28496       return {
28497           metadata: {
28498               count: laneCount,
28499               oneway: isOneWay,
28500               forward: forward,
28501               backward: backward,
28502               bothways: bothways,
28503               turnLanes: turnLanes,
28504               maxspeed: maxspeed,
28505               maxspeedLanes: maxspeedLanes,
28506               psvLanes: psvLanes,
28507               busLanes: busLanes,
28508               taxiLanes: taxiLanes,
28509               hovLanes: hovLanes,
28510               hgvLanes: hgvLanes,
28511               bicyclewayLanes: bicyclewayLanes
28512           },
28513           lanes: lanesObj
28514       };
28515   }
28516
28517
28518   function getLaneCount(tags, isOneWay) {
28519       var count;
28520       if (tags.lanes) {
28521           count = parseInt(tags.lanes, 10);
28522           if (count > 0) {
28523               return count;
28524           }
28525       }
28526
28527
28528       switch (tags.highway) {
28529           case 'trunk':
28530           case 'motorway':
28531               count = isOneWay ? 2 : 4;
28532               break;
28533           default:
28534               count = isOneWay ? 1 : 2;
28535               break;
28536       }
28537
28538       return count;
28539   }
28540
28541
28542   function parseMaxspeed(tags) {
28543       var maxspeed = tags.maxspeed;
28544       if (isNumber(maxspeed)) return maxspeed;
28545       if (isString(maxspeed)) {
28546           maxspeed = maxspeed.match(/^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/g);
28547           if (!maxspeed) return;
28548           return parseInt(maxspeed, 10);
28549       }
28550   }
28551
28552
28553   function parseLaneDirections(tags, isOneWay, laneCount) {
28554       var forward = parseInt(tags['lanes:forward'], 10);
28555       var backward = parseInt(tags['lanes:backward'], 10);
28556       var bothways = parseInt(tags['lanes:both_ways'], 10) > 0 ? 1 : 0;
28557
28558       if (parseInt(tags.oneway, 10) === -1) {
28559           forward = 0;
28560           bothways = 0;
28561           backward = laneCount;
28562       }
28563       else if (isOneWay) {
28564           forward = laneCount;
28565           bothways = 0;
28566           backward = 0;
28567       }
28568       else if (isNaN$1(forward) && isNaN$1(backward)) {
28569           backward = Math.floor((laneCount - bothways) / 2);
28570           forward = laneCount - bothways - backward;
28571       }
28572       else if (isNaN$1(forward)) {
28573           if (backward > laneCount - bothways) {
28574               backward = laneCount - bothways;
28575           }
28576           forward = laneCount - bothways - backward;
28577       }
28578       else if (isNaN$1(backward)) {
28579           if (forward > laneCount - bothways) {
28580               forward = laneCount - bothways;
28581           }
28582           backward = laneCount - bothways - forward;
28583       }
28584       return {
28585           forward: forward,
28586           backward: backward,
28587           bothways: bothways
28588       };
28589   }
28590
28591
28592   function parseTurnLanes(tag){
28593       if (!tag) return;
28594
28595       var validValues = [
28596           'left', 'slight_left', 'sharp_left', 'through', 'right', 'slight_right',
28597           'sharp_right', 'reverse', 'merge_to_left', 'merge_to_right', 'none'
28598       ];
28599
28600       return tag.split('|')
28601           .map(function (s) {
28602               if (s === '') s = 'none';
28603               return s.split(';')
28604                   .map(function (d) {
28605                       return validValues.indexOf(d) === -1 ? 'unknown': d;
28606                   });
28607           });
28608   }
28609
28610
28611   function parseMaxspeedLanes(tag, maxspeed) {
28612       if (!tag) return;
28613
28614       return tag.split('|')
28615           .map(function (s) {
28616               if (s === 'none') return s;
28617               var m = parseInt(s, 10);
28618               if (s === '' || m === maxspeed) return null;
28619               return isNaN$1(m) ? 'unknown': m;
28620           });
28621   }
28622
28623
28624   function parseMiscLanes(tag) {
28625       if (!tag) return;
28626
28627       var validValues = [
28628           'yes', 'no', 'designated'
28629       ];
28630
28631       return tag.split('|')
28632           .map(function (s) {
28633               if (s === '') s = 'no';
28634               return validValues.indexOf(s) === -1 ? 'unknown': s;
28635           });
28636   }
28637
28638
28639   function parseBicycleWay(tag) {
28640       if (!tag) return;
28641
28642       var validValues = [
28643           'yes', 'no', 'designated', 'lane'
28644       ];
28645
28646       return tag.split('|')
28647           .map(function (s) {
28648               if (s === '') s = 'no';
28649               return validValues.indexOf(s) === -1 ? 'unknown': s;
28650           });
28651   }
28652
28653
28654   function mapToLanesObj(lanesObj, data, key) {
28655       if (data.forward) data.forward.forEach(function(l, i) {
28656           if (!lanesObj.forward[i]) lanesObj.forward[i] = {};
28657           lanesObj.forward[i][key] = l;
28658       });
28659       if (data.backward) data.backward.forEach(function(l, i) {
28660           if (!lanesObj.backward[i]) lanesObj.backward[i] = {};
28661           lanesObj.backward[i][key] = l;
28662       });
28663       if (data.unspecified) data.unspecified.forEach(function(l, i) {
28664           if (!lanesObj.unspecified[i]) lanesObj.unspecified[i] = {};
28665           lanesObj.unspecified[i][key] = l;
28666       });
28667   }
28668
28669   /** Used to compose bitmasks for cloning. */
28670   var CLONE_DEEP_FLAG$2 = 1,
28671       CLONE_SYMBOLS_FLAG$3 = 4;
28672
28673   /**
28674    * This method is like `_.clone` except that it recursively clones `value`.
28675    *
28676    * @static
28677    * @memberOf _
28678    * @since 1.0.0
28679    * @category Lang
28680    * @param {*} value The value to recursively clone.
28681    * @returns {*} Returns the deep cloned value.
28682    * @see _.clone
28683    * @example
28684    *
28685    * var objects = [{ 'a': 1 }, { 'b': 2 }];
28686    *
28687    * var deep = _.cloneDeep(objects);
28688    * console.log(deep[0] === objects[0]);
28689    * // => false
28690    */
28691   function cloneDeep(value) {
28692     return baseClone(value, CLONE_DEEP_FLAG$2 | CLONE_SYMBOLS_FLAG$3);
28693   }
28694
28695   /**
28696    * Gets the timestamp of the number of milliseconds that have elapsed since
28697    * the Unix epoch (1 January 1970 00:00:00 UTC).
28698    *
28699    * @static
28700    * @memberOf _
28701    * @since 2.4.0
28702    * @category Date
28703    * @returns {number} Returns the timestamp.
28704    * @example
28705    *
28706    * _.defer(function(stamp) {
28707    *   console.log(_.now() - stamp);
28708    * }, _.now());
28709    * // => Logs the number of milliseconds it took for the deferred invocation.
28710    */
28711   var now$1 = function() {
28712     return root$2.Date.now();
28713   };
28714
28715   /** Error message constants. */
28716   var FUNC_ERROR_TEXT$2 = 'Expected a function';
28717
28718   /* Built-in method references for those with the same name as other `lodash` methods. */
28719   var nativeMax$2 = Math.max,
28720       nativeMin = Math.min;
28721
28722   /**
28723    * Creates a debounced function that delays invoking `func` until after `wait`
28724    * milliseconds have elapsed since the last time the debounced function was
28725    * invoked. The debounced function comes with a `cancel` method to cancel
28726    * delayed `func` invocations and a `flush` method to immediately invoke them.
28727    * Provide `options` to indicate whether `func` should be invoked on the
28728    * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
28729    * with the last arguments provided to the debounced function. Subsequent
28730    * calls to the debounced function return the result of the last `func`
28731    * invocation.
28732    *
28733    * **Note:** If `leading` and `trailing` options are `true`, `func` is
28734    * invoked on the trailing edge of the timeout only if the debounced function
28735    * is invoked more than once during the `wait` timeout.
28736    *
28737    * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
28738    * until to the next tick, similar to `setTimeout` with a timeout of `0`.
28739    *
28740    * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
28741    * for details over the differences between `_.debounce` and `_.throttle`.
28742    *
28743    * @static
28744    * @memberOf _
28745    * @since 0.1.0
28746    * @category Function
28747    * @param {Function} func The function to debounce.
28748    * @param {number} [wait=0] The number of milliseconds to delay.
28749    * @param {Object} [options={}] The options object.
28750    * @param {boolean} [options.leading=false]
28751    *  Specify invoking on the leading edge of the timeout.
28752    * @param {number} [options.maxWait]
28753    *  The maximum time `func` is allowed to be delayed before it's invoked.
28754    * @param {boolean} [options.trailing=true]
28755    *  Specify invoking on the trailing edge of the timeout.
28756    * @returns {Function} Returns the new debounced function.
28757    * @example
28758    *
28759    * // Avoid costly calculations while the window size is in flux.
28760    * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
28761    *
28762    * // Invoke `sendMail` when clicked, debouncing subsequent calls.
28763    * jQuery(element).on('click', _.debounce(sendMail, 300, {
28764    *   'leading': true,
28765    *   'trailing': false
28766    * }));
28767    *
28768    * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
28769    * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
28770    * var source = new EventSource('/stream');
28771    * jQuery(source).on('message', debounced);
28772    *
28773    * // Cancel the trailing debounced invocation.
28774    * jQuery(window).on('popstate', debounced.cancel);
28775    */
28776   function debounce(func, wait, options) {
28777     var lastArgs,
28778         lastThis,
28779         maxWait,
28780         result,
28781         timerId,
28782         lastCallTime,
28783         lastInvokeTime = 0,
28784         leading = false,
28785         maxing = false,
28786         trailing = true;
28787
28788     if (typeof func != 'function') {
28789       throw new TypeError(FUNC_ERROR_TEXT$2);
28790     }
28791     wait = toNumber(wait) || 0;
28792     if (isObject(options)) {
28793       leading = !!options.leading;
28794       maxing = 'maxWait' in options;
28795       maxWait = maxing ? nativeMax$2(toNumber(options.maxWait) || 0, wait) : maxWait;
28796       trailing = 'trailing' in options ? !!options.trailing : trailing;
28797     }
28798
28799     function invokeFunc(time) {
28800       var args = lastArgs,
28801           thisArg = lastThis;
28802
28803       lastArgs = lastThis = undefined;
28804       lastInvokeTime = time;
28805       result = func.apply(thisArg, args);
28806       return result;
28807     }
28808
28809     function leadingEdge(time) {
28810       // Reset any `maxWait` timer.
28811       lastInvokeTime = time;
28812       // Start the timer for the trailing edge.
28813       timerId = setTimeout(timerExpired, wait);
28814       // Invoke the leading edge.
28815       return leading ? invokeFunc(time) : result;
28816     }
28817
28818     function remainingWait(time) {
28819       var timeSinceLastCall = time - lastCallTime,
28820           timeSinceLastInvoke = time - lastInvokeTime,
28821           timeWaiting = wait - timeSinceLastCall;
28822
28823       return maxing
28824         ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
28825         : timeWaiting;
28826     }
28827
28828     function shouldInvoke(time) {
28829       var timeSinceLastCall = time - lastCallTime,
28830           timeSinceLastInvoke = time - lastInvokeTime;
28831
28832       // Either this is the first call, activity has stopped and we're at the
28833       // trailing edge, the system time has gone backwards and we're treating
28834       // it as the trailing edge, or we've hit the `maxWait` limit.
28835       return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
28836         (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
28837     }
28838
28839     function timerExpired() {
28840       var time = now$1();
28841       if (shouldInvoke(time)) {
28842         return trailingEdge(time);
28843       }
28844       // Restart the timer.
28845       timerId = setTimeout(timerExpired, remainingWait(time));
28846     }
28847
28848     function trailingEdge(time) {
28849       timerId = undefined;
28850
28851       // Only invoke if we have `lastArgs` which means `func` has been
28852       // debounced at least once.
28853       if (trailing && lastArgs) {
28854         return invokeFunc(time);
28855       }
28856       lastArgs = lastThis = undefined;
28857       return result;
28858     }
28859
28860     function cancel() {
28861       if (timerId !== undefined) {
28862         clearTimeout(timerId);
28863       }
28864       lastInvokeTime = 0;
28865       lastArgs = lastCallTime = lastThis = timerId = undefined;
28866     }
28867
28868     function flush() {
28869       return timerId === undefined ? result : trailingEdge(now$1());
28870     }
28871
28872     function debounced() {
28873       var time = now$1(),
28874           isInvoking = shouldInvoke(time);
28875
28876       lastArgs = arguments;
28877       lastThis = this;
28878       lastCallTime = time;
28879
28880       if (isInvoking) {
28881         if (timerId === undefined) {
28882           return leadingEdge(lastCallTime);
28883         }
28884         if (maxing) {
28885           // Handle invocations in a tight loop.
28886           timerId = setTimeout(timerExpired, wait);
28887           return invokeFunc(lastCallTime);
28888         }
28889       }
28890       if (timerId === undefined) {
28891         timerId = setTimeout(timerExpired, wait);
28892       }
28893       return result;
28894     }
28895     debounced.cancel = cancel;
28896     debounced.flush = flush;
28897     return debounced;
28898   }
28899
28900   /**
28901    * Casts `value` to `identity` if it's not a function.
28902    *
28903    * @private
28904    * @param {*} value The value to inspect.
28905    * @returns {Function} Returns cast function.
28906    */
28907   function castFunction(value) {
28908     return typeof value == 'function' ? value : identity$8;
28909   }
28910
28911   /**
28912    * Iterates over elements of `collection` and invokes `iteratee` for each element.
28913    * The iteratee is invoked with three arguments: (value, index|key, collection).
28914    * Iteratee functions may exit iteration early by explicitly returning `false`.
28915    *
28916    * **Note:** As with other "Collections" methods, objects with a "length"
28917    * property are iterated like arrays. To avoid this behavior use `_.forIn`
28918    * or `_.forOwn` for object iteration.
28919    *
28920    * @static
28921    * @memberOf _
28922    * @since 0.1.0
28923    * @alias each
28924    * @category Collection
28925    * @param {Array|Object} collection The collection to iterate over.
28926    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
28927    * @returns {Array|Object} Returns `collection`.
28928    * @see _.forEachRight
28929    * @example
28930    *
28931    * _.forEach([1, 2], function(value) {
28932    *   console.log(value);
28933    * });
28934    * // => Logs `1` then `2`.
28935    *
28936    * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
28937    *   console.log(key);
28938    * });
28939    * // => Logs 'a' then 'b' (iteration order is not guaranteed).
28940    */
28941   function forEach(collection, iteratee) {
28942     var func = isArray(collection) ? arrayEach : baseEach;
28943     return func(collection, castFunction(iteratee));
28944   }
28945
28946   /**
28947    * Iterates over own enumerable string keyed properties of an object and
28948    * invokes `iteratee` for each property. The iteratee is invoked with three
28949    * arguments: (value, key, object). Iteratee functions may exit iteration
28950    * early by explicitly returning `false`.
28951    *
28952    * @static
28953    * @memberOf _
28954    * @since 0.3.0
28955    * @category Object
28956    * @param {Object} object The object to iterate over.
28957    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
28958    * @returns {Object} Returns `object`.
28959    * @see _.forOwnRight
28960    * @example
28961    *
28962    * function Foo() {
28963    *   this.a = 1;
28964    *   this.b = 2;
28965    * }
28966    *
28967    * Foo.prototype.c = 3;
28968    *
28969    * _.forOwn(new Foo, function(value, key) {
28970    *   console.log(key);
28971    * });
28972    * // => Logs 'a' then 'b' (iteration order is not guaranteed).
28973    */
28974   function forOwn(object, iteratee) {
28975     return object && baseForOwn(object, castFunction(iteratee));
28976   }
28977
28978   var translations = Object.create(null);
28979
28980   var currentLocale = 'en';
28981   var textDirection = 'ltr';
28982
28983   function setLocale(val) {
28984       if (translations[val] !== undefined) {
28985           currentLocale = val;
28986       } else if (translations[val.split('-')[0]]) {
28987           currentLocale = val.split('-')[0];
28988       }
28989   }
28990
28991   function addTranslation(id, value) {
28992       translations[id] = value;
28993   }
28994
28995   /**
28996    * Given a string identifier, try to find that string in the current
28997    * language, and return it.  This function will be called recursively
28998    * with locale `en` if a string can not be found in the requested language.
28999    *
29000    * @param {string}   s   string identifier
29001    * @param {object?}  o   object of token replacements and default string
29002    * @param {string?}  loc locale to use
29003    * @returns {string?} locale string
29004    */
29005   function t(s, o, loc) {
29006       loc = loc || currentLocale;
29007
29008       var path = s
29009           .split('.')
29010           .map(function (s) { return s.replace(/<TX_DOT>/g, '.'); })
29011           .reverse();
29012
29013       var rep = translations[loc];
29014
29015       while (rep !== undefined && path.length) {
29016           rep = rep[path.pop()];
29017       }
29018
29019       if (rep !== undefined) {
29020           if (o) {
29021               for (var k in o) {
29022                   var variable = '{' + k + '}';
29023                   var re = new RegExp(variable, 'g'); // check globally for variables
29024                   rep = rep.replace(re, o[k]);
29025               }
29026           }
29027           return rep;
29028       }
29029
29030       if (loc !== 'en') {
29031           return t(s, o, 'en');
29032       }
29033
29034       if (o && 'default' in o) {
29035           return o.default;
29036       }
29037
29038       var missing = 'Missing ' + loc + ' translation: ' + s;
29039       if (typeof console !== 'undefined') console.error(missing); // eslint-disable-line
29040
29041       return missing;
29042   }
29043
29044   /**
29045    * Given string 'ltr' or 'rtl', save that setting
29046    *
29047    * @param {string} dir ltr or rtl
29048    */
29049
29050   function setTextDirection(dir) {
29051       textDirection = dir;
29052   }
29053
29054   /** Used to compose bitmasks for cloning. */
29055   var CLONE_DEEP_FLAG$3 = 1,
29056       CLONE_SYMBOLS_FLAG$4 = 4;
29057
29058   /**
29059    * This method is like `_.cloneWith` except that it recursively clones `value`.
29060    *
29061    * @static
29062    * @memberOf _
29063    * @since 4.0.0
29064    * @category Lang
29065    * @param {*} value The value to recursively clone.
29066    * @param {Function} [customizer] The function to customize cloning.
29067    * @returns {*} Returns the deep cloned value.
29068    * @see _.cloneWith
29069    * @example
29070    *
29071    * function customizer(value) {
29072    *   if (_.isElement(value)) {
29073    *     return value.cloneNode(true);
29074    *   }
29075    * }
29076    *
29077    * var el = _.cloneDeepWith(document.body, customizer);
29078    *
29079    * console.log(el === document.body);
29080    * // => false
29081    * console.log(el.nodeName);
29082    * // => 'BODY'
29083    * console.log(el.childNodes.length);
29084    * // => 20
29085    */
29086   function cloneDeepWith(value, customizer) {
29087     customizer = typeof customizer == 'function' ? customizer : undefined;
29088     return baseClone(value, CLONE_DEEP_FLAG$3 | CLONE_SYMBOLS_FLAG$4, customizer);
29089   }
29090
29091   /**
29092    * Creates an array of `array` values not included in the other given arrays
29093    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
29094    * for equality comparisons. The order and references of result values are
29095    * determined by the first array.
29096    *
29097    * **Note:** Unlike `_.pullAll`, this method returns a new array.
29098    *
29099    * @static
29100    * @memberOf _
29101    * @since 0.1.0
29102    * @category Array
29103    * @param {Array} array The array to inspect.
29104    * @param {...Array} [values] The values to exclude.
29105    * @returns {Array} Returns the new array of filtered values.
29106    * @see _.without, _.xor
29107    * @example
29108    *
29109    * _.difference([2, 1], [2, 3]);
29110    * // => [1]
29111    */
29112   var difference = baseRest(function(array, values) {
29113     return isArrayLikeObject(array)
29114       ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
29115       : [];
29116   });
29117
29118   /** `Object#toString` result references. */
29119   var mapTag$7 = '[object Map]',
29120       setTag$7 = '[object Set]';
29121
29122   /** Used for built-in method references. */
29123   var objectProto$h = Object.prototype;
29124
29125   /** Used to check objects for own properties. */
29126   var hasOwnProperty$e = objectProto$h.hasOwnProperty;
29127
29128   /**
29129    * Checks if `value` is an empty object, collection, map, or set.
29130    *
29131    * Objects are considered empty if they have no own enumerable string keyed
29132    * properties.
29133    *
29134    * Array-like values such as `arguments` objects, arrays, buffers, strings, or
29135    * jQuery-like collections are considered empty if they have a `length` of `0`.
29136    * Similarly, maps and sets are considered empty if they have a `size` of `0`.
29137    *
29138    * @static
29139    * @memberOf _
29140    * @since 0.1.0
29141    * @category Lang
29142    * @param {*} value The value to check.
29143    * @returns {boolean} Returns `true` if `value` is empty, else `false`.
29144    * @example
29145    *
29146    * _.isEmpty(null);
29147    * // => true
29148    *
29149    * _.isEmpty(true);
29150    * // => true
29151    *
29152    * _.isEmpty(1);
29153    * // => true
29154    *
29155    * _.isEmpty([1, 2, 3]);
29156    * // => false
29157    *
29158    * _.isEmpty({ 'a': 1 });
29159    * // => false
29160    */
29161   function isEmpty(value) {
29162     if (value == null) {
29163       return true;
29164     }
29165     if (isArrayLike(value) &&
29166         (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
29167           isBuffer(value) || isTypedArray(value) || isArguments(value))) {
29168       return !value.length;
29169     }
29170     var tag = getTag$1(value);
29171     if (tag == mapTag$7 || tag == setTag$7) {
29172       return !value.size;
29173     }
29174     if (isPrototype(value)) {
29175       return !baseKeys(value).length;
29176     }
29177     for (var key in value) {
29178       if (hasOwnProperty$e.call(value, key)) {
29179         return false;
29180       }
29181     }
29182     return true;
29183   }
29184
29185   var detected;
29186
29187   function utilDetect(force) {
29188       if (detected && !force) return detected;
29189       detected = {};
29190
29191       var ua = navigator.userAgent,
29192           m = null,
29193           q = utilStringQs(window.location.hash.substring(1));
29194
29195       m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i);   // Edge
29196       if (m !== null) {
29197           detected.browser = m[1];
29198           detected.version = m[2];
29199       }
29200       if (!detected.browser) {
29201           m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i);   // IE11
29202           if (m !== null) {
29203               detected.browser = 'msie';
29204               detected.version = m[1];
29205           }
29206       }
29207       if (!detected.browser) {
29208           m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i);   // Opera 15+
29209           if (m !== null) {
29210               detected.browser = 'Opera';
29211               detected.version = m[2];
29212           }
29213       }
29214       if (!detected.browser) {
29215           m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
29216           if (m !== null) {
29217               detected.browser = m[1];
29218               detected.version = m[2];
29219               m = ua.match(/version\/([\.\d]+)/i);
29220               if (m !== null) detected.version = m[1];
29221           }
29222       }
29223       if (!detected.browser) {
29224           detected.browser = navigator.appName;
29225           detected.version = navigator.appVersion;
29226       }
29227
29228       // keep major.minor version only..
29229       detected.version = detected.version.split(/\W/).slice(0,2).join('.');
29230
29231       if (detected.browser.toLowerCase() === 'msie') {
29232           detected.ie = true;
29233           detected.browser = 'Internet Explorer';
29234           detected.support = parseFloat(detected.version) >= 11;
29235       } else {
29236           detected.ie = false;
29237           detected.support = true;
29238       }
29239
29240       // Added due to incomplete svg style support. See #715
29241       detected.opera = (detected.browser.toLowerCase() === 'opera' && parseFloat(detected.version) < 15 );
29242
29243       // Set locale based on url param (format 'en-US') or browser lang (default)
29244       if (q.hasOwnProperty('locale')) {
29245           detected.locale = q.locale;
29246           detected.language = q.locale.split('-')[0];
29247       } else {
29248           detected.locale = (navigator.language || navigator.userLanguage || 'en-US');
29249           detected.language = detected.locale.split('-')[0];
29250
29251           // Search `navigator.languages` for a better locale. Prefer the first language,
29252           // unless the second language is a culture-specific version of the first one, see #3842
29253           if (navigator.languages && navigator.languages.length > 0) {
29254               var code0 = navigator.languages[0],
29255                   parts0 = code0.split('-');
29256
29257               detected.locale = code0;
29258               detected.language = parts0[0];
29259
29260               if (navigator.languages.length > 1 && parts0.length === 1) {
29261                   var code1 = navigator.languages[1],
29262                       parts1 = code1.split('-');
29263
29264                   if (parts1[0] === parts0[0]) {
29265                       detected.locale = code1;
29266                   }
29267               }
29268           }
29269       }
29270
29271       // Loaded locale is stored in currentLocale
29272       // return that instead (except in the situation where 'en' might override 'en-US')
29273       var loadedLocale = currentLocale || 'en';
29274       if (loadedLocale !== 'en') {
29275           detected.locale = loadedLocale;
29276           detected.language = detected.locale.split('-')[0];
29277       }
29278
29279       // detect text direction
29280       var lang = dataLocales[detected.locale];
29281       if ((lang && lang.rtl) || (q.rtl === 'true')) {
29282           detected.textDirection = 'rtl';
29283       } else {
29284           detected.textDirection = 'ltr';
29285       }
29286       setTextDirection(detected.textDirection);
29287
29288       // detect host
29289       var loc = window.top.location;
29290       var origin = loc.origin;
29291       if (!origin) {  // for unpatched IE11
29292           origin = loc.protocol + '//' + loc.hostname + (loc.port ? ':' + loc.port: '');
29293       }
29294
29295       detected.host = origin + loc.pathname;
29296
29297       detected.filedrop = (window.FileReader && 'ondrop' in window);
29298
29299       detected.download = !(detected.ie || detected.browser.toLowerCase() === 'edge');
29300
29301       detected.cssfilters = !(detected.ie || detected.browser.toLowerCase() === 'edge');
29302
29303       function nav(x) {
29304           return navigator.userAgent.indexOf(x) !== -1;
29305       }
29306
29307       if (nav('Win')) {
29308           detected.os = 'win';
29309           detected.platform = 'Windows';
29310       }
29311       else if (nav('Mac')) {
29312           detected.os = 'mac';
29313           detected.platform = 'Macintosh';
29314       }
29315       else if (nav('X11') || nav('Linux')) {
29316           detected.os = 'linux';
29317           detected.platform = 'Linux';
29318       }
29319       else {
29320           detected.os = 'win';
29321           detected.platform = 'Unknown';
29322       }
29323
29324       return detected;
29325   }
29326
29327   var remove$1 = removeDiacritics;
29328
29329   var replacementList = [
29330     {
29331       base: ' ',
29332       chars: "\u00A0",
29333     }, {
29334       base: '0',
29335       chars: "\u07C0",
29336     }, {
29337       base: 'A',
29338       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",
29339     }, {
29340       base: 'AA',
29341       chars: "\uA732",
29342     }, {
29343       base: 'AE',
29344       chars: "\u00C6\u01FC\u01E2",
29345     }, {
29346       base: 'AO',
29347       chars: "\uA734",
29348     }, {
29349       base: 'AU',
29350       chars: "\uA736",
29351     }, {
29352       base: 'AV',
29353       chars: "\uA738\uA73A",
29354     }, {
29355       base: 'AY',
29356       chars: "\uA73C",
29357     }, {
29358       base: 'B',
29359       chars: "\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0181",
29360     }, {
29361       base: 'C',
29362       chars: "\u24b8\uff23\uA73E\u1E08\u0106\u0043\u0108\u010A\u010C\u00C7\u0187\u023B",
29363     }, {
29364       base: 'D',
29365       chars: "\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018A\u0189\u1D05\uA779",
29366     }, {
29367       base: 'Dh',
29368       chars: "\u00D0",
29369     }, {
29370       base: 'DZ',
29371       chars: "\u01F1\u01C4",
29372     }, {
29373       base: 'Dz',
29374       chars: "\u01F2\u01C5",
29375     }, {
29376       base: 'E',
29377       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",
29378     }, {
29379       base: 'F',
29380       chars: "\uA77C\u24BB\uFF26\u1E1E\u0191\uA77B",
29381     }, {
29382       base: 'G',
29383       chars: "\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E\u0262",
29384     }, {
29385       base: 'H',
29386       chars: "\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D",
29387     }, {
29388       base: 'I',
29389       chars: "\u24BE\uFF29\xCC\xCD\xCE\u0128\u012A\u012C\u0130\xCF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197",
29390     }, {
29391       base: 'J',
29392       chars: "\u24BF\uFF2A\u0134\u0248\u0237",
29393     }, {
29394       base: 'K',
29395       chars: "\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2",
29396     }, {
29397       base: 'L',
29398       chars: "\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780",
29399     }, {
29400       base: 'LJ',
29401       chars: "\u01C7",
29402     }, {
29403       base: 'Lj',
29404       chars: "\u01C8",
29405     }, {
29406       base: 'M',
29407       chars: "\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C\u03FB",
29408     }, {
29409       base: 'N',
29410       chars: "\uA7A4\u0220\u24C3\uFF2E\u01F8\u0143\xD1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u019D\uA790\u1D0E",
29411     }, {
29412       base: 'NJ',
29413       chars: "\u01CA",
29414     }, {
29415       base: 'Nj',
29416       chars: "\u01CB",
29417     }, {
29418       base: 'O',
29419       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",
29420     }, {
29421       base: 'OE',
29422       chars: "\u0152",
29423     }, {
29424       base: 'OI',
29425       chars: "\u01A2",
29426     }, {
29427       base: 'OO',
29428       chars: "\uA74E",
29429     }, {
29430       base: 'OU',
29431       chars: "\u0222",
29432     }, {
29433       base: 'P',
29434       chars: "\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754",
29435     }, {
29436       base: 'Q',
29437       chars: "\u24C6\uFF31\uA756\uA758\u024A",
29438     }, {
29439       base: 'R',
29440       chars: "\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782",
29441     }, {
29442       base: 'S',
29443       chars: "\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784",
29444     }, {
29445       base: 'T',
29446       chars: "\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786",
29447     }, {
29448       base: 'Th',
29449       chars: "\u00DE",
29450     }, {
29451       base: 'TZ',
29452       chars: "\uA728",
29453     }, {
29454       base: 'U',
29455       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",
29456     }, {
29457       base: 'V',
29458       chars: "\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245",
29459     }, {
29460       base: 'VY',
29461       chars: "\uA760",
29462     }, {
29463       base: 'W',
29464       chars: "\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72",
29465     }, {
29466       base: 'X',
29467       chars: "\u24CD\uFF38\u1E8A\u1E8C",
29468     }, {
29469       base: 'Y',
29470       chars: "\u24CE\uFF39\u1EF2\xDD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE",
29471     }, {
29472       base: 'Z',
29473       chars: "\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762",
29474     }, {
29475       base: 'a',
29476       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",
29477     }, {
29478       base: 'aa',
29479       chars: "\uA733",
29480     }, {
29481       base: 'ae',
29482       chars: "\u00E6\u01FD\u01E3",
29483     }, {
29484       base: 'ao',
29485       chars: "\uA735",
29486     }, {
29487       base: 'au',
29488       chars: "\uA737",
29489     }, {
29490       base: 'av',
29491       chars: "\uA739\uA73B",
29492     }, {
29493       base: 'ay',
29494       chars: "\uA73D",
29495     }, {
29496       base: 'b',
29497       chars: "\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253\u0182",
29498     }, {
29499       base: 'c',
29500       chars: "\uFF43\u24D2\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184",
29501     }, {
29502       base: 'd',
29503       chars: "\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\u018B\u13E7\u0501\uA7AA",
29504     }, {
29505       base: 'dh',
29506       chars: "\u00F0",
29507     }, {
29508       base: 'dz',
29509       chars: "\u01F3\u01C6",
29510     }, {
29511       base: 'e',
29512       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",
29513     }, {
29514       base: 'f',
29515       chars: "\u24D5\uFF46\u1E1F\u0192",
29516     }, {
29517       base: 'ff',
29518       chars: "\uFB00",
29519     }, {
29520       base: 'fi',
29521       chars: "\uFB01",
29522     }, {
29523       base: 'fl',
29524       chars: "\uFB02",
29525     }, {
29526       base: 'ffi',
29527       chars: "\uFB03",
29528     }, {
29529       base: 'ffl',
29530       chars: "\uFB04",
29531     }, {
29532       base: 'g',
29533       chars: "\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\uA77F\u1D79",
29534     }, {
29535       base: 'h',
29536       chars: "\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265",
29537     }, {
29538       base: 'hv',
29539       chars: "\u0195",
29540     }, {
29541       base: 'i',
29542       chars: "\u24D8\uFF49\xEC\xED\xEE\u0129\u012B\u012D\xEF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131",
29543     }, {
29544       base: 'j',
29545       chars: "\u24D9\uFF4A\u0135\u01F0\u0249",
29546     }, {
29547       base: 'k',
29548       chars: "\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3",
29549     }, {
29550       base: 'l',
29551       chars: "\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747\u026D",
29552     }, {
29553       base: 'lj',
29554       chars: "\u01C9",
29555     }, {
29556       base: 'm',
29557       chars: "\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F",
29558     }, {
29559       base: 'n',
29560       chars: "\u24DD\uFF4E\u01F9\u0144\xF1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5\u043B\u0509",
29561     }, {
29562       base: 'nj',
29563       chars: "\u01CC",
29564     }, {
29565       base: 'o',
29566       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",
29567     }, {
29568       base: 'oe',
29569       chars: "\u0153",
29570     }, {
29571       base: 'oi',
29572       chars: "\u01A3",
29573     }, {
29574       base: 'oo',
29575       chars: "\uA74F",
29576     }, {
29577       base: 'ou',
29578       chars: "\u0223",
29579     }, {
29580       base: 'p',
29581       chars: "\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755\u03C1",
29582     }, {
29583       base: 'q',
29584       chars: "\u24E0\uFF51\u024B\uA757\uA759",
29585     }, {
29586       base: 'r',
29587       chars: "\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783",
29588     }, {
29589       base: 's',
29590       chars: "\u24E2\uFF53\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B\u0282",
29591     }, {
29592       base: 'ss',
29593       chars: "\xDF",
29594     }, {
29595       base: 't',
29596       chars: "\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787",
29597     }, {
29598       base: 'th',
29599       chars: "\u00FE",
29600     }, {
29601       base: 'tz',
29602       chars: "\uA729",
29603     }, {
29604       base: 'u',
29605       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",
29606     }, {
29607       base: 'v',
29608       chars: "\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C",
29609     }, {
29610       base: 'vy',
29611       chars: "\uA761",
29612     }, {
29613       base: 'w',
29614       chars: "\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73",
29615     }, {
29616       base: 'x',
29617       chars: "\u24E7\uFF58\u1E8B\u1E8D",
29618     }, {
29619       base: 'y',
29620       chars: "\u24E8\uFF59\u1EF3\xFD\u0177\u1EF9\u0233\u1E8F\xFF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF",
29621     }, {
29622       base: 'z',
29623       chars: "\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763",
29624     }
29625   ];
29626
29627   var diacriticsMap = {};
29628   for (var i = 0; i < replacementList.length; i += 1) {
29629     var chars = replacementList[i].chars;
29630     for (var j = 0; j < chars.length; j += 1) {
29631       diacriticsMap[chars[j]] = replacementList[i].base;
29632     }
29633   }
29634
29635   function removeDiacritics(str) {
29636     return str.replace(/[^\u0000-\u007e]/g, function(c) {
29637       return diacriticsMap[c] || c;
29638     });
29639   }
29640
29641   // see https://github.com/openstreetmap/iD/pull/3707
29642   // https://gist.github.com/mapmeld/556b09ddec07a2044c76e1ef45f01c60
29643
29644   var chars$1 = {
29645       // madda above alef
29646       1570: { initial: 'آ‎', isolated: 'ﺁ', medial: 'ﺁ', final: 'ﺂ' },
29647
29648       // hamza above and below alef
29649       1571: { initial: 'أ', isolated: 'ﺃ', medial: '', final: 'ﺄ' },
29650       // 1572 is ؤ
29651       1573: { initial: 'إ', isolated: 'ﺇ', medial: '', final: 'ﺈ' },
29652       // 1574 is ئ
29653       1575: { initial: 'ا', isolated: 'ا', medial: '', final: 'ﺎ' },
29654       1576: { initial: 'ﺑ', isolated: 'ﺏ', medial: 'ﺒ', final: 'ﺐ' },
29655
29656       // 1577 ة
29657       1577: { initial: '', isolated: 'ة', medial: '', final: 'ﺔ' },
29658
29659       1578: { initial: 'ﺗ', isolated: 'ﺕ', medial: 'ﺘ', final: 'ﺖ' },
29660       1579: { initial: 'ﺛ', isolated: 'ﺙ', medial: 'ﺜ', final: 'ﺚ' },
29661       1580: { initial: 'ﺟ', isolated: 'ﺝ', medial: 'ﺠ', final: 'ﺞ' },
29662       1581: { initial: 'ﺣ', isolated: 'ﺡ', medial: 'ﺤ', final: 'ﺢ' },
29663       1582: { initial: 'ﺧ', isolated: 'ﺥ', medial: 'ﺨ', final: 'ﺦ' },
29664       1583: { initial: 'ﺩ', isolated: 'ﺩ', medial: '', final: 'ﺪ' },
29665       1584: { initial: 'ﺫ', isolated: 'ﺫ', medial: '', final: 'ﺬ' },
29666       1585: { initial: 'ﺭ', isolated: 'ﺭ', medial: '', final: 'ﺮ' },
29667       1586: { initial: 'ﺯ', isolated: 'ﺯ', medial: '', final: 'ﺰ' },
29668       1688: { initial: 'ﮊ', isolated: 'ﮊ', medial: '', final: 'ﮋ' },
29669       1587: { initial: 'ﺳ', isolated: 'ﺱ', medial: 'ﺴ', final: 'ﺲ' },
29670       1588: { initial: 'ﺷ', isolated: 'ﺵ', medial: 'ﺸ', final: 'ﺶ' },
29671       1589: { initial: 'ﺻ', isolated: 'ﺹ', medial: 'ﺼ', final: 'ﺺ' },
29672       1590: { initial: 'ﺿ', isolated: 'ﺽ', medial: 'ﻀ', final: 'ﺾ' },
29673       1591: { initial: 'ﻃ', isolated: 'ﻁ', medial: 'ﻄ', final: 'ﻂ' },
29674       1592: { initial: 'ﻇ', isolated: 'ﻅ', medial: 'ﻈ', final: 'ﻆ' },
29675       1593: { initial: 'ﻋ', isolated: 'ﻉ', medial: 'ﻌ', final: 'ﻊ' },
29676       1594: { initial: 'ﻏ', isolated: 'ﻍ', medial: 'ﻐ', final: 'ﻎ' },
29677
29678       // 1595 ػ - may be very rare
29679
29680       1601: { initial: 'ﻓ', isolated: 'ﻑ', medial: 'ﻔ', final: 'ﻒ' },
29681       1602: { initial: 'ﻗ', isolated: 'ﻕ', medial: 'ﻘ', final: 'ﻖ' },
29682       1604: { initial: 'ﻟ', isolated: 'ﻝ', medial: 'ﻠ', final: 'ﻞ' },
29683       1605: { initial: 'ﻣ', isolated: 'ﻡ', medial: 'ﻤ', final: 'ﻢ' },
29684       1606: { initial: 'ﻧ', isolated: 'ﻥ', medial: 'ﻨ', final: 'ﻦ' },
29685       1607: { initial: 'ﻫ', isolated: 'ﻩ', medial: 'ﻬ', final: 'ﻪ' },
29686       1608: { initial: 'ﻭ', isolated: 'ﻭ', medial: '', final: 'ﻮ' },
29687
29688       // 1609 ى
29689       1609: { initial: 'ﯨ', isolated: 'ﻯ', medial: 'ﯩ', final: 'ﻰ' },
29690       // 1610 ي
29691       1610: { initial: 'ﻳ', isolated: 'ﻱ', medial: 'ﻴ', final: 'ﻲ' },
29692
29693       // short vowel sounds / tashkil markings
29694
29695       1662: { initial: 'ﭘ', isolated: 'ﭖ', medial: 'ﭙ', final: 'ﭗ' },
29696
29697       1670: { initial: 'ﭼ', isolated: 'ﭺ', medial: 'ﭽ', final: 'ﭻ' },
29698       1603: { initial: 'ﻛ', isolated: 'ﻙ', medial: 'ﻜ', final: 'ﻚ' },
29699       1705: { initial: 'ﻛ', isolated: 'ﮎ', medial: 'ﻜ', final: 'ﮏ' },
29700       1711: { initial: 'ﮔ', isolated: 'ﮒ', medial: 'ﮕ', final: 'ﮓ' },
29701       1740: { initial: 'ﻳ', isolated: 'ﻯ', medial: 'ﻴ', final: 'ﻰ' },
29702       5000: { initial: 'ﻻ', isolated: 'ﻻ', medial: '', final: 'ﻼ' }
29703   };
29704
29705   var rtlRegex = /[\u0590-\u05FF\u0600-\u06FF\u0780-\u07BF]/;
29706
29707   function fixRTLTextForSvg(inputText) {
29708       var context = true;
29709       var ret = '';
29710       var rtlBuffer = [];
29711       var arabicRegex = /[\u0600-\u06FF]/g;
29712       var arabicTashkil = /[\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED]/;
29713       var thaanaVowel = /[\u07A6-\u07B0]/;
29714       var hebrewSign = /[\u0591-\u05bd\u05bf\u05c1-\u05c5\u05c7]/;
29715
29716       if (!arabicRegex.test(inputText)) {
29717           // Hebrew or Thaana RTL script
29718           for (var n = 0; n < inputText.length; n++) {
29719               var c = inputText[n];
29720               if ((thaanaVowel.test(c) || hebrewSign.test(c)) && rtlBuffer.length) {
29721                   rtlBuffer[rtlBuffer.length - 1] += c;
29722               } else if (rtlRegex.test(c)) {
29723                   rtlBuffer.push(c);
29724               } else if (c === ' ' && rtlBuffer.length) {
29725                   // whitespace within RTL text
29726                   rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
29727               } else {
29728                   // non-RTL character
29729                   ret += rtlBuffer.reverse().join('') + c;
29730                   rtlBuffer = [];
29731               }
29732           }
29733       } else {
29734           for (var i = 0, l = inputText.length; i < l; i++) {
29735               var code = inputText[i].charCodeAt(0);
29736               var nextCode = inputText[i + 1] ? inputText[i + 1].charCodeAt(0) : 0;
29737
29738               if (!chars$1[code]) {
29739                   if (code === 32 && rtlBuffer.length) {
29740                       // whitespace
29741                       rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
29742                   } else if (arabicTashkil.test(inputText[i]) && rtlBuffer.length) {
29743                       // tashkil mark
29744                       rtlBuffer[rtlBuffer.length - 1] += inputText[i];
29745                   } else {
29746                       // non-RTL character
29747                       ret += rtlBuffer.reverse().join('') + inputText[i];
29748                       rtlBuffer = [];
29749                   }
29750                   continue;
29751               }
29752               if (context) {
29753                   if (i === l - 1 || nextCode === 32) {
29754                       rtlBuffer.push(chars$1[code].isolated);
29755                   } else {
29756                       // special case for لا
29757                       if (code === 1604 && nextCode === 1575) {
29758                           rtlBuffer.push(chars$1[5000].initial);
29759                           i++;
29760                           context = true;
29761                           continue;
29762                       }
29763                       rtlBuffer.push(chars$1[code].initial);
29764                   }
29765               } else {
29766                   if (i === l - 1 || nextCode === 32){
29767                       rtlBuffer.push(chars$1[code].final);
29768                   } else {
29769                       // special case for ﻼ
29770                       if (code === 1604 && nextCode === 1575){
29771                           rtlBuffer.push(chars$1[5000].final);
29772                           i++;
29773                           context = true;
29774                           continue;
29775                       }
29776                       if (chars$1[code].medial === ''){
29777                           rtlBuffer.push(chars$1[code].final);
29778                       } else {
29779                           rtlBuffer.push(chars$1[code].medial);
29780                       }
29781                   }
29782               }
29783               context = (chars$1[code].medial === '') || nextCode === 32;
29784           }
29785       }
29786       ret += rtlBuffer.reverse().join('');
29787       return ret;
29788   }
29789
29790   function utilTagText(entity) {
29791       return map$3(entity.tags, function(v, k) {
29792           return k + '=' + v;
29793       }).join(', ');
29794   }
29795
29796
29797   function utilEntitySelector(ids) {
29798       return ids.length ? '.' + ids.join(',.') : 'nothing';
29799   }
29800
29801
29802   function utilEntityOrMemberSelector(ids, graph) {
29803       var s = utilEntitySelector(ids);
29804
29805       ids.forEach(function(id) {
29806           var entity = graph.hasEntity(id);
29807           if (entity && entity.type === 'relation') {
29808               entity.members.forEach(function(member) {
29809                   s += ',.' + member.id;
29810               });
29811           }
29812       });
29813
29814       return s;
29815   }
29816
29817
29818   function utilEntityOrDeepMemberSelector(ids, graph) {
29819       var seen = {};
29820       var allIDs = [];
29821
29822       function addEntityAndMembersIfNotYetSeen(id) {
29823           // avoid infinite recursion for circular relations by skipping seen entities
29824           if (seen[id]) return;
29825           // mark the entity as seen
29826           seen[id] = true;
29827           // add the id;
29828           allIDs.push(id);
29829           if (graph.hasEntity(id)) {
29830               var entity = graph.entity(id);
29831               if (entity.type === 'relation' && entity.members) {
29832                   entity.members.forEach(function(member){
29833                       addEntityAndMembersIfNotYetSeen(member.id);
29834                   });
29835               }
29836           }
29837       }
29838
29839       ids.forEach(function(id) {
29840           addEntityAndMembersIfNotYetSeen(id);
29841       });
29842       return utilEntitySelector(allIDs);
29843   }
29844
29845
29846   function utilGetAllNodes(ids, graph) {
29847       var seen = {};
29848       var nodes = [];
29849       ids.forEach(getNodes);
29850       return nodes;
29851
29852       function getNodes(id) {
29853           if (seen[id]) return;
29854           seen[id] = true;
29855
29856           var entity = graph.hasEntity(id);
29857           if (!entity) return;
29858
29859           if (entity.type === 'node') {
29860               nodes.push(entity);
29861           } else if (entity.type === 'way') {
29862               entity.nodes.forEach(getNodes);
29863           } else {
29864               entity.members.map(function(member) { return member.id; }).forEach(getNodes);
29865           }
29866       }
29867   }
29868
29869
29870   function utilDisplayName(entity) {
29871       var localizedNameKey = 'name:' + utilDetect().locale.toLowerCase().split('-')[0];
29872       var name = entity.tags[localizedNameKey] || entity.tags.name || '';
29873       var network = entity.tags.cycle_network || entity.tags.network;
29874
29875       if (!name && entity.tags.ref) {
29876           name = entity.tags.ref;
29877           if (network) {
29878               name = network + ' ' + name;
29879           }
29880       }
29881
29882       return name;
29883   }
29884
29885
29886   function utilDisplayNameForPath(entity) {
29887       var name = utilDisplayName(entity);
29888       var isFirefox = utilDetect().browser.toLowerCase().indexOf('firefox') > -1;
29889
29890       if (!isFirefox && name && rtlRegex.test(name)) {
29891           name = fixRTLTextForSvg(name);
29892       }
29893
29894       return name;
29895   }
29896
29897
29898   function utilDisplayType(id) {
29899       return {
29900           n: t('inspector.node'),
29901           w: t('inspector.way'),
29902           r: t('inspector.relation')
29903       }[id.charAt(0)];
29904   }
29905
29906
29907   function utilEntityRoot(entityType) {
29908       return {
29909           node: 'n',
29910           way: 'w',
29911           relation: 'r'
29912       }[entityType];
29913   }
29914
29915
29916   function utilStringQs(str) {
29917       return str.split('&').reduce(function(obj, pair){
29918           var parts = pair.split('=');
29919           if (parts.length === 2) {
29920               obj[parts[0]] = (null === parts[1]) ? '' : decodeURIComponent(parts[1]);
29921           }
29922           if (parts[0] === 'mvt') {
29923               obj[parts[0]] = (parts[2] !== undefined) ? (decodeURIComponent(parts[1]) + '=' + decodeURIComponent(parts[2])) : (decodeURIComponent(parts[1]));
29924           }
29925           return obj;
29926       }, {});
29927   }
29928
29929
29930   function utilQsString(obj, noencode) {
29931       // encode everything except special characters used in certain hash parameters:
29932       // "/" in map states, ":", ",", {" and "}" in background
29933       function softEncode(s) {
29934           return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent);
29935       }
29936
29937       return Object.keys(obj).sort().map(function(key) {
29938           return encodeURIComponent(key) + '=' + (
29939               noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
29940       }).join('&');
29941   }
29942
29943
29944   function utilPrefixDOMProperty(property) {
29945       var prefixes = ['webkit', 'ms', 'moz', 'o'];
29946       var i = -1;
29947       var n = prefixes.length;
29948       var s = document.body;
29949
29950       if (property in s)
29951           return property;
29952
29953       property = property.substr(0, 1).toUpperCase() + property.substr(1);
29954
29955       while (++i < n) {
29956           if (prefixes[i] + property in s) {
29957               return prefixes[i] + property;
29958           }
29959       }
29960
29961       return false;
29962   }
29963
29964
29965   function utilPrefixCSSProperty(property) {
29966       var prefixes = ['webkit', 'ms', 'Moz', 'O'];
29967       var i = -1;
29968       var n = prefixes.length;
29969       var s = document.body.style;
29970
29971       if (property.toLowerCase() in s) {
29972           return property.toLowerCase();
29973       }
29974
29975       while (++i < n) {
29976           if (prefixes[i] + property in s) {
29977               return '-' + prefixes[i].toLowerCase() + property.replace(/([A-Z])/g, '-$1').toLowerCase();
29978           }
29979       }
29980
29981       return false;
29982   }
29983
29984
29985   var transformProperty;
29986   function utilSetTransform(el, x, y, scale) {
29987       var prop = transformProperty = transformProperty || utilPrefixCSSProperty('Transform');
29988       var translate = utilDetect().opera ? 'translate('   + x + 'px,' + y + 'px)'
29989           : 'translate3d(' + x + 'px,' + y + 'px,0)';
29990       return el.style(prop, translate + (scale ? ' scale(' + scale + ')' : ''));
29991   }
29992
29993
29994   // Calculates Levenshtein distance between two strings
29995   // see:  https://en.wikipedia.org/wiki/Levenshtein_distance
29996   // first converts the strings to lowercase and replaces diacritic marks with ascii equivalents.
29997   function utilEditDistance(a, b) {
29998       a = remove$1(a.toLowerCase());
29999       b = remove$1(b.toLowerCase());
30000       if (a.length === 0) return b.length;
30001       if (b.length === 0) return a.length;
30002       var matrix = [];
30003       for (var i = 0; i <= b.length; i++) { matrix[i] = [i]; }
30004       for (var j = 0; j <= a.length; j++) { matrix[0][j] = j; }
30005       for (i = 1; i <= b.length; i++) {
30006           for (j = 1; j <= a.length; j++) {
30007               if (b.charAt(i-1) === a.charAt(j-1)) {
30008                   matrix[i][j] = matrix[i-1][j-1];
30009               } else {
30010                   matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution
30011                       Math.min(matrix[i][j-1] + 1, // insertion
30012                       matrix[i-1][j] + 1)); // deletion
30013               }
30014           }
30015       }
30016       return matrix[b.length][a.length];
30017   }
30018
30019
30020   // a d3.mouse-alike which
30021   // 1. Only works on HTML elements, not SVG
30022   // 2. Does not cause style recalculation
30023   function utilFastMouse(container) {
30024       var rect = container.getBoundingClientRect();
30025       var rectLeft = rect.left;
30026       var rectTop = rect.top;
30027       var clientLeft = +container.clientLeft;
30028       var clientTop = +container.clientTop;
30029
30030       if (textDirection === 'rtl') {
30031           rectLeft = 0;
30032       }
30033       return function(e) {
30034           return [
30035               e.clientX - rectLeft - clientLeft,
30036               e.clientY - rectTop - clientTop];
30037       };
30038   }
30039
30040
30041   /* eslint-disable no-proto */
30042   var utilGetPrototypeOf = Object.getPrototypeOf || function(obj) { return obj.__proto__; };
30043   /* eslint-enable no-proto */
30044
30045
30046   function utilAsyncMap(inputs, func, callback) {
30047       var remaining = inputs.length;
30048       var results = [];
30049       var errors = [];
30050
30051       inputs.forEach(function(d, i) {
30052           func(d, function done(err, data) {
30053               errors[i] = err;
30054               results[i] = data;
30055               remaining--;
30056               if (!remaining) callback(errors, results);
30057           });
30058       });
30059   }
30060
30061
30062   // wraps an index to an interval [0..length-1]
30063   function utilWrap(index, length) {
30064       if (index < 0) {
30065           index += Math.ceil(-index/length)*length;
30066       }
30067       return index % length;
30068   }
30069
30070
30071   /**
30072    * a replacement for functor
30073    *
30074    * @param {*} value any value
30075    * @returns {Function} a function that returns that value or the value if it's a function
30076    */
30077   function utilFunctor(value) {
30078       if (typeof value === 'function') return value;
30079       return function() {
30080           return value;
30081       };
30082   }
30083
30084
30085   function utilNoAuto(selection) {
30086       var isText = (selection.size() && selection.node().tagName.toLowerCase() === 'textarea');
30087
30088       return selection
30089           // assign 'new-password' even for non-password fields to prevent browsers (Chrome) ignoring 'off'
30090           .attr('autocomplete', 'new-password')
30091           .attr('autocorrect', 'off')
30092           .attr('autocapitalize', 'off')
30093           .attr('spellcheck', isText ? 'true' : 'false');
30094   }
30095
30096
30097   // https://stackoverflow.com/questions/194846/is-there-any-kind-of-hash-code-function-in-javascript
30098   // https://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/
30099   function utilHashcode(str) {
30100       var hash = 0;
30101       if (str.length === 0) {
30102           return hash;
30103       }
30104       for (var i = 0; i < str.length; i++) {
30105           var char = str.charCodeAt(i);
30106           hash = ((hash << 5) - hash) + char;
30107           hash = hash & hash; // Convert to 32bit integer
30108       }
30109       return hash;
30110   }
30111
30112   // Adds or removes highlight styling for the specified entity's SVG elements in the map.
30113   function utilHighlightEntity(id, highlighted, context) {
30114       context.surface()
30115           .selectAll(utilEntityOrDeepMemberSelector([id], context.graph()))
30116           .classed('highlighted', highlighted);
30117   }
30118
30119   // note the function should be of low priority
30120   // and should not be returning a value.
30121   function utilCallWhenIdle(func, timeout) {
30122       return function() {
30123           var args = arguments;
30124           var that = this;
30125           window.requestIdleCallback(function() {
30126               func.apply(that, args);
30127           }, {timeout: timeout});
30128       };
30129   }
30130
30131   function utilCleanTags(tags) {
30132       var out = {};
30133       for (var k in tags) {
30134           if (!k) continue;
30135           var v = tags[k];
30136           if (v !== undefined) {
30137               out[k] = cleanValue(k, v);
30138           }
30139       }
30140
30141       return out;
30142
30143
30144       function cleanValue(k, v) {
30145           function keepSpaces(k) {
30146               return /_hours|_times|:conditional$/.test(k);
30147           }
30148
30149           function skip(k) {
30150               return /^(description|note|fixme)$/.test(k);
30151           }
30152
30153           if (skip(k)) return v;
30154
30155           var cleaned = v
30156               .split(';')
30157               .map(function(s) { return s.trim(); })
30158               .join(keepSpaces(k) ? '; ' : ';');
30159
30160           // The code below is not intended to validate websites and emails.
30161           // It is only intended to prevent obvious copy-paste errors. (#2323)
30162           // clean website- and email-like tags
30163           if (k.indexOf('website') !== -1 ||
30164               k.indexOf('email') !== -1 ||
30165               cleaned.indexOf('http') === 0) {
30166               cleaned = cleaned
30167                   .replace(/[\u200B-\u200F\uFEFF]/g, '');  // strip LRM and other zero width chars
30168
30169           }
30170
30171           return cleaned;
30172       }
30173   }
30174
30175   // Like selection.property('value', ...), but avoids no-op value sets,
30176   // which can result in layout/repaint thrashing in some situations.
30177   function utilGetSetValue(selection, value) {
30178       function d3_selection_value(value) {
30179           function valueNull() {
30180               delete this.value;
30181           }
30182
30183           function valueConstant() {
30184               if (this.value !== value) {
30185                   this.value = value;
30186               }
30187           }
30188
30189           function valueFunction() {
30190               var x = value.apply(this, arguments);
30191               if (x == null) {
30192                   delete this.value;
30193               } else if (this.value !== x) {
30194                   this.value = x;
30195               }
30196           }
30197
30198           return value == null
30199               ? valueNull : (typeof value === 'function'
30200               ? valueFunction : valueConstant);
30201       }
30202
30203       if (arguments.length === 1) {
30204           return selection.property('value');
30205       }
30206
30207       return selection.each(d3_selection_value(value));
30208   }
30209
30210   function utilIdleWorker(tasks, processor, callback) {
30211       var results = [], result;
30212       for (var i = 0; i < tasks.length; i++) {
30213           result = processor(tasks[i]);
30214           if (result) results.push(result);
30215       }
30216       callback(results);
30217
30218       // var processed = [];
30219       // var currentPos = 0;
30220       // var totalTasks = tasks.length;
30221
30222       // function worker(deadline) {
30223       //     while (deadline.timeRemaining() > 0 && currentPos < totalTasks) {
30224       //         var result = processor(tasks[currentPos]);
30225
30226       //         // if falsy dont add to the processed list
30227       //         if (result) processed.push(result);
30228       //         currentPos++;
30229       //     }
30230
30231       //     // more tasks are left, we might need more idleCallbacks
30232       //     if (currentPos < totalTasks) {
30233       //         return window.requestIdleCallback(function(deadline) {worker(deadline);});
30234       //     }
30235
30236       //     // tasks are completed
30237       //     return callback(processed);
30238       // }
30239
30240       // window.requestIdleCallback(function(deadline) {worker(deadline);});
30241   }
30242
30243   // shim
30244   window.requestIdleCallback =
30245       window.requestIdleCallback ||
30246       function(cb) {
30247           var start = Date.now();
30248           return setTimeout(function() {
30249               cb({
30250                   didTimeout: false,
30251                   timeRemaining: function() {
30252                       return Math.max(0, 50 - (Date.now() - start));
30253                   }
30254               });
30255           }, 1);
30256       };
30257
30258   window.cancelIdleCallback =
30259       window.cancelIdleCallback ||
30260       function(id) {
30261           clearTimeout(id);
30262       };
30263
30264   function utilKeybinding(namespace$$1) {
30265       var _keybindings = {};
30266
30267
30268       function testBindings(isCapturing) {
30269           var didMatch = false;
30270           var bindings = Object.keys(_keybindings).map(function(id) { return _keybindings[id]; });
30271           var i, binding;
30272
30273           // Most key shortcuts will accept either lower or uppercase ('h' or 'H'),
30274           // so we don't strictly match on the shift key, but we prioritize
30275           // shifted keybindings first, and fallback to unshifted only if no match.
30276           // (This lets us differentiate between '←'/'⇧←' or '⌘Z'/'⌘⇧Z')
30277
30278           // priority match shifted keybindings first
30279           for (i = 0; i < bindings.length; i++) {
30280               binding = bindings[i];
30281               if (!binding.event.modifiers.shiftKey) continue;  // no shift
30282               if (!!binding.capture !== isCapturing) continue;
30283               if (matches(binding, true)) {
30284                   binding.callback();
30285                   didMatch = true;
30286               }
30287           }
30288
30289           // then unshifted keybindings
30290           if (didMatch) return;
30291           for (i = 0; i < bindings.length; i++) {
30292               binding = bindings[i];
30293               if (binding.event.modifiers.shiftKey) continue;   // shift
30294               if (!!binding.capture !== isCapturing) continue;
30295               if (matches(binding, false)) {
30296                   binding.callback();
30297               }
30298           }
30299
30300
30301           function matches(binding, testShift) {
30302               var event$$1 = event;
30303               var isMatch = false;
30304               var tryKeyCode = true;
30305
30306               // Prefer a match on `KeyboardEvent.key`
30307               if (event$$1.key !== undefined) {
30308                   tryKeyCode = (event$$1.key.charCodeAt(0) > 255);  // outside ISO-Latin-1
30309                   isMatch = true;
30310
30311                   if (binding.event.key === undefined) {
30312                       isMatch = false;
30313                   } else if (Array.isArray(binding.event.key)) {
30314                       if (binding.event.key.map(function(s) { return s.toLowerCase(); }).indexOf(event$$1.key.toLowerCase()) === -1)
30315                           isMatch = false;
30316                   } else {
30317                       if (event$$1.key.toLowerCase() !== binding.event.key.toLowerCase())
30318                           isMatch = false;
30319                   }
30320               }
30321
30322               // Fallback match on `KeyboardEvent.keyCode`, can happen if:
30323               // - browser doesn't support `KeyboardEvent.key`
30324               // - `KeyboardEvent.key` is outside ISO-Latin-1 range (cyrillic?)
30325               if (!isMatch && tryKeyCode) {
30326                   isMatch = (event$$1.keyCode === binding.event.keyCode);
30327               }
30328
30329               if (!isMatch) return false;
30330
30331               // test modifier keys
30332               if (!(event$$1.ctrlKey && event$$1.altKey)) {  // if both are set, assume AltGr and skip it - #4096
30333                   if (event$$1.ctrlKey !== binding.event.modifiers.ctrlKey) return false;
30334                   if (event$$1.altKey !== binding.event.modifiers.altKey) return false;
30335               }
30336               if (event$$1.metaKey !== binding.event.modifiers.metaKey) return false;
30337               if (testShift && event$$1.shiftKey !== binding.event.modifiers.shiftKey) return false;
30338
30339               return true;
30340           }
30341       }
30342
30343
30344       function capture() {
30345           testBindings(true);
30346       }
30347
30348
30349       function bubble() {
30350           var tagName = select(event.target).node().tagName;
30351           if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') {
30352               return;
30353           }
30354           testBindings(false);
30355       }
30356
30357
30358       function keybinding(selection$$1) {
30359           selection$$1 = selection$$1 || select(document);
30360           selection$$1.on('keydown.capture.' + namespace$$1, capture, true);
30361           selection$$1.on('keydown.bubble.' + namespace$$1, bubble, false);
30362           return keybinding;
30363       }
30364
30365       // was: keybinding.off()
30366       keybinding.unbind = function(selection$$1) {
30367           _keybindings = [];
30368           selection$$1 = selection$$1 || select(document);
30369           selection$$1.on('keydown.capture.' + namespace$$1, null);
30370           selection$$1.on('keydown.bubble.' + namespace$$1, null);
30371           return keybinding;
30372       };
30373
30374
30375       keybinding.clear = function() {
30376           _keybindings = {};
30377           return keybinding;
30378       };
30379
30380
30381       // Remove one or more keycode bindings.
30382       keybinding.off = function(codes, capture) {
30383           var arr = uniq([].concat(codes));
30384
30385           for (var i = 0; i < arr.length; i++) {
30386               var id = arr[i] + (capture ? '-capture' : '-bubble');
30387               delete _keybindings[id];
30388           }
30389           return keybinding;
30390       };
30391
30392
30393       // Add one or more keycode bindings.
30394       keybinding.on = function(codes, callback, capture) {
30395           if (!isFunction(callback)) {
30396               return keybinding.off(codes, capture);
30397           }
30398
30399           var arr = uniq([].concat(codes));
30400
30401           for (var i = 0; i < arr.length; i++) {
30402               var id = arr[i] + (capture ? '-capture' : '-bubble');
30403               var binding = {
30404                   id: id,
30405                   capture: capture,
30406                   callback: callback,
30407                   event: {
30408                       key: undefined,  // preferred
30409                       keyCode: 0,      // fallback
30410                       modifiers: {
30411                           shiftKey: false,
30412                           ctrlKey: false,
30413                           altKey: false,
30414                           metaKey: false
30415                       }
30416                   }
30417               };
30418
30419               if (_keybindings[id]) {
30420                   console.warn('warning: duplicate keybinding for "' + id + '"'); // eslint-disable-line no-console
30421               }
30422
30423               _keybindings[id] = binding;
30424
30425               var matches = arr[i].toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g);
30426               for (var j = 0; j < matches.length; j++) {
30427                   // Normalise matching errors
30428                   if (matches[j] === '++') matches[j] = '+';
30429
30430                   if (matches[j] in utilKeybinding.modifierCodes) {
30431                       var prop = utilKeybinding.modifierProperties[utilKeybinding.modifierCodes[matches[j]]];
30432                       binding.event.modifiers[prop] = true;
30433                   } else {
30434                       binding.event.key = utilKeybinding.keys[matches[j]] || matches[j];
30435                       if (matches[j] in utilKeybinding.keyCodes) {
30436                           binding.event.keyCode = utilKeybinding.keyCodes[matches[j]];
30437                       }
30438                   }
30439               }
30440           }
30441
30442           return keybinding;
30443       };
30444
30445
30446       return keybinding;
30447   }
30448
30449
30450   /*
30451    * See https://github.com/keithamus/jwerty
30452    */
30453
30454   utilKeybinding.modifierCodes = {
30455       // Shift key, ⇧
30456       '⇧': 16, shift: 16,
30457       // CTRL key, on Mac: ⌃
30458       '⌃': 17, ctrl: 17,
30459       // ALT key, on Mac: ⌥ (Alt)
30460       '⌥': 18, alt: 18, option: 18,
30461       // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super)
30462       '⌘': 91, meta: 91, cmd: 91, 'super': 91, win: 91
30463   };
30464
30465   utilKeybinding.modifierProperties = {
30466       16: 'shiftKey',
30467       17: 'ctrlKey',
30468       18: 'altKey',
30469       91: 'metaKey'
30470   };
30471
30472   utilKeybinding.keys = {
30473       // Backspace key, on Mac: ⌫ (Backspace)
30474       '⌫': 'Backspace', backspace: 'Backspace',
30475       // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
30476       '⇥': 'Tab', '⇆': 'Tab', tab: 'Tab',
30477       // Return key, ↩
30478       '↩': 'Enter', 'return': 'Enter', enter: 'Enter', '⌅': 'Enter',
30479       // Pause/Break key
30480       'pause': 'Pause', 'pause-break': 'Pause',
30481       // Caps Lock key, ⇪
30482       '⇪': 'CapsLock', caps: 'CapsLock', 'caps-lock': 'CapsLock',
30483       // Escape key, on Mac: ⎋, on Windows: Esc
30484       '⎋': ['Escape', 'Esc'], escape: ['Escape', 'Esc'], esc: ['Escape', 'Esc'],
30485       // Space key
30486       space: [' ', 'Spacebar'],
30487       // Page-Up key, or pgup, on Mac: ↖
30488       '↖': 'PageUp', pgup: 'PageUp', 'page-up': 'PageUp',
30489       // Page-Down key, or pgdown, on Mac: ↘
30490       '↘': 'PageDown', pgdown: 'PageDown', 'page-down': 'PageDown',
30491       // END key, on Mac: ⇟
30492       '⇟': 'End', end: 'End',
30493       // HOME key, on Mac: ⇞
30494       '⇞': 'Home', home: 'Home',
30495       // Insert key, or ins
30496       ins: 'Insert', insert: 'Insert',
30497       // Delete key, on Mac: ⌦ (Delete)
30498       '⌦': ['Delete', 'Del'], del: ['Delete', 'Del'], 'delete': ['Delete', 'Del'],
30499       // Left Arrow Key, or ←
30500       '←': ['ArrowLeft', 'Left'], left: ['ArrowLeft', 'Left'], 'arrow-left': ['ArrowLeft', 'Left'],
30501       // Up Arrow Key, or ↑
30502       '↑': ['ArrowUp', 'Up'], up: ['ArrowUp', 'Up'], 'arrow-up': ['ArrowUp', 'Up'],
30503       // Right Arrow Key, or →
30504       '→': ['ArrowRight', 'Right'], right: ['ArrowRight', 'Right'], 'arrow-right': ['ArrowRight', 'Right'],
30505       // Up Arrow Key, or ↓
30506       '↓': ['ArrowDown', 'Down'], down: ['ArrowDown', 'Down'], 'arrow-down': ['ArrowDown', 'Down'],
30507       // odities, stuff for backward compatibility (browsers and code):
30508       // Num-Multiply, or *
30509       '*': ['*', 'Multiply'], star: ['*', 'Multiply'], asterisk: ['*', 'Multiply'], multiply: ['*', 'Multiply'],
30510       // Num-Plus or +
30511       '+': ['+', 'Add'], 'plus': ['+', 'Add'],
30512       // Num-Subtract, or -
30513       '-': ['-', 'Subtract'], subtract: ['-', 'Subtract'], 'dash': ['-', 'Subtract'],
30514       // Semicolon
30515       semicolon: ';',
30516       // = or equals
30517       equals: '=',
30518       // Comma, or ,
30519       comma: ',',
30520       // Period, or ., or full-stop
30521       period: '.', 'full-stop': '.',
30522       // Slash, or /, or forward-slash
30523       slash: '/', 'forward-slash': '/',
30524       // Tick, or `, or back-quote
30525       tick: '`', 'back-quote': '`',
30526       // Open bracket, or [
30527       'open-bracket': '[',
30528       // Back slash, or \
30529       'back-slash': '\\',
30530       // Close backet, or ]
30531       'close-bracket': ']',
30532       // Apostrophe, or Quote, or '
30533       quote: '\'', apostrophe: '\'',
30534       // NUMPAD 0-9
30535       'num-0': '0',
30536       'num-1': '1',
30537       'num-2': '2',
30538       'num-3': '3',
30539       'num-4': '4',
30540       'num-5': '5',
30541       'num-6': '6',
30542       'num-7': '7',
30543       'num-8': '8',
30544       'num-9': '9',
30545       // F1-F25
30546       f1: 'F1',
30547       f2: 'F2',
30548       f3: 'F3',
30549       f4: 'F4',
30550       f5: 'F5',
30551       f6: 'F6',
30552       f7: 'F7',
30553       f8: 'F8',
30554       f9: 'F9',
30555       f10: 'F10',
30556       f11: 'F11',
30557       f12: 'F12',
30558       f13: 'F13',
30559       f14: 'F14',
30560       f15: 'F15',
30561       f16: 'F16',
30562       f17: 'F17',
30563       f18: 'F18',
30564       f19: 'F19',
30565       f20: 'F20',
30566       f21: 'F21',
30567       f22: 'F22',
30568       f23: 'F23',
30569       f24: 'F24',
30570       f25: 'F25'
30571   };
30572
30573   utilKeybinding.keyCodes = {
30574       // Backspace key, on Mac: ⌫ (Backspace)
30575       '⌫': 8, backspace: 8,
30576       // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
30577       '⇥': 9, '⇆': 9, tab: 9,
30578       // Return key, ↩
30579       '↩': 13, 'return': 13, enter: 13, '⌅': 13,
30580       // Pause/Break key
30581       'pause': 19, 'pause-break': 19,
30582       // Caps Lock key, ⇪
30583       '⇪': 20, caps: 20, 'caps-lock': 20,
30584       // Escape key, on Mac: ⎋, on Windows: Esc
30585       '⎋': 27, escape: 27, esc: 27,
30586       // Space key
30587       space: 32,
30588       // Page-Up key, or pgup, on Mac: ↖
30589       '↖': 33, pgup: 33, 'page-up': 33,
30590       // Page-Down key, or pgdown, on Mac: ↘
30591       '↘': 34, pgdown: 34, 'page-down': 34,
30592       // END key, on Mac: ⇟
30593       '⇟': 35, end: 35,
30594       // HOME key, on Mac: ⇞
30595       '⇞': 36, home: 36,
30596       // Insert key, or ins
30597       ins: 45, insert: 45,
30598       // Delete key, on Mac: ⌦ (Delete)
30599       '⌦': 46, del: 46, 'delete': 46,
30600       // Left Arrow Key, or ←
30601       '←': 37, left: 37, 'arrow-left': 37,
30602       // Up Arrow Key, or ↑
30603       '↑': 38, up: 38, 'arrow-up': 38,
30604       // Right Arrow Key, or →
30605       '→': 39, right: 39, 'arrow-right': 39,
30606       // Up Arrow Key, or ↓
30607       '↓': 40, down: 40, 'arrow-down': 40,
30608       // odities, printing characters that come out wrong:
30609       // Firefox Equals
30610       'ffequals': 61,
30611       // Num-Multiply, or *
30612       '*': 106, star: 106, asterisk: 106, multiply: 106,
30613       // Num-Plus or +
30614       '+': 107, 'plus': 107,
30615       // Num-Subtract, or -
30616       '-': 109, subtract: 109,
30617       // Firefox Plus
30618       'ffplus': 171,
30619       // Firefox Minus
30620       'ffminus': 173,
30621       // Semicolon
30622       ';': 186, semicolon: 186,
30623       // = or equals
30624       '=': 187, 'equals': 187,
30625       // Comma, or ,
30626       ',': 188, comma: 188,
30627       // Dash / Underscore key
30628       'dash': 189,
30629       // Period, or ., or full-stop
30630       '.': 190, period: 190, 'full-stop': 190,
30631       // Slash, or /, or forward-slash
30632       '/': 191, slash: 191, 'forward-slash': 191,
30633       // Tick, or `, or back-quote
30634       '`': 192, tick: 192, 'back-quote': 192,
30635       // Open bracket, or [
30636       '[': 219, 'open-bracket': 219,
30637       // Back slash, or \
30638       '\\': 220, 'back-slash': 220,
30639       // Close backet, or ]
30640       ']': 221, 'close-bracket': 221,
30641       // Apostrophe, or Quote, or '
30642       '\'': 222, quote: 222, apostrophe: 222
30643   };
30644
30645   // NUMPAD 0-9
30646   var i$1 = 95, n = 0;
30647   while (++i$1 < 106) {
30648       utilKeybinding.keyCodes['num-' + n] = i$1;
30649       ++n;
30650   }
30651
30652   // 0-9
30653   i$1 = 47; n = 0;
30654   while (++i$1 < 58) {
30655       utilKeybinding.keyCodes[n] = i$1;
30656       ++n;
30657   }
30658
30659   // F1-F25
30660   i$1 = 111; n = 1;
30661   while (++i$1 < 136) {
30662       utilKeybinding.keyCodes['f' + n] = i$1;
30663       ++n;
30664   }
30665
30666   // a-z
30667   i$1 = 64;
30668   while (++i$1 < 91) {
30669       utilKeybinding.keyCodes[String.fromCharCode(i$1).toLowerCase()] = i$1;
30670   }
30671
30672   // Copies a variable number of methods from source to target.
30673   function utilRebind(target, source) {
30674       var i = 1, n = arguments.length, method;
30675       while (++i < n) {
30676           target[method = arguments[i]] = d3_rebind(target, source, source[method]);
30677       }
30678       return target;
30679   }
30680
30681   // Method is assumed to be a standard D3 getter-setter:
30682   // If passed with no arguments, gets the value.
30683   // If passed with arguments, sets the value and returns the target.
30684   function d3_rebind(target, source, method) {
30685       return function() {
30686           var value = method.apply(source, arguments);
30687           return value === source ? target : value;
30688       };
30689   }
30690
30691   // A per-domain session mutex backed by a cookie and dead man's
30692   // switch. If the session crashes, the mutex will auto-release
30693   // after 5 seconds.
30694
30695   // This accepts a string and returns an object that complies with utilSessionMutexType
30696   function utilSessionMutex(name) {
30697       var mutex = {};
30698       var intervalID;
30699
30700       function renew() {
30701           var expires = new Date();
30702           expires.setSeconds(expires.getSeconds() + 5);
30703           document.cookie = name + '=1; expires=' + expires.toUTCString();
30704       }
30705
30706       mutex.lock = function () {
30707           if (intervalID) return true;
30708           var cookie = document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1');
30709           if (cookie) return false;
30710           renew();
30711           intervalID = window.setInterval(renew, 4000);
30712           return true;
30713       };
30714
30715       mutex.unlock = function () {
30716           if (!intervalID) return;
30717           document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT';
30718           clearInterval(intervalID);
30719           intervalID = null;
30720       };
30721
30722       mutex.locked = function () {
30723           return !!intervalID;
30724       };
30725
30726       return mutex;
30727   }
30728
30729   function utilTiler() {
30730       var _size = [256, 256];
30731       var _scale = 256;
30732       var _tileSize = 256;
30733       var _zoomExtent = [0, 20];
30734       var _translate = [_size[0] / 2, _size[1] / 2];
30735       var _margin = 0;
30736       var _skipNullIsland = false;
30737
30738
30739       function clamp(num, min$$1, max$$1) {
30740           return Math.max(min$$1, Math.min(num, max$$1));
30741       }
30742
30743
30744       function nearNullIsland(tile) {
30745           var x = tile[0];
30746           var y = tile[1];
30747           var z = tile[2];
30748           if (z >= 7) {
30749               var center = Math.pow(2, z - 1);
30750               var width = Math.pow(2, z - 6);
30751               var min$$1 = center - (width / 2);
30752               var max$$1 = center + (width / 2) - 1;
30753               return x >= min$$1 && x <= max$$1 && y >= min$$1 && y <= max$$1;
30754           }
30755           return false;
30756       }
30757
30758
30759       function tiler() {
30760           var z = geoScaleToZoom(_scale / (2 * Math.PI), _tileSize);
30761           var z0 = clamp(Math.round(z), _zoomExtent[0], _zoomExtent[1]);
30762           var tileMin = 0;
30763           var tileMax = Math.pow(2, z0) - 1;
30764           var log2ts = Math.log(_tileSize) * Math.LOG2E;
30765           var k = Math.pow(2, z - z0 + log2ts);
30766           var origin = [
30767               (_translate[0] - _scale / 2) / k,
30768               (_translate[1] - _scale / 2) / k
30769           ];
30770
30771           var cols = range(
30772               clamp(Math.floor(-origin[0]) - _margin,               tileMin, tileMax + 1),
30773               clamp(Math.ceil(_size[0] / k - origin[0]) + _margin,  tileMin, tileMax + 1)
30774           );
30775           var rows = range(
30776               clamp(Math.floor(-origin[1]) - _margin,               tileMin, tileMax + 1),
30777               clamp(Math.ceil(_size[1] / k - origin[1]) + _margin,  tileMin, tileMax + 1)
30778           );
30779
30780           var tiles = [];
30781           for (var i = 0; i < rows.length; i++) {
30782               var y = rows[i];
30783               for (var j = 0; j < cols.length; j++) {
30784                   var x = cols[j];
30785
30786                   if (i >= _margin && i <= rows.length - _margin &&
30787                       j >= _margin && j <= cols.length - _margin) {
30788                       tiles.unshift([x, y, z0]);  // tiles in view at beginning
30789                   } else {
30790                       tiles.push([x, y, z0]);     // tiles in margin at the end
30791                   }
30792               }
30793           }
30794
30795           tiles.translate = origin;
30796           tiles.scale = k;
30797
30798           return tiles;
30799       }
30800
30801
30802       /**
30803        * getTiles() returns an array of tiles that cover the map view
30804        */
30805       tiler.getTiles = function(projection) {
30806           var origin = [
30807               projection.scale() * Math.PI - projection.translate()[0],
30808               projection.scale() * Math.PI - projection.translate()[1]
30809           ];
30810
30811           this
30812               .size(projection.clipExtent()[1])
30813               .scale(projection.scale() * 2 * Math.PI)
30814               .translate(projection.translate());
30815
30816           var tiles = tiler();
30817           var ts = tiles.scale;
30818
30819           return tiles
30820               .map(function(tile) {
30821                   if (_skipNullIsland && nearNullIsland(tile)) {
30822                       return false;
30823                   }
30824                   var x = tile[0] * ts - origin[0];
30825                   var y = tile[1] * ts - origin[1];
30826                   return {
30827                       id: tile.toString(),
30828                       xyz: tile,
30829                       extent: geoExtent$$1(
30830                           projection.invert([x, y + ts]),
30831                           projection.invert([x + ts, y])
30832                       )
30833                   };
30834               }).filter(Boolean);
30835       };
30836
30837
30838       /**
30839        * getGeoJSON() returns a FeatureCollection for debugging tiles
30840        */
30841       tiler.getGeoJSON = function(projection) {
30842           var features = tiler.getTiles(projection).map(function(tile) {
30843               return {
30844                   type: 'Feature',
30845                   properties: {
30846                       id: tile.id,
30847                       name: tile.id
30848                   },
30849                   geometry: {
30850                       type: 'Polygon',
30851                       coordinates: [ tile.extent.polygon() ]
30852                   }
30853               };
30854           });
30855
30856           return {
30857               type: 'FeatureCollection',
30858               features: features
30859           };
30860       };
30861
30862
30863       tiler.tileSize = function(val) {
30864           if (!arguments.length) return _tileSize;
30865           _tileSize = val;
30866           return tiler;
30867       };
30868
30869
30870       tiler.zoomExtent = function(val) {
30871           if (!arguments.length) return _zoomExtent;
30872           _zoomExtent = val;
30873           return tiler;
30874       };
30875
30876
30877       tiler.size = function(val) {
30878           if (!arguments.length) return _size;
30879           _size = val;
30880           return tiler;
30881       };
30882
30883
30884       tiler.scale = function(val) {
30885           if (!arguments.length) return _scale;
30886           _scale = val;
30887           return tiler;
30888       };
30889
30890
30891       tiler.translate = function(val) {
30892           if (!arguments.length) return _translate;
30893           _translate = val;
30894           return tiler;
30895       };
30896
30897
30898       // number to extend the rows/columns beyond those covering the viewport
30899       tiler.margin = function(val) {
30900           if (!arguments.length) return _margin;
30901           _margin = +val;
30902           return tiler;
30903       };
30904
30905
30906       tiler.skipNullIsland = function(val) {
30907           if (!arguments.length) return _skipNullIsland;
30908           _skipNullIsland = val;
30909           return tiler;
30910       };
30911
30912
30913       return tiler;
30914   }
30915
30916   function utilTriggerEvent(target, type) {
30917       target.each(function() {
30918           var evt = document.createEvent('HTMLEvents');
30919           evt.initEvent(type, true, true);
30920           this.dispatchEvent(evt);
30921       });
30922   }
30923
30924   function validationDeprecatedTag() {
30925
30926       var validation = function(changes) {
30927           var warnings = [];
30928           for (var i = 0; i < changes.created.length; i++) {
30929               var change = changes.created[i];
30930               var deprecatedTags = change.deprecatedTags();
30931
30932               if (!isEmpty(deprecatedTags)) {
30933                   var tags = utilTagText({ tags: deprecatedTags });
30934                   warnings.push({
30935                       id: 'deprecated_tags',
30936                       message: t('validations.deprecated_tags', { tags: tags }),
30937                       entity: change
30938                   });
30939               }
30940           }
30941
30942           return warnings;
30943       };
30944
30945
30946       return validation;
30947   }
30948
30949   function validationDisconnectedHighway() {
30950
30951       function isDisconnectedHighway(entity, graph) {
30952           if (!entity.tags.highway) return false;
30953           if (entity.geometry(graph) !== 'line') return false;
30954
30955           return graph.childNodes(entity)
30956               .every(function(vertex) {
30957                   var parents = graph.parentWays(vertex);
30958                   if (parents.length === 1) {  // standalone vertex
30959                       return true;
30960                   } else {                     // shared vertex
30961                       return !vertex.tags.entrance &&
30962                           parents.filter(function(parent) {
30963                               return parent.tags.highway && parent !== entity;
30964                           }).length === 0;
30965                   }
30966               });
30967       }
30968
30969
30970       var validation = function(changes, graph) {
30971           var warnings = [];
30972           for (var i = 0; i < changes.created.length; i++) {
30973               var entity = changes.created[i];
30974
30975               if (isDisconnectedHighway(entity, graph)) {
30976                   warnings.push({
30977                       id: 'disconnected_highway',
30978                       message: t('validations.disconnected_highway'),
30979                       tooltip: t('validations.disconnected_highway_tooltip'),
30980                       entity: entity
30981                   });
30982               }
30983           }
30984
30985           return warnings;
30986       };
30987
30988
30989       return validation;
30990   }
30991
30992   var discardNames = ["\\(historical\\)","^[0-9]+$","^agencja pocztowa$","^änderungsschneiderei$","^apotek(a|et)$","^(adler|bahnhof|brunnen|burg|bären|engel|hirsch|hubertus|kur|linden|löwen)(-| )?apotheke$","^(marien|markt|neue|park|rathaus|rats|rosen|schloss|sonnen|stadt|stern)(-| )?apotheke$","^alte (apotheke|post)$","^apotheke(\\sam\\smarkt)?$","^apteka$","^аптека","^atelier de couture$","^atm$","^auto serwis$","^bank(| spółdzielczy)$","^bar$","^bazar$","^bäckerei$","^bakery$","^(the )?barber(ia|shop|\\sshop)?$","^berber$","^biletomat$","^bistro$","^blumen(laden)?$","^bodega$","^borracharia$","^bo(u)?tique$","^boucherie(\\scharcuterie)?$","^boulangerie(\\sp(a|â)tisserie)?$","^bread$","^briefkasten$","^budget inn$","^(bureau de |)change$","^bureau de poste$","^büfé$","^caf(e|é)(t(e|é)r(i|í)a)?( )?(central)?$","^carnicer(i|í)a$","^central$","^centro naturista$","^cine(ma)?$","^cleaners$","^coiff(eur|ure)$","^coffee$","^colmado$","^commercial hotel$","^correos$","^currency exchange$","^d(ö|o)ner(\\skebab)?$","^drinks$","^droguer(i|í)a$","^eczane$","^el árbol$","^estanco$","^eisdiele","^eiscaf(e|é)(\\s(dolomiti|venezia))?$","^exchange$","^euroshop$","^élelmiszer$","^élelmiszerbolt$","^farm(a|à|á)ci(a|à|á|e)$","^fagyizó$","^fast food$","^fish (and|&) chips$","^fleuriste$","^florărie$","^food court$","^fris(eu|ö)r$","^fri(t|z)erie$","^frituur$","^fryzjer$","^frutería$","^funeraria$","^ferreter(i|í)a$","^game$","^garage$","^gasoline(ra)?$","^gast(haus|hof)\\s(krone|(zur)\\s(linde|post))?$","^getränkemarkt$","^gimnasio$","^gomer(i|í)a$","^gym(nase|nasium)?$","^gyógyszertár$","^haar(genau|monie|scharf)$","^hair\\s(design|lounge|salon)$","^hardware$","^(hof|dorf)laden$","^hospedaje$","^(h|m)otel$","^h(o|ô)tel\\s(astoria|central|europa|krone|panorama|plaza|royal|victoria|(zur\\s)?post|de france)$","^(central|city|europa|grand|palace|park|royal)(\\s)?hotel$","^húsbolt$","^indipend\\.$","^((drummed|independent)\\s)?(cng|filling|fuel|gas|lpg|petrol)(\\s(station|pump))?$","^istanbul(\\skebab)?$","^imbiss$","^internet cafe$","^kaf(e|é)$","^kios(co|k|ko|que)?$","^kantine$","^kantor$","^kebab(ai|\\shouse)?$","^kitchen$","^kisbolt$","^kwiaciarnia$","^ladestation$","^lékárna$","^librer(i|í)a$","^librairie$","^libro$","^ljekarna$","^lombard$","^lot 1$","^macelleria$","^mailbox$","^magazin","^market$","^mécanique$","^mercado$","^mini(\\s)?(abc|market|mart|mercado|pump)","municipal","^nails$","^obuwie$","^(okręgowa\\s)?stacja kontroli pojazdów$","^oplaadpunt$","^opti(c|k)a$","^optical center$","^padaria$","^panader(i|í)a$","^panificio$","^panorama$","^papeler(i|í)a$","^pa(r|cz)komat$","^parafarmacia$","^parkscheinautomat$","^parquímetro$","^peluquer(i|í)a$","^pharmac(ie|y)$","^piekarnia$","^pizz(eri)?a$","^piscine$","^poczta$","^po(s|š)t(a|e|o)$","^post(\\s)?(agentur|filiale|partner|office|stelle)?$","^punkt apteczny$","^pressing$","^rent a car$","^restaurant(e)?(\\suniversitário)?$","^rzeźnik$","^salle (omnisport|polyvalente)$","^(the\\s)?salo(o)?n( de coiffure| fryzjerski)?$","^second\\shand$","^shop$","^(coffee|pet|vulcanizing|gift)(\\sshop)?$","^sklep$","^(sklep\\s)?(spożywcz(y|o))(-przemysłowy)?$","^snack$","^souvenirs$","^stacja (benzynowa|paliw)$","^stadium$","^station service$","^steak house$","^stores?$","^(beer|convenience|corner|general|liquor|variety)(\\sstore)?$","^stromtankstelle$","^super ?america","^superm(arket|ercado)$","^sushi(\\s(bar|shop))?$","^tabaccher(i|í)a$","^taba(c|k)(os|chi)?(\\strafi(k|c))?$","^tacos$","^tankstelle$","^tattoo$","^taverna$","^tea stall$","^tienda(\\sde\\s(barrio|abarrotes))?$","^tokyo$","^trattoria$","^trafik(a)?$","^trinkhalle$","^ufficio postale$","^urząd pocztowy$","^vegyesbolt$","^venezia$","^večerka$","^virágbolt$","^vision\\splus$","^(clinica\\s)?veterinari(a|o)$","^(clinique\\s)?vétérinaire$","^warung$","^warzywniak$","^windmill$","^wok$","^wulkanizacja$","^zigarettenautomat$","^zöldséges$","^авто(рынок|ремонт|сервис|электрик|запчасти(ни)?)?$","^автома(г|газин|стерская)?$","^ателье$","^бистро$","^буфет$","^бассейн$","^ветеринарная клиника$","^ветлечебница$","^вулканизация$","^газ$","^газовая заправка$","^гостиница$","^главпочтамт$","^детский дом$","^ломбард$","^закусочная$","замена масла","^золото(й)?$","^зоо(магазин|товары)$","^канцтовары$","^касса$","^(летнее\\s)?кафе(терий)?$","^кофе(йня|\\sхауз)$","^книги$","^киоск$","^мебель$","^меблі$","^мороженое$","^оптика$","^овощи(\\sи\\s|-)фрукты$","^(спец|детская|женская)?(\\s)?одежда$","^(парикмахерская|персона|перукарня)$","^почта$","^почтовое отделение$","^подарки$","^пресса$","^(Проездные\\s)?билет(ы)?$","^продукт(ы|и)?$","^промтовары$","^ресторан$","^ремонт\\sобуви$","^рыб(a|олов)$","^ритуал(ьные услуги)?$","^салон красоты$","^сувениры$","^супермаркет$","^столовая$","^стройматериалы$","^социальный участковый$","^спорт(зал|комплекс)$","^табак(ерка)?$","^товары для дома$","^Уют$","^универ(маг|сам)$","^φαρμακείο$","^фармация$","^химчистка$","^хоз(товары|яюшка)$","шиномонтаж","^ша(ве|у)рма$","^نانوایی$","^نانوایی بربری$","^حلاق$","^مخبز(ة)?$","^مقهى$","^محط(ه|ة) وقود$","^میوه فروشی$","^داروخانه$","^بانک$","^بقال(ة)?$","^پمپ (بنزین|گاز)$","^سوپر\\s?مارکت$","^صيدلية$","^اداره پست$","^رستوران$","^مطعم$","^მარკეტი\\s\\(Market\\)","^דלק$","^カフェ$","^ポスト$","^珈琲館$","^加油站$","^郵局$","^食堂$","^(自動販売機|自販機)$","^体育館$"];
30993
30994   function validationGenericName() {
30995
30996       function isGenericName(entity) {
30997           var name = entity.tags.name;
30998           if (!name) return false;
30999
31000           var i, re;
31001
31002           // test if the name is just the tag value (e.g. "park")
31003           var keys = ['amenity', 'leisure', 'shop', 'man_made', 'tourism'];
31004           for (i = 0; i < keys.length; i++) {
31005               var val = entity.tags[keys[i]];
31006               if (val && val.replace(/\_/g, ' ').toLowerCase() === name.toLowerCase()) {
31007                   return name;
31008               }
31009           }
31010
31011           // test if the name is a generic name (e.g. "pizzaria")
31012           for (i = 0; i < discardNames.length; i++) {
31013               re = new RegExp(discardNames[i], 'i');
31014               if (re.test(name)) {
31015                   return name;
31016               }
31017           }
31018
31019           return false;
31020       }
31021
31022
31023       return function validation(changes) {
31024           var warnings = [];
31025
31026           for (var i = 0; i < changes.created.length; i++) {
31027               var change = changes.created[i];
31028               var generic = isGenericName(change);
31029               if (generic) {
31030                   warnings.push({
31031                       id: 'generic_name',
31032                       message: t('validations.generic_name'),
31033                       tooltip: t('validations.generic_name_tooltip', { name: generic }),
31034                       entity: change
31035                   });
31036               }
31037           }
31038
31039           return warnings;
31040       };
31041   }
31042
31043   function validationManyDeletions() {
31044       var threshold = 100;
31045
31046       var validation = function(changes, graph) {
31047           var warnings = [];
31048           var nodes = 0, ways = 0, areas = 0, relations = 0;
31049
31050           changes.deleted.forEach(function(c) {
31051               if (c.type === 'node') { nodes++; }
31052               else if (c.type === 'way' && c.geometry(graph) === 'line') { ways++; }
31053               else if (c.type === 'way' && c.geometry(graph) === 'area') { areas++; }
31054               else if (c.type === 'relation') { relations++; }
31055           });
31056           if (changes.deleted.length > threshold) {
31057               warnings.push({
31058                   id: 'many_deletions',
31059                   message: t('validations.many_deletions',
31060                       { n: changes.deleted.length, p: nodes, l: ways, a:areas, r: relations }
31061                   )
31062               });
31063           }
31064
31065           return warnings;
31066       };
31067
31068
31069       return validation;
31070   }
31071
31072   var localizeStrings = {"this node":"this_node","this way":"this_way","this relation":"this_relation","this one-way":"this_oneway","this highway":"this_highway","this railway":"this_railway","this waterway":"this_waterway","this cycleway":"this_cycleway","this footpath":"this_footpath","this cycleway/footpath":"this_cycleway_footpath","this riverbank":"this_riverbank","this crossing":"this_crossing","this railway crossing":"this_railway_crossing","this bridge":"this_bridge","this tunnel":"this_tunnel","this boundary":"this_boundary","this turn-restriction":"this_turn_restriction","this roundabout":"this_roundabout","this mini-roundabout":"this_mini_roundabout","this track":"this_track","this feature":"this_feature",highway:"highway",railway:"railway",waterway:"waterway",cycleway:"cycleway",cycleway_footpath:"cycleway/footpath",riverbank:"riverbank",place_of_worship:"place_of_worship",pub:"pub",restaurant:"restaurant",school:"school",university:"university",hospital:"hospital",library:"library",theatre:"theatre",courthouse:"courthouse",bank:"bank",cinema:"cinema",pharmacy:"pharmacy",cafe:"cafe",fast_food:"fast_food",fuel:"fuel",from:"from",to:"to","left-hand":"left_hand","right-hand":"right_hand"};
31073   var errorTypes = {"20":{title:"multiple nodes on the same spot",severity:"warning",description:"There is more than one node in this spot. Offending node IDs: $1",IDs:["20"],regex:"IDs: ((?:#\\d+,?)+)"},"30":{title:"non-closed_areas",severity:"error",description:"This way is tagged with '$1' and should be closed-loop.",IDs:["this",""],regex:"(this way) is tagged with '(.+)'"},"40":{title:"dead-ended one-ways",severity:"error",description:"The first node (id $1) of this one-way is not connected to any other way",IDs:["n","this"],regex:"\\(id (\\d+)\\) of (this one-way)"},"41":{title:"",severity:"error",description:"The last node (id $1) of this one-way is not connected to any other way",IDs:["n","this"],regex:"\\(id (\\d+)\\) of (this one-way)"},"42":{title:"",severity:"error",description:"This node cannot be reached because one-ways only lead away from here",IDs:["this"],regex:"(this node)"},"43":{title:"",severity:"error",description:"You cannot escape from this node because one-ways only lead to here",IDs:["this"],regex:"(this node)"},"50":{title:"almost-junctions",severity:"error",description:"This node is very close but not connected to way #$1",IDs:["this","w"],regex:"(this node) is very close but not connected to way #(\\d+)"},"60":{title:"deprecated tags",severity:"warning",description:"This $1 uses deprecated tag $2. Please use $3 instead!",IDs:["this","",""],regex:"(this (?:node|way|relation)) uses deprecated tag '(.+)'\\. Please use &quot;(.+)&quot;"},"70":{title:"missing tags",severity:"error",description:"This $1 has an empty tag: $2",IDs:["this",""],regex:"(this (?:node|way|relation)) has an empty tag: &quot;(.+)=&quot;"},"71":{title:"",severity:"error",description:"This way has no tags",IDs:["this"],regex:"(this way)"},"72":{title:"",severity:"error",description:"This node is not member of any way and does not have any tags",IDs:["this"],regex:"(this node)"},"73":{title:"",severity:"error",description:"This way has a $1 tag but no highway tag",IDs:["this",""],regex:"(this way) has a (.+) tag"},"74":{title:"missing tags",severity:"error",description:"This $1 has an empty tag: $2",IDs:["this",""],regex:"(this (?:node|way|relation)) has an empty tag: &quot;(.+)=&quot;"},"75":{description:"This (node|way|relation) has a name \\((.+)\\) but no other tag",IDs:["this",""],regex:"(this (?:node|way|relation)) has a name \\((.+)\\)"},"90":{title:"motorways without ref",severity:"error",description:"This way is tagged as motorway and therefore needs a ref nat_ref or int_ref tag",IDs:["this"],regex:"(this way)"},"100":{title:"places of worship without religion",severity:"error",description:"This $1 is tagged as place of worship and therefore needs a religion tag",IDs:["this"],regex:"(this (?:node|way|relation))"},"110":{title:"point of interest without name",severity:"error",description:"This node is tagged as $1 and therefore needs a name tag",IDs:["this",""],regex:"(this (?:node|way|relation)) is tagged as (.+) and"},"120":{title:"ways without nodes",severity:"error",description:"This way has just one single node",IDs:["this"],regex:"(this way)"},"130":{title:"floating islands",severity:"error",description:"This way is not connected to the rest of the map",IDs:["this"],regex:"(this way)"},"150":{title:"railway crossing without tag",severity:"error",description:"This crossing of a highway and a railway needs to be tagged as railway=crossing or railway=level_crossing",IDs:["this"],regex:"(this crossing)"},"160":{title:"wrongly used railway tag",severity:"error",description:"There are ways in different layers coming together in this railway crossing. There are ways tagged as tunnel or bridge coming together in this railway crossing",IDs:["this"],regex:"(this railway crossing)"},"170":{title:"FIXME tagged items",severity:"error",description:"This feature has a FIXME tag: (.*)",IDs:["this"],regex:"(this feature) has a FIXME tag: (.*)"},"180":{title:"relations without type",severity:"error",description:"This relation has no type tag which is mandatory for relations",IDs:["this"],regex:"(this relation)"},"190":{title:"intersections without junctions",severity:"error",description:"This $1 intersects the $2 #$3 but there is no junction node",IDs:["this","","w"],regex:"(this .+) intersects the (.+) #(\\d+)"},"200":{title:"overlapping ways",severity:"error",description:"This $1 overlaps the $2 #$3",IDs:["this","","w"],regex:"(this .+) overlaps the (.+) #(\\d+)"},"210":{title:"loopings",severity:"error",description:"These errors contain self intersecting ways"},"211":{title:"",severity:"error",description:"This way contains more than one node at least twice. Nodes are $1.",IDs:["this","211"],regex:"(this way) contains more than one node at least twice. Nodes are ((?:#\\d+(?:, )?)+)\\."},"212":{title:"",severity:"error",description:"This way has only two different nodes and contains one of them more than once",IDs:["this"],regex:"(this way)"},"220":{title:"misspelled tags",severity:"error",description:"This $1 is tagged '$2' where $3 looks like $4",regex:"(this (?:node|way|relation)) is tagged '(.+)' where &quot;(.+)&quot; looks like &quot;(.+)&quot;"},"221":{title:"",severity:"error",description:"The key of this $1's tag is 'key': $2",regex:"(this (?:node|way|relation))\\'s tag is \\'key\\': (.+)"},"230":{title:"layer conflicts",severity:"error",description:"This node is a junction of ways on different layers.",IDs:["this"],regex:"(this node)"},"231":{title:"mixed layers intersection",severity:"error",description:"This node is a junction of ways on different layers: $1",IDs:["this","231"],regex:"(this node) is a junction of ways on different layers: (.+)"},"232":{title:"strange layers",severity:"error",description:"This $1 is tagged with layer $2. This need not be an error, but it looks strange",IDs:["this",""],regex:"(this (?:bridge|tunnel)) is tagged with layer (-?\\d+)\\."},"270":{title:"motorways connected directly",severity:"error",description:"This node is a junction of a motorway and a highway other than motorway, motorway_link, trunk, rest_area or construction. Service or unclassified is only valid if it has access=no/private or it leads to a motorway service area or if it is a service=parking_aisle.",IDs:["this"],regex:"(this node)"},"280":{title:"boundaries",severity:"error",description:"Administrative Boundaries can be expressed either by tagging ways or by adding them to a relation. They should be closed-loop sequences of ways, they must not self-intersect or split and they must have a name and an admin_level."},"281":{title:"missing name",severity:"error",description:"This boundary has no name",IDs:["this"],regex:"(this boundary)"},"282":{title:"missing admin level",severity:"error",description:"The boundary of $1 has no (?:valid numeric)?admin_level",regex:"of (.+) has"},"283":{title:"no closed loop",severity:"error",description:"The boundary of $1 is not closed-loop",regex:"boundary of (.+) is"},"284":{title:"splitting boundary",severity:"error",description:"The boundary of $1 splits here",regex:"boundary of (.+) splits"},"285":{title:"admin_level too high",severity:"error",description:"This boundary-way has admin_level $1 but belongs to a relation with lower admin_level (higher priority); it should have the lowest admin_level of all relations",IDs:["this",""],regex:"(this boundary)-way has admin_level (-?\\d+) but"},"290":{title:"restrictions",severity:"error",description:"Analyses all relations tagged type=restriction or following variations type=restriction:hgv type=restriction:caravan type=restriction:motorcar type=restriction:bus type=restriction:agricultural type=restriction:motorcycle type=restriction:bicycle and type=restriction:hazmat"},"291":{title:"missing type",severity:"error",description:"This turn-restriction has no (?:known )?restriction type",IDs:["this"],regex:"(this turn-restriction) has"},"292":{title:"missing from way",severity:"error",description:"This turn-restriction needs exactly one from member. This one has $1",IDs:["this",""],regex:"(this turn-restriction) needs.+has (\\d+)"},"293":{title:"missing to way",severity:"error",description:"This turn-restriction needs exactly one to member. This one has $1",IDs:["this",""],regex:"(this turn-restriction) needs.+has (\\d+)"},"294":{title:"from or to not a way",severity:"error",description:"From- and To-members of this turn-restriction need to be ways. $1",IDs:["this","294"],regex:"(this turn-restriction)~.+ways\\. ((?:(?:from|to) (?:node|relation) #\\d+,?)+)"},"295":{title:"via is not on the way ends",severity:"error",description:"via (node #$1) is not the first or the last member of (from|to) (way #$3)",IDs:["this","n","","w"],regex:"(this turn-restriction)~via \\(node #(\\d+)\\).+ of (from|to) \\(way #(\\d+)\\)"},"296":{title:"wrong restriction angle",severity:"error",description:"This turn-restriction type is $1, but angle is $2 degrees. Maybe the restriction type is not appropriate?",IDs:["this","",""],regex:"(this turn-restriction)~.+is (\\w+), but angle is (-?\\d+)"},"297":{title:"wrong direction of to member",severity:"error",description:"wrong direction of to way $1",IDs:["this","w"],regex:"(this turn-restriction)~.+to way (\\d+)"},"298":{title:"already restricted by oneway",severity:"error",description:"entry already prohibited by oneway tag on $1",IDs:["this","w"],regex:"(this turn-restriction)~.+tag on (\\d+)"},"300":{title:"missing maxspeed",severity:"warning",description:"This highway is missing a maxspeed tag",IDs:["this"],regex:"(this highway)"},"310":{title:"roundabouts",severity:"error",description:"Analyses ways with tag junction=roundabout. More then one way can form a roundabout. It supports tag oneway=-1"},"311":{title:"not closed loop",severity:"error",description:"This way is part of a roundabout but is not closed-loop. (split carriageways approaching a roundabout should not be tagged as roundabout)",IDs:["this"],regex:"(this way)"},"312":{title:"wrong direction",severity:"error",description:"If this ((?:mini_)?roundabout) is in a country with (left|right)-hand traffic then its orientation goes the wrong way around",IDs:["this",""],regex:"(this (?:mini_)?roundabout) is in a country with ((?:left|right)-hand)"},"313":{title:"faintly connected",severity:"error",description:"This roundabout has only $1 other roads connected. Roundabouts typically have three",IDs:["this",""],regex:"(this roundabout) has only (\\d) other"},"320":{title:"*_link connections",severity:"error",description:"This way is tagged as highway=$1_link but doesn't have a connection to any other $1 or $1_link",IDs:["this","","","",""],regex:"(this way) is tagged as (highway=.+) but doesn't have a connection to any other (.+) or (.+)"},"350":{title:"bridge-tags",severity:"error",description:"This bridge does not have a tag in common with its surrounding ways that shows the purpose of this bridge. There should be one of these tags: (.+)",NOTE:"Group can be arbitrary list of form: key=value,key=value,key=value...",IDs:["this",""],regex:"(this bridge).*tags: (.+)"},"360":{title:"language unknown",severity:"warning",description:"It would be nice if this (node|way|relation) had an additional tag 'name:XX=(.+)' where XX shows the language of its name '\\2'",IDs:["this",""],regex:"(this (?:node|way|relation)) had an additional tag 'name:XX=(.+)' where"},"370":{title:"doubled places",severity:"error",description:"This node has tags in common with the surrounding way #$1 ((?:\\(including the name '.+'\\) )?)and seems to be redundand",IDs:["this","w","370"],regex:"(this node) has tags in common with the surrounding way #(\\d+) ((?:\\(including the name '.+'\\) )?)and"},"380":{title:"non-physical use of sport-tag",severity:"error",description:"This way is tagged sport=$1 but has no physical tag like e.g. leisure, building, amenity or highway",IDs:["this",""],regex:"(this way) is tagged (sport=.+) but"},"390":{title:"missing tracktype",severity:"warning",description:"This track doesn''t have a tracktype",IDs:["this"],regex:"(this track)"},"400":{title:"geometry glitches",severity:"error",description:""},"401":{title:"missing turn restriction",severity:"error",description:"ways $1 and $2 join in a very sharp angle here and there is no oneway tag or turn restriction that prevents turning( from way (\\1|\\2) to (\\1|\\2))?",IDs:["w","w"],regex:"ways (\\d+) and (\\d+) join"},"402":{title:"impossible angles",severity:"error",description:"this way bends in a very sharp angle here",IDs:["this"],regex:"(this way)"},"410":{title:"website",severity:"error",description:"Web pages are analyzed. Web page is defined by any of the following tags website=* url=* website:mobile=* contact:website=* contact:url=* image=* source:website=* or source:url=*"},"411":{title:"http error",severity:"error",description:"The URL (<a target=_blank href=$1>$1</a>) cannot be opened (HTTP status code $2)",IDs:["this","url",""],regex:"(this feature)~.+ href=([^>]+)>.+ code (\\d+)\\)"},"412":{title:"domain hijacking",severity:"error",description:"Possible domain squatting: <a target=_blank href=$1>$1</a>. Suspicious text is: \"$2\"",IDs:["this","url",""],regex:"(this feature)~.+ href=([^>]+)>.+ is: &quot;(.+)&quot;"},"413":{title:"non-match",severity:"error",description:"Content of the URL (<a target=_blank href=$1>$1</a>) did not contain these keywords: ($2)",IDs:["this","url",""],regex:"(this feature)~.+ href=([^>]+)>.+ keywords: \\((.+)\\)"}};
31074
31075   var tiler = utilTiler();
31076   var dispatch$1 = dispatch('loaded');
31077
31078   var _krCache;
31079   var _krZoom = 14;
31080   var _krUrlRoot = 'https://www.keepright.at/';
31081
31082   var _krRuleset = [
31083       // no 20 - multiple node on same spot - these are mostly boundaries overlapping roads
31084       30, 40, 50, 60, 70, 90, 100, 110, 120, 130, 150, 160, 170, 180,
31085       190, 191, 192, 193, 194, 195, 196, 197, 198,
31086       200, 201, 202, 203, 204, 205, 206, 207, 208, 210, 220,
31087       230, 231, 232, 270, 280, 281, 282, 283, 284, 285,
31088       290, 291, 292, 293, 294, 295, 296, 297, 298, 300, 310, 311, 312, 313,
31089       320, 350, 360, 370, 380, 390, 400, 401, 402, 410, 411, 412, 413
31090   ];
31091
31092
31093   function abortRequest(i) {
31094       if (i) {
31095           i.abort();
31096       }
31097   }
31098
31099   function abortUnwantedRequests(cache, tiles) {
31100       forEach(cache.inflightTile, function(v, k) {
31101           var wanted = find$1(tiles, function(tile) {
31102               return k === tile.id;
31103           });
31104           if (!wanted) {
31105               abortRequest(v);
31106               delete cache.inflightTile[k];
31107           }
31108       });
31109   }
31110
31111
31112   function encodeErrorRtree(d) {
31113       return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d };
31114   }
31115
31116
31117   // replace or remove error from rtree
31118   function updateRtree(item, replace) {
31119       _krCache.rtree.remove(item, function isEql(a, b) {
31120           return a.data.id === b.data.id;
31121       });
31122
31123       if (replace) {
31124           _krCache.rtree.insert(item);
31125       }
31126   }
31127
31128
31129   function tokenReplacements(d) {
31130       if (!(d instanceof krError)) return;
31131
31132       var htmlRegex = new RegExp(/<\/[a-z][\s\S]*>/);
31133       var replacements = {};
31134
31135       var errorTemplate = errorTypes[d.which_type];
31136       if (!errorTemplate) {
31137           /* eslint-disable no-console */
31138           console.log('No Template: ', d.which_type);
31139           console.log('  ', d.description);
31140           /* eslint-enable no-console */
31141           return;
31142       }
31143
31144       // some descriptions are just fixed text
31145       if (!errorTemplate.regex) return;
31146
31147       // regex pattern should match description with variable details captured
31148       var errorRegex = new RegExp(errorTemplate.regex, 'i');
31149       var errorMatch = errorRegex.exec(d.description);
31150       if (!errorMatch) {
31151           /* eslint-disable no-console */
31152           console.log('Unmatched: ', d.which_type);
31153           console.log('  ', d.description);
31154           console.log('  ', errorRegex);
31155           /* eslint-enable no-console */
31156           return;
31157       }
31158
31159       for (var i = 1; i < errorMatch.length; i++) {   // skip first
31160           var capture = errorMatch[i];
31161           var idType;
31162
31163           idType = 'IDs' in errorTemplate ? errorTemplate.IDs[i-1] : '';
31164           if (idType && capture) {   // link IDs if present in the capture
31165               capture = parseError(capture, idType);
31166           } else if (htmlRegex.test(capture)) {   // escape any html in non-IDs
31167               capture = '\\' +  capture + '\\';
31168           } else {
31169               var compare = capture.toLowerCase();
31170               if (localizeStrings[compare]) {   // some replacement strings can be localized
31171                   capture = t('QA.keepRight.error_parts.' + localizeStrings[compare]);
31172               }
31173           }
31174
31175           replacements['var' + i] = capture;
31176       }
31177
31178       return replacements;
31179   }
31180
31181
31182   function parseError(capture, idType) {
31183       var compare = capture.toLowerCase();
31184       if (localizeStrings[compare]) {   // some replacement strings can be localized
31185           capture = t('QA.keepRight.error_parts.' + localizeStrings[compare]);
31186       }
31187
31188       switch (idType) {
31189           // link a string like "this node"
31190           case 'this':
31191               capture = linkErrorObject(capture);
31192               break;
31193
31194           case 'url':
31195               capture = linkURL(capture);
31196               break;
31197
31198           // link an entity ID
31199           case 'n':
31200           case 'w':
31201           case 'r':
31202               capture = linkEntity(idType + capture);
31203               break;
31204
31205           // some errors have more complex ID lists/variance
31206           case '20':
31207               capture = parse20(capture);
31208               break;
31209           case '211':
31210               capture = parse211(capture);
31211               break;
31212           case '231':
31213               capture = parse231(capture);
31214               break;
31215           case '294':
31216               capture = parse294(capture);
31217               break;
31218           case '370':
31219               capture = parse370(capture);
31220               break;
31221       }
31222
31223       return capture;
31224
31225
31226       function linkErrorObject(d) {
31227           return '<a class="kr_error_object_link">' + d + '</a>';
31228       }
31229
31230       function linkEntity(d) {
31231           return '<a class="kr_error_entity_link">' + d + '</a>';
31232       }
31233
31234       function linkURL(d) {
31235           return '<a class="kr_external_link" target="_blank" href="' + d + '">' + d + '</a>';
31236       }
31237
31238       // arbitrary node list of form: #ID, #ID, #ID...
31239       function parse211(capture) {
31240           var newList = [];
31241           var items = capture.split(', ');
31242
31243           items.forEach(function(item) {
31244               // ID has # at the front
31245               var id = linkEntity('n' + item.slice(1));
31246               newList.push(id);
31247           });
31248
31249           return newList.join(', ');
31250       }
31251
31252       // arbitrary way list of form: #ID(layer),#ID(layer),#ID(layer)...
31253       function parse231(capture) {
31254           var newList = [];
31255           // unfortunately 'layer' can itself contain commas, so we split on '),'
31256           var items = capture.split('),');
31257
31258           items.forEach(function(item) {
31259               var match = item.match(/\#(\d+)\((.+)\)?/);
31260               if (match !== null && match.length > 2) {
31261                   newList.push(linkEntity('w' + match[1]) + ' ' +
31262                       t('QA.keepRight.errorTypes.231.layer', { layer: match[2] })
31263                   );
31264               }
31265           });
31266
31267           return newList.join(', ');
31268       }
31269
31270       // arbitrary node/relation list of form: from node #ID,to relation #ID,to node #ID...
31271       function parse294(capture) {
31272           var newList = [];
31273           var items = capture.split(',');
31274
31275           items.forEach(function(item) {
31276               var role;
31277               var idType;
31278               var id;
31279
31280               // item of form "from/to node/relation #ID"
31281               item = item.split(' ');
31282
31283               // to/from role is more clear in quotes
31284               role = '"' + item[0] + '"';
31285
31286               // first letter of node/relation provides the type
31287               idType = item[1].slice(0,1);
31288
31289               // ID has # at the front
31290               id = item[2].slice(1);
31291               id = linkEntity(idType + id);
31292
31293               item = [role, item[1], id].join(' ');
31294               newList.push(item);
31295           });
31296
31297           return newList.join(', ');
31298       }
31299
31300       // may or may not include the string "(including the name 'name')"
31301       function parse370(capture) {
31302           if (!capture) return '';
31303
31304           var match = capture.match(/\(including the name (\'.+\')\)/);
31305           if (match !== null && match.length) {
31306               return t('QA.keepRight.errorTypes.370.including_the_name', { name: match[1] });
31307           }
31308           return '';
31309       }
31310
31311       // arbitrary node list of form: #ID,#ID,#ID...
31312       function parse20(capture) {
31313           var newList = [];
31314           var items = capture.split(',');
31315
31316           items.forEach(function(item) {
31317               // ID has # at the front
31318               var id = linkEntity('n' + item.slice(1));
31319               newList.push(id);
31320           });
31321
31322           return newList.join(', ');
31323       }
31324   }
31325
31326
31327   var serviceKeepRight = {
31328       init: function() {
31329           if (!_krCache) {
31330               this.reset();
31331           }
31332
31333           this.event = utilRebind(this, dispatch$1, 'on');
31334       },
31335
31336       reset: function() {
31337           if (_krCache) {
31338               forEach(_krCache.inflightTile, abortRequest);
31339           }
31340           _krCache = {
31341               data: {},
31342               loadedTile: {},
31343               inflightTile: {},
31344               inflightPost: {},
31345               closed: {},
31346               rtree: rbush_1()
31347           };
31348       },
31349
31350
31351       // KeepRight API:  http://osm.mueschelsoft.de/keepright/interfacing.php
31352       loadErrors: function(projection) {
31353           var options = { format: 'geojson' };
31354           var rules = _krRuleset.join();
31355
31356           // determine the needed tiles to cover the view
31357           var tiles = tiler
31358               .zoomExtent([_krZoom, _krZoom])
31359               .getTiles(projection);
31360
31361           // abort inflight requests that are no longer needed
31362           abortUnwantedRequests(_krCache, tiles);
31363
31364           // issue new requests..
31365           tiles.forEach(function(tile) {
31366               if (_krCache.loadedTile[tile.id] || _krCache.inflightTile[tile.id]) return;
31367
31368               var rect = tile.extent.rectangle();
31369               var params = assignIn({}, options, { left: rect[0], bottom: rect[3], right: rect[2], top: rect[1] });
31370               var url = _krUrlRoot + 'export.php?' + utilQsString(params) + '&ch=' + rules;
31371
31372               _krCache.inflightTile[tile.id] = d3_json(url,
31373                   function(err, data) {
31374                       delete _krCache.inflightTile[tile.id];
31375
31376                       if (err) return;
31377                       _krCache.loadedTile[tile.id] = true;
31378
31379                       if (!data.features || !data.features.length) return;
31380
31381                       data.features.forEach(function(feature) {
31382                           var loc = feature.geometry.coordinates;
31383                           var props = feature.properties;
31384
31385                           // if there is a parent, save its error type e.g.:
31386                           //  Error 191 = "highway-highway"
31387                           //  Error 190 = "intersections without junctions"  (parent)
31388                           var errorType = props.error_type;
31389                           var errorTemplate = errorTypes[errorType];
31390                           var parentErrorType = (Math.floor(errorType / 10) * 10).toString();
31391
31392                           // try to handle error type directly, fallback to parent error type.
31393                           var whichType = errorTemplate ? errorType : parentErrorType;
31394                           var whichTemplate = errorTypes[whichType];
31395
31396                           // Rewrite a few of the errors at this point..
31397                           // This is done to make them easier to linkify and translate.
31398                           switch (whichType) {
31399                               case '170':
31400                                   props.description = 'This feature has a FIXME tag: ' + props.description;
31401                                   break;
31402                               case '292':
31403                               case '293':
31404                                   props.description = props.description.replace('A turn-', 'This turn-');
31405                                   break;
31406                               case '294':
31407                               case '295':
31408                               case '296':
31409                               case '297':
31410                               case '298':
31411                                   props.description = 'This turn-restriction~' + props.description;
31412                                   break;
31413                               case '300':
31414                                   props.description = 'This highway is missing a maxspeed tag';
31415                                   break;
31416                               case '411':
31417                               case '412':
31418                               case '413':
31419                                   props.description = 'This feature~' + props.description;
31420                                   break;
31421                           }
31422
31423                           // - move markers slightly so it doesn't obscure the geometry,
31424                           // - then move markers away from other coincident markers
31425                           var coincident = false;
31426                           do {
31427                               // first time, move marker up. after that, move marker right.
31428                               var delta = coincident ? [0.00001, 0] : [0, 0.00001];
31429                               loc = geoVecAdd(loc, delta);
31430                               var bbox = geoExtent$$1(loc).bbox();
31431                               coincident = _krCache.rtree.search(bbox).length;
31432                           } while (coincident);
31433
31434                           var d = new krError({
31435                               loc: loc,
31436                               id: props.error_id,
31437                               comment: props.comment || null,
31438                               description: props.description || '',
31439                               error_id: props.error_id,
31440                               which_type: whichType,
31441                               error_type: errorType,
31442                               parent_error_type: parentErrorType,
31443                               severity: whichTemplate.severity || 'error',
31444                               object_id: props.object_id,
31445                               object_type: props.object_type,
31446                               schema: props.schema,
31447                               title: props.title
31448                           });
31449
31450                           d.replacements = tokenReplacements(d);
31451
31452                           _krCache.data[d.id] = d;
31453                           _krCache.rtree.insert(encodeErrorRtree(d));
31454                       });
31455
31456                       dispatch$1.call('loaded');
31457                   }
31458               );
31459           });
31460       },
31461
31462
31463       postKeepRightUpdate: function(d, callback) {
31464           if (_krCache.inflightPost[d.id]) {
31465               return callback({ message: 'Error update already inflight', status: -2 }, d);
31466           }
31467
31468           var that = this;
31469           var params = { schema: d.schema, id: d.error_id };
31470
31471           if (d.state) {
31472               params.st = d.state;
31473           }
31474           if (d.newComment !== undefined) {
31475               params.co = d.newComment;
31476           }
31477
31478           // NOTE: This throws a CORS err, but it seems successful.
31479           // We don't care too much about the response, so this is fine.
31480           var url = _krUrlRoot + 'comment.php?' + utilQsString(params);
31481           _krCache.inflightPost[d.id] = request(url)
31482               .post(function(err) {
31483                   delete _krCache.inflightPost[d.id];
31484
31485                   if (d.state === 'ignore') {   // ignore permanently (false positive)
31486                       that.removeError(d);
31487
31488                   } else if (d.state === 'ignore_t') {  // ignore temporarily (error fixed)
31489                       that.removeError(d);
31490                       _krCache.closed[d.schema + ':' + d.error_id] = true;
31491
31492                   } else {
31493                       d = that.replaceError(d.update({
31494                           comment: d.newComment,
31495                           newComment: undefined,
31496                           state: undefined
31497                       }));
31498                   }
31499
31500                   return callback(err, d);
31501               });
31502
31503       },
31504
31505
31506       // get all cached errors covering the viewport
31507       getErrors: function(projection) {
31508           var viewport = projection.clipExtent();
31509           var min = [viewport[0][0], viewport[1][1]];
31510           var max = [viewport[1][0], viewport[0][1]];
31511           var bbox = geoExtent$$1(projection.invert(min), projection.invert(max)).bbox();
31512
31513           return _krCache.rtree.search(bbox).map(function(d) {
31514               return d.data;
31515           });
31516       },
31517
31518
31519       // get a single error from the cache
31520       getError: function(id) {
31521           return _krCache.data[id];
31522       },
31523
31524
31525       // replace a single error in the cache
31526       replaceError: function(error) {
31527           if (!(error instanceof krError) || !error.id) return;
31528
31529           _krCache.data[error.id] = error;
31530           updateRtree(encodeErrorRtree(error), true); // true = replace
31531           return error;
31532       },
31533
31534
31535       // remove a single error from the cache
31536       removeError: function(error) {
31537           if (!(error instanceof krError) || !error.id) return;
31538
31539           delete _krCache.data[error.id];
31540           updateRtree(encodeErrorRtree(error), false); // false = remove
31541       },
31542
31543
31544       errorURL: function(error) {
31545           return _krUrlRoot + 'report_map.php?schema=' + error.schema + '&error=' + error.id;
31546       },
31547
31548
31549       // Get an array of errors closed during this session.
31550       // Used to populate `closed:keepright` changeset tag
31551       getClosedIDs: function() {
31552           return Object.keys(_krCache.closed).sort();
31553       }
31554
31555   };
31556
31557   function svgAreas$$1(projection, context) {
31558       // Patterns only work in Firefox when set directly on element.
31559       // (This is not a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=750632)
31560       var patterns = {
31561           // tag - pattern name
31562           // -or-
31563           // tag - value - pattern name
31564           // -or-
31565           // tag - value - rules (optional tag-values, pattern name)
31566           // (matches earlier rules first, so fallback should be last entry)
31567           amenity: {
31568               grave_yard: 'cemetery',
31569               fountain: 'water_standing'
31570           },
31571           landuse: {
31572               cemetery: [
31573                   { religion: 'christian', pattern: 'cemetery_christian' },
31574                   { religion: 'buddhist', pattern: 'cemetery_buddhist' },
31575                   { religion: 'muslim', pattern: 'cemetery_muslim' },
31576                   { religion: 'jewish', pattern: 'cemetery_jewish' },
31577                   { pattern: 'cemetery' }
31578               ],
31579               construction: 'construction',
31580               farmland: 'farmland',
31581               farmyard: 'farmyard',
31582               forest: [
31583                   { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' },
31584                   { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' },
31585                   { leaf_type: 'leafless', pattern: 'forest_leafless' },
31586                   { pattern: 'forest' } // same as 'leaf_type:mixed'
31587               ],
31588               grave_yard: 'cemetery',
31589               grass: 'grass',
31590               landfill: 'landfill',
31591               meadow: 'meadow',
31592               military: 'construction',
31593               orchard: 'orchard',
31594               reservoir: 'water_standing',
31595               quarry: 'quarry',
31596               vineyard: 'vineyard'
31597           },
31598           natural: {
31599               beach: 'beach',
31600               grassland: 'grass',
31601               sand: 'beach',
31602               scrub: 'scrub',
31603               water: [
31604                   { water: 'pond', pattern: 'pond' },
31605                   { water: 'reservoir', pattern: 'water_standing' },
31606                   { pattern: 'waves' }
31607               ],
31608               wetland: [
31609                   { wetland: 'marsh', pattern: 'wetland_marsh' },
31610                   { wetland: 'swamp', pattern: 'wetland_swamp' },
31611                   { wetland: 'bog', pattern: 'wetland_bog' },
31612                   { wetland: 'reedbed', pattern: 'wetland_reedbed' },
31613                   { pattern: 'wetland' }
31614               ],
31615               wood: [
31616                   { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' },
31617                   { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' },
31618                   { leaf_type: 'leafless', pattern: 'forest_leafless' },
31619                   { pattern: 'forest' } // same as 'leaf_type:mixed'
31620               ]
31621           },
31622           traffic_calming: {
31623               island: [
31624                   { surface: 'grass', pattern: 'grass' },
31625               ],
31626               chicane: [
31627                   { surface: 'grass', pattern: 'grass' },
31628               ],
31629               choker: [
31630                   { surface: 'grass', pattern: 'grass' },
31631               ]
31632           }
31633       };
31634
31635       function setPattern(entity) {
31636           // Skip pattern filling if this is a building (buildings don't get patterns applied)
31637           if (entity.tags.building && entity.tags.building !== 'no') {
31638               this.style.fill = this.style.stroke = '';
31639               return;
31640           }
31641
31642           for (var tag in patterns) {
31643               var entityValue = entity.tags[tag];
31644               if (!entityValue) continue;
31645
31646               if (typeof patterns[tag] === 'string') { // extra short syntax (just tag) - pattern name
31647                   this.style.fill = this.style.stroke = 'url("#pattern-' + patterns[tag] + '")';
31648                   return;
31649               } else {
31650                   var values = patterns[tag];
31651                   for (var value in values) {
31652                       if (entityValue !== value) continue;
31653
31654                       var rules = values[value];
31655                       if (typeof rules === 'string') { // short syntax - pattern name
31656                           this.style.fill = this.style.stroke = 'url("#pattern-' + rules + '")';
31657                           return;
31658                       } else { // long syntax - rule array
31659                           for (var ruleKey in rules) {
31660                               var rule = rules[ruleKey];
31661
31662                               var pass = true;
31663                               for (var criterion in rule) {
31664                                   if (criterion !== 'pattern') { // reserved for pattern name
31665                                       // The only rule is a required tag-value pair
31666                                       var v = entity.tags[criterion];
31667                                       if (!v || v !== rule[criterion]) {
31668                                           pass = false;
31669                                           break;
31670                                       }
31671                                   }
31672                               }
31673
31674                               if (pass) {
31675                                   this.style.fill = this.style.stroke = 'url("#pattern-' + rule.pattern + '")';
31676                                   return;
31677                               }
31678                           }
31679                       }
31680                   }
31681               }
31682           }
31683
31684           this.style.fill = this.style.stroke = '';
31685       }
31686
31687
31688       function drawTargets(selection, graph, entities, filter) {
31689           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
31690           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
31691           var getPath = svgPath(projection).geojson;
31692           var activeID = context.activeID();
31693
31694           // The targets and nopes will be MultiLineString sub-segments of the ways
31695           var data = { targets: [], nopes: [] };
31696
31697           entities.forEach(function(way) {
31698               var features = svgSegmentWay(way, graph, activeID);
31699               data.targets.push.apply(data.targets, features.passive);
31700               data.nopes.push.apply(data.nopes, features.active);
31701           });
31702
31703
31704           // Targets allow hover and vertex snapping
31705           var targetData = data.targets.filter(getPath);
31706           var targets = selection.selectAll('.area.target-allowed')
31707               .filter(function(d) { return filter(d.properties.entity); })
31708               .data(targetData, function key(d) { return d.id; });
31709
31710           // exit
31711           targets.exit()
31712               .remove();
31713
31714           // enter/update
31715           targets.enter()
31716               .append('path')
31717               .merge(targets)
31718               .attr('d', getPath)
31719               .attr('class', function(d) { return 'way area target target-allowed ' + targetClass + d.id; });
31720
31721
31722           // NOPE
31723           var nopeData = data.nopes.filter(getPath);
31724           var nopes = selection.selectAll('.area.target-nope')
31725               .filter(function(d) { return filter(d.properties.entity); })
31726               .data(nopeData, function key(d) { return d.id; });
31727
31728           // exit
31729           nopes.exit()
31730               .remove();
31731
31732           // enter/update
31733           nopes.enter()
31734               .append('path')
31735               .merge(nopes)
31736               .attr('d', getPath)
31737               .attr('class', function(d) { return 'way area target target-nope ' + nopeClass + d.id; });
31738       }
31739
31740
31741       function drawAreas(selection, graph, entities, filter) {
31742           var path = svgPath(projection, graph, true);
31743           var areas = {};
31744           var multipolygon;
31745
31746           for (var i = 0; i < entities.length; i++) {
31747               var entity = entities[i];
31748               if (entity.geometry(graph) !== 'area') continue;
31749
31750               multipolygon = osmIsSimpleMultipolygonOuterMember(entity, graph);
31751               if (multipolygon) {
31752                   areas[multipolygon.id] = {
31753                       entity: multipolygon.mergeTags(entity.tags),
31754                       area: Math.abs(entity.area(graph))
31755                   };
31756               } else if (!areas[entity.id]) {
31757                   areas[entity.id] = {
31758                       entity: entity,
31759                       area: Math.abs(entity.area(graph))
31760                   };
31761               }
31762           }
31763
31764           areas = values$1(areas).filter(function hasPath(a) { return path(a.entity); });
31765           areas.sort(function areaSort(a, b) { return b.area - a.area; });
31766           areas = map$3(areas, 'entity');
31767
31768           var strokes = areas.filter(function(area) {
31769               return area.type === 'way';
31770           });
31771
31772           var data = {
31773               clip: areas,
31774               shadow: strokes,
31775               stroke: strokes,
31776               fill: areas
31777           };
31778
31779           var clipPaths = context.surface().selectAll('defs').selectAll('.clipPath-osm')
31780              .filter(filter)
31781              .data(data.clip, osmEntity$$1.key);
31782
31783           clipPaths.exit()
31784              .remove();
31785
31786           var clipPathsEnter = clipPaths.enter()
31787              .append('clipPath')
31788              .attr('class', 'clipPath-osm')
31789              .attr('id', function(entity) { return entity.id + '-clippath'; });
31790
31791           clipPathsEnter
31792              .append('path');
31793
31794           clipPaths.merge(clipPathsEnter)
31795              .selectAll('path')
31796              .attr('d', path);
31797
31798
31799           var drawLayer = selection.selectAll('.layer-osm.areas');
31800           var touchLayer = selection.selectAll('.layer-touch.areas');
31801
31802           // Draw areas..
31803           var areagroup = drawLayer
31804               .selectAll('g.areagroup')
31805               .data(['fill', 'shadow', 'stroke']);
31806
31807           areagroup = areagroup.enter()
31808               .append('g')
31809               .attr('class', function(d) { return 'areagroup area-' + d; })
31810               .merge(areagroup);
31811
31812           var paths = areagroup
31813               .selectAll('path')
31814               .filter(filter)
31815               .data(function(layer) { return data[layer]; }, osmEntity$$1.key);
31816
31817           paths.exit()
31818               .remove();
31819
31820           var fills = selection.selectAll('.area-fill path.area').nodes();
31821
31822           var bisect = bisector(function(node) {
31823               return -node.__data__.area(graph);
31824           }).left;
31825
31826           function sortedByArea(entity) {
31827               if (this._parent.__data__ === 'fill') {
31828                   return fills[bisect(fills, -entity.area(graph))];
31829               }
31830           }
31831
31832           paths = paths.enter()
31833               .insert('path', sortedByArea)
31834               .merge(paths)
31835               .each(function(entity) {
31836                   var layer = this.parentNode.__data__;
31837                   this.setAttribute('class', entity.type + ' area ' + layer + ' ' + entity.id);
31838
31839                   if (layer === 'fill') {
31840                       this.setAttribute('clip-path', 'url(#' + entity.id + '-clippath)');
31841                       setPattern.call(this, entity);
31842                   }
31843               })
31844               .call(svgTagClasses())
31845               .attr('d', path);
31846
31847
31848           // Draw touch targets..
31849           touchLayer
31850               .call(drawTargets, graph, data.stroke, filter);
31851       }
31852
31853       return drawAreas;
31854   }
31855
31856   /**
31857    * A specialized version of `_.reduce` for arrays without support for
31858    * iteratee shorthands.
31859    *
31860    * @private
31861    * @param {Array} [array] The array to iterate over.
31862    * @param {Function} iteratee The function invoked per iteration.
31863    * @param {*} [accumulator] The initial value.
31864    * @param {boolean} [initAccum] Specify using the first element of `array` as
31865    *  the initial value.
31866    * @returns {*} Returns the accumulated value.
31867    */
31868   function arrayReduce(array, iteratee, accumulator, initAccum) {
31869     var index = -1,
31870         length = array == null ? 0 : array.length;
31871
31872     if (initAccum && length) {
31873       accumulator = array[++index];
31874     }
31875     while (++index < length) {
31876       accumulator = iteratee(accumulator, array[index], index, array);
31877     }
31878     return accumulator;
31879   }
31880
31881   /**
31882    * The base implementation of `_.reduce` and `_.reduceRight`, without support
31883    * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
31884    *
31885    * @private
31886    * @param {Array|Object} collection The collection to iterate over.
31887    * @param {Function} iteratee The function invoked per iteration.
31888    * @param {*} accumulator The initial value.
31889    * @param {boolean} initAccum Specify using the first or last element of
31890    *  `collection` as the initial value.
31891    * @param {Function} eachFunc The function to iterate over `collection`.
31892    * @returns {*} Returns the accumulated value.
31893    */
31894   function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
31895     eachFunc(collection, function(value, index, collection) {
31896       accumulator = initAccum
31897         ? (initAccum = false, value)
31898         : iteratee(accumulator, value, index, collection);
31899     });
31900     return accumulator;
31901   }
31902
31903   /**
31904    * Reduces `collection` to a value which is the accumulated result of running
31905    * each element in `collection` thru `iteratee`, where each successive
31906    * invocation is supplied the return value of the previous. If `accumulator`
31907    * is not given, the first element of `collection` is used as the initial
31908    * value. The iteratee is invoked with four arguments:
31909    * (accumulator, value, index|key, collection).
31910    *
31911    * Many lodash methods are guarded to work as iteratees for methods like
31912    * `_.reduce`, `_.reduceRight`, and `_.transform`.
31913    *
31914    * The guarded methods are:
31915    * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
31916    * and `sortBy`
31917    *
31918    * @static
31919    * @memberOf _
31920    * @since 0.1.0
31921    * @category Collection
31922    * @param {Array|Object} collection The collection to iterate over.
31923    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
31924    * @param {*} [accumulator] The initial value.
31925    * @returns {*} Returns the accumulated value.
31926    * @see _.reduceRight
31927    * @example
31928    *
31929    * _.reduce([1, 2], function(sum, n) {
31930    *   return sum + n;
31931    * }, 0);
31932    * // => 3
31933    *
31934    * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
31935    *   (result[value] || (result[value] = [])).push(key);
31936    *   return result;
31937    * }, {});
31938    * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
31939    */
31940   function reduce(collection, iteratee, accumulator) {
31941     var func = isArray(collection) ? arrayReduce : baseReduce,
31942         initAccum = arguments.length < 3;
31943
31944     return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);
31945   }
31946
31947   /** Error message constants. */
31948   var FUNC_ERROR_TEXT$3 = 'Expected a function';
31949
31950   /**
31951    * Creates a throttled function that only invokes `func` at most once per
31952    * every `wait` milliseconds. The throttled function comes with a `cancel`
31953    * method to cancel delayed `func` invocations and a `flush` method to
31954    * immediately invoke them. Provide `options` to indicate whether `func`
31955    * should be invoked on the leading and/or trailing edge of the `wait`
31956    * timeout. The `func` is invoked with the last arguments provided to the
31957    * throttled function. Subsequent calls to the throttled function return the
31958    * result of the last `func` invocation.
31959    *
31960    * **Note:** If `leading` and `trailing` options are `true`, `func` is
31961    * invoked on the trailing edge of the timeout only if the throttled function
31962    * is invoked more than once during the `wait` timeout.
31963    *
31964    * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
31965    * until to the next tick, similar to `setTimeout` with a timeout of `0`.
31966    *
31967    * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
31968    * for details over the differences between `_.throttle` and `_.debounce`.
31969    *
31970    * @static
31971    * @memberOf _
31972    * @since 0.1.0
31973    * @category Function
31974    * @param {Function} func The function to throttle.
31975    * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
31976    * @param {Object} [options={}] The options object.
31977    * @param {boolean} [options.leading=true]
31978    *  Specify invoking on the leading edge of the timeout.
31979    * @param {boolean} [options.trailing=true]
31980    *  Specify invoking on the trailing edge of the timeout.
31981    * @returns {Function} Returns the new throttled function.
31982    * @example
31983    *
31984    * // Avoid excessively updating the position while scrolling.
31985    * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
31986    *
31987    * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
31988    * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
31989    * jQuery(element).on('click', throttled);
31990    *
31991    * // Cancel the trailing throttled invocation.
31992    * jQuery(window).on('popstate', throttled.cancel);
31993    */
31994   function throttle(func, wait, options) {
31995     var leading = true,
31996         trailing = true;
31997
31998     if (typeof func != 'function') {
31999       throw new TypeError(FUNC_ERROR_TEXT$3);
32000     }
32001     if (isObject(options)) {
32002       leading = 'leading' in options ? !!options.leading : leading;
32003       trailing = 'trailing' in options ? !!options.trailing : trailing;
32004     }
32005     return debounce(func, wait, {
32006       'leading': leading,
32007       'maxWait': wait,
32008       'trailing': trailing
32009     });
32010   }
32011
32012   var fastJsonStableStringify = function (data, opts) {
32013       if (!opts) opts = {};
32014       if (typeof opts === 'function') opts = { cmp: opts };
32015       var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false;
32016
32017       var cmp = opts.cmp && (function (f) {
32018           return function (node) {
32019               return function (a, b) {
32020                   var aobj = { key: a, value: node[a] };
32021                   var bobj = { key: b, value: node[b] };
32022                   return f(aobj, bobj);
32023               };
32024           };
32025       })(opts.cmp);
32026
32027       var seen = [];
32028       return (function stringify (node) {
32029           if (node && node.toJSON && typeof node.toJSON === 'function') {
32030               node = node.toJSON();
32031           }
32032
32033           if (node === undefined) return;
32034           if (typeof node == 'number') return isFinite(node) ? '' + node : 'null';
32035           if (typeof node !== 'object') return JSON.stringify(node);
32036
32037           var i, out;
32038           if (Array.isArray(node)) {
32039               out = '[';
32040               for (i = 0; i < node.length; i++) {
32041                   if (i) out += ',';
32042                   out += stringify(node[i]) || 'null';
32043               }
32044               return out + ']';
32045           }
32046
32047           if (node === null) return 'null';
32048
32049           if (seen.indexOf(node) !== -1) {
32050               if (cycles) return JSON.stringify('__cycle__');
32051               throw new TypeError('Converting circular structure to JSON');
32052           }
32053
32054           var seenIndex = seen.push(node) - 1;
32055           var keys = Object.keys(node).sort(cmp && cmp(node));
32056           out = '';
32057           for (i = 0; i < keys.length; i++) {
32058               var key = keys[i];
32059               var value = stringify(node[key]);
32060
32061               if (!value) continue;
32062               if (out) out += ',';
32063               out += JSON.stringify(key) + ':' + value;
32064           }
32065           seen.splice(seenIndex, 1);
32066           return '{' + out + '}';
32067       })(data);
32068   };
32069
32070   //[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]
32071   //[4a]        NameChar           ::=          NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
32072   //[5]         Name       ::=          NameStartChar (NameChar)*
32073   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
32074   var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
32075   var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
32076   //var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
32077   //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(',')
32078
32079   //S_TAG,      S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
32080   //S_ATTR_SPACE,       S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
32081   var S_TAG = 0;//tag name offerring
32082   var S_ATTR = 1;//attr name offerring 
32083   var S_ATTR_SPACE=2;//attr name end and space offer
32084   var S_EQ = 3;//=space?
32085   var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
32086   var S_ATTR_END = 5;//attr value end and no space(quot end)
32087   var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
32088   var S_TAG_CLOSE = 7;//closed el<el />
32089
32090   function XMLReader(){
32091         
32092   }
32093
32094   XMLReader.prototype = {
32095         parse:function(source,defaultNSMap,entityMap){
32096                 var domBuilder = this.domBuilder;
32097                 domBuilder.startDocument();
32098                 _copy(defaultNSMap ,defaultNSMap = {});
32099                 parse(source,defaultNSMap,entityMap,
32100                                 domBuilder,this.errorHandler);
32101                 domBuilder.endDocument();
32102         }
32103   };
32104   function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
32105         function fixedFromCharCode(code) {
32106                 // String.prototype.fromCharCode does not supports
32107                 // > 2 bytes unicode chars directly
32108                 if (code > 0xffff) {
32109                         code -= 0x10000;
32110                         var surrogate1 = 0xd800 + (code >> 10)
32111                                 , surrogate2 = 0xdc00 + (code & 0x3ff);
32112
32113                         return String.fromCharCode(surrogate1, surrogate2);
32114                 } else {
32115                         return String.fromCharCode(code);
32116                 }
32117         }
32118         function entityReplacer(a){
32119                 var k = a.slice(1,-1);
32120                 if(k in entityMap){
32121                         return entityMap[k]; 
32122                 }else if(k.charAt(0) === '#'){
32123                         return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
32124                 }else{
32125                         errorHandler.error('entity not found:'+a);
32126                         return a;
32127                 }
32128         }
32129         function appendText(end){//has some bugs
32130                 if(end>start){
32131                         var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
32132                         locator&&position(start);
32133                         domBuilder.characters(xt,0,end-start);
32134                         start = end;
32135                 }
32136         }
32137         function position(p,m){
32138                 while(p>=lineEnd && (m = linePattern.exec(source))){
32139                         lineStart = m.index;
32140                         lineEnd = lineStart + m[0].length;
32141                         locator.lineNumber++;
32142                         //console.log('line++:',locator,startPos,endPos)
32143                 }
32144                 locator.columnNumber = p-lineStart+1;
32145         }
32146         var lineStart = 0;
32147         var lineEnd = 0;
32148         var linePattern = /.*(?:\r\n?|\n)|.*$/g;
32149         var locator = domBuilder.locator;
32150         
32151         var parseStack = [{currentNSMap:defaultNSMapCopy}];
32152         var closeMap = {};
32153         var start = 0;
32154         while(true){
32155                 try{
32156                         var tagStart = source.indexOf('<',start);
32157                         if(tagStart<0){
32158                                 if(!source.substr(start).match(/^\s*$/)){
32159                                         var doc = domBuilder.doc;
32160                                 var text = doc.createTextNode(source.substr(start));
32161                                 doc.appendChild(text);
32162                                 domBuilder.currentElement = text;
32163                                 }
32164                                 return;
32165                         }
32166                         if(tagStart>start){
32167                                 appendText(tagStart);
32168                         }
32169                         switch(source.charAt(tagStart+1)){
32170                         case '/':
32171                                 var end = source.indexOf('>',tagStart+3);
32172                                 var tagName = source.substring(tagStart+2,end);
32173                                 var config = parseStack.pop();
32174                                 if(end<0){
32175                                         
32176                                 tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
32177                                 //console.error('#@@@@@@'+tagName)
32178                                 errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
32179                                 end = tagStart+1+tagName.length;
32180                         }else if(tagName.match(/\s</)){
32181                                 tagName = tagName.replace(/[\s<].*/,'');
32182                                 errorHandler.error("end tag name: "+tagName+' maybe not complete');
32183                                 end = tagStart+1+tagName.length;
32184                                 }
32185                                 //console.error(parseStack.length,parseStack)
32186                                 //console.error(config);
32187                                 var localNSMap = config.localNSMap;
32188                                 var endMatch = config.tagName == tagName;
32189                                 var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase();
32190                         if(endIgnoreCaseMach){
32191                                 domBuilder.endElement(config.uri,config.localName,tagName);
32192                                         if(localNSMap){
32193                                                 for(var prefix in localNSMap){
32194                                                         domBuilder.endPrefixMapping(prefix) ;
32195                                                 }
32196                                         }
32197                                         if(!endMatch){
32198                                 errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
32199                                         }
32200                         }else{
32201                                 parseStack.push(config);
32202                         }
32203                                 
32204                                 end++;
32205                                 break;
32206                                 // end elment
32207                         case '?':// <?...?>
32208                                 locator&&position(tagStart);
32209                                 end = parseInstruction(source,tagStart,domBuilder);
32210                                 break;
32211                         case '!':// <!doctype,<![CDATA,<!--
32212                                 locator&&position(tagStart);
32213                                 end = parseDCC(source,tagStart,domBuilder,errorHandler);
32214                                 break;
32215                         default:
32216                                 locator&&position(tagStart);
32217                                 var el = new ElementAttributes();
32218                                 var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
32219                                 //elStartEnd
32220                                 var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
32221                                 var len = el.length;
32222                                 
32223                                 
32224                                 if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
32225                                         el.closed = true;
32226                                         if(!entityMap.nbsp){
32227                                                 errorHandler.warning('unclosed xml attribute');
32228                                         }
32229                                 }
32230                                 if(locator && len){
32231                                         var locator2 = copyLocator(locator,{});
32232                                         //try{//attribute position fixed
32233                                         for(var i = 0;i<len;i++){
32234                                                 var a = el[i];
32235                                                 position(a.offset);
32236                                                 a.locator = copyLocator(locator,{});
32237                                         }
32238                                         //}catch(e){console.error('@@@@@'+e)}
32239                                         domBuilder.locator = locator2;
32240                                         if(appendElement(el,domBuilder,currentNSMap)){
32241                                                 parseStack.push(el);
32242                                         }
32243                                         domBuilder.locator = locator;
32244                                 }else{
32245                                         if(appendElement(el,domBuilder,currentNSMap)){
32246                                                 parseStack.push(el);
32247                                         }
32248                                 }
32249                                 
32250                                 
32251                                 
32252                                 if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
32253                                         end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder);
32254                                 }else{
32255                                         end++;
32256                                 }
32257                         }
32258                 }catch(e){
32259                         errorHandler.error('element parse error: '+e);
32260                         //errorHandler.error('element parse error: '+e);
32261                         end = -1;
32262                         //throw e;
32263                 }
32264                 if(end>start){
32265                         start = end;
32266                 }else{
32267                         //TODO: 这里有可能sax回退,有位置错误风险
32268                         appendText(Math.max(tagStart,start)+1);
32269                 }
32270         }
32271   }
32272   function copyLocator(f,t){
32273         t.lineNumber = f.lineNumber;
32274         t.columnNumber = f.columnNumber;
32275         return t;
32276   }
32277
32278   /**
32279    * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
32280    * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
32281    */
32282   function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
32283         var attrName;
32284         var value;
32285         var p = ++start;
32286         var s = S_TAG;//status
32287         while(true){
32288                 var c = source.charAt(p);
32289                 switch(c){
32290                 case '=':
32291                         if(s === S_ATTR){//attrName
32292                                 attrName = source.slice(start,p);
32293                                 s = S_EQ;
32294                         }else if(s === S_ATTR_SPACE){
32295                                 s = S_EQ;
32296                         }else{
32297                                 //fatalError: equal must after attrName or space after attrName
32298                                 throw new Error('attribute equal must after attrName');
32299                         }
32300                         break;
32301                 case '\'':
32302                 case '"':
32303                         if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
32304                                 ){//equal
32305                                 if(s === S_ATTR){
32306                                         errorHandler.warning('attribute value must after "="');
32307                                         attrName = source.slice(start,p);
32308                                 }
32309                                 start = p+1;
32310                                 p = source.indexOf(c,start);
32311                                 if(p>0){
32312                                         value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
32313                                         el.add(attrName,value,start-1);
32314                                         s = S_ATTR_END;
32315                                 }else{
32316                                         //fatalError: no end quot match
32317                                         throw new Error('attribute value no end \''+c+'\' match');
32318                                 }
32319                         }else if(s == S_ATTR_NOQUOT_VALUE){
32320                                 value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
32321                                 //console.log(attrName,value,start,p)
32322                                 el.add(attrName,value,start);
32323                                 //console.dir(el)
32324                                 errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
32325                                 start = p+1;
32326                                 s = S_ATTR_END;
32327                         }else{
32328                                 //fatalError: no equal before
32329                                 throw new Error('attribute value must after "="');
32330                         }
32331                         break;
32332                 case '/':
32333                         switch(s){
32334                         case S_TAG:
32335                                 el.setTagName(source.slice(start,p));
32336                         case S_ATTR_END:
32337                         case S_TAG_SPACE:
32338                         case S_TAG_CLOSE:
32339                                 s =S_TAG_CLOSE;
32340                                 el.closed = true;
32341                         case S_ATTR_NOQUOT_VALUE:
32342                         case S_ATTR:
32343                         case S_ATTR_SPACE:
32344                                 break;
32345                         //case S_EQ:
32346                         default:
32347                                 throw new Error("attribute invalid close char('/')")
32348                         }
32349                         break;
32350                 case ''://end document
32351                         //throw new Error('unexpected end of input')
32352                         errorHandler.error('unexpected end of input');
32353                         if(s == S_TAG){
32354                                 el.setTagName(source.slice(start,p));
32355                         }
32356                         return p;
32357                 case '>':
32358                         switch(s){
32359                         case S_TAG:
32360                                 el.setTagName(source.slice(start,p));
32361                         case S_ATTR_END:
32362                         case S_TAG_SPACE:
32363                         case S_TAG_CLOSE:
32364                                 break;//normal
32365                         case S_ATTR_NOQUOT_VALUE://Compatible state
32366                         case S_ATTR:
32367                                 value = source.slice(start,p);
32368                                 if(value.slice(-1) === '/'){
32369                                         el.closed  = true;
32370                                         value = value.slice(0,-1);
32371                                 }
32372                         case S_ATTR_SPACE:
32373                                 if(s === S_ATTR_SPACE){
32374                                         value = attrName;
32375                                 }
32376                                 if(s == S_ATTR_NOQUOT_VALUE){
32377                                         errorHandler.warning('attribute "'+value+'" missed quot(")!!');
32378                                         el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start);
32379                                 }else{
32380                                         if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
32381                                                 errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!');
32382                                         }
32383                                         el.add(value,value,start);
32384                                 }
32385                                 break;
32386                         case S_EQ:
32387                                 throw new Error('attribute value missed!!');
32388                         }
32389   //                    console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
32390                         return p;
32391                 /*xml space '\x20' | #x9 | #xD | #xA; */
32392                 case '\u0080':
32393                         c = ' ';
32394                 default:
32395                         if(c<= ' '){//space
32396                                 switch(s){
32397                                 case S_TAG:
32398                                         el.setTagName(source.slice(start,p));//tagName
32399                                         s = S_TAG_SPACE;
32400                                         break;
32401                                 case S_ATTR:
32402                                         attrName = source.slice(start,p);
32403                                         s = S_ATTR_SPACE;
32404                                         break;
32405                                 case S_ATTR_NOQUOT_VALUE:
32406                                         var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
32407                                         errorHandler.warning('attribute "'+value+'" missed quot(")!!');
32408                                         el.add(attrName,value,start);
32409                                 case S_ATTR_END:
32410                                         s = S_TAG_SPACE;
32411                                         break;
32412                                 //case S_TAG_SPACE:
32413                                 //case S_EQ:
32414                                 //case S_ATTR_SPACE:
32415                                 //      void();break;
32416                                 //case S_TAG_CLOSE:
32417                                         //ignore warning
32418                                 }
32419                         }else{//not space
32420   //S_TAG,      S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
32421   //S_ATTR_SPACE,       S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
32422                                 switch(s){
32423                                 //case S_TAG:void();break;
32424                                 //case S_ATTR:void();break;
32425                                 //case S_ATTR_NOQUOT_VALUE:void();break;
32426                                 case S_ATTR_SPACE:
32427                                         var tagName =  el.tagName;
32428                                         if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
32429                                                 errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!');
32430                                         }
32431                                         el.add(attrName,attrName,start);
32432                                         start = p;
32433                                         s = S_ATTR;
32434                                         break;
32435                                 case S_ATTR_END:
32436                                         errorHandler.warning('attribute space is required"'+attrName+'"!!');
32437                                 case S_TAG_SPACE:
32438                                         s = S_ATTR;
32439                                         start = p;
32440                                         break;
32441                                 case S_EQ:
32442                                         s = S_ATTR_NOQUOT_VALUE;
32443                                         start = p;
32444                                         break;
32445                                 case S_TAG_CLOSE:
32446                                         throw new Error("elements closed character '/' and '>' must be connected to");
32447                                 }
32448                         }
32449                 }//end outer switch
32450                 //console.log('p++',p)
32451                 p++;
32452         }
32453   }
32454   /**
32455    * @return true if has new namespace define
32456    */
32457   function appendElement(el,domBuilder,currentNSMap){
32458         var tagName = el.tagName;
32459         var localNSMap = null;
32460         //var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
32461         var i = el.length;
32462         while(i--){
32463                 var a = el[i];
32464                 var qName = a.qName;
32465                 var value = a.value;
32466                 var nsp = qName.indexOf(':');
32467                 if(nsp>0){
32468                         var prefix = a.prefix = qName.slice(0,nsp);
32469                         var localName = qName.slice(nsp+1);
32470                         var nsPrefix = prefix === 'xmlns' && localName;
32471                 }else{
32472                         localName = qName;
32473                         prefix = null;
32474                         nsPrefix = qName === 'xmlns' && '';
32475                 }
32476                 //can not set prefix,because prefix !== ''
32477                 a.localName = localName ;
32478                 //prefix == null for no ns prefix attribute 
32479                 if(nsPrefix !== false){//hack!!
32480                         if(localNSMap == null){
32481                                 localNSMap = {};
32482                                 //console.log(currentNSMap,0)
32483                                 _copy(currentNSMap,currentNSMap={});
32484                                 //console.log(currentNSMap,1)
32485                         }
32486                         currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
32487                         a.uri = 'http://www.w3.org/2000/xmlns/';
32488                         domBuilder.startPrefixMapping(nsPrefix, value); 
32489                 }
32490         }
32491         var i = el.length;
32492         while(i--){
32493                 a = el[i];
32494                 var prefix = a.prefix;
32495                 if(prefix){//no prefix attribute has no namespace
32496                         if(prefix === 'xml'){
32497                                 a.uri = 'http://www.w3.org/XML/1998/namespace';
32498                         }if(prefix !== 'xmlns'){
32499                                 a.uri = currentNSMap[prefix || ''];
32500                                 
32501                                 //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
32502                         }
32503                 }
32504         }
32505         var nsp = tagName.indexOf(':');
32506         if(nsp>0){
32507                 prefix = el.prefix = tagName.slice(0,nsp);
32508                 localName = el.localName = tagName.slice(nsp+1);
32509         }else{
32510                 prefix = null;//important!!
32511                 localName = el.localName = tagName;
32512         }
32513         //no prefix element has default namespace
32514         var ns = el.uri = currentNSMap[prefix || ''];
32515         domBuilder.startElement(ns,localName,tagName,el);
32516         //endPrefixMapping and startPrefixMapping have not any help for dom builder
32517         //localNSMap = null
32518         if(el.closed){
32519                 domBuilder.endElement(ns,localName,tagName);
32520                 if(localNSMap){
32521                         for(prefix in localNSMap){
32522                                 domBuilder.endPrefixMapping(prefix); 
32523                         }
32524                 }
32525         }else{
32526                 el.currentNSMap = currentNSMap;
32527                 el.localNSMap = localNSMap;
32528                 //parseStack.push(el);
32529                 return true;
32530         }
32531   }
32532   function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
32533         if(/^(?:script|textarea)$/i.test(tagName)){
32534                 var elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);
32535                 var text = source.substring(elStartEnd+1,elEndStart);
32536                 if(/[&<]/.test(text)){
32537                         if(/^script$/i.test(tagName)){
32538                                 //if(!/\]\]>/.test(text)){
32539                                         //lexHandler.startCDATA();
32540                                         domBuilder.characters(text,0,text.length);
32541                                         //lexHandler.endCDATA();
32542                                         return elEndStart;
32543                                 //}
32544                         }//}else{//text area
32545                                 text = text.replace(/&#?\w+;/g,entityReplacer);
32546                                 domBuilder.characters(text,0,text.length);
32547                                 return elEndStart;
32548                         //}
32549                         
32550                 }
32551         }
32552         return elStartEnd+1;
32553   }
32554   function fixSelfClosed(source,elStartEnd,tagName,closeMap){
32555         //if(tagName in closeMap){
32556         var pos = closeMap[tagName];
32557         if(pos == null){
32558                 //console.log(tagName)
32559                 pos =  source.lastIndexOf('</'+tagName+'>');
32560                 if(pos<elStartEnd){//忘记闭合
32561                         pos = source.lastIndexOf('</'+tagName);
32562                 }
32563                 closeMap[tagName] =pos;
32564         }
32565         return pos<elStartEnd;
32566         //} 
32567   }
32568   function _copy(source,target){
32569         for(var n in source){target[n] = source[n];}
32570   }
32571   function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
32572         var next= source.charAt(start+2);
32573         switch(next){
32574         case '-':
32575                 if(source.charAt(start + 3) === '-'){
32576                         var end = source.indexOf('-->',start+4);
32577                         //append comment source.substring(4,end)//<!--
32578                         if(end>start){
32579                                 domBuilder.comment(source,start+4,end-start-4);
32580                                 return end+3;
32581                         }else{
32582                                 errorHandler.error("Unclosed comment");
32583                                 return -1;
32584                         }
32585                 }else{
32586                         //error
32587                         return -1;
32588                 }
32589         default:
32590                 if(source.substr(start+3,6) == 'CDATA['){
32591                         var end = source.indexOf(']]>',start+9);
32592                         domBuilder.startCDATA();
32593                         domBuilder.characters(source,start+9,end-start-9);
32594                         domBuilder.endCDATA(); 
32595                         return end+3;
32596                 }
32597                 //<!DOCTYPE
32598                 //startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) 
32599                 var matchs = split(source,start);
32600                 var len = matchs.length;
32601                 if(len>1 && /!doctype/i.test(matchs[0][0])){
32602                         var name = matchs[1][0];
32603                         var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0];
32604                         var sysid = len>4 && matchs[4][0];
32605                         var lastMatch = matchs[len-1];
32606                         domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
32607                                         sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
32608                         domBuilder.endDTD();
32609                         
32610                         return lastMatch.index+lastMatch[0].length
32611                 }
32612         }
32613         return -1;
32614   }
32615
32616
32617
32618   function parseInstruction(source,start,domBuilder){
32619         var end = source.indexOf('?>',start);
32620         if(end){
32621                 var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
32622                 if(match){
32623                         var len = match[0].length;
32624                         domBuilder.processingInstruction(match[1], match[2]) ;
32625                         return end+2;
32626                 }else{//error
32627                         return -1;
32628                 }
32629         }
32630         return -1;
32631   }
32632
32633   /**
32634    * @param source
32635    */
32636   function ElementAttributes(source){
32637         
32638   }
32639   ElementAttributes.prototype = {
32640         setTagName:function(tagName){
32641                 if(!tagNamePattern.test(tagName)){
32642                         throw new Error('invalid tagName:'+tagName)
32643                 }
32644                 this.tagName = tagName;
32645         },
32646         add:function(qName,value,offset){
32647                 if(!tagNamePattern.test(qName)){
32648                         throw new Error('invalid attribute:'+qName)
32649                 }
32650                 this[this.length++] = {qName:qName,value:value,offset:offset};
32651         },
32652         length:0,
32653         getLocalName:function(i){return this[i].localName},
32654         getLocator:function(i){return this[i].locator},
32655         getQName:function(i){return this[i].qName},
32656         getURI:function(i){return this[i].uri},
32657         getValue:function(i){return this[i].value}
32658   //    ,getIndex:function(uri, localName)){
32659   //            if(localName){
32660   //                    
32661   //            }else{
32662   //                    var qName = uri
32663   //            }
32664   //    },
32665   //    getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
32666   //    getType:function(uri,localName){}
32667   //    getType:function(i){},
32668   };
32669
32670
32671
32672
32673   function _set_proto_(thiz,parent){
32674         thiz.__proto__ = parent;
32675         return thiz;
32676   }
32677   if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
32678         _set_proto_ = function(thiz,parent){
32679                 function p(){}          p.prototype = parent;
32680                 p = new p();
32681                 for(parent in thiz){
32682                         p[parent] = thiz[parent];
32683                 }
32684                 return p;
32685         };
32686   }
32687
32688   function split(source,start){
32689         var match;
32690         var buf = [];
32691         var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
32692         reg.lastIndex = start;
32693         reg.exec(source);//skip <
32694         while(match = reg.exec(source)){
32695                 buf.push(match);
32696                 if(match[1])return buf;
32697         }
32698   }
32699
32700   var XMLReader_1 = XMLReader;
32701
32702   var sax = {
32703         XMLReader: XMLReader_1
32704   };
32705
32706   /*
32707    * DOM Level 2
32708    * Object DOMException
32709    * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
32710    * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
32711    */
32712
32713   function copy$1(src,dest){
32714         for(var p in src){
32715                 dest[p] = src[p];
32716         }
32717   }
32718   /**
32719   ^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
32720   ^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
32721    */
32722   function _extends(Class,Super){
32723         var pt = Class.prototype;
32724         if(Object.create){
32725                 var ppt = Object.create(Super.prototype);
32726                 pt.__proto__ = ppt;
32727         }
32728         if(!(pt instanceof Super)){
32729                 function t(){}          t.prototype = Super.prototype;
32730                 t = new t();
32731                 copy$1(pt,t);
32732                 Class.prototype = pt = t;
32733         }
32734         if(pt.constructor != Class){
32735                 if(typeof Class != 'function'){
32736                         console.error("unknow Class:"+Class);
32737                 }
32738                 pt.constructor = Class;
32739         }
32740   }
32741   var htmlns = 'http://www.w3.org/1999/xhtml' ;
32742   // Node Types
32743   var NodeType = {};
32744   var ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;
32745   var ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;
32746   var TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;
32747   var CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;
32748   var ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;
32749   var ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;
32750   var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
32751   var COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;
32752   var DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;
32753   var DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;
32754   var DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;
32755   var NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;
32756
32757   // ExceptionCode
32758   var ExceptionCode = {};
32759   var ExceptionMessage = {};
32760   var INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = ((ExceptionMessage[1]="Index size error"),1);
32761   var DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = ((ExceptionMessage[2]="DOMString size error"),2);
32762   var HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = ((ExceptionMessage[3]="Hierarchy request error"),3);
32763   var WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = ((ExceptionMessage[4]="Wrong document"),4);
32764   var INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = ((ExceptionMessage[5]="Invalid character"),5);
32765   var NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = ((ExceptionMessage[6]="No data allowed"),6);
32766   var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
32767   var NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = ((ExceptionMessage[8]="Not found"),8);
32768   var NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = ((ExceptionMessage[9]="Not supported"),9);
32769   var INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = ((ExceptionMessage[10]="Attribute in use"),10);
32770   //level2
32771   var INVALID_STATE_ERR         = ExceptionCode.INVALID_STATE_ERR               = ((ExceptionMessage[11]="Invalid state"),11);
32772   var SYNTAX_ERR                = ExceptionCode.SYNTAX_ERR                      = ((ExceptionMessage[12]="Syntax error"),12);
32773   var INVALID_MODIFICATION_ERR  = ExceptionCode.INVALID_MODIFICATION_ERR        = ((ExceptionMessage[13]="Invalid modification"),13);
32774   var NAMESPACE_ERR             = ExceptionCode.NAMESPACE_ERR                   = ((ExceptionMessage[14]="Invalid namespace"),14);
32775   var INVALID_ACCESS_ERR        = ExceptionCode.INVALID_ACCESS_ERR              = ((ExceptionMessage[15]="Invalid access"),15);
32776
32777
32778   function DOMException(code, message) {
32779         if(message instanceof Error){
32780                 var error = message;
32781         }else{
32782                 error = this;
32783                 Error.call(this, ExceptionMessage[code]);
32784                 this.message = ExceptionMessage[code];
32785                 if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
32786         }
32787         error.code = code;
32788         if(message) this.message = this.message + ": " + message;
32789         return error;
32790   }DOMException.prototype = Error.prototype;
32791   copy$1(ExceptionCode,DOMException);
32792   /**
32793    * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
32794    * 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.
32795    * The items in the NodeList are accessible via an integral index, starting from 0.
32796    */
32797   function NodeList() {
32798   }NodeList.prototype = {
32799         /**
32800          * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
32801          * @standard level1
32802          */
32803         length:0, 
32804         /**
32805          * 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.
32806          * @standard level1
32807          * @param index  unsigned long 
32808          *   Index into the collection.
32809          * @return Node
32810          *      The node at the indexth position in the NodeList, or null if that is not a valid index. 
32811          */
32812         item: function(index) {
32813                 return this[index] || null;
32814         },
32815         toString:function(isHTML,nodeFilter){
32816                 for(var buf = [], i = 0;i<this.length;i++){
32817                         serializeToString(this[i],buf,isHTML,nodeFilter);
32818                 }
32819                 return buf.join('');
32820         }
32821   };
32822   function LiveNodeList(node,refresh){
32823         this._node = node;
32824         this._refresh = refresh;
32825         _updateLiveList(this);
32826   }
32827   function _updateLiveList(list){
32828         var inc = list._node._inc || list._node.ownerDocument._inc;
32829         if(list._inc != inc){
32830                 var ls = list._refresh(list._node);
32831                 //console.log(ls.length)
32832                 __set__(list,'length',ls.length);
32833                 copy$1(ls,list);
32834                 list._inc = inc;
32835         }
32836   }
32837   LiveNodeList.prototype.item = function(i){
32838         _updateLiveList(this);
32839         return this[i];
32840   };
32841
32842   _extends(LiveNodeList,NodeList);
32843   /**
32844    * 
32845    * 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.
32846    * NamedNodeMap objects in the DOM are live.
32847    * used for attributes or DocumentType entities 
32848    */
32849   function NamedNodeMap() {
32850   }
32851   function _findNodeIndex(list,node){
32852         var i = list.length;
32853         while(i--){
32854                 if(list[i] === node){return i}
32855         }
32856   }
32857
32858   function _addNamedNode(el,list,newAttr,oldAttr){
32859         if(oldAttr){
32860                 list[_findNodeIndex(list,oldAttr)] = newAttr;
32861         }else{
32862                 list[list.length++] = newAttr;
32863         }
32864         if(el){
32865                 newAttr.ownerElement = el;
32866                 var doc = el.ownerDocument;
32867                 if(doc){
32868                         oldAttr && _onRemoveAttribute(doc,el,oldAttr);
32869                         _onAddAttribute(doc,el,newAttr);
32870                 }
32871         }
32872   }
32873   function _removeNamedNode(el,list,attr){
32874         //console.log('remove attr:'+attr)
32875         var i = _findNodeIndex(list,attr);
32876         if(i>=0){
32877                 var lastIndex = list.length-1;
32878                 while(i<lastIndex){
32879                         list[i] = list[++i];
32880                 }
32881                 list.length = lastIndex;
32882                 if(el){
32883                         var doc = el.ownerDocument;
32884                         if(doc){
32885                                 _onRemoveAttribute(doc,el,attr);
32886                                 attr.ownerElement = null;
32887                         }
32888                 }
32889         }else{
32890                 throw DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
32891         }
32892   }
32893   NamedNodeMap.prototype = {
32894         length:0,
32895         item:NodeList.prototype.item,
32896         getNamedItem: function(key) {
32897   //            if(key.indexOf(':')>0 || key == 'xmlns'){
32898   //                    return null;
32899   //            }
32900                 //console.log()
32901                 var i = this.length;
32902                 while(i--){
32903                         var attr = this[i];
32904                         //console.log(attr.nodeName,key)
32905                         if(attr.nodeName == key){
32906                                 return attr;
32907                         }
32908                 }
32909         },
32910         setNamedItem: function(attr) {
32911                 var el = attr.ownerElement;
32912                 if(el && el!=this._ownerElement){
32913                         throw new DOMException(INUSE_ATTRIBUTE_ERR);
32914                 }
32915                 var oldAttr = this.getNamedItem(attr.nodeName);
32916                 _addNamedNode(this._ownerElement,this,attr,oldAttr);
32917                 return oldAttr;
32918         },
32919         /* returns Node */
32920         setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
32921                 var el = attr.ownerElement, oldAttr;
32922                 if(el && el!=this._ownerElement){
32923                         throw new DOMException(INUSE_ATTRIBUTE_ERR);
32924                 }
32925                 oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
32926                 _addNamedNode(this._ownerElement,this,attr,oldAttr);
32927                 return oldAttr;
32928         },
32929
32930         /* returns Node */
32931         removeNamedItem: function(key) {
32932                 var attr = this.getNamedItem(key);
32933                 _removeNamedNode(this._ownerElement,this,attr);
32934                 return attr;
32935                 
32936                 
32937         },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
32938         
32939         //for level2
32940         removeNamedItemNS:function(namespaceURI,localName){
32941                 var attr = this.getNamedItemNS(namespaceURI,localName);
32942                 _removeNamedNode(this._ownerElement,this,attr);
32943                 return attr;
32944         },
32945         getNamedItemNS: function(namespaceURI, localName) {
32946                 var i = this.length;
32947                 while(i--){
32948                         var node = this[i];
32949                         if(node.localName == localName && node.namespaceURI == namespaceURI){
32950                                 return node;
32951                         }
32952                 }
32953                 return null;
32954         }
32955   };
32956   /**
32957    * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
32958    */
32959   function DOMImplementation(/* Object */ features) {
32960         this._features = {};
32961         if (features) {
32962                 for (var feature in features) {
32963                          this._features = features[feature];
32964                 }
32965         }
32966   }
32967   DOMImplementation.prototype = {
32968         hasFeature: function(/* string */ feature, /* string */ version) {
32969                 var versions = this._features[feature.toLowerCase()];
32970                 if (versions && (!version || version in versions)) {
32971                         return true;
32972                 } else {
32973                         return false;
32974                 }
32975         },
32976         // Introduced in DOM Level 2:
32977         createDocument:function(namespaceURI,  qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
32978                 var doc = new Document();
32979                 doc.implementation = this;
32980                 doc.childNodes = new NodeList();
32981                 doc.doctype = doctype;
32982                 if(doctype){
32983                         doc.appendChild(doctype);
32984                 }
32985                 if(qualifiedName){
32986                         var root = doc.createElementNS(namespaceURI,qualifiedName);
32987                         doc.appendChild(root);
32988                 }
32989                 return doc;
32990         },
32991         // Introduced in DOM Level 2:
32992         createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
32993                 var node = new DocumentType();
32994                 node.name = qualifiedName;
32995                 node.nodeName = qualifiedName;
32996                 node.publicId = publicId;
32997                 node.systemId = systemId;
32998                 // Introduced in DOM Level 2:
32999                 //readonly attribute DOMString        internalSubset;
33000                 
33001                 //TODO:..
33002                 //  readonly attribute NamedNodeMap     entities;
33003                 //  readonly attribute NamedNodeMap     notations;
33004                 return node;
33005         }
33006   };
33007
33008
33009   /**
33010    * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
33011    */
33012
33013   function Node$2() {
33014   }
33015   Node$2.prototype = {
33016         firstChild : null,
33017         lastChild : null,
33018         previousSibling : null,
33019         nextSibling : null,
33020         attributes : null,
33021         parentNode : null,
33022         childNodes : null,
33023         ownerDocument : null,
33024         nodeValue : null,
33025         namespaceURI : null,
33026         prefix : null,
33027         localName : null,
33028         // Modified in DOM Level 2:
33029         insertBefore:function(newChild, refChild){//raises 
33030                 return _insertBefore(this,newChild,refChild);
33031         },
33032         replaceChild:function(newChild, oldChild){//raises 
33033                 this.insertBefore(newChild,oldChild);
33034                 if(oldChild){
33035                         this.removeChild(oldChild);
33036                 }
33037         },
33038         removeChild:function(oldChild){
33039                 return _removeChild(this,oldChild);
33040         },
33041         appendChild:function(newChild){
33042                 return this.insertBefore(newChild,null);
33043         },
33044         hasChildNodes:function(){
33045                 return this.firstChild != null;
33046         },
33047         cloneNode:function(deep){
33048                 return cloneNode(this.ownerDocument||this,this,deep);
33049         },
33050         // Modified in DOM Level 2:
33051         normalize:function(){
33052                 var child = this.firstChild;
33053                 while(child){
33054                         var next = child.nextSibling;
33055                         if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
33056                                 this.removeChild(next);
33057                                 child.appendData(next.data);
33058                         }else{
33059                                 child.normalize();
33060                                 child = next;
33061                         }
33062                 }
33063         },
33064         // Introduced in DOM Level 2:
33065         isSupported:function(feature, version){
33066                 return this.ownerDocument.implementation.hasFeature(feature,version);
33067         },
33068       // Introduced in DOM Level 2:
33069       hasAttributes:function(){
33070         return this.attributes.length>0;
33071       },
33072       lookupPrefix:function(namespaceURI){
33073         var el = this;
33074         while(el){
33075                 var map = el._nsMap;
33076                 //console.dir(map)
33077                 if(map){
33078                         for(var n in map){
33079                                 if(map[n] == namespaceURI){
33080                                         return n;
33081                                 }
33082                         }
33083                 }
33084                 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
33085         }
33086         return null;
33087       },
33088       // Introduced in DOM Level 3:
33089       lookupNamespaceURI:function(prefix){
33090         var el = this;
33091         while(el){
33092                 var map = el._nsMap;
33093                 //console.dir(map)
33094                 if(map){
33095                         if(prefix in map){
33096                                 return map[prefix] ;
33097                         }
33098                 }
33099                 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
33100         }
33101         return null;
33102       },
33103       // Introduced in DOM Level 3:
33104       isDefaultNamespace:function(namespaceURI){
33105         var prefix = this.lookupPrefix(namespaceURI);
33106         return prefix == null;
33107       }
33108   };
33109
33110
33111   function _xmlEncoder(c){
33112         return c == '<' && '&lt;' ||
33113            c == '>' && '&gt;' ||
33114            c == '&' && '&amp;' ||
33115            c == '"' && '&quot;' ||
33116            '&#'+c.charCodeAt()+';'
33117   }
33118
33119
33120   copy$1(NodeType,Node$2);
33121   copy$1(NodeType,Node$2.prototype);
33122
33123   /**
33124    * @param callback return true for continue,false for break
33125    * @return boolean true: break visit;
33126    */
33127   function _visitNode(node,callback){
33128         if(callback(node)){
33129                 return true;
33130         }
33131         if(node = node.firstChild){
33132                 do{
33133                         if(_visitNode(node,callback)){return true}
33134           }while(node=node.nextSibling)
33135       }
33136   }
33137
33138
33139
33140   function Document(){
33141   }
33142   function _onAddAttribute(doc,el,newAttr){
33143         doc && doc._inc++;
33144         var ns = newAttr.namespaceURI ;
33145         if(ns == 'http://www.w3.org/2000/xmlns/'){
33146                 //update namespace
33147                 el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value;
33148         }
33149   }
33150   function _onRemoveAttribute(doc,el,newAttr,remove){
33151         doc && doc._inc++;
33152         var ns = newAttr.namespaceURI ;
33153         if(ns == 'http://www.w3.org/2000/xmlns/'){
33154                 //update namespace
33155                 delete el._nsMap[newAttr.prefix?newAttr.localName:''];
33156         }
33157   }
33158   function _onUpdateChild(doc,el,newChild){
33159         if(doc && doc._inc){
33160                 doc._inc++;
33161                 //update childNodes
33162                 var cs = el.childNodes;
33163                 if(newChild){
33164                         cs[cs.length++] = newChild;
33165                 }else{
33166                         //console.log(1)
33167                         var child = el.firstChild;
33168                         var i = 0;
33169                         while(child){
33170                                 cs[i++] = child;
33171                                 child =child.nextSibling;
33172                         }
33173                         cs.length = i;
33174                 }
33175         }
33176   }
33177
33178   /**
33179    * attributes;
33180    * children;
33181    * 
33182    * writeable properties:
33183    * nodeValue,Attr:value,CharacterData:data
33184    * prefix
33185    */
33186   function _removeChild(parentNode,child){
33187         var previous = child.previousSibling;
33188         var next = child.nextSibling;
33189         if(previous){
33190                 previous.nextSibling = next;
33191         }else{
33192                 parentNode.firstChild = next;
33193         }
33194         if(next){
33195                 next.previousSibling = previous;
33196         }else{
33197                 parentNode.lastChild = previous;
33198         }
33199         _onUpdateChild(parentNode.ownerDocument,parentNode);
33200         return child;
33201   }
33202   /**
33203    * preformance key(refChild == null)
33204    */
33205   function _insertBefore(parentNode,newChild,nextChild){
33206         var cp = newChild.parentNode;
33207         if(cp){
33208                 cp.removeChild(newChild);//remove and update
33209         }
33210         if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
33211                 var newFirst = newChild.firstChild;
33212                 if (newFirst == null) {
33213                         return newChild;
33214                 }
33215                 var newLast = newChild.lastChild;
33216         }else{
33217                 newFirst = newLast = newChild;
33218         }
33219         var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
33220
33221         newFirst.previousSibling = pre;
33222         newLast.nextSibling = nextChild;
33223         
33224         
33225         if(pre){
33226                 pre.nextSibling = newFirst;
33227         }else{
33228                 parentNode.firstChild = newFirst;
33229         }
33230         if(nextChild == null){
33231                 parentNode.lastChild = newLast;
33232         }else{
33233                 nextChild.previousSibling = newLast;
33234         }
33235         do{
33236                 newFirst.parentNode = parentNode;
33237         }while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
33238         _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
33239         //console.log(parentNode.lastChild.nextSibling == null)
33240         if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
33241                 newChild.firstChild = newChild.lastChild = null;
33242         }
33243         return newChild;
33244   }
33245   function _appendSingleChild(parentNode,newChild){
33246         var cp = newChild.parentNode;
33247         if(cp){
33248                 var pre = parentNode.lastChild;
33249                 cp.removeChild(newChild);//remove and update
33250                 var pre = parentNode.lastChild;
33251         }
33252         var pre = parentNode.lastChild;
33253         newChild.parentNode = parentNode;
33254         newChild.previousSibling = pre;
33255         newChild.nextSibling = null;
33256         if(pre){
33257                 pre.nextSibling = newChild;
33258         }else{
33259                 parentNode.firstChild = newChild;
33260         }
33261         parentNode.lastChild = newChild;
33262         _onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
33263         return newChild;
33264         //console.log("__aa",parentNode.lastChild.nextSibling == null)
33265   }
33266   Document.prototype = {
33267         //implementation : null,
33268         nodeName :  '#document',
33269         nodeType :  DOCUMENT_NODE,
33270         doctype :  null,
33271         documentElement :  null,
33272         _inc : 1,
33273         
33274         insertBefore :  function(newChild, refChild){//raises 
33275                 if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
33276                         var child = newChild.firstChild;
33277                         while(child){
33278                                 var next = child.nextSibling;
33279                                 this.insertBefore(child,refChild);
33280                                 child = next;
33281                         }
33282                         return newChild;
33283                 }
33284                 if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
33285                         this.documentElement = newChild;
33286                 }
33287                 
33288                 return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
33289         },
33290         removeChild :  function(oldChild){
33291                 if(this.documentElement == oldChild){
33292                         this.documentElement = null;
33293                 }
33294                 return _removeChild(this,oldChild);
33295         },
33296         // Introduced in DOM Level 2:
33297         importNode : function(importedNode,deep){
33298                 return importNode(this,importedNode,deep);
33299         },
33300         // Introduced in DOM Level 2:
33301         getElementById :        function(id){
33302                 var rtv = null;
33303                 _visitNode(this.documentElement,function(node){
33304                         if(node.nodeType == ELEMENT_NODE){
33305                                 if(node.getAttribute('id') == id){
33306                                         rtv = node;
33307                                         return true;
33308                                 }
33309                         }
33310                 });
33311                 return rtv;
33312         },
33313         
33314         //document factory method:
33315         createElement : function(tagName){
33316                 var node = new Element();
33317                 node.ownerDocument = this;
33318                 node.nodeName = tagName;
33319                 node.tagName = tagName;
33320                 node.childNodes = new NodeList();
33321                 var attrs       = node.attributes = new NamedNodeMap();
33322                 attrs._ownerElement = node;
33323                 return node;
33324         },
33325         createDocumentFragment :        function(){
33326                 var node = new DocumentFragment();
33327                 node.ownerDocument = this;
33328                 node.childNodes = new NodeList();
33329                 return node;
33330         },
33331         createTextNode :        function(data){
33332                 var node = new Text();
33333                 node.ownerDocument = this;
33334                 node.appendData(data);
33335                 return node;
33336         },
33337         createComment : function(data){
33338                 var node = new Comment();
33339                 node.ownerDocument = this;
33340                 node.appendData(data);
33341                 return node;
33342         },
33343         createCDATASection :    function(data){
33344                 var node = new CDATASection();
33345                 node.ownerDocument = this;
33346                 node.appendData(data);
33347                 return node;
33348         },
33349         createProcessingInstruction :   function(target,data){
33350                 var node = new ProcessingInstruction();
33351                 node.ownerDocument = this;
33352                 node.tagName = node.target = target;
33353                 node.nodeValue= node.data = data;
33354                 return node;
33355         },
33356         createAttribute :       function(name){
33357                 var node = new Attr();
33358                 node.ownerDocument      = this;
33359                 node.name = name;
33360                 node.nodeName   = name;
33361                 node.localName = name;
33362                 node.specified = true;
33363                 return node;
33364         },
33365         createEntityReference : function(name){
33366                 var node = new EntityReference();
33367                 node.ownerDocument      = this;
33368                 node.nodeName   = name;
33369                 return node;
33370         },
33371         // Introduced in DOM Level 2:
33372         createElementNS :       function(namespaceURI,qualifiedName){
33373                 var node = new Element();
33374                 var pl = qualifiedName.split(':');
33375                 var attrs       = node.attributes = new NamedNodeMap();
33376                 node.childNodes = new NodeList();
33377                 node.ownerDocument = this;
33378                 node.nodeName = qualifiedName;
33379                 node.tagName = qualifiedName;
33380                 node.namespaceURI = namespaceURI;
33381                 if(pl.length == 2){
33382                         node.prefix = pl[0];
33383                         node.localName = pl[1];
33384                 }else{
33385                         //el.prefix = null;
33386                         node.localName = qualifiedName;
33387                 }
33388                 attrs._ownerElement = node;
33389                 return node;
33390         },
33391         // Introduced in DOM Level 2:
33392         createAttributeNS :     function(namespaceURI,qualifiedName){
33393                 var node = new Attr();
33394                 var pl = qualifiedName.split(':');
33395                 node.ownerDocument = this;
33396                 node.nodeName = qualifiedName;
33397                 node.name = qualifiedName;
33398                 node.namespaceURI = namespaceURI;
33399                 node.specified = true;
33400                 if(pl.length == 2){
33401                         node.prefix = pl[0];
33402                         node.localName = pl[1];
33403                 }else{
33404                         //el.prefix = null;
33405                         node.localName = qualifiedName;
33406                 }
33407                 return node;
33408         }
33409   };
33410   _extends(Document,Node$2);
33411
33412
33413   function Element() {
33414         this._nsMap = {};
33415   }Element.prototype = {
33416         nodeType : ELEMENT_NODE,
33417         hasAttribute : function(name){
33418                 return this.getAttributeNode(name)!=null;
33419         },
33420         getAttribute : function(name){
33421                 var attr = this.getAttributeNode(name);
33422                 return attr && attr.value || '';
33423         },
33424         getAttributeNode : function(name){
33425                 return this.attributes.getNamedItem(name);
33426         },
33427         setAttribute : function(name, value){
33428                 var attr = this.ownerDocument.createAttribute(name);
33429                 attr.value = attr.nodeValue = "" + value;
33430                 this.setAttributeNode(attr);
33431         },
33432         removeAttribute : function(name){
33433                 var attr = this.getAttributeNode(name);
33434                 attr && this.removeAttributeNode(attr);
33435         },
33436         
33437         //four real opeartion method
33438         appendChild:function(newChild){
33439                 if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
33440                         return this.insertBefore(newChild,null);
33441                 }else{
33442                         return _appendSingleChild(this,newChild);
33443                 }
33444         },
33445         setAttributeNode : function(newAttr){
33446                 return this.attributes.setNamedItem(newAttr);
33447         },
33448         setAttributeNodeNS : function(newAttr){
33449                 return this.attributes.setNamedItemNS(newAttr);
33450         },
33451         removeAttributeNode : function(oldAttr){
33452                 //console.log(this == oldAttr.ownerElement)
33453                 return this.attributes.removeNamedItem(oldAttr.nodeName);
33454         },
33455         //get real attribute name,and remove it by removeAttributeNode
33456         removeAttributeNS : function(namespaceURI, localName){
33457                 var old = this.getAttributeNodeNS(namespaceURI, localName);
33458                 old && this.removeAttributeNode(old);
33459         },
33460         
33461         hasAttributeNS : function(namespaceURI, localName){
33462                 return this.getAttributeNodeNS(namespaceURI, localName)!=null;
33463         },
33464         getAttributeNS : function(namespaceURI, localName){
33465                 var attr = this.getAttributeNodeNS(namespaceURI, localName);
33466                 return attr && attr.value || '';
33467         },
33468         setAttributeNS : function(namespaceURI, qualifiedName, value){
33469                 var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
33470                 attr.value = attr.nodeValue = "" + value;
33471                 this.setAttributeNode(attr);
33472         },
33473         getAttributeNodeNS : function(namespaceURI, localName){
33474                 return this.attributes.getNamedItemNS(namespaceURI, localName);
33475         },
33476         
33477         getElementsByTagName : function(tagName){
33478                 return new LiveNodeList(this,function(base){
33479                         var ls = [];
33480                         _visitNode(base,function(node){
33481                                 if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
33482                                         ls.push(node);
33483                                 }
33484                         });
33485                         return ls;
33486                 });
33487         },
33488         getElementsByTagNameNS : function(namespaceURI, localName){
33489                 return new LiveNodeList(this,function(base){
33490                         var ls = [];
33491                         _visitNode(base,function(node){
33492                                 if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
33493                                         ls.push(node);
33494                                 }
33495                         });
33496                         return ls;
33497                         
33498                 });
33499         }
33500   };
33501   Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
33502   Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
33503
33504
33505   _extends(Element,Node$2);
33506   function Attr() {
33507   }Attr.prototype.nodeType = ATTRIBUTE_NODE;
33508   _extends(Attr,Node$2);
33509
33510
33511   function CharacterData() {
33512   }CharacterData.prototype = {
33513         data : '',
33514         substringData : function(offset, count) {
33515                 return this.data.substring(offset, offset+count);
33516         },
33517         appendData: function(text) {
33518                 text = this.data+text;
33519                 this.nodeValue = this.data = text;
33520                 this.length = text.length;
33521         },
33522         insertData: function(offset,text) {
33523                 this.replaceData(offset,0,text);
33524         
33525         },
33526         appendChild:function(newChild){
33527                 throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
33528         },
33529         deleteData: function(offset, count) {
33530                 this.replaceData(offset,count,"");
33531         },
33532         replaceData: function(offset, count, text) {
33533                 var start = this.data.substring(0,offset);
33534                 var end = this.data.substring(offset+count);
33535                 text = start + text + end;
33536                 this.nodeValue = this.data = text;
33537                 this.length = text.length;
33538         }
33539   };
33540   _extends(CharacterData,Node$2);
33541   function Text() {
33542   }Text.prototype = {
33543         nodeName : "#text",
33544         nodeType : TEXT_NODE,
33545         splitText : function(offset) {
33546                 var text = this.data;
33547                 var newText = text.substring(offset);
33548                 text = text.substring(0, offset);
33549                 this.data = this.nodeValue = text;
33550                 this.length = text.length;
33551                 var newNode = this.ownerDocument.createTextNode(newText);
33552                 if(this.parentNode){
33553                         this.parentNode.insertBefore(newNode, this.nextSibling);
33554                 }
33555                 return newNode;
33556         }
33557   };
33558   _extends(Text,CharacterData);
33559   function Comment() {
33560   }Comment.prototype = {
33561         nodeName : "#comment",
33562         nodeType : COMMENT_NODE
33563   };
33564   _extends(Comment,CharacterData);
33565
33566   function CDATASection() {
33567   }CDATASection.prototype = {
33568         nodeName : "#cdata-section",
33569         nodeType : CDATA_SECTION_NODE
33570   };
33571   _extends(CDATASection,CharacterData);
33572
33573
33574   function DocumentType() {
33575   }DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
33576   _extends(DocumentType,Node$2);
33577
33578   function Notation() {
33579   }Notation.prototype.nodeType = NOTATION_NODE;
33580   _extends(Notation,Node$2);
33581
33582   function Entity() {
33583   }Entity.prototype.nodeType = ENTITY_NODE;
33584   _extends(Entity,Node$2);
33585
33586   function EntityReference() {
33587   }EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
33588   _extends(EntityReference,Node$2);
33589
33590   function DocumentFragment() {
33591   }DocumentFragment.prototype.nodeName =        "#document-fragment";
33592   DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE;
33593   _extends(DocumentFragment,Node$2);
33594
33595
33596   function ProcessingInstruction() {
33597   }
33598   ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
33599   _extends(ProcessingInstruction,Node$2);
33600   function XMLSerializer$1(){}
33601   XMLSerializer$1.prototype.serializeToString = function(node,isHtml,nodeFilter){
33602         return nodeSerializeToString.call(node,isHtml,nodeFilter);
33603   };
33604   Node$2.prototype.toString = nodeSerializeToString;
33605   function nodeSerializeToString(isHtml,nodeFilter){
33606         var buf = [];
33607         var refNode = this.nodeType == 9?this.documentElement:this;
33608         var prefix = refNode.prefix;
33609         var uri = refNode.namespaceURI;
33610         
33611         if(uri && prefix == null){
33612                 //console.log(prefix)
33613                 var prefix = refNode.lookupPrefix(uri);
33614                 if(prefix == null){
33615                         //isHTML = true;
33616                         var visibleNamespaces=[
33617                         {namespace:uri,prefix:null}
33618                         //{namespace:uri,prefix:''}
33619                         ];
33620                 }
33621         }
33622         serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
33623         //console.log('###',this.nodeType,uri,prefix,buf.join(''))
33624         return buf.join('');
33625   }
33626   function needNamespaceDefine(node,isHTML, visibleNamespaces) {
33627         var prefix = node.prefix||'';
33628         var uri = node.namespaceURI;
33629         if (!prefix && !uri){
33630                 return false;
33631         }
33632         if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" 
33633                 || uri == 'http://www.w3.org/2000/xmlns/'){
33634                 return false;
33635         }
33636         
33637         var i = visibleNamespaces.length; 
33638         //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
33639         while (i--) {
33640                 var ns = visibleNamespaces[i];
33641                 // get namespace prefix
33642                 //console.log(node.nodeType,node.tagName,ns.prefix,prefix)
33643                 if (ns.prefix == prefix){
33644                         return ns.namespace != uri;
33645                 }
33646         }
33647         //console.log(isHTML,uri,prefix=='')
33648         //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
33649         //      return false;
33650         //}
33651         //node.flag = '11111'
33652         //console.error(3,true,node.flag,node.prefix,node.namespaceURI)
33653         return true;
33654   }
33655   function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
33656         if(nodeFilter){
33657                 node = nodeFilter(node);
33658                 if(node){
33659                         if(typeof node == 'string'){
33660                                 buf.push(node);
33661                                 return;
33662                         }
33663                 }else{
33664                         return;
33665                 }
33666                 //buf.sort.apply(attrs, attributeSorter);
33667         }
33668         switch(node.nodeType){
33669         case ELEMENT_NODE:
33670                 if (!visibleNamespaces) visibleNamespaces = [];
33671                 var startVisibleNamespaces = visibleNamespaces.length;
33672                 var attrs = node.attributes;
33673                 var len = attrs.length;
33674                 var child = node.firstChild;
33675                 var nodeName = node.tagName;
33676                 
33677                 isHTML =  (htmlns === node.namespaceURI) ||isHTML; 
33678                 buf.push('<',nodeName);
33679                 
33680                 
33681                 
33682                 for(var i=0;i<len;i++){
33683                         // add namespaces for attributes
33684                         var attr = attrs.item(i);
33685                         if (attr.prefix == 'xmlns') {
33686                                 visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
33687                         }else if(attr.nodeName == 'xmlns'){
33688                                 visibleNamespaces.push({ prefix: '', namespace: attr.value });
33689                         }
33690                 }
33691                 for(var i=0;i<len;i++){
33692                         var attr = attrs.item(i);
33693                         if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
33694                                 var prefix = attr.prefix||'';
33695                                 var uri = attr.namespaceURI;
33696                                 var ns = prefix ? ' xmlns:' + prefix : " xmlns";
33697                                 buf.push(ns, '="' , uri , '"');
33698                                 visibleNamespaces.push({ prefix: prefix, namespace:uri });
33699                         }
33700                         serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
33701                 }
33702                 // add namespace for current node               
33703                 if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
33704                         var prefix = node.prefix||'';
33705                         var uri = node.namespaceURI;
33706                         var ns = prefix ? ' xmlns:' + prefix : " xmlns";
33707                         buf.push(ns, '="' , uri , '"');
33708                         visibleNamespaces.push({ prefix: prefix, namespace:uri });
33709                 }
33710                 
33711                 if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
33712                         buf.push('>');
33713                         //if is cdata child node
33714                         if(isHTML && /^script$/i.test(nodeName)){
33715                                 while(child){
33716                                         if(child.data){
33717                                                 buf.push(child.data);
33718                                         }else{
33719                                                 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
33720                                         }
33721                                         child = child.nextSibling;
33722                                 }
33723                         }else
33724                         {
33725                                 while(child){
33726                                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
33727                                         child = child.nextSibling;
33728                                 }
33729                         }
33730                         buf.push('</',nodeName,'>');
33731                 }else{
33732                         buf.push('/>');
33733                 }
33734                 // remove added visible namespaces
33735                 //visibleNamespaces.length = startVisibleNamespaces;
33736                 return;
33737         case DOCUMENT_NODE:
33738         case DOCUMENT_FRAGMENT_NODE:
33739                 var child = node.firstChild;
33740                 while(child){
33741                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
33742                         child = child.nextSibling;
33743                 }
33744                 return;
33745         case ATTRIBUTE_NODE:
33746                 return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
33747         case TEXT_NODE:
33748                 return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
33749         case CDATA_SECTION_NODE:
33750                 return buf.push( '<![CDATA[',node.data,']]>');
33751         case COMMENT_NODE:
33752                 return buf.push( "<!--",node.data,"-->");
33753         case DOCUMENT_TYPE_NODE:
33754                 var pubid = node.publicId;
33755                 var sysid = node.systemId;
33756                 buf.push('<!DOCTYPE ',node.name);
33757                 if(pubid){
33758                         buf.push(' PUBLIC "',pubid);
33759                         if (sysid && sysid!='.') {
33760                                 buf.push( '" "',sysid);
33761                         }
33762                         buf.push('">');
33763                 }else if(sysid && sysid!='.'){
33764                         buf.push(' SYSTEM "',sysid,'">');
33765                 }else{
33766                         var sub = node.internalSubset;
33767                         if(sub){
33768                                 buf.push(" [",sub,"]");
33769                         }
33770                         buf.push(">");
33771                 }
33772                 return;
33773         case PROCESSING_INSTRUCTION_NODE:
33774                 return buf.push( "<?",node.target," ",node.data,"?>");
33775         case ENTITY_REFERENCE_NODE:
33776                 return buf.push( '&',node.nodeName,';');
33777         //case ENTITY_NODE:
33778         //case NOTATION_NODE:
33779         default:
33780                 buf.push('??',node.nodeName);
33781         }
33782   }
33783   function importNode(doc,node,deep){
33784         var node2;
33785         switch (node.nodeType) {
33786         case ELEMENT_NODE:
33787                 node2 = node.cloneNode(false);
33788                 node2.ownerDocument = doc;
33789                 //var attrs = node2.attributes;
33790                 //var len = attrs.length;
33791                 //for(var i=0;i<len;i++){
33792                         //node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
33793                 //}
33794         case DOCUMENT_FRAGMENT_NODE:
33795                 break;
33796         case ATTRIBUTE_NODE:
33797                 deep = true;
33798                 break;
33799         //case ENTITY_REFERENCE_NODE:
33800         //case PROCESSING_INSTRUCTION_NODE:
33801         ////case TEXT_NODE:
33802         //case CDATA_SECTION_NODE:
33803         //case COMMENT_NODE:
33804         //      deep = false;
33805         //      break;
33806         //case DOCUMENT_NODE:
33807         //case DOCUMENT_TYPE_NODE:
33808         //cannot be imported.
33809         //case ENTITY_NODE:
33810         //case NOTATION_NODE:
33811         //can not hit in level3
33812         //default:throw e;
33813         }
33814         if(!node2){
33815                 node2 = node.cloneNode(false);//false
33816         }
33817         node2.ownerDocument = doc;
33818         node2.parentNode = null;
33819         if(deep){
33820                 var child = node.firstChild;
33821                 while(child){
33822                         node2.appendChild(importNode(doc,child,deep));
33823                         child = child.nextSibling;
33824                 }
33825         }
33826         return node2;
33827   }
33828   //
33829   //var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
33830   //                                    attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
33831   function cloneNode(doc,node,deep){
33832         var node2 = new node.constructor();
33833         for(var n in node){
33834                 var v = node[n];
33835                 if(typeof v != 'object' ){
33836                         if(v != node2[n]){
33837                                 node2[n] = v;
33838                         }
33839                 }
33840         }
33841         if(node.childNodes){
33842                 node2.childNodes = new NodeList();
33843         }
33844         node2.ownerDocument = doc;
33845         switch (node2.nodeType) {
33846         case ELEMENT_NODE:
33847                 var attrs       = node.attributes;
33848                 var attrs2      = node2.attributes = new NamedNodeMap();
33849                 var len = attrs.length;
33850                 attrs2._ownerElement = node2;
33851                 for(var i=0;i<len;i++){
33852                         node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
33853                 }
33854                 break;
33855         case ATTRIBUTE_NODE:
33856                 deep = true;
33857         }
33858         if(deep){
33859                 var child = node.firstChild;
33860                 while(child){
33861                         node2.appendChild(cloneNode(doc,child,deep));
33862                         child = child.nextSibling;
33863                 }
33864         }
33865         return node2;
33866   }
33867
33868   function __set__(object,key,value){
33869         object[key] = value;
33870   }
33871   //do dynamic
33872   try{
33873         if(Object.defineProperty){
33874                 Object.defineProperty(LiveNodeList.prototype,'length',{
33875                         get:function(){
33876                                 _updateLiveList(this);
33877                                 return this.$$length;
33878                         }
33879                 });
33880                 Object.defineProperty(Node$2.prototype,'textContent',{
33881                         get:function(){
33882                                 return getTextContent(this);
33883                         },
33884                         set:function(data){
33885                                 switch(this.nodeType){
33886                                 case ELEMENT_NODE:
33887                                 case DOCUMENT_FRAGMENT_NODE:
33888                                         while(this.firstChild){
33889                                                 this.removeChild(this.firstChild);
33890                                         }
33891                                         if(data || String(data)){
33892                                                 this.appendChild(this.ownerDocument.createTextNode(data));
33893                                         }
33894                                         break;
33895                                 default:
33896                                         //TODO:
33897                                         this.data = data;
33898                                         this.value = data;
33899                                         this.nodeValue = data;
33900                                 }
33901                         }
33902                 });
33903                 
33904                 function getTextContent(node){
33905                         switch(node.nodeType){
33906                         case ELEMENT_NODE:
33907                         case DOCUMENT_FRAGMENT_NODE:
33908                                 var buf = [];
33909                                 node = node.firstChild;
33910                                 while(node){
33911                                         if(node.nodeType!==7 && node.nodeType !==8){
33912                                                 buf.push(getTextContent(node));
33913                                         }
33914                                         node = node.nextSibling;
33915                                 }
33916                                 return buf.join('');
33917                         default:
33918                                 return node.nodeValue;
33919                         }
33920                 }
33921                 __set__ = function(object,key,value){
33922                         //console.log(value)
33923                         object['$$'+key] = value;
33924                 };
33925         }
33926   }catch(e){//ie8
33927   }
33928
33929   //if(typeof require == 'function'){
33930         var DOMImplementation_1 = DOMImplementation;
33931         var XMLSerializer_1 = XMLSerializer$1;
33932   //}
33933
33934   var dom = {
33935         DOMImplementation: DOMImplementation_1,
33936         XMLSerializer: XMLSerializer_1
33937   };
33938
33939   var domParser = createCommonjsModule(function (module, exports) {
33940   function DOMParser(options){
33941         this.options = options ||{locator:{}};
33942         
33943   }
33944   DOMParser.prototype.parseFromString = function(source,mimeType){
33945         var options = this.options;
33946         var sax$$1 =  new XMLReader();
33947         var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
33948         var errorHandler = options.errorHandler;
33949         var locator = options.locator;
33950         var defaultNSMap = options.xmlns||{};
33951         var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"};
33952         if(locator){
33953                 domBuilder.setDocumentLocator(locator);
33954         }
33955         
33956         sax$$1.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
33957         sax$$1.domBuilder = options.domBuilder || domBuilder;
33958         if(/\/x?html?$/.test(mimeType)){
33959                 entityMap.nbsp = '\xa0';
33960                 entityMap.copy = '\xa9';
33961                 defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
33962         }
33963         defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
33964         if(source){
33965                 sax$$1.parse(source,defaultNSMap,entityMap);
33966         }else{
33967                 sax$$1.errorHandler.error("invalid doc source");
33968         }
33969         return domBuilder.doc;
33970   };
33971   function buildErrorHandler(errorImpl,domBuilder,locator){
33972         if(!errorImpl){
33973                 if(domBuilder instanceof DOMHandler){
33974                         return domBuilder;
33975                 }
33976                 errorImpl = domBuilder ;
33977         }
33978         var errorHandler = {};
33979         var isCallback = errorImpl instanceof Function;
33980         locator = locator||{};
33981         function build(key){
33982                 var fn = errorImpl[key];
33983                 if(!fn && isCallback){
33984                         fn = errorImpl.length == 2?function(msg){errorImpl(key,msg);}:errorImpl;
33985                 }
33986                 errorHandler[key] = fn && function(msg){
33987                         fn('[xmldom '+key+']\t'+msg+_locator(locator));
33988                 }||function(){};
33989         }
33990         build('warning');
33991         build('error');
33992         build('fatalError');
33993         return errorHandler;
33994   }
33995
33996   //console.log('#\n\n\n\n\n\n\n####')
33997   /**
33998    * +ContentHandler+ErrorHandler
33999    * +LexicalHandler+EntityResolver2
34000    * -DeclHandler-DTDHandler 
34001    * 
34002    * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
34003    * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
34004    * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
34005    */
34006   function DOMHandler() {
34007       this.cdata = false;
34008   }
34009   function position(locator,node){
34010         node.lineNumber = locator.lineNumber;
34011         node.columnNumber = locator.columnNumber;
34012   }
34013   /**
34014    * @see org.xml.sax.ContentHandler#startDocument
34015    * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
34016    */ 
34017   DOMHandler.prototype = {
34018         startDocument : function() {
34019         this.doc = new DOMImplementation().createDocument(null, null, null);
34020         if (this.locator) {
34021                 this.doc.documentURI = this.locator.systemId;
34022         }
34023         },
34024         startElement:function(namespaceURI, localName, qName, attrs) {
34025                 var doc = this.doc;
34026             var el = doc.createElementNS(namespaceURI, qName||localName);
34027             var len = attrs.length;
34028             appendElement(this, el);
34029             this.currentElement = el;
34030             
34031                 this.locator && position(this.locator,el);
34032             for (var i = 0 ; i < len; i++) {
34033                 var namespaceURI = attrs.getURI(i);
34034                 var value = attrs.getValue(i);
34035                 var qName = attrs.getQName(i);
34036                         var attr = doc.createAttributeNS(namespaceURI, qName);
34037                         this.locator &&position(attrs.getLocator(i),attr);
34038                         attr.value = attr.nodeValue = value;
34039                         el.setAttributeNode(attr);
34040             }
34041         },
34042         endElement:function(namespaceURI, localName, qName) {
34043                 var current = this.currentElement;
34044                 var tagName = current.tagName;
34045                 this.currentElement = current.parentNode;
34046         },
34047         startPrefixMapping:function(prefix, uri) {
34048         },
34049         endPrefixMapping:function(prefix) {
34050         },
34051         processingInstruction:function(target, data) {
34052             var ins = this.doc.createProcessingInstruction(target, data);
34053             this.locator && position(this.locator,ins);
34054             appendElement(this, ins);
34055         },
34056         ignorableWhitespace:function(ch, start, length) {
34057         },
34058         characters:function(chars, start, length) {
34059                 chars = _toString.apply(this,arguments);
34060                 //console.log(chars)
34061                 if(chars){
34062                         if (this.cdata) {
34063                                 var charNode = this.doc.createCDATASection(chars);
34064                         } else {
34065                                 var charNode = this.doc.createTextNode(chars);
34066                         }
34067                         if(this.currentElement){
34068                                 this.currentElement.appendChild(charNode);
34069                         }else if(/^\s*$/.test(chars)){
34070                                 this.doc.appendChild(charNode);
34071                                 //process xml
34072                         }
34073                         this.locator && position(this.locator,charNode);
34074                 }
34075         },
34076         skippedEntity:function(name) {
34077         },
34078         endDocument:function() {
34079                 this.doc.normalize();
34080         },
34081         setDocumentLocator:function (locator) {
34082             if(this.locator = locator){// && !('lineNumber' in locator)){
34083                 locator.lineNumber = 0;
34084             }
34085         },
34086         //LexicalHandler
34087         comment:function(chars, start, length) {
34088                 chars = _toString.apply(this,arguments);
34089             var comm = this.doc.createComment(chars);
34090             this.locator && position(this.locator,comm);
34091             appendElement(this, comm);
34092         },
34093         
34094         startCDATA:function() {
34095             //used in characters() methods
34096             this.cdata = true;
34097         },
34098         endCDATA:function() {
34099             this.cdata = false;
34100         },
34101         
34102         startDTD:function(name, publicId, systemId) {
34103                 var impl = this.doc.implementation;
34104             if (impl && impl.createDocumentType) {
34105                 var dt = impl.createDocumentType(name, publicId, systemId);
34106                 this.locator && position(this.locator,dt);
34107                 appendElement(this, dt);
34108             }
34109         },
34110         /**
34111          * @see org.xml.sax.ErrorHandler
34112          * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
34113          */
34114         warning:function(error) {
34115                 console.warn('[xmldom warning]\t'+error,_locator(this.locator));
34116         },
34117         error:function(error) {
34118                 console.error('[xmldom error]\t'+error,_locator(this.locator));
34119         },
34120         fatalError:function(error) {
34121                 console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
34122             throw error;
34123         }
34124   };
34125   function _locator(l){
34126         if(l){
34127                 return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
34128         }
34129   }
34130   function _toString(chars,start,length){
34131         if(typeof chars == 'string'){
34132                 return chars.substr(start,length)
34133         }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
34134                 if(chars.length >= start+length || start){
34135                         return new java.lang.String(chars,start,length)+'';
34136                 }
34137                 return chars;
34138         }
34139   }
34140
34141   /*
34142    * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
34143    * used method of org.xml.sax.ext.LexicalHandler:
34144    *  #comment(chars, start, length)
34145    *  #startCDATA()
34146    *  #endCDATA()
34147    *  #startDTD(name, publicId, systemId)
34148    *
34149    *
34150    * IGNORED method of org.xml.sax.ext.LexicalHandler:
34151    *  #endDTD()
34152    *  #startEntity(name)
34153    *  #endEntity(name)
34154    *
34155    *
34156    * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
34157    * IGNORED method of org.xml.sax.ext.DeclHandler
34158    *    #attributeDecl(eName, aName, type, mode, value)
34159    *  #elementDecl(name, model)
34160    *  #externalEntityDecl(name, publicId, systemId)
34161    *  #internalEntityDecl(name, value)
34162    * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
34163    * IGNORED method of org.xml.sax.EntityResolver2
34164    *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
34165    *  #resolveEntity(publicId, systemId)
34166    *  #getExternalSubset(name, baseURI)
34167    * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
34168    * IGNORED method of org.xml.sax.DTDHandler
34169    *  #notationDecl(name, publicId, systemId) {};
34170    *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
34171    */
34172   "endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
34173         DOMHandler.prototype[key] = function(){return null};
34174   });
34175
34176   /* 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 */
34177   function appendElement (hander,node) {
34178       if (!hander.currentElement) {
34179           hander.doc.appendChild(node);
34180       } else {
34181           hander.currentElement.appendChild(node);
34182       }
34183   }//appendChild and setAttributeNS are preformance key
34184
34185   //if(typeof require == 'function'){
34186         var XMLReader = sax.XMLReader;
34187         var DOMImplementation = exports.DOMImplementation = dom.DOMImplementation;
34188         exports.XMLSerializer = dom.XMLSerializer ;
34189         exports.DOMParser = DOMParser;
34190   //}
34191   });
34192   var domParser_1 = domParser.DOMImplementation;
34193   var domParser_2 = domParser.XMLSerializer;
34194   var domParser_3 = domParser.DOMParser;
34195
34196   var togeojson = createCommonjsModule(function (module, exports) {
34197   var toGeoJSON = (function() {
34198
34199       var removeSpace = /\s*/g,
34200           trimSpace = /^\s*|\s*$/g,
34201           splitSpace = /\s+/;
34202       // generate a short, numeric hash of a string
34203       function okhash(x) {
34204           if (!x || !x.length) return 0;
34205           for (var i = 0, h = 0; i < x.length; i++) {
34206               h = ((h << 5) - h) + x.charCodeAt(i) | 0;
34207           } return h;
34208       }
34209       // all Y children of X
34210       function get(x, y) { return x.getElementsByTagName(y); }
34211       function attr(x, y) { return x.getAttribute(y); }
34212       function attrf(x, y) { return parseFloat(attr(x, y)); }
34213       // one Y child of X, if any, otherwise null
34214       function get1(x, y) { var n = get(x, y); return n.length ? n[0] : null; }
34215       // https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize
34216       function norm(el) { if (el.normalize) { el.normalize(); } return el; }
34217       // cast array x into numbers
34218       function numarray(x) {
34219           for (var j = 0, o = []; j < x.length; j++) { o[j] = parseFloat(x[j]); }
34220           return o;
34221       }
34222       // get the content of a text node, if any
34223       function nodeVal(x) {
34224           if (x) { norm(x); }
34225           return (x && x.textContent) || '';
34226       }
34227       // get the contents of multiple text nodes, if present
34228       function getMulti(x, ys) {
34229           var o = {}, n, k;
34230           for (k = 0; k < ys.length; k++) {
34231               n = get1(x, ys[k]);
34232               if (n) o[ys[k]] = nodeVal(n);
34233           }
34234           return o;
34235       }
34236       // add properties of Y to X, overwriting if present in both
34237       function extend(x, y) { for (var k in y) x[k] = y[k]; }
34238       // get one coordinate from a coordinate array, if any
34239       function coord1(v) { return numarray(v.replace(removeSpace, '').split(',')); }
34240       // get all coordinates from a coordinate array as [[],[]]
34241       function coord(v) {
34242           var coords = v.replace(trimSpace, '').split(splitSpace),
34243               o = [];
34244           for (var i = 0; i < coords.length; i++) {
34245               o.push(coord1(coords[i]));
34246           }
34247           return o;
34248       }
34249       function coordPair(x) {
34250           var ll = [attrf(x, 'lon'), attrf(x, 'lat')],
34251               ele = get1(x, 'ele'),
34252               // handle namespaced attribute in browser
34253               heartRate = get1(x, 'gpxtpx:hr') || get1(x, 'hr'),
34254               time = get1(x, 'time'),
34255               e;
34256           if (ele) {
34257               e = parseFloat(nodeVal(ele));
34258               if (!isNaN(e)) {
34259                   ll.push(e);
34260               }
34261           }
34262           return {
34263               coordinates: ll,
34264               time: time ? nodeVal(time) : null,
34265               heartRate: heartRate ? parseFloat(nodeVal(heartRate)) : null
34266           };
34267       }
34268
34269       // create a new feature collection parent object
34270       function fc() {
34271           return {
34272               type: 'FeatureCollection',
34273               features: []
34274           };
34275       }
34276
34277       var serializer;
34278       if (typeof XMLSerializer !== 'undefined') {
34279           /* istanbul ignore next */
34280           serializer = new XMLSerializer();
34281       // only require xmldom in a node environment
34282       } else if (typeof process === 'object' && !process.browser) {
34283           serializer = new (domParser.XMLSerializer)();
34284       }
34285       function xml2str(str) {
34286           // IE9 will create a new XMLSerializer but it'll crash immediately.
34287           // This line is ignored because we don't run coverage tests in IE9
34288           /* istanbul ignore next */
34289           if (str.xml !== undefined) return str.xml;
34290           return serializer.serializeToString(str);
34291       }
34292
34293       var t = {
34294           kml: function(doc) {
34295
34296               var gj = fc(),
34297                   // styleindex keeps track of hashed styles in order to match features
34298                   styleIndex = {}, styleByHash = {},
34299                   // stylemapindex keeps track of style maps to expose in properties
34300                   styleMapIndex = {},
34301                   // atomic geospatial types supported by KML - MultiGeometry is
34302                   // handled separately
34303                   geotypes = ['Polygon', 'LineString', 'Point', 'Track', 'gx:Track'],
34304                   // all root placemarks in the file
34305                   placemarks = get(doc, 'Placemark'),
34306                   styles = get(doc, 'Style'),
34307                   styleMaps = get(doc, 'StyleMap');
34308
34309               for (var k = 0; k < styles.length; k++) {
34310                   var hash = okhash(xml2str(styles[k])).toString(16);
34311                   styleIndex['#' + attr(styles[k], 'id')] = hash;
34312                   styleByHash[hash] = styles[k];
34313               }
34314               for (var l = 0; l < styleMaps.length; l++) {
34315                   styleIndex['#' + attr(styleMaps[l], 'id')] = okhash(xml2str(styleMaps[l])).toString(16);
34316                   var pairs = get(styleMaps[l], 'Pair');
34317                   var pairsMap = {};
34318                   for (var m = 0; m < pairs.length; m++) {
34319                       pairsMap[nodeVal(get1(pairs[m], 'key'))] = nodeVal(get1(pairs[m], 'styleUrl'));
34320                   }
34321                   styleMapIndex['#' + attr(styleMaps[l], 'id')] = pairsMap;
34322
34323               }
34324               for (var j = 0; j < placemarks.length; j++) {
34325                   gj.features = gj.features.concat(getPlacemark(placemarks[j]));
34326               }
34327               function kmlColor(v) {
34328                   var color, opacity;
34329                   v = v || '';
34330                   if (v.substr(0, 1) === '#') { v = v.substr(1); }
34331                   if (v.length === 6 || v.length === 3) { color = v; }
34332                   if (v.length === 8) {
34333                       opacity = parseInt(v.substr(0, 2), 16) / 255;
34334                       color = '#' + v.substr(6, 2) +
34335                           v.substr(4, 2) +
34336                           v.substr(2, 2);
34337                   }
34338                   return [color, isNaN(opacity) ? undefined : opacity];
34339               }
34340               function gxCoord(v) { return numarray(v.split(' ')); }
34341               function gxCoords(root) {
34342                   var elems = get(root, 'coord', 'gx'), coords = [], times = [];
34343                   if (elems.length === 0) elems = get(root, 'gx:coord');
34344                   for (var i = 0; i < elems.length; i++) coords.push(gxCoord(nodeVal(elems[i])));
34345                   var timeElems = get(root, 'when');
34346                   for (var j = 0; j < timeElems.length; j++) times.push(nodeVal(timeElems[j]));
34347                   return {
34348                       coords: coords,
34349                       times: times
34350                   };
34351               }
34352               function getGeometry(root) {
34353                   var geomNode, geomNodes, i, j, k, geoms = [], coordTimes = [];
34354                   if (get1(root, 'MultiGeometry')) { return getGeometry(get1(root, 'MultiGeometry')); }
34355                   if (get1(root, 'MultiTrack')) { return getGeometry(get1(root, 'MultiTrack')); }
34356                   if (get1(root, 'gx:MultiTrack')) { return getGeometry(get1(root, 'gx:MultiTrack')); }
34357                   for (i = 0; i < geotypes.length; i++) {
34358                       geomNodes = get(root, geotypes[i]);
34359                       if (geomNodes) {
34360                           for (j = 0; j < geomNodes.length; j++) {
34361                               geomNode = geomNodes[j];
34362                               if (geotypes[i] === 'Point') {
34363                                   geoms.push({
34364                                       type: 'Point',
34365                                       coordinates: coord1(nodeVal(get1(geomNode, 'coordinates')))
34366                                   });
34367                               } else if (geotypes[i] === 'LineString') {
34368                                   geoms.push({
34369                                       type: 'LineString',
34370                                       coordinates: coord(nodeVal(get1(geomNode, 'coordinates')))
34371                                   });
34372                               } else if (geotypes[i] === 'Polygon') {
34373                                   var rings = get(geomNode, 'LinearRing'),
34374                                       coords = [];
34375                                   for (k = 0; k < rings.length; k++) {
34376                                       coords.push(coord(nodeVal(get1(rings[k], 'coordinates'))));
34377                                   }
34378                                   geoms.push({
34379                                       type: 'Polygon',
34380                                       coordinates: coords
34381                                   });
34382                               } else if (geotypes[i] === 'Track' ||
34383                                   geotypes[i] === 'gx:Track') {
34384                                   var track = gxCoords(geomNode);
34385                                   geoms.push({
34386                                       type: 'LineString',
34387                                       coordinates: track.coords
34388                                   });
34389                                   if (track.times.length) coordTimes.push(track.times);
34390                               }
34391                           }
34392                       }
34393                   }
34394                   return {
34395                       geoms: geoms,
34396                       coordTimes: coordTimes
34397                   };
34398               }
34399               function getPlacemark(root) {
34400                   var geomsAndTimes = getGeometry(root), i, properties = {},
34401                       name = nodeVal(get1(root, 'name')),
34402                       address = nodeVal(get1(root, 'address')),
34403                       styleUrl = nodeVal(get1(root, 'styleUrl')),
34404                       description = nodeVal(get1(root, 'description')),
34405                       timeSpan = get1(root, 'TimeSpan'),
34406                       timeStamp = get1(root, 'TimeStamp'),
34407                       extendedData = get1(root, 'ExtendedData'),
34408                       lineStyle = get1(root, 'LineStyle'),
34409                       polyStyle = get1(root, 'PolyStyle'),
34410                       visibility = get1(root, 'visibility');
34411
34412                   if (!geomsAndTimes.geoms.length) return [];
34413                   if (name) properties.name = name;
34414                   if (address) properties.address = address;
34415                   if (styleUrl) {
34416                       if (styleUrl[0] !== '#') {
34417                           styleUrl = '#' + styleUrl;
34418                       }
34419
34420                       properties.styleUrl = styleUrl;
34421                       if (styleIndex[styleUrl]) {
34422                           properties.styleHash = styleIndex[styleUrl];
34423                       }
34424                       if (styleMapIndex[styleUrl]) {
34425                           properties.styleMapHash = styleMapIndex[styleUrl];
34426                           properties.styleHash = styleIndex[styleMapIndex[styleUrl].normal];
34427                       }
34428                       // Try to populate the lineStyle or polyStyle since we got the style hash
34429                       var style = styleByHash[properties.styleHash];
34430                       if (style) {
34431                           if (!lineStyle) lineStyle = get1(style, 'LineStyle');
34432                           if (!polyStyle) polyStyle = get1(style, 'PolyStyle');
34433                       }
34434                   }
34435                   if (description) properties.description = description;
34436                   if (timeSpan) {
34437                       var begin = nodeVal(get1(timeSpan, 'begin'));
34438                       var end = nodeVal(get1(timeSpan, 'end'));
34439                       properties.timespan = { begin: begin, end: end };
34440                   }
34441                   if (timeStamp) {
34442                       properties.timestamp = nodeVal(get1(timeStamp, 'when'));
34443                   }
34444                   if (lineStyle) {
34445                       var linestyles = kmlColor(nodeVal(get1(lineStyle, 'color'))),
34446                           color = linestyles[0],
34447                           opacity = linestyles[1],
34448                           width = parseFloat(nodeVal(get1(lineStyle, 'width')));
34449                       if (color) properties.stroke = color;
34450                       if (!isNaN(opacity)) properties['stroke-opacity'] = opacity;
34451                       if (!isNaN(width)) properties['stroke-width'] = width;
34452                   }
34453                   if (polyStyle) {
34454                       var polystyles = kmlColor(nodeVal(get1(polyStyle, 'color'))),
34455                           pcolor = polystyles[0],
34456                           popacity = polystyles[1],
34457                           fill = nodeVal(get1(polyStyle, 'fill')),
34458                           outline = nodeVal(get1(polyStyle, 'outline'));
34459                       if (pcolor) properties.fill = pcolor;
34460                       if (!isNaN(popacity)) properties['fill-opacity'] = popacity;
34461                       if (fill) properties['fill-opacity'] = fill === '1' ? properties['fill-opacity'] || 1 : 0;
34462                       if (outline) properties['stroke-opacity'] = outline === '1' ? properties['stroke-opacity'] || 1 : 0;
34463                   }
34464                   if (extendedData) {
34465                       var datas = get(extendedData, 'Data'),
34466                           simpleDatas = get(extendedData, 'SimpleData');
34467
34468                       for (i = 0; i < datas.length; i++) {
34469                           properties[datas[i].getAttribute('name')] = nodeVal(get1(datas[i], 'value'));
34470                       }
34471                       for (i = 0; i < simpleDatas.length; i++) {
34472                           properties[simpleDatas[i].getAttribute('name')] = nodeVal(simpleDatas[i]);
34473                       }
34474                   }
34475                   if (visibility) {
34476                       properties.visibility = nodeVal(visibility);
34477                   }
34478                   if (geomsAndTimes.coordTimes.length) {
34479                       properties.coordTimes = (geomsAndTimes.coordTimes.length === 1) ?
34480                           geomsAndTimes.coordTimes[0] : geomsAndTimes.coordTimes;
34481                   }
34482                   var feature = {
34483                       type: 'Feature',
34484                       geometry: (geomsAndTimes.geoms.length === 1) ? geomsAndTimes.geoms[0] : {
34485                           type: 'GeometryCollection',
34486                           geometries: geomsAndTimes.geoms
34487                       },
34488                       properties: properties
34489                   };
34490                   if (attr(root, 'id')) feature.id = attr(root, 'id');
34491                   return [feature];
34492               }
34493               return gj;
34494           },
34495           gpx: function(doc) {
34496               var i,
34497                   tracks = get(doc, 'trk'),
34498                   routes = get(doc, 'rte'),
34499                   waypoints = get(doc, 'wpt'),
34500                   // a feature collection
34501                   gj = fc(),
34502                   feature;
34503               for (i = 0; i < tracks.length; i++) {
34504                   feature = getTrack(tracks[i]);
34505                   if (feature) gj.features.push(feature);
34506               }
34507               for (i = 0; i < routes.length; i++) {
34508                   feature = getRoute(routes[i]);
34509                   if (feature) gj.features.push(feature);
34510               }
34511               for (i = 0; i < waypoints.length; i++) {
34512                   gj.features.push(getPoint(waypoints[i]));
34513               }
34514               function getPoints(node, pointname) {
34515                   var pts = get(node, pointname),
34516                       line = [],
34517                       times = [],
34518                       heartRates = [],
34519                       l = pts.length;
34520                   if (l < 2) return {};  // Invalid line in GeoJSON
34521                   for (var i = 0; i < l; i++) {
34522                       var c = coordPair(pts[i]);
34523                       line.push(c.coordinates);
34524                       if (c.time) times.push(c.time);
34525                       if (c.heartRate) heartRates.push(c.heartRate);
34526                   }
34527                   return {
34528                       line: line,
34529                       times: times,
34530                       heartRates: heartRates
34531                   };
34532               }
34533               function getTrack(node) {
34534                   var segments = get(node, 'trkseg'),
34535                       track = [],
34536                       times = [],
34537                       heartRates = [],
34538                       line;
34539                   for (var i = 0; i < segments.length; i++) {
34540                       line = getPoints(segments[i], 'trkpt');
34541                       if (line) {
34542                           if (line.line) track.push(line.line);
34543                           if (line.times && line.times.length) times.push(line.times);
34544                           if (line.heartRates && line.heartRates.length) heartRates.push(line.heartRates);
34545                       }
34546                   }
34547                   if (track.length === 0) return;
34548                   var properties = getProperties(node);
34549                   extend(properties, getLineStyle(get1(node, 'extensions')));
34550                   if (times.length) properties.coordTimes = track.length === 1 ? times[0] : times;
34551                   if (heartRates.length) properties.heartRates = track.length === 1 ? heartRates[0] : heartRates;
34552                   return {
34553                       type: 'Feature',
34554                       properties: properties,
34555                       geometry: {
34556                           type: track.length === 1 ? 'LineString' : 'MultiLineString',
34557                           coordinates: track.length === 1 ? track[0] : track
34558                       }
34559                   };
34560               }
34561               function getRoute(node) {
34562                   var line = getPoints(node, 'rtept');
34563                   if (!line.line) return;
34564                   var prop = getProperties(node);
34565                   extend(prop, getLineStyle(get1(node, 'extensions')));
34566                   var routeObj = {
34567                       type: 'Feature',
34568                       properties: prop,
34569                       geometry: {
34570                           type: 'LineString',
34571                           coordinates: line.line
34572                       }
34573                   };
34574                   return routeObj;
34575               }
34576               function getPoint(node) {
34577                   var prop = getProperties(node);
34578                   extend(prop, getMulti(node, ['sym']));
34579                   return {
34580                       type: 'Feature',
34581                       properties: prop,
34582                       geometry: {
34583                           type: 'Point',
34584                           coordinates: coordPair(node).coordinates
34585                       }
34586                   };
34587               }
34588               function getLineStyle(extensions) {
34589                   var style = {};
34590                   if (extensions) {
34591                       var lineStyle = get1(extensions, 'line');
34592                       if (lineStyle) {
34593                           var color = nodeVal(get1(lineStyle, 'color')),
34594                               opacity = parseFloat(nodeVal(get1(lineStyle, 'opacity'))),
34595                               width = parseFloat(nodeVal(get1(lineStyle, 'width')));
34596                           if (color) style.stroke = color;
34597                           if (!isNaN(opacity)) style['stroke-opacity'] = opacity;
34598                           // GPX width is in mm, convert to px with 96 px per inch
34599                           if (!isNaN(width)) style['stroke-width'] = width * 96 / 25.4;
34600                       }
34601                   }
34602                   return style;
34603               }
34604               function getProperties(node) {
34605                   var prop = getMulti(node, ['name', 'cmt', 'desc', 'type', 'time', 'keywords']),
34606                       links = get(node, 'link');
34607                   if (links.length) prop.links = [];
34608                   for (var i = 0, link; i < links.length; i++) {
34609                       link = { href: attr(links[i], 'href') };
34610                       extend(link, getMulti(links[i], ['text', 'type']));
34611                       prop.links.push(link);
34612                   }
34613                   return prop;
34614               }
34615               return gj;
34616           }
34617       };
34618       return t;
34619   })();
34620
34621   module.exports = toGeoJSON;
34622   });
34623
34624   var _initialized = false;
34625   var _enabled = false;
34626   var _geojson;
34627
34628
34629   function svgData$$1(projection$$1, context, dispatch) {
34630       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
34631       var _showLabels = true;
34632       var detected = utilDetect();
34633       var layer = select(null);
34634       var _vtService;
34635       var _fileList;
34636       var _template;
34637       var _src;
34638
34639
34640       function init() {
34641           if (_initialized) return;  // run once
34642
34643           _geojson = {};
34644           _enabled = true;
34645
34646           function over() {
34647               event.stopPropagation();
34648               event.preventDefault();
34649               event.dataTransfer.dropEffect = 'copy';
34650           }
34651
34652           select('body')
34653               .attr('dropzone', 'copy')
34654               .on('drop.svgData', function() {
34655                   event.stopPropagation();
34656                   event.preventDefault();
34657                   if (!detected.filedrop) return;
34658                   drawData.fileList(event.dataTransfer.files);
34659               })
34660               .on('dragenter.svgData', over)
34661               .on('dragexit.svgData', over)
34662               .on('dragover.svgData', over);
34663
34664           _initialized = true;
34665       }
34666
34667
34668       function getService() {
34669           if (services.vectorTile && !_vtService) {
34670               _vtService = services.vectorTile;
34671               _vtService.event.on('loadedData', throttledRedraw);
34672           } else if (!services.vectorTile && _vtService) {
34673               _vtService = null;
34674           }
34675
34676           return _vtService;
34677       }
34678
34679
34680       function showLayer() {
34681           layerOn();
34682
34683           layer
34684               .style('opacity', 0)
34685               .transition()
34686               .duration(250)
34687               .style('opacity', 1)
34688               .on('end', function () { dispatch.call('change'); });
34689       }
34690
34691
34692       function hideLayer() {
34693           throttledRedraw.cancel();
34694
34695           layer
34696               .transition()
34697               .duration(250)
34698               .style('opacity', 0)
34699               .on('end', layerOff);
34700       }
34701
34702
34703       function layerOn() {
34704           layer.style('display', 'block');
34705       }
34706
34707
34708       function layerOff() {
34709           layer.selectAll('.viewfield-group').remove();
34710           layer.style('display', 'none');
34711       }
34712
34713
34714       // ensure that all geojson features in a collection have IDs
34715       function ensureIDs(gj) {
34716           if (!gj) return null;
34717
34718           if (gj.type === 'FeatureCollection') {
34719               for (var i = 0; i < gj.features.length; i++) {
34720                   ensureFeatureID(gj.features[i]);
34721               }
34722           } else {
34723               ensureFeatureID(gj);
34724           }
34725           return gj;
34726       }
34727
34728
34729       // ensure that each single Feature object has a unique ID
34730       function ensureFeatureID(feature) {
34731           if (!feature) return;
34732           feature.__featurehash__ = utilHashcode(fastJsonStableStringify(feature));
34733           return feature;
34734       }
34735
34736
34737       // Prefer an array of Features instead of a FeatureCollection
34738       function getFeatures(gj) {
34739           if (!gj) return [];
34740
34741           if (gj.type === 'FeatureCollection') {
34742               return gj.features;
34743           } else {
34744               return [gj];
34745           }
34746       }
34747
34748
34749       function featureKey(d) {
34750           return d.__featurehash__;
34751       }
34752
34753
34754       function isPolygon(d) {
34755           return d.geometry.type === 'Polygon' || d.geometry.type === 'MultiPolygon';
34756       }
34757
34758
34759       function clipPathID(d) {
34760           return 'data-' + d.__featurehash__ + '-clippath';
34761       }
34762
34763
34764       function featureClasses(d) {
34765           return [
34766               'data' + d.__featurehash__,
34767               d.geometry.type,
34768               isPolygon(d) ? 'area' : '',
34769               d.__layerID__ || ''
34770           ].filter(Boolean).join(' ');
34771       }
34772
34773
34774       function drawData(selection$$1) {
34775           var vtService = getService();
34776           var getPath = svgPath(projection$$1).geojson;
34777           var getAreaPath = svgPath(projection$$1, null, true).geojson;
34778           var hasData = drawData.hasData();
34779
34780           layer = selection$$1.selectAll('.layer-mapdata')
34781               .data(_enabled && hasData ? [0] : []);
34782
34783           layer.exit()
34784               .remove();
34785
34786           layer = layer.enter()
34787               .append('g')
34788               .attr('class', 'layer-mapdata')
34789               .merge(layer);
34790
34791           var surface = context.surface();
34792           if (!surface || surface.empty()) return;  // not ready to draw yet, starting up
34793
34794
34795           // Gather data
34796           var geoData, polygonData;
34797           if (_template && vtService) {   // fetch data from vector tile service
34798               var sourceID = _template;
34799               vtService.loadTiles(sourceID, _template, projection$$1);
34800               geoData = vtService.data(sourceID, projection$$1);
34801           } else {
34802               geoData = getFeatures(_geojson);
34803           }
34804           geoData = geoData.filter(getPath);
34805           polygonData = geoData.filter(isPolygon);
34806
34807
34808           // Draw clip paths for polygons
34809           var clipPaths = surface.selectAll('defs').selectAll('.clipPath-data')
34810              .data(polygonData, featureKey);
34811
34812           clipPaths.exit()
34813              .remove();
34814
34815           var clipPathsEnter = clipPaths.enter()
34816              .append('clipPath')
34817              .attr('class', 'clipPath-data')
34818              .attr('id', clipPathID);
34819
34820           clipPathsEnter
34821              .append('path');
34822
34823           clipPaths.merge(clipPathsEnter)
34824              .selectAll('path')
34825              .attr('d', getAreaPath);
34826
34827
34828           // Draw fill, shadow, stroke layers
34829           var datagroups = layer
34830               .selectAll('g.datagroup')
34831               .data(['fill', 'shadow', 'stroke']);
34832
34833           datagroups = datagroups.enter()
34834               .append('g')
34835               .attr('class', function(d) { return 'datagroup datagroup-' + d; })
34836               .merge(datagroups);
34837
34838
34839           // Draw paths
34840           var pathData = {
34841               fill: polygonData,
34842               shadow: geoData,
34843               stroke: geoData
34844           };
34845
34846           var paths = datagroups
34847               .selectAll('path')
34848               .data(function(layer) { return pathData[layer]; }, featureKey);
34849
34850           // exit
34851           paths.exit()
34852               .remove();
34853
34854           // enter/update
34855           paths = paths.enter()
34856               .append('path')
34857               .attr('class', function(d) {
34858                   var datagroup = this.parentNode.__data__;
34859                   return 'pathdata ' + datagroup + ' ' + featureClasses(d);
34860               })
34861               .attr('clip-path', function(d) {
34862                   var datagroup = this.parentNode.__data__;
34863                   return datagroup === 'fill' ? ('url(#' + clipPathID(d) + ')') : null;
34864               })
34865               .merge(paths)
34866               .attr('d', function(d) {
34867                   var datagroup = this.parentNode.__data__;
34868                   return datagroup === 'fill' ? getAreaPath(d) : getPath(d);
34869               });
34870
34871
34872           // Draw labels
34873           layer
34874               .call(drawLabels, 'label-halo', geoData)
34875               .call(drawLabels, 'label', geoData);
34876
34877
34878           function drawLabels(selection$$1, textClass, data) {
34879               var labelPath = d3_geoPath(projection$$1);
34880               var labelData = data.filter(function(d) {
34881                   return _showLabels && d.properties && (d.properties.desc || d.properties.name);
34882               });
34883
34884               var labels = selection$$1.selectAll('text.' + textClass)
34885                   .data(labelData, featureKey);
34886
34887               // exit
34888               labels.exit()
34889                   .remove();
34890
34891               // enter/update
34892               labels = labels.enter()
34893                   .append('text')
34894                   .attr('class', function(d) { return textClass + ' ' + featureClasses(d); })
34895                   .merge(labels)
34896                   .text(function(d) {
34897                       return d.properties.desc || d.properties.name;
34898                   })
34899                   .attr('x', function(d) {
34900                       var centroid = labelPath.centroid(d);
34901                       return centroid[0] + 11;
34902                   })
34903                   .attr('y', function(d) {
34904                       var centroid = labelPath.centroid(d);
34905                       return centroid[1];
34906                   });
34907           }
34908       }
34909
34910
34911       function getExtension(fileName) {
34912           if (!fileName) return;
34913
34914           var re = /\.(gpx|kml|(geo)?json)$/i;
34915           var match = fileName.toLowerCase().match(re);
34916           return match && match.length && match[0];
34917       }
34918
34919
34920       function xmlToDom(textdata) {
34921           return (new DOMParser()).parseFromString(textdata, 'text/xml');
34922       }
34923
34924
34925       drawData.setFile = function(extension, data) {
34926           _template = null;
34927           _fileList = null;
34928           _geojson = null;
34929           _src = null;
34930
34931           var gj;
34932           switch (extension) {
34933               case '.gpx':
34934                   gj = togeojson.gpx(xmlToDom(data));
34935                   break;
34936               case '.kml':
34937                   gj = togeojson.kml(xmlToDom(data));
34938                   break;
34939               case '.geojson':
34940               case '.json':
34941                   gj = JSON.parse(data);
34942                   break;
34943           }
34944
34945           if (!isEmpty(gj)) {
34946               _geojson = ensureIDs(gj);
34947               _src = extension + ' data file';
34948               this.fitZoom();
34949           }
34950
34951           dispatch.call('change');
34952           return this;
34953       };
34954
34955
34956       drawData.showLabels = function(val) {
34957           if (!arguments.length) return _showLabels;
34958
34959           _showLabels = val;
34960           return this;
34961       };
34962
34963
34964       drawData.enabled = function(val) {
34965           if (!arguments.length) return _enabled;
34966
34967           _enabled = val;
34968           if (_enabled) {
34969               showLayer();
34970           } else {
34971               hideLayer();
34972           }
34973
34974           dispatch.call('change');
34975           return this;
34976       };
34977
34978
34979       drawData.hasData = function() {
34980           return !!(_template || !isEmpty(_geojson));
34981       };
34982
34983
34984       drawData.template = function(val, src) {
34985           if (!arguments.length) return _template;
34986
34987           // test source against OSM imagery blacklists..
34988           var osm = context.connection();
34989           if (osm) {
34990               var blacklists = osm.imageryBlacklists();
34991               var fail = false;
34992               var tested = 0;
34993               var regex;
34994
34995               for (var i = 0; i < blacklists.length; i++) {
34996                   try {
34997                       regex = new RegExp(blacklists[i]);
34998                       fail = regex.test(val);
34999                       tested++;
35000                       if (fail) break;
35001                   } catch (e) {
35002                       /* noop */
35003                   }
35004               }
35005
35006               // ensure at least one test was run.
35007               if (!tested) {
35008                   regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
35009                   fail = regex.test(val);
35010               }
35011           }
35012
35013           _template = val;
35014           _fileList = null;
35015           _geojson = null;
35016
35017           // strip off the querystring/hash from the template,
35018           // it often includes the access token
35019           _src = src || ('vectortile:' + val.split(/[?#]/)[0]);
35020
35021           dispatch.call('change');
35022           return this;
35023       };
35024
35025
35026       drawData.geojson = function(gj, src) {
35027           if (!arguments.length) return _geojson;
35028
35029           _template = null;
35030           _fileList = null;
35031           _geojson = null;
35032           _src = null;
35033
35034           if (!isEmpty(gj)) {
35035               _geojson = ensureIDs(gj);
35036               _src = src || 'unknown.geojson';
35037           }
35038
35039           dispatch.call('change');
35040           return this;
35041       };
35042
35043
35044       drawData.fileList = function(fileList) {
35045           if (!arguments.length) return _fileList;
35046
35047           _template = null;
35048           _fileList = fileList;
35049           _geojson = null;
35050           _src = null;
35051
35052           if (!fileList || !fileList.length) return this;
35053           var f = fileList[0];
35054           var extension = getExtension(f.name);
35055           var reader = new FileReader();
35056           reader.onload = (function() {
35057               return function(e) {
35058                   drawData.setFile(extension, e.target.result);
35059               };
35060           })(f);
35061
35062           reader.readAsText(f);
35063
35064           return this;
35065       };
35066
35067
35068       drawData.url = function(url, defaultExtension) {
35069           _template = null;
35070           _fileList = null;
35071           _geojson = null;
35072           _src = null;
35073
35074           // strip off any querystring/hash from the url before checking extension
35075           var testUrl = url.split(/[?#]/)[0];
35076           var extension = getExtension(testUrl) || defaultExtension;
35077           if (extension) {
35078               _template = null;
35079               d3_text(url, function(err, data) {
35080                   if (err) return;
35081                   drawData.setFile(extension, data);
35082               });
35083           } else {
35084               drawData.template(url);
35085           }
35086
35087           return this;
35088       };
35089
35090
35091       drawData.getSrc = function() {
35092           return _src || '';
35093       };
35094
35095
35096       drawData.fitZoom = function() {
35097           var features = getFeatures(_geojson);
35098           if (!features.length) return;
35099
35100           var map = context.map();
35101           var viewport = map.trimmedExtent().polygon();
35102           var coords = reduce(features, function(coords, feature) {
35103               var c = feature.geometry.coordinates;
35104
35105               /* eslint-disable no-fallthrough */
35106               switch (feature.geometry.type) {
35107                   case 'Point':
35108                       c = [c];
35109                   case 'MultiPoint':
35110                   case 'LineString':
35111                       break;
35112
35113                   case 'MultiPolygon':
35114                       c = flatten(c);
35115                   case 'Polygon':
35116                   case 'MultiLineString':
35117                       c = flatten(c);
35118                       break;
35119               }
35120               /* eslint-enable no-fallthrough */
35121
35122               return union(coords, c);
35123           }, []);
35124
35125           if (!geoPolygonIntersectsPolygon(viewport, coords, true)) {
35126               var extent = geoExtent$$1(d3_geoBounds({ type: 'LineString', coordinates: coords }));
35127               map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
35128           }
35129
35130           return this;
35131       };
35132
35133
35134       init();
35135       return drawData;
35136   }
35137
35138   function svgDebug$$1(projection, context) {
35139
35140       function drawDebug(selection$$1) {
35141           var showsTile = context.getDebug('tile');
35142           var showsCollision = context.getDebug('collision');
35143           var showsImagery = context.getDebug('imagery');
35144           var showsCommunity = context.getDebug('community');
35145           var showsImperial = context.getDebug('imperial');
35146           var showsDriveLeft = context.getDebug('driveLeft');
35147           var showsTouchTargets = context.getDebug('target');
35148
35149           var debugData = [];
35150           if (showsTile) {
35151               debugData.push({ class: 'red', label: 'tile' });
35152           }
35153           if (showsCollision) {
35154               debugData.push({ class: 'yellow', label: 'collision' });
35155           }
35156           if (showsImagery) {
35157               debugData.push({ class: 'orange', label: 'imagery' });
35158           }
35159           if (showsCommunity) {
35160               debugData.push({ class: 'blue', label: 'community' });
35161           }
35162           if (showsImperial) {
35163               debugData.push({ class: 'cyan', label: 'imperial' });
35164           }
35165           if (showsDriveLeft) {
35166               debugData.push({ class: 'green', label: 'driveLeft' });
35167           }
35168           if (showsTouchTargets) {
35169               debugData.push({ class: 'pink', label: 'touchTargets' });
35170           }
35171
35172
35173           var legend = select('#content')
35174               .selectAll('.debug-legend')
35175               .data(debugData.length ? [0] : []);
35176
35177           legend.exit()
35178               .remove();
35179
35180           legend = legend.enter()
35181               .append('div')
35182               .attr('class', 'fillD debug-legend')
35183               .merge(legend);
35184
35185
35186           var legendItems = legend.selectAll('.debug-legend-item')
35187               .data(debugData, function(d) { return d.label; });
35188
35189           legendItems.exit()
35190               .remove();
35191
35192           legendItems.enter()
35193               .append('span')
35194               .attr('class', function(d) { return 'debug-legend-item ' + d.class; })
35195               .text(function(d) { return d.label; });
35196
35197
35198           var layer = selection$$1.selectAll('.layer-debug')
35199               .data(showsImagery || showsCommunity || showsImperial || showsDriveLeft ? [0] : []);
35200
35201           layer.exit()
35202               .remove();
35203
35204           layer = layer.enter()
35205               .append('g')
35206               .attr('class', 'layer-debug')
35207               .merge(layer);
35208
35209
35210           var extent = context.map().extent();
35211           var matchImagery = (showsImagery && data.imagery.query.bbox(extent.rectangle(), true)) || [];
35212           var features = matchImagery.map(function(d) { return data.imagery.features[d.id]; });
35213
35214           var imagery = layer.selectAll('path.debug-imagery')
35215               .data(features);
35216
35217           imagery.exit()
35218               .remove();
35219
35220           imagery.enter()
35221               .append('path')
35222               .attr('class', 'debug-imagery debug orange');
35223
35224
35225           var community = layer.selectAll('path.debug-community')
35226               .data(showsCommunity ? values$1(data.community.features) : []);
35227
35228           community.exit()
35229               .remove();
35230
35231           community.enter()
35232               .append('path')
35233               .attr('class', 'debug-community debug blue');
35234
35235
35236           var imperial = layer
35237               .selectAll('path.debug-imperial')
35238               .data(showsImperial ? [dataImperial] : []);
35239
35240           imperial.exit()
35241               .remove();
35242
35243           imperial.enter()
35244               .append('path')
35245               .attr('class', 'debug-imperial debug cyan');
35246
35247
35248           var driveLeft = layer
35249               .selectAll('path.debug-drive-left')
35250               .data(showsDriveLeft ? [dataDriveLeft] : []);
35251
35252           driveLeft.exit()
35253               .remove();
35254
35255           driveLeft.enter()
35256               .append('path')
35257               .attr('class', 'debug-drive-left debug green');
35258
35259
35260           // update
35261           layer.selectAll('path')
35262               .attr('d', svgPath(projection).geojson);
35263       }
35264
35265
35266       // This looks strange because `enabled` methods on other layers are
35267       // chainable getter/setters, and this one is just a getter.
35268       drawDebug.enabled = function() {
35269           if (!arguments.length) {
35270               return context.getDebug('tile') ||
35271                   context.getDebug('collision') ||
35272                   context.getDebug('imagery') ||
35273                   context.getDebug('imperial') ||
35274                   context.getDebug('driveLeft') ||
35275                   context.getDebug('target');
35276           } else {
35277               return this;
35278           }
35279       };
35280
35281
35282       return drawDebug;
35283   }
35284
35285   /*
35286       A standalone SVG element that contains only a `defs` sub-element. To be
35287       used once globally, since defs IDs must be unique within a document.
35288   */
35289   function svgDefs(context) {
35290
35291       function drawDefs(selection$$1) {
35292           var defs = selection$$1.append('defs');
35293
35294           // add markers
35295           defs
35296               .append('marker')
35297               .attr('id', 'oneway-marker')
35298               .attr('viewBox', '0 0 10 5')
35299               .attr('refX', 2.5)
35300               .attr('refY', 2.5)
35301               .attr('markerWidth', 2)
35302               .attr('markerHeight', 2)
35303               .attr('markerUnits', 'strokeWidth')
35304               .attr('orient', 'auto')
35305               .append('path')
35306               .attr('class', 'oneway-marker-path')
35307               .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')
35308               .attr('stroke', 'none')
35309               .attr('fill', '#000')
35310               .attr('opacity', '0.75');
35311
35312           // SVG markers have to be given a colour where they're defined
35313           // (they can't inherit it from the line they're attached to),
35314           // so we need to manually define markers for each color of tag
35315           // (also, it's slightly nicer if we can control the
35316           // positioning for different tags)
35317           function addSidedMarker(name, color, offset) {
35318               defs
35319                   .append('marker')
35320                   .attr('id', 'sided-marker-' + name)
35321                   .attr('viewBox', '0 0 2 2')
35322                   .attr('refX', 1)
35323                   .attr('refY', -offset)
35324                   .attr('markerWidth', 1.5)
35325                   .attr('markerHeight', 1.5)
35326                   .attr('markerUnits', 'strokeWidth')
35327                   .attr('orient', 'auto')
35328                   .append('path')
35329                   .attr('class', 'sided-marker-path sided-marker-' + name + '-path')
35330                   .attr('d', 'M 0,0 L 1,1 L 2,0 z')
35331                   .attr('stroke', 'none')
35332                   .attr('fill', color);
35333           }
35334           addSidedMarker('natural', 'rgb(140, 208, 95)', 0);
35335           // for a coastline, the arrows are (somewhat unintuitively) on
35336           // the water side, so let's color them blue (with a gap) to
35337           // give a stronger indication
35338           addSidedMarker('coastline', '#77dede', 1);
35339           // barriers have a dashed line, and separating the triangle
35340           // from the line visually suits that
35341           addSidedMarker('barrier', '#ddd', 1);
35342           addSidedMarker('man_made', '#fff', 0);
35343
35344           defs
35345               .append('marker')
35346               .attr('id', 'viewfield-marker')
35347               .attr('viewBox', '0 0 16 16')
35348               .attr('refX', 8)
35349               .attr('refY', 16)
35350               .attr('markerWidth', 4)
35351               .attr('markerHeight', 4)
35352               .attr('markerUnits', 'strokeWidth')
35353               .attr('orient', 'auto')
35354               .append('path')
35355               .attr('class', 'viewfield-marker-path')
35356               .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')
35357               .attr('fill', '#333')
35358               .attr('fill-opacity', '0.75')
35359               .attr('stroke', '#fff')
35360               .attr('stroke-width', '0.5px')
35361               .attr('stroke-opacity', '0.75');
35362
35363           defs
35364               .append('marker')
35365               .attr('id', 'viewfield-marker-wireframe')
35366               .attr('viewBox', '0 0 16 16')
35367               .attr('refX', 8)
35368               .attr('refY', 16)
35369               .attr('markerWidth', 4)
35370               .attr('markerHeight', 4)
35371               .attr('markerUnits', 'strokeWidth')
35372               .attr('orient', 'auto')
35373               .append('path')
35374               .attr('class', 'viewfield-marker-path')
35375               .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')
35376               .attr('fill', 'none')
35377               .attr('stroke', '#fff')
35378               .attr('stroke-width', '0.5px')
35379               .attr('stroke-opacity', '0.75');
35380
35381           // add patterns
35382           var patterns = defs.selectAll('pattern')
35383               .data([
35384                   // pattern name, pattern image name
35385                   ['beach', 'dots'],
35386                   ['construction', 'construction'],
35387                   ['cemetery', 'cemetery'],
35388                   ['cemetery_christian', 'cemetery_christian'],
35389                   ['cemetery_buddhist', 'cemetery_buddhist'],
35390                   ['cemetery_muslim', 'cemetery_muslim'],
35391                   ['cemetery_jewish', 'cemetery_jewish'],
35392                   ['farmland', 'farmland'],
35393                   ['farmyard', 'farmyard'],
35394                   ['forest', 'forest'],
35395                   ['forest_broadleaved', 'forest_broadleaved'],
35396                   ['forest_needleleaved', 'forest_needleleaved'],
35397                   ['forest_leafless', 'forest_leafless'],
35398                   ['grass', 'grass'],
35399                   ['landfill', 'landfill'],
35400                   ['meadow', 'grass'],
35401                   ['orchard', 'orchard'],
35402                   ['pond', 'pond'],
35403                   ['quarry', 'quarry'],
35404                   ['scrub', 'bushes'],
35405                   ['vineyard', 'vineyard'],
35406                   ['water_standing', 'lines'],
35407                   ['waves', 'waves'],
35408                   ['wetland', 'wetland'],
35409                   ['wetland_marsh', 'wetland_marsh'],
35410                   ['wetland_swamp', 'wetland_swamp'],
35411                   ['wetland_bog', 'wetland_bog'],
35412                   ['wetland_reedbed', 'wetland_reedbed']
35413               ])
35414               .enter()
35415               .append('pattern')
35416               .attr('id', function (d) { return 'pattern-' + d[0]; })
35417               .attr('width', 32)
35418               .attr('height', 32)
35419               .attr('patternUnits', 'userSpaceOnUse');
35420
35421           patterns
35422               .append('rect')
35423               .attr('x', 0)
35424               .attr('y', 0)
35425               .attr('width', 32)
35426               .attr('height', 32)
35427               .attr('class', function (d) { return 'pattern-color-' + d[0]; });
35428
35429           patterns
35430               .append('image')
35431               .attr('x', 0)
35432               .attr('y', 0)
35433               .attr('width', 32)
35434               .attr('height', 32)
35435               .attr('xlink:href', function (d) {
35436                   return context.imagePath('pattern/' + d[1] + '.png');
35437               });
35438
35439           // add clip paths
35440           defs.selectAll('clipPath')
35441               .data([12, 18, 20, 32, 45])
35442               .enter()
35443               .append('clipPath')
35444               .attr('id', function (d) { return 'clip-square-' + d; })
35445               .append('rect')
35446               .attr('x', 0)
35447               .attr('y', 0)
35448               .attr('width', function (d) { return d; })
35449               .attr('height', function (d) { return d; });
35450
35451           // add symbol spritesheets
35452           defs
35453               .call(drawDefs.addSprites, [
35454                   'iD-sprite', 'maki-sprite', 'temaki-sprite', 'fa-sprite', 'community-sprite'
35455               ]);
35456       }
35457
35458
35459       drawDefs.addSprites = function(selection$$1, ids) {
35460           var spritesheets = selection$$1.selectAll('.spritesheet');
35461           var currData = spritesheets.data();
35462           var data = uniq(currData.concat(ids));
35463
35464           spritesheets
35465               .data(data)
35466               .enter()
35467               .append('g')
35468               .attr('class', function(d) { return 'spritesheet spritesheet-' + d; })
35469               .each(function(d) {
35470                   var url = context.imagePath(d + '.svg');
35471                   var node = select(this).node();
35472                   request(url)
35473                       .mimeType('image/svg+xml')
35474                       .response(function(xhr) { return xhr.responseXML; })
35475                       .get(function(err, svg) {
35476                           if (err) return;
35477                           node.appendChild(
35478                               select(svg.documentElement).attr('id', d).node()
35479                           );
35480                       });
35481               });
35482       };
35483
35484
35485       return drawDefs;
35486   }
35487
35488   function behaviorEdit(context) {
35489
35490       function behavior() {
35491           context.map()
35492               .minzoom(context.minEditableZoom());
35493       }
35494
35495
35496       behavior.off = function() {
35497           context.map()
35498               .minzoom(0);
35499       };
35500
35501       return behavior;
35502   }
35503
35504   /*
35505      The hover behavior adds the `.hover` class on mouseover to all elements to which
35506      the identical datum is bound, and removes it on mouseout.
35507
35508      The :hover pseudo-class is insufficient for iD's purposes because a datum's visual
35509      representation may consist of several elements scattered throughout the DOM hierarchy.
35510      Only one of these elements can have the :hover pseudo-class, but all of them will
35511      have the .hover class.
35512    */
35513   function behaviorHover(context) {
35514       var dispatch$$1 = dispatch('hover');
35515       var _selection = select(null);
35516       var _newId = null;
35517       var _buttonDown;
35518       var _altDisables;
35519       var _target;
35520
35521
35522       function keydown() {
35523           if (_altDisables && event.keyCode === utilKeybinding.modifierCodes.alt) {
35524               _selection.selectAll('.hover')
35525                   .classed('hover-suppressed', true)
35526                   .classed('hover', false);
35527
35528               _selection
35529                   .classed('hover-disabled', true);
35530
35531               dispatch$$1.call('hover', this, null);
35532           }
35533       }
35534
35535
35536       function keyup() {
35537           if (_altDisables && event.keyCode === utilKeybinding.modifierCodes.alt) {
35538               _selection.selectAll('.hover-suppressed')
35539                   .classed('hover-suppressed', false)
35540                   .classed('hover', true);
35541
35542               _selection
35543                   .classed('hover-disabled', false);
35544
35545               dispatch$$1.call('hover', this, _target ? _target.id : null);
35546           }
35547       }
35548
35549
35550       function behavior(selection$$1) {
35551           _selection = selection$$1;
35552           _newId = null;
35553
35554           _selection
35555               .on('mouseover.hover', mouseover)
35556               .on('mouseout.hover', mouseout)
35557               .on('mousedown.hover', mousedown);
35558
35559           select(window)
35560               .on('keydown.hover', keydown)
35561               .on('keyup.hover', keyup);
35562
35563
35564           function mouseover() {
35565               if (_buttonDown) return;
35566               var target = event.target;
35567               enter(target ? target.__data__ : null);
35568           }
35569
35570
35571           function mouseout() {
35572               if (_buttonDown) return;
35573               var target = event.relatedTarget;
35574               enter(target ? target.__data__ : null);
35575           }
35576
35577
35578           function mousedown() {
35579               _buttonDown = true;
35580               select(window)
35581                   .on('mouseup.hover', mouseup, true);
35582           }
35583
35584
35585           function mouseup() {
35586               _buttonDown = false;
35587               select(window)
35588                   .on('mouseup.hover', null, true);
35589           }
35590
35591
35592           function enter(datum) {
35593               if (datum === _target) return;
35594               _target = datum;
35595
35596               _selection.selectAll('.hover')
35597                   .classed('hover', false);
35598               _selection.selectAll('.hover-suppressed')
35599                   .classed('hover-suppressed', false);
35600
35601               // What are we hovering over?
35602               var entity, selector$$1;
35603               if (datum && datum.__featurehash__) {
35604                   entity = datum;
35605                   selector$$1 = '.data' + datum.__featurehash__;
35606
35607               } else if (datum instanceof krError) {
35608                   entity = datum;
35609                   selector$$1 = '.kr_error-' + datum.id;
35610
35611               } else if (datum instanceof osmNote) {
35612                   entity = datum;
35613                   selector$$1 = '.note-' + datum.id;
35614
35615               } else if (datum instanceof osmEntity$$1) {
35616                   entity = datum;
35617                   selector$$1 = '.' + entity.id;
35618                   if (entity.type === 'relation') {
35619                       entity.members.forEach(function(member) { selector$$1 += ', .' + member.id; });
35620                   }
35621
35622               } else if (datum && datum.properties && (datum.properties.entity instanceof osmEntity$$1)) {
35623                   entity = datum.properties.entity;
35624                   selector$$1 = '.' + entity.id;
35625                   if (entity.type === 'relation') {
35626                       entity.members.forEach(function(member) { selector$$1 += ', .' + member.id; });
35627                   }
35628               }
35629
35630               // Update hover state and dispatch event
35631               if (entity && entity.id !== _newId) {
35632                   // If drawing a way, don't hover on a node that was just placed. #3974
35633                   var mode = context.mode() && context.mode().id;
35634                   if ((mode === 'draw-line' || mode === 'draw-area') && !_newId && entity.type === 'node') {
35635                       _newId = entity.id;
35636                       return;
35637                   }
35638
35639                   var suppressed = _altDisables && event && event.altKey;
35640                   _selection.selectAll(selector$$1)
35641                       .classed(suppressed ? 'hover-suppressed' : 'hover', true);
35642
35643                   dispatch$$1.call('hover', this, !suppressed && entity);
35644
35645               } else {
35646                   dispatch$$1.call('hover', this, null);
35647               }
35648           }
35649       }
35650
35651
35652       behavior.off = function(selection$$1) {
35653           selection$$1.selectAll('.hover')
35654               .classed('hover', false);
35655           selection$$1.selectAll('.hover-suppressed')
35656               .classed('hover-suppressed', false);
35657           selection$$1
35658               .classed('hover-disabled', false);
35659
35660           selection$$1
35661               .on('mouseover.hover', null)
35662               .on('mouseout.hover', null)
35663               .on('mousedown.hover', null);
35664
35665           select(window)
35666               .on('keydown.hover', null)
35667               .on('keyup.hover', null);
35668       };
35669
35670
35671       behavior.altDisables = function(val) {
35672           if (!arguments.length) return _altDisables;
35673           _altDisables = val;
35674           return behavior;
35675       };
35676
35677
35678       return utilRebind(behavior, dispatch$$1, 'on');
35679   }
35680
35681   function refresh(selection, node) {
35682       var cr = node.getBoundingClientRect();
35683       var prop = [cr.width, cr.height];
35684       selection.property('__dimensions__', prop);
35685       return prop;
35686   }
35687
35688   function utilGetDimensions(selection, force) {
35689       if (!selection || selection.empty()) {
35690           return [0, 0];
35691       }
35692       var node = selection.node(),
35693           cached = selection.property('__dimensions__');
35694       return (!cached || force) ? refresh(selection, node) : cached;
35695   }
35696
35697
35698   function utilSetDimensions(selection, dimensions) {
35699       if (!selection || selection.empty()) {
35700           return selection;
35701       }
35702       var node = selection.node();
35703       if (dimensions === null) {
35704           refresh(selection, node);
35705           return selection;
35706       }
35707       return selection
35708           .property('__dimensions__', [dimensions[0], dimensions[1]])
35709           .attr('width', dimensions[0])
35710           .attr('height', dimensions[1]);
35711   }
35712
35713   function behaviorTail() {
35714       var container;
35715       var xmargin = 25;
35716       var tooltipSize = [0, 0];
35717       var selectionSize = [0, 0];
35718       var _text;
35719
35720
35721       function behavior(selection$$1) {
35722           if (!_text) return;
35723
35724           select(window)
35725               .on('resize.tail', function() { selectionSize = utilGetDimensions(selection$$1); });
35726
35727           container = select(document.body)
35728               .append('div')
35729               .style('display', 'none')
35730               .attr('class', 'tail tooltip-inner');
35731
35732           container.append('div')
35733               .text(_text);
35734
35735           selection$$1
35736               .on('mousemove.tail', mousemove)
35737               .on('mouseenter.tail', mouseenter)
35738               .on('mouseleave.tail', mouseleave);
35739
35740           container
35741               .on('mousemove.tail', mousemove);
35742
35743           tooltipSize = utilGetDimensions(container);
35744           selectionSize = utilGetDimensions(selection$$1);
35745
35746
35747           function show() {
35748               container.style('display', 'block');
35749               tooltipSize = utilGetDimensions(container);
35750           }
35751
35752
35753           function mousemove() {
35754               if (container.style('display') === 'none') show();
35755               var xoffset = ((event.clientX + tooltipSize[0] + xmargin) > selectionSize[0]) ?
35756                   -tooltipSize[0] - xmargin : xmargin;
35757               container.classed('left', xoffset > 0);
35758               utilSetTransform(container, event.clientX + xoffset, event.clientY);
35759           }
35760
35761
35762           function mouseleave() {
35763               if (event.relatedTarget !== container.node()) {
35764                   container.style('display', 'none');
35765               }
35766           }
35767
35768
35769           function mouseenter() {
35770               if (event.relatedTarget !== container.node()) {
35771                   show();
35772               }
35773           }
35774       }
35775
35776
35777       behavior.off = function(selection$$1) {
35778           if (!_text) return;
35779
35780           container
35781               .on('mousemove.tail', null)
35782               .remove();
35783
35784           selection$$1
35785               .on('mousemove.tail', null)
35786               .on('mouseenter.tail', null)
35787               .on('mouseleave.tail', null);
35788
35789           select(window)
35790               .on('resize.tail', null);
35791       };
35792
35793
35794       behavior.text = function(val) {
35795           if (!arguments.length) return _text;
35796           _text = val;
35797           return behavior;
35798       };
35799
35800
35801       return behavior;
35802   }
35803
35804   var _usedTails = {};
35805   var _disableSpace = false;
35806   var _lastSpace = null;
35807
35808
35809   function behaviorDraw(context) {
35810       var dispatch$$1 = dispatch(
35811           'move', 'click', 'clickWay', 'clickNode', 'undo', 'cancel', 'finish'
35812       );
35813
35814       var keybinding = utilKeybinding('draw');
35815
35816       var hover = behaviorHover(context).altDisables(true)
35817           .on('hover', context.ui().sidebar.hover);
35818       var tail = behaviorTail();
35819       var edit = behaviorEdit(context);
35820
35821       var closeTolerance = 4;
35822       var tolerance = 12;
35823       var _mouseLeave = false;
35824       var _lastMouse = null;
35825
35826
35827       // related code
35828       // - `mode/drag_node.js` `datum()`
35829       function datum() {
35830           var mode = context.mode();
35831           var isNote = mode && (mode.id.indexOf('note') !== -1);
35832           if (event.altKey || isNote) return {};
35833
35834           var element;
35835           if (event.type === 'keydown') {
35836               element = _lastMouse && _lastMouse.target;
35837           } else {
35838               element = event.target;
35839           }
35840
35841           // When drawing, snap only to touch targets..
35842           // (this excludes area fills and active drawing elements)
35843           var d = element.__data__;
35844           return (d && d.properties && d.properties.target) ? d : {};
35845       }
35846
35847
35848       function mousedown() {
35849
35850           function point$$1() {
35851               var p = context.container().node();
35852               return touchId !== null ? d3_touches(p).filter(function(p) {
35853                   return p.identifier === touchId;
35854               })[0] : mouse(p);
35855           }
35856
35857           var element = select(this);
35858           var touchId = event.touches ? event.changedTouches[0].identifier : null;
35859           var t1 = +new Date();
35860           var p1 = point$$1();
35861
35862           element.on('mousemove.draw', null);
35863
35864           select(window).on('mouseup.draw', function() {
35865               var t2 = +new Date();
35866               var p2 = point$$1();
35867               var dist = geoVecLength(p1, p2);
35868
35869               element.on('mousemove.draw', mousemove);
35870               select(window).on('mouseup.draw', null);
35871
35872               if (dist < closeTolerance || (dist < tolerance && (t2 - t1) < 500)) {
35873                   // Prevent a quick second click
35874                   select(window).on('click.draw-block', function() {
35875                       event.stopPropagation();
35876                   }, true);
35877
35878                   context.map().dblclickEnable(false);
35879
35880                   window.setTimeout(function() {
35881                       context.map().dblclickEnable(true);
35882                       select(window).on('click.draw-block', null);
35883                   }, 500);
35884
35885                   click();
35886               }
35887           }, true);
35888       }
35889
35890
35891       function mousemove() {
35892           _lastMouse = event;
35893           dispatch$$1.call('move', this, datum());
35894       }
35895
35896
35897       function mouseenter() {
35898           _mouseLeave = false;
35899       }
35900
35901
35902       function mouseleave() {
35903           _mouseLeave = true;
35904       }
35905
35906
35907       // related code
35908       // - `mode/drag_node.js`     `doMode()`
35909       // - `behavior/draw.js`      `click()`
35910       // - `behavior/draw_way.js`  `move()`
35911       function click() {
35912           var d = datum();
35913           var target = d && d.properties && d.properties.entity;
35914
35915           if (target && target.type === 'node') {   // Snap to a node
35916               dispatch$$1.call('clickNode', this, target, d);
35917               return;
35918
35919           } else if (target && target.type === 'way') {   // Snap to a way
35920               var choice = geoChooseEdge(
35921                   context.childNodes(target), context.mouse(), context.projection, context.activeID()
35922               );
35923               if (choice) {
35924                   var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]];
35925                   dispatch$$1.call('clickWay', this, choice.loc, edge, d);
35926                   return;
35927               }
35928           }
35929           dispatch$$1.call('click', this, context.map().mouseCoordinates(), d);
35930       }
35931
35932
35933       function space() {
35934           event.preventDefault();
35935           event.stopPropagation();
35936
35937           var currSpace = context.mouse();
35938           if (_disableSpace && _lastSpace) {
35939               var dist = geoVecLength(_lastSpace, currSpace);
35940               if (dist > tolerance) {
35941                   _disableSpace = false;
35942               }
35943           }
35944
35945           if (_disableSpace || _mouseLeave || !_lastMouse) return;
35946
35947           // user must move mouse or release space bar to allow another click
35948           _lastSpace = currSpace;
35949           _disableSpace = true;
35950
35951           select(window).on('keyup.space-block', function() {
35952               event.preventDefault();
35953               event.stopPropagation();
35954               _disableSpace = false;
35955               select(window).on('keyup.space-block', null);
35956           });
35957
35958           click();
35959       }
35960
35961
35962       function backspace() {
35963           event.preventDefault();
35964           dispatch$$1.call('undo');
35965       }
35966
35967
35968       function del() {
35969           event.preventDefault();
35970           dispatch$$1.call('cancel');
35971       }
35972
35973
35974       function ret() {
35975           event.preventDefault();
35976           dispatch$$1.call('finish');
35977       }
35978
35979
35980       function behavior(selection$$1) {
35981           context.install(hover);
35982           context.install(edit);
35983
35984           if (!context.inIntro() && !_usedTails[tail.text()]) {
35985               context.install(tail);
35986           }
35987
35988           keybinding
35989               .on('⌫', backspace)
35990               .on('⌦', del)
35991               .on('⎋', ret)
35992               .on('↩', ret)
35993               .on('space', space)
35994               .on('⌥space', space);
35995
35996           selection$$1
35997               .on('mouseenter.draw', mouseenter)
35998               .on('mouseleave.draw', mouseleave)
35999               .on('mousedown.draw', mousedown)
36000               .on('mousemove.draw', mousemove);
36001
36002           select(document)
36003               .call(keybinding);
36004
36005           return behavior;
36006       }
36007
36008
36009       behavior.off = function(selection$$1) {
36010           context.ui().sidebar.hover.cancel();
36011           context.uninstall(hover);
36012           context.uninstall(edit);
36013
36014           if (!context.inIntro() && !_usedTails[tail.text()]) {
36015               context.uninstall(tail);
36016               _usedTails[tail.text()] = true;
36017           }
36018
36019           selection$$1
36020               .on('mouseenter.draw', null)
36021               .on('mouseleave.draw', null)
36022               .on('mousedown.draw', null)
36023               .on('mousemove.draw', null);
36024
36025           select(window)
36026               .on('mouseup.draw', null);
36027               // note: keyup.space-block, click.draw-block should remain
36028
36029           select(document)
36030               .call(keybinding.unbind);
36031       };
36032
36033
36034       behavior.tail = function(_) {
36035           tail.text(_);
36036           return behavior;
36037       };
36038
36039
36040       return utilRebind(behavior, dispatch$$1, 'on');
36041   }
36042
36043   function behaviorAddWay(context) {
36044       var dispatch$$1 = dispatch('start', 'startFromWay', 'startFromNode');
36045       var draw = behaviorDraw(context);
36046
36047       function behavior(surface) {
36048           draw.on('click', function() { dispatch$$1.apply('start', this, arguments); })
36049               .on('clickWay', function() { dispatch$$1.apply('startFromWay', this, arguments); })
36050               .on('clickNode', function() { dispatch$$1.apply('startFromNode', this, arguments); })
36051               .on('cancel', behavior.cancel)
36052               .on('finish', behavior.cancel);
36053
36054           context.map()
36055               .dblclickEnable(false);
36056
36057           surface.call(draw);
36058       }
36059
36060
36061       behavior.off = function(surface) {
36062           surface.call(draw.off);
36063       };
36064
36065
36066       behavior.cancel = function() {
36067           window.setTimeout(function() {
36068               context.map().dblclickEnable(true);
36069           }, 1000);
36070
36071           context.enter(modeBrowse(context));
36072       };
36073
36074
36075       behavior.tail = function(text) {
36076           draw.tail(text);
36077           return behavior;
36078       };
36079
36080
36081       return utilRebind(behavior, dispatch$$1, 'on');
36082   }
36083
36084   /**
36085    * Performs a deep comparison between two values to determine if they are
36086    * equivalent.
36087    *
36088    * **Note:** This method supports comparing arrays, array buffers, booleans,
36089    * date objects, error objects, maps, numbers, `Object` objects, regexes,
36090    * sets, strings, symbols, and typed arrays. `Object` objects are compared
36091    * by their own, not inherited, enumerable properties. Functions and DOM
36092    * nodes are compared by strict equality, i.e. `===`.
36093    *
36094    * @static
36095    * @memberOf _
36096    * @since 0.1.0
36097    * @category Lang
36098    * @param {*} value The value to compare.
36099    * @param {*} other The other value to compare.
36100    * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
36101    * @example
36102    *
36103    * var object = { 'a': 1 };
36104    * var other = { 'a': 1 };
36105    *
36106    * _.isEqual(object, other);
36107    * // => true
36108    *
36109    * object === other;
36110    * // => false
36111    */
36112   function isEqual(value, other) {
36113     return baseIsEqual(value, other);
36114   }
36115
36116   function behaviorBreathe() {
36117       var duration = 800;
36118       var steps = 4;
36119       var selector$$1 = '.selected.shadow, .selected .shadow';
36120       var _selected = select(null);
36121       var _classed = '';
36122       var _params = {};
36123       var _done = false;
36124       var _timer;
36125
36126
36127       function ratchetyInterpolator(a, b, steps, units) {
36128           a = parseFloat(a);
36129           b = parseFloat(b);
36130           var sample = quantize()
36131               .domain([0, 1])
36132               .range(d3_quantize(interpolateNumber(a, b), steps));
36133
36134           return function(t) {
36135               return String(sample(t)) + (units || '');
36136           };
36137       }
36138
36139
36140       function reset(selection$$1) {
36141           selection$$1
36142               .style('stroke-opacity', null)
36143               .style('stroke-width', null)
36144               .style('fill-opacity', null)
36145               .style('r', null);
36146       }
36147
36148
36149       function setAnimationParams(transition, fromTo) {
36150           var toFrom = (fromTo === 'from' ? 'to' : 'from');
36151
36152           transition
36153               .styleTween('stroke-opacity', function(d) {
36154                   return ratchetyInterpolator(
36155                       _params[d.id][toFrom].opacity,
36156                       _params[d.id][fromTo].opacity,
36157                       steps
36158                   );
36159               })
36160               .styleTween('stroke-width', function(d) {
36161                   return ratchetyInterpolator(
36162                       _params[d.id][toFrom].width,
36163                       _params[d.id][fromTo].width,
36164                       steps,
36165                       'px'
36166                   );
36167               })
36168               .styleTween('fill-opacity', function(d) {
36169                   return ratchetyInterpolator(
36170                       _params[d.id][toFrom].opacity,
36171                       _params[d.id][fromTo].opacity,
36172                       steps
36173                   );
36174               })
36175               .styleTween('r', function(d) {
36176                   return ratchetyInterpolator(
36177                       _params[d.id][toFrom].width,
36178                       _params[d.id][fromTo].width,
36179                       steps,
36180                       'px'
36181                   );
36182               });
36183       }
36184
36185
36186       function calcAnimationParams(selection$$1) {
36187           selection$$1
36188               .call(reset)
36189               .each(function(d) {
36190                   var s = select(this);
36191                   var tag = s.node().tagName;
36192                   var p = {'from': {}, 'to': {}};
36193                   var opacity;
36194                   var width;
36195
36196                   // determine base opacity and width
36197                   if (tag === 'circle') {
36198                       opacity = parseFloat(s.style('fill-opacity') || 0.5);
36199                       width = parseFloat(s.style('r') || 15.5);
36200                   } else {
36201                       opacity = parseFloat(s.style('stroke-opacity') || 0.7);
36202                       width = parseFloat(s.style('stroke-width') || 10);
36203                   }
36204
36205                   // calculate from/to interpolation params..
36206                   p.tag = tag;
36207                   p.from.opacity = opacity * 0.6;
36208                   p.to.opacity = opacity * 1.25;
36209                   p.from.width = width * 0.7;
36210                   p.to.width = width * (tag === 'circle' ? 1.5 : 1);
36211                   _params[d.id] = p;
36212               });
36213       }
36214
36215
36216       function run(surface, fromTo) {
36217           var toFrom = (fromTo === 'from' ? 'to' : 'from');
36218           var currSelected = surface.selectAll(selector$$1);
36219           var currClassed = surface.attr('class');
36220
36221           if (_done || currSelected.empty()) {
36222               _selected.call(reset);
36223               return;
36224           }
36225
36226           if (!isEqual(currSelected.data(), _selected.data()) || currClassed !== _classed) {
36227               _selected.call(reset);
36228               _classed = currClassed;
36229               _selected = currSelected.call(calcAnimationParams);
36230           }
36231
36232           _selected
36233               .transition()
36234               .duration(duration)
36235               .call(setAnimationParams, fromTo)
36236               .on('end', function() {
36237                   surface.call(run, toFrom);
36238               });
36239       }
36240
36241
36242       function behavior(surface) {
36243           _done = false;
36244           _timer = timer(function() {
36245               // wait for elements to actually become selected
36246               if (surface.selectAll(selector$$1).empty()) {
36247                   return false;
36248               }
36249
36250               surface.call(run, 'from');
36251               _timer.stop();
36252               return true;
36253           }, 20);
36254       }
36255
36256
36257       behavior.off = function() {
36258           _done = true;
36259           if (_timer) {
36260               _timer.stop();
36261           }
36262           _selected
36263               .interrupt()
36264               .call(reset);
36265       };
36266
36267
36268       return behavior;
36269   }
36270
36271   var _tooltipID = 0;
36272
36273   function tooltip() {
36274       var _id = _tooltipID++;
36275       var tooltip = function(selection$$1) {
36276           selection$$1.each(setup);
36277       };
36278       var _animation = utilFunctor(false);
36279       var _title = function() {
36280           var title = this.getAttribute('data-original-title');
36281           if (title) {
36282               return title;
36283           } else {
36284               title = this.getAttribute('title');
36285               this.removeAttribute('title');
36286               this.setAttribute('data-original-title', title);
36287           }
36288           return title;
36289       };
36290       var _html = utilFunctor(false);
36291       var _placement = utilFunctor('top');
36292
36293
36294       tooltip.title = function(val) {
36295           if (arguments.length) {
36296               _title = utilFunctor(val);
36297               return tooltip;
36298           } else {
36299               return _title;
36300           }
36301       };
36302
36303
36304       tooltip.html = function(val) {
36305           if (arguments.length) {
36306               _html = utilFunctor(val);
36307               return tooltip;
36308           } else {
36309               return _html;
36310           }
36311       };
36312
36313
36314       tooltip.placement = function(val) {
36315           if (arguments.length) {
36316               _placement = utilFunctor(val);
36317               return tooltip;
36318           } else {
36319               return _placement;
36320           }
36321       };
36322
36323
36324       tooltip.show = function(selection$$1) {
36325           selection$$1.each(show);
36326       };
36327
36328
36329       tooltip.hide = function(selection$$1) {
36330           selection$$1.each(hide);
36331       };
36332
36333
36334       tooltip.toggle = function(selection$$1) {
36335           selection$$1.each(toggle);
36336       };
36337
36338
36339       tooltip.destroy = function(selection$$1, selector$$1) {
36340           // by default, just destroy the current tooltip
36341           selector$$1 = selector$$1 || '.tooltip-' + _id;
36342
36343           selection$$1
36344               .on('mouseenter.tooltip', null)
36345               .on('mouseleave.tooltip', null)
36346               .attr('title', function() {
36347                   return this.getAttribute('data-original-title') || this.getAttribute('title');
36348               })
36349               .attr('data-original-title', null)
36350               .selectAll(selector$$1)
36351               .remove();
36352       };
36353
36354
36355       tooltip.destroyAny = function(selection$$1) {
36356           selection$$1.call(tooltip.destroy, '.tooltip');
36357       };
36358
36359
36360       function setup() {
36361           var root = select(this);
36362           var animate = _animation.apply(this, arguments);
36363           var tip = root.selectAll('.tooltip-' + _id)
36364               .data([0]);
36365
36366           var enter = tip.enter()
36367               .append('div')
36368               .attr('class', 'tooltip tooltip-' + _id);
36369
36370           enter
36371               .append('div')
36372               .attr('class', 'tooltip-arrow');
36373
36374           enter
36375               .append('div')
36376               .attr('class', 'tooltip-inner');
36377
36378           tip = enter
36379               .merge(tip);
36380
36381           if (animate) {
36382               tip.classed('fade', true);
36383           }
36384
36385           var place = _placement.apply(this, arguments);
36386           tip.classed(place, true);
36387
36388           root.on('mouseenter.tooltip', show);
36389           root.on('mouseleave.tooltip', hide);
36390       }
36391
36392
36393       function show() {
36394           var root = select(this);
36395           var content = _title.apply(this, arguments);
36396           var tip = root.selectAll('.tooltip-' + _id);
36397
36398           if (tip.empty()) {   // tooltip was removed somehow, put it back
36399               root.call(tooltip.destroy);
36400               root.each(setup);
36401               tip = root.selectAll('.tooltip-' + _id);
36402           }
36403
36404           tip.classed('in', true);
36405           var markup = _html.apply(this, arguments);
36406
36407           tip.selectAll('.tooltip-inner')[markup ? 'html' : 'text'](content);
36408           var place = _placement.apply(this, arguments);
36409           var outer = getPosition(root.node());
36410           var inner = getPosition(tip.node());
36411           var pos;
36412
36413           switch (place) {
36414               case 'top':
36415               pos = { x: outer.x + (outer.w - inner.w) / 2, y: outer.y - inner.h };
36416               break;
36417               case 'right':
36418               pos = { x: outer.x + outer.w, y: outer.y + (outer.h - inner.h) / 2 };
36419               break;
36420               case 'left':
36421               pos = { x: outer.x - inner.w, y: outer.y + (outer.h - inner.h) / 2 };
36422               break;
36423               case 'bottom':
36424               pos = { x: Math.max(0, outer.x + (outer.w - inner.w) / 2), y: outer.y + outer.h };
36425               break;
36426           }
36427
36428           if (pos) {
36429               tip.style('left', ~~pos.x + 'px').style('top', ~~pos.y + 'px');
36430           } else {
36431               tip.style('left', null).style('top', null);
36432           }
36433
36434           this.tooltipVisible = true;
36435
36436
36437           function getPosition(node) {
36438               var mode = select(node).style('position');
36439               if (mode === 'absolute' || mode === 'static') {
36440                   return {
36441                       x: node.offsetLeft,
36442                       y: node.offsetTop,
36443                       w: node.offsetWidth,
36444                       h: node.offsetHeight
36445                   };
36446               } else {
36447                   return {
36448                       x: 0,
36449                       y: 0,
36450                       w: node.offsetWidth,
36451                       h: node.offsetHeight
36452                   };
36453               }
36454           }
36455       }
36456
36457
36458       function hide() {
36459           select(this).selectAll('.tooltip-' + _id).classed('in', false);
36460           this.tooltipVisible = false;
36461       }
36462
36463
36464       function toggle() {
36465           if (this.tooltipVisible) {
36466               hide.apply(this, arguments);
36467           } else {
36468               show.apply(this, arguments);
36469           }
36470       }
36471
36472
36473       return tooltip;
36474   }
36475
36476   function uiAccount(context) {
36477       var osm = context.connection();
36478
36479
36480       function update(selection$$1) {
36481           if (!osm) return;
36482
36483           if (!osm.authenticated()) {
36484               selection$$1.selectAll('#userLink, #logoutLink')
36485                   .classed('hide', true);
36486               return;
36487           }
36488
36489           osm.userDetails(function(err, details) {
36490               var userLink = selection$$1.select('#userLink'),
36491                   logoutLink = selection$$1.select('#logoutLink');
36492
36493               userLink.html('');
36494               logoutLink.html('');
36495
36496               if (err) return;
36497
36498               selection$$1.selectAll('#userLink, #logoutLink')
36499                   .classed('hide', false);
36500
36501               // Link
36502               userLink.append('a')
36503                   .attr('href', osm.userURL(details.display_name))
36504                   .attr('target', '_blank');
36505
36506               // Add thumbnail or dont
36507               if (details.image_url) {
36508                   userLink.append('img')
36509                       .attr('class', 'icon pre-text user-icon')
36510                       .attr('src', details.image_url);
36511               } else {
36512                   userLink
36513                       .call(svgIcon('#iD-icon-avatar', 'pre-text light'));
36514               }
36515
36516               // Add user name
36517               userLink.append('span')
36518                   .attr('class', 'label')
36519                   .text(details.display_name);
36520
36521               logoutLink.append('a')
36522                   .attr('class', 'logout')
36523                   .attr('href', '#')
36524                   .text(t('logout'))
36525                   .on('click.logout', function() {
36526                       event.preventDefault();
36527                       osm.logout();
36528                   });
36529           });
36530       }
36531
36532
36533       return function(selection$$1) {
36534           selection$$1.append('li')
36535               .attr('id', 'logoutLink')
36536               .classed('hide', true);
36537
36538           selection$$1.append('li')
36539               .attr('id', 'userLink')
36540               .classed('hide', true);
36541
36542           if (osm) {
36543               osm.on('change.account', function() { update(selection$$1); });
36544               update(selection$$1);
36545           }
36546       };
36547   }
36548
36549   function uiAttribution(context) {
36550       var selection$$1;
36551
36552
36553       function attribution(data, klass) {
36554           var div = selection$$1.selectAll('.' + klass)
36555               .data([0]);
36556
36557           div = div.enter()
36558               .append('div')
36559               .attr('class', klass)
36560               .merge(div);
36561
36562
36563           var background = div.selectAll('.attribution')
36564               .data(data, function(d) { return d.name(); });
36565
36566           background.exit()
36567               .remove();
36568
36569           background = background.enter()
36570               .append('span')
36571               .attr('class', 'attribution')
36572               .each(function(d) {
36573                   if (d.terms_html) {
36574                       select(this)
36575                           .html(d.terms_html);
36576                       return;
36577                   }
36578
36579                   var selection$$1;
36580                   if (d.terms_url) {
36581                       selection$$1 = select(this)
36582                           .append('a')
36583                           .attr('href', d.terms_url)
36584                           .attr('target', '_blank');
36585                   } else {
36586                       selection$$1 = select(this);
36587                   }
36588
36589
36590                   var id_safe = d.id.replace(/\./g, '<TX_DOT>');
36591                   var terms_text = t('imagery.' + id_safe + '.attribution.text',
36592                       { default: d.terms_text || d.id || d.name() }
36593                   );
36594
36595                   if (d.icon && !d.overlay) {
36596                       selection$$1
36597                           .append('img')
36598                           .attr('class', 'source-image')
36599                           .attr('src', d.icon);
36600                   }
36601
36602                   selection$$1
36603                       .append('span')
36604                       .attr('class', 'attribution-text')
36605                       .text(terms_text);
36606               })
36607               .merge(background);
36608
36609
36610           var copyright = background.selectAll('.copyright-notice')
36611               .data(function(d) {
36612                   var notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
36613                   return notice ? [notice] : [];
36614               });
36615
36616           copyright.exit()
36617               .remove();
36618
36619           copyright = copyright.enter()
36620               .append('span')
36621               .attr('class', 'copyright-notice')
36622               .merge(copyright);
36623
36624           copyright
36625               .text(String);
36626       }
36627
36628
36629       function update() {
36630           attribution([context.background().baseLayerSource()], 'base-layer-attribution');
36631           attribution(context.background().overlayLayerSources().filter(function (s) {
36632               return s.validZoom(context.map().zoom());
36633           }), 'overlay-layer-attribution');
36634       }
36635
36636
36637       return function(select$$1) {
36638           selection$$1 = select$$1;
36639
36640           context.background()
36641               .on('change.attribution', update);
36642
36643           context.map()
36644               .on('move.attribution', throttle(update, 400, {leading: false}));
36645
36646           update();
36647       };
36648   }
36649
36650   // toggles the visibility of ui elements, using a combination of the
36651   // hide class, which sets display=none, and a d3 transition for opacity.
36652   // this will cause blinking when called repeatedly, so check that the
36653   // value actually changes between calls.
36654   function uiToggle(show, callback) {
36655       return function(selection$$1) {
36656           selection$$1
36657               .style('opacity', show ? 0 : 1)
36658               .classed('hide', false)
36659               .transition()
36660               .style('opacity', show ? 1 : 0)
36661               .on('end', function() {
36662                   select(this)
36663                       .classed('hide', !show)
36664                       .style('opacity', null);
36665                   if (callback) callback.apply(this);
36666               });
36667       };
36668   }
36669
36670   function uiDisclosure(context, key, expandedDefault) {
36671       var dispatch$$1 = dispatch('toggled');
36672       var _preference = (context.storage('disclosure.' + key + '.expanded'));
36673       var _expanded = (_preference === null ? !!expandedDefault : (_preference === 'true'));
36674       var _title;
36675       var _updatePreference = true;
36676       var _content = function () {};
36677
36678
36679       var disclosure = function(selection$$1) {
36680           var hideToggle = selection$$1.selectAll('.hide-toggle-' + key)
36681               .data([0]);
36682
36683           // enter
36684           var hideToggleEnter = hideToggle.enter()
36685               .append('a')
36686               .attr('href', '#')
36687               .attr('class', 'hide-toggle hide-toggle-' + key)
36688               .call(svgIcon('', 'pre-text', 'hide-toggle-icon'));
36689
36690           hideToggleEnter
36691               .append('span')
36692               .attr('class', 'hide-toggle-text');
36693
36694           // update
36695           hideToggle = hideToggleEnter
36696               .merge(hideToggle);
36697
36698           hideToggle
36699               .on('click', toggle)
36700               .classed('expanded', _expanded);
36701
36702           hideToggle.selectAll('.hide-toggle-text')
36703               .text(_title);
36704
36705           hideToggle.selectAll('.hide-toggle-icon')
36706               .attr('xlink:href', _expanded ? '#iD-icon-down'
36707                   : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
36708               );
36709
36710
36711           var wrap = selection$$1.selectAll('.disclosure-wrap')
36712               .data([0]);
36713
36714           // enter/update
36715           wrap = wrap.enter()
36716               .append('div')
36717               .attr('class', 'disclosure-wrap disclosure-wrap-' + key)
36718               .merge(wrap)
36719               .classed('hide', !_expanded);
36720
36721           if (_expanded) {
36722               wrap
36723                   .call(_content);
36724           }
36725
36726
36727           function toggle() {
36728               event.preventDefault();
36729
36730               _expanded = !_expanded;
36731
36732               if (_updatePreference) {
36733                   context.storage('disclosure.' + key + '.expanded', _expanded);
36734               }
36735
36736               hideToggle
36737                   .classed('expanded', _expanded);
36738
36739               hideToggle.selectAll('.hide-toggle-icon')
36740                   .attr('xlink:href', _expanded ? '#iD-icon-down'
36741                       : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
36742                   );
36743
36744               if (_expanded) {
36745                   wrap
36746                       .call(_content);
36747               }
36748
36749               wrap
36750                   .call(uiToggle(_expanded));
36751
36752               dispatch$$1.call('toggled', this, _expanded);
36753           }
36754       };
36755
36756
36757       disclosure.title = function(val) {
36758           if (!arguments.length) return _title;
36759           _title = val;
36760           return disclosure;
36761       };
36762
36763
36764       disclosure.expanded = function(val) {
36765           if (!arguments.length) return _expanded;
36766           _expanded = val;
36767           return disclosure;
36768       };
36769
36770
36771       disclosure.updatePreference = function(val) {
36772           if (!arguments.length) return _updatePreference;
36773           _updatePreference = val;
36774           return disclosure;
36775       };
36776
36777
36778       disclosure.content = function(val) {
36779           if (!arguments.length) return _content;
36780           _content = val;
36781           return disclosure;
36782       };
36783
36784
36785       return utilRebind(disclosure, dispatch$$1, 'on');
36786   }
36787
36788   function uiBackgroundDisplayOptions(context) {
36789       var detected = utilDetect();
36790       var storedOpacity = context.storage('background-opacity');
36791       var minVal = 0.25;
36792       var maxVal = detected.cssfilters ? 2 : 1;
36793
36794       var sliders = detected.cssfilters
36795           ? ['brightness', 'contrast', 'saturation', 'sharpness']
36796           : ['brightness'];
36797
36798       var _options = {
36799           brightness: (storedOpacity !== null ? (+storedOpacity) : 1),
36800           contrast: 1,
36801           saturation: 1,
36802           sharpness: 1
36803       };
36804
36805       var _selection = select(null);
36806
36807
36808       function clamp(x, min, max) {
36809           return Math.max(min, Math.min(x, max));
36810       }
36811
36812
36813       function updateValue(d, val) {
36814           if (!val && event && event.target) {
36815               val = event.target.value;
36816           }
36817
36818           val = clamp(val, minVal, maxVal);
36819
36820           _options[d] = val;
36821           context.background()[d](val);
36822
36823           if (d === 'brightness') {
36824               context.storage('background-opacity', val);
36825           }
36826
36827           _selection
36828               .call(render);
36829       }
36830
36831
36832       function render(selection$$1) {
36833           var container = selection$$1.selectAll('.display-options-container')
36834               .data([0]);
36835
36836           var containerEnter = container.enter()
36837               .append('div')
36838               .attr('class', 'display-options-container controls-list');
36839
36840           // add slider controls
36841           var slidersEnter = containerEnter.selectAll('.display-control')
36842               .data(sliders)
36843               .enter()
36844               .append('div')
36845               .attr('class', function(d) { return 'display-control display-control-' + d; });
36846
36847           slidersEnter
36848               .append('h5')
36849               .text(function(d) { return t('background.' + d); })
36850               .append('span')
36851               .attr('class', function(d) { return 'display-option-value display-option-value-' + d; });
36852
36853           slidersEnter
36854               .append('input')
36855               .attr('class', function(d) { return 'display-option-input display-option-input-' + d; })
36856               .attr('type', 'range')
36857               .attr('min', minVal)
36858               .attr('max', maxVal)
36859               .attr('step', '0.05')
36860               .on('input', function(d) {
36861                   var val = select(this).property('value');
36862                   updateValue(d, val);
36863               });
36864
36865           slidersEnter
36866               .append('button')
36867               .attr('title', t('background.reset'))
36868               .attr('class', function(d) { return 'display-option-reset display-option-reset-' + d; })
36869               .on('click', function(d) {
36870                   if (event.button !== 0) return;
36871                   updateValue(d, 1);
36872               })
36873               .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
36874
36875
36876           // update
36877           container = containerEnter
36878               .merge(container);
36879
36880           container.selectAll('.display-option-input')
36881               .property('value', function(d) { return _options[d]; });
36882
36883           container.selectAll('.display-option-value')
36884               .text(function(d) { return Math.floor(_options[d] * 100) + '%'; });
36885
36886           container.selectAll('.display-option-reset')
36887               .classed('disabled', function(d) { return _options[d] === 1; });
36888
36889           // first time only, set brightness if needed
36890           if (containerEnter.size() && _options.brightness !== 1) {
36891               context.background().brightness(_options.brightness);
36892           }
36893       }
36894
36895
36896       function backgroundDisplayOptions(selection$$1) {
36897           _selection = selection$$1;
36898
36899           selection$$1
36900               .call(uiDisclosure(context, 'background_display_options', true)
36901                   .title(t('background.display_options'))
36902                   .content(render)
36903               );
36904       }
36905
36906
36907       return backgroundDisplayOptions;
36908   }
36909
36910   function uiBackgroundOffset(context) {
36911       var directions = [
36912           ['right', [0.5, 0]],
36913           ['top', [0, -0.5]],
36914           ['left', [-0.5, 0]],
36915           ['bottom', [0, 0.5]]
36916       ];
36917
36918
36919       function d3_eventCancel() {
36920           event.stopPropagation();
36921           event.preventDefault();
36922       }
36923
36924
36925       function updateValue() {
36926           var meters = geoOffsetToMeters(context.background().offset());
36927           var x = +meters[0].toFixed(2);
36928           var y = +meters[1].toFixed(2);
36929
36930           d3_selectAll('.nudge-inner-rect')
36931               .select('input')
36932               .classed('error', false)
36933               .property('value', x + ', ' + y);
36934
36935           d3_selectAll('.nudge-reset')
36936               .classed('disabled', function() {
36937                   return (x === 0 && y === 0);
36938               });
36939       }
36940
36941
36942       function resetOffset() {
36943           context.background().offset([0, 0]);
36944           updateValue();
36945       }
36946
36947
36948       function nudge(d) {
36949           context.background().nudge(d, context.map().zoom());
36950           updateValue();
36951       }
36952
36953
36954       function clickNudgeButton(d) {
36955           var interval;
36956           var timeout = window.setTimeout(function() {
36957                   interval = window.setInterval(nudge.bind(null, d), 100);
36958               }, 500);
36959
36960           function doneNudge() {
36961               window.clearTimeout(timeout);
36962               window.clearInterval(interval);
36963               select(window)
36964                   .on('mouseup.buttonoffset', null, true)
36965                   .on('mousedown.buttonoffset', null, true);
36966           }
36967
36968           select(window)
36969               .on('mouseup.buttonoffset', doneNudge, true)
36970               .on('mousedown.buttonoffset', doneNudge, true);
36971
36972           nudge(d);
36973       }
36974
36975
36976       function inputOffset() {
36977           var input = select(this);
36978           var d = input.node().value;
36979
36980           if (d === '') return resetOffset();
36981
36982           d = d.replace(/;/g, ',').split(',').map(function(n) {
36983               // if n is NaN, it will always get mapped to false.
36984               return !isNaN(n) && n;
36985           });
36986
36987           if (d.length !== 2 || !d[0] || !d[1]) {
36988               input.classed('error', true);
36989               return;
36990           }
36991
36992           context.background().offset(geoMetersToOffset(d));
36993           updateValue();
36994       }
36995
36996
36997       function dragOffset() {
36998           event.preventDefault();
36999           if (event.button !== 0) return;
37000
37001           var origin = [event.clientX, event.clientY];
37002
37003           context.container()
37004               .append('div')
37005               .attr('class', 'nudge-surface');
37006
37007           select(window)
37008               .on('mousemove.offset', function() {
37009                   var latest = [event.clientX, event.clientY];
37010                   var d = [
37011                       -(origin[0] - latest[0]) / 4,
37012                       -(origin[1] - latest[1]) / 4
37013                   ];
37014
37015                   origin = latest;
37016                   nudge(d);
37017               })
37018               .on('mouseup.offset', function() {
37019                   if (event.button !== 0) return;
37020                   d3_selectAll('.nudge-surface')
37021                       .remove();
37022
37023                   select(window)
37024                       .on('mousemove.offset', null)
37025                       .on('mouseup.offset', null);
37026               });
37027       }
37028
37029
37030       function render(selection$$1) {
37031           var container = selection$$1.selectAll('.nudge-container')
37032               .data([0]);
37033
37034           var containerEnter = container.enter()
37035               .append('div')
37036               .attr('class', 'nudge-container cf');
37037
37038           containerEnter
37039               .append('div')
37040               .attr('class', 'nudge-instructions')
37041               .text(t('background.offset'));
37042
37043           var nudgeEnter = containerEnter
37044               .append('div')
37045               .attr('class', 'nudge-outer-rect')
37046               .on('mousedown', dragOffset);
37047
37048           nudgeEnter
37049               .append('div')
37050               .attr('class', 'nudge-inner-rect')
37051               .append('input')
37052               .on('change', inputOffset);
37053
37054           containerEnter
37055               .append('div')
37056               .selectAll('button')
37057               .data(directions).enter()
37058               .append('button')
37059               .attr('class', function(d) { return d[0] + ' nudge'; })
37060               .on('contextmenu', d3_eventCancel)
37061               .on('mousedown', function(d) {
37062                   if (event.button !== 0) return;
37063                   clickNudgeButton(d[1]);
37064               });
37065
37066           containerEnter
37067               .append('button')
37068               .attr('title', t('background.reset'))
37069               .attr('class', 'nudge-reset disabled')
37070               .on('contextmenu', d3_eventCancel)
37071               .on('click', function() {
37072                   if (event.button !== 0) return;
37073                   resetOffset();
37074               })
37075               .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
37076
37077           updateValue();
37078       }
37079
37080
37081       function backgroundOffset(selection$$1) {
37082           selection$$1
37083               .call(uiDisclosure(context, 'background_offset', false)
37084                   .title(t('background.fix_misalignment'))
37085                   .content(render)
37086               );
37087       }
37088
37089
37090       context.background()
37091           .on('change.backgroundOffset-update', updateValue);
37092
37093       return backgroundOffset;
37094   }
37095
37096   // Translate a MacOS key command into the appropriate Windows/Linux equivalent.
37097   // For example, ⌘Z -> Ctrl+Z
37098   var uiCmd = function (code) {
37099       var detected = utilDetect();
37100
37101       if (detected.os === 'mac') {
37102           return code;
37103       }
37104
37105       if (detected.os === 'win') {
37106           if (code === '⌘⇧Z') return 'Ctrl+Y';
37107       }
37108
37109       var result = '',
37110           replacements = {
37111               '⌘': 'Ctrl',
37112               '⇧': 'Shift',
37113               '⌥': 'Alt',
37114               '⌫': 'Backspace',
37115               '⌦': 'Delete'
37116           };
37117
37118       for (var i = 0; i < code.length; i++) {
37119           if (code[i] in replacements) {
37120               result += replacements[code[i]] + (i < code.length - 1 ? '+' : '');
37121           } else {
37122               result += code[i];
37123           }
37124       }
37125
37126       return result;
37127   };
37128
37129
37130   // return a display-focused string for a given keyboard code
37131   uiCmd.display = function(code) {
37132       if (code.length !== 1) return code;
37133
37134       var detected = utilDetect();
37135       var mac = (detected.os === 'mac');
37136       var replacements = {
37137           '⌘': mac ? '⌘ ' + t('shortcuts.key.cmd')    : t('shortcuts.key.ctrl'),
37138           '⇧': mac ? '⇧ ' + t('shortcuts.key.shift')  : t('shortcuts.key.shift'),
37139           '⌥': mac ? '⌥ ' + t('shortcuts.key.option') : t('shortcuts.key.alt'),
37140           '⌃': mac ? '⌃ ' + t('shortcuts.key.ctrl')   : t('shortcuts.key.ctrl'),
37141           '⌫': mac ? '⌫ ' + t('shortcuts.key.delete') : t('shortcuts.key.backspace'),
37142           '⌦': mac ? '⌦ ' + t('shortcuts.key.del')    : t('shortcuts.key.del'),
37143           '↖': mac ? '↖ ' + t('shortcuts.key.pgup')   : t('shortcuts.key.pgup'),
37144           '↘': mac ? '↘ ' + t('shortcuts.key.pgdn')   : t('shortcuts.key.pgdn'),
37145           '⇞': mac ? '⇞ ' + t('shortcuts.key.home')   : t('shortcuts.key.home'),
37146           '⇟': mac ? '⇟ ' + t('shortcuts.key.end')    : t('shortcuts.key.end'),
37147           '↵': mac ? '↵ ' + t('shortcuts.key.return') : t('shortcuts.key.enter'),
37148           '⎋': mac ? '⎋ ' + t('shortcuts.key.esc')    : t('shortcuts.key.esc'),
37149       };
37150
37151       return replacements[code] || code;
37152   };
37153
37154   var marked = createCommonjsModule(function (module, exports) {
37155   (function(root) {
37156
37157   /**
37158    * Block-Level Grammar
37159    */
37160
37161   var block = {
37162     newline: /^\n+/,
37163     code: /^( {4}[^\n]+\n*)+/,
37164     fences: noop,
37165     hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
37166     heading: /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,
37167     nptable: noop,
37168     blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
37169     list: /^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
37170     html: '^ {0,3}(?:' // optional indentation
37171       + '<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1)
37172       + '|comment[^\\n]*(\\n+|$)' // (2)
37173       + '|<\\?[\\s\\S]*?\\?>\\n*' // (3)
37174       + '|<![A-Z][\\s\\S]*?>\\n*' // (4)
37175       + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*' // (5)
37176       + '|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)' // (6)
37177       + '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) open tag
37178       + '|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag
37179       + ')',
37180     def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
37181     table: noop,
37182     lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
37183     paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,
37184     text: /^[^\n]+/
37185   };
37186
37187   block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
37188   block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
37189   block.def = edit(block.def)
37190     .replace('label', block._label)
37191     .replace('title', block._title)
37192     .getRegex();
37193
37194   block.bullet = /(?:[*+-]|\d{1,9}\.)/;
37195   block.item = /^( *)(bull) ?[^\n]*(?:\n(?!\1bull ?)[^\n]*)*/;
37196   block.item = edit(block.item, 'gm')
37197     .replace(/bull/g, block.bullet)
37198     .getRegex();
37199
37200   block.list = edit(block.list)
37201     .replace(/bull/g, block.bullet)
37202     .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))')
37203     .replace('def', '\\n+(?=' + block.def.source + ')')
37204     .getRegex();
37205
37206   block._tag = 'address|article|aside|base|basefont|blockquote|body|caption'
37207     + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'
37208     + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'
37209     + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'
37210     + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'
37211     + '|track|ul';
37212   block._comment = /<!--(?!-?>)[\s\S]*?-->/;
37213   block.html = edit(block.html, 'i')
37214     .replace('comment', block._comment)
37215     .replace('tag', block._tag)
37216     .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/)
37217     .getRegex();
37218
37219   block.paragraph = edit(block.paragraph)
37220     .replace('hr', block.hr)
37221     .replace('heading', block.heading)
37222     .replace('lheading', block.lheading)
37223     .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks
37224     .getRegex();
37225
37226   block.blockquote = edit(block.blockquote)
37227     .replace('paragraph', block.paragraph)
37228     .getRegex();
37229
37230   /**
37231    * Normal Block Grammar
37232    */
37233
37234   block.normal = merge({}, block);
37235
37236   /**
37237    * GFM Block Grammar
37238    */
37239
37240   block.gfm = merge({}, block.normal, {
37241     fences: /^ {0,3}(`{3,}|~{3,})([^`\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,
37242     paragraph: /^/,
37243     heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
37244   });
37245
37246   block.gfm.paragraph = edit(block.paragraph)
37247     .replace('(?!', '(?!'
37248       + block.gfm.fences.source.replace('\\1', '\\2') + '|'
37249       + block.list.source.replace('\\1', '\\3') + '|')
37250     .getRegex();
37251
37252   /**
37253    * GFM + Tables Block Grammar
37254    */
37255
37256   block.tables = merge({}, block.gfm, {
37257     nptable: /^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,
37258     table: /^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/
37259   });
37260
37261   /**
37262    * Pedantic grammar
37263    */
37264
37265   block.pedantic = merge({}, block.normal, {
37266     html: edit(
37267       '^ *(?:comment *(?:\\n|\\s*$)'
37268       + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
37269       + '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))')
37270       .replace('comment', block._comment)
37271       .replace(/tag/g, '(?!(?:'
37272         + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'
37273         + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'
37274         + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b')
37275       .getRegex(),
37276     def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/
37277   });
37278
37279   /**
37280    * Block Lexer
37281    */
37282
37283   function Lexer(options) {
37284     this.tokens = [];
37285     this.tokens.links = Object.create(null);
37286     this.options = options || marked.defaults;
37287     this.rules = block.normal;
37288
37289     if (this.options.pedantic) {
37290       this.rules = block.pedantic;
37291     } else if (this.options.gfm) {
37292       if (this.options.tables) {
37293         this.rules = block.tables;
37294       } else {
37295         this.rules = block.gfm;
37296       }
37297     }
37298   }
37299
37300   /**
37301    * Expose Block Rules
37302    */
37303
37304   Lexer.rules = block;
37305
37306   /**
37307    * Static Lex Method
37308    */
37309
37310   Lexer.lex = function(src, options) {
37311     var lexer = new Lexer(options);
37312     return lexer.lex(src);
37313   };
37314
37315   /**
37316    * Preprocessing
37317    */
37318
37319   Lexer.prototype.lex = function(src) {
37320     src = src
37321       .replace(/\r\n|\r/g, '\n')
37322       .replace(/\t/g, '    ')
37323       .replace(/\u00a0/g, ' ')
37324       .replace(/\u2424/g, '\n');
37325
37326     return this.token(src, true);
37327   };
37328
37329   /**
37330    * Lexing
37331    */
37332
37333   Lexer.prototype.token = function(src, top) {
37334     src = src.replace(/^ +$/gm, '');
37335     var next,
37336         loose,
37337         cap,
37338         bull,
37339         b,
37340         item,
37341         listStart,
37342         listItems,
37343         t,
37344         space,
37345         i,
37346         tag,
37347         l,
37348         isordered,
37349         istask,
37350         ischecked;
37351
37352     while (src) {
37353       // newline
37354       if (cap = this.rules.newline.exec(src)) {
37355         src = src.substring(cap[0].length);
37356         if (cap[0].length > 1) {
37357           this.tokens.push({
37358             type: 'space'
37359           });
37360         }
37361       }
37362
37363       // code
37364       if (cap = this.rules.code.exec(src)) {
37365         src = src.substring(cap[0].length);
37366         cap = cap[0].replace(/^ {4}/gm, '');
37367         this.tokens.push({
37368           type: 'code',
37369           text: !this.options.pedantic
37370             ? rtrim(cap, '\n')
37371             : cap
37372         });
37373         continue;
37374       }
37375
37376       // fences (gfm)
37377       if (cap = this.rules.fences.exec(src)) {
37378         src = src.substring(cap[0].length);
37379         this.tokens.push({
37380           type: 'code',
37381           lang: cap[2] ? cap[2].trim() : cap[2],
37382           text: cap[3] || ''
37383         });
37384         continue;
37385       }
37386
37387       // heading
37388       if (cap = this.rules.heading.exec(src)) {
37389         src = src.substring(cap[0].length);
37390         this.tokens.push({
37391           type: 'heading',
37392           depth: cap[1].length,
37393           text: cap[2]
37394         });
37395         continue;
37396       }
37397
37398       // table no leading pipe (gfm)
37399       if (top && (cap = this.rules.nptable.exec(src))) {
37400         item = {
37401           type: 'table',
37402           header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
37403           align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
37404           cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
37405         };
37406
37407         if (item.header.length === item.align.length) {
37408           src = src.substring(cap[0].length);
37409
37410           for (i = 0; i < item.align.length; i++) {
37411             if (/^ *-+: *$/.test(item.align[i])) {
37412               item.align[i] = 'right';
37413             } else if (/^ *:-+: *$/.test(item.align[i])) {
37414               item.align[i] = 'center';
37415             } else if (/^ *:-+ *$/.test(item.align[i])) {
37416               item.align[i] = 'left';
37417             } else {
37418               item.align[i] = null;
37419             }
37420           }
37421
37422           for (i = 0; i < item.cells.length; i++) {
37423             item.cells[i] = splitCells(item.cells[i], item.header.length);
37424           }
37425
37426           this.tokens.push(item);
37427
37428           continue;
37429         }
37430       }
37431
37432       // hr
37433       if (cap = this.rules.hr.exec(src)) {
37434         src = src.substring(cap[0].length);
37435         this.tokens.push({
37436           type: 'hr'
37437         });
37438         continue;
37439       }
37440
37441       // blockquote
37442       if (cap = this.rules.blockquote.exec(src)) {
37443         src = src.substring(cap[0].length);
37444
37445         this.tokens.push({
37446           type: 'blockquote_start'
37447         });
37448
37449         cap = cap[0].replace(/^ *> ?/gm, '');
37450
37451         // Pass `top` to keep the current
37452         // "toplevel" state. This is exactly
37453         // how markdown.pl works.
37454         this.token(cap, top);
37455
37456         this.tokens.push({
37457           type: 'blockquote_end'
37458         });
37459
37460         continue;
37461       }
37462
37463       // list
37464       if (cap = this.rules.list.exec(src)) {
37465         src = src.substring(cap[0].length);
37466         bull = cap[2];
37467         isordered = bull.length > 1;
37468
37469         listStart = {
37470           type: 'list_start',
37471           ordered: isordered,
37472           start: isordered ? +bull : '',
37473           loose: false
37474         };
37475
37476         this.tokens.push(listStart);
37477
37478         // Get each top-level item.
37479         cap = cap[0].match(this.rules.item);
37480
37481         listItems = [];
37482         next = false;
37483         l = cap.length;
37484         i = 0;
37485
37486         for (; i < l; i++) {
37487           item = cap[i];
37488
37489           // Remove the list item's bullet
37490           // so it is seen as the next token.
37491           space = item.length;
37492           item = item.replace(/^ *([*+-]|\d+\.) */, '');
37493
37494           // Outdent whatever the
37495           // list item contains. Hacky.
37496           if (~item.indexOf('\n ')) {
37497             space -= item.length;
37498             item = !this.options.pedantic
37499               ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
37500               : item.replace(/^ {1,4}/gm, '');
37501           }
37502
37503           // Determine whether the next list item belongs here.
37504           // Backpedal if it does not belong in this list.
37505           if (i !== l - 1) {
37506             b = block.bullet.exec(cap[i + 1])[0];
37507             if (bull.length > 1 ? b.length === 1
37508               : (b.length > 1 || (this.options.smartLists && b !== bull))) {
37509               src = cap.slice(i + 1).join('\n') + src;
37510               i = l - 1;
37511             }
37512           }
37513
37514           // Determine whether item is loose or not.
37515           // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
37516           // for discount behavior.
37517           loose = next || /\n\n(?!\s*$)/.test(item);
37518           if (i !== l - 1) {
37519             next = item.charAt(item.length - 1) === '\n';
37520             if (!loose) loose = next;
37521           }
37522
37523           if (loose) {
37524             listStart.loose = true;
37525           }
37526
37527           // Check for task list items
37528           istask = /^\[[ xX]\] /.test(item);
37529           ischecked = undefined;
37530           if (istask) {
37531             ischecked = item[1] !== ' ';
37532             item = item.replace(/^\[[ xX]\] +/, '');
37533           }
37534
37535           t = {
37536             type: 'list_item_start',
37537             task: istask,
37538             checked: ischecked,
37539             loose: loose
37540           };
37541
37542           listItems.push(t);
37543           this.tokens.push(t);
37544
37545           // Recurse.
37546           this.token(item, false);
37547
37548           this.tokens.push({
37549             type: 'list_item_end'
37550           });
37551         }
37552
37553         if (listStart.loose) {
37554           l = listItems.length;
37555           i = 0;
37556           for (; i < l; i++) {
37557             listItems[i].loose = true;
37558           }
37559         }
37560
37561         this.tokens.push({
37562           type: 'list_end'
37563         });
37564
37565         continue;
37566       }
37567
37568       // html
37569       if (cap = this.rules.html.exec(src)) {
37570         src = src.substring(cap[0].length);
37571         this.tokens.push({
37572           type: this.options.sanitize
37573             ? 'paragraph'
37574             : 'html',
37575           pre: !this.options.sanitizer
37576             && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
37577           text: cap[0]
37578         });
37579         continue;
37580       }
37581
37582       // def
37583       if (top && (cap = this.rules.def.exec(src))) {
37584         src = src.substring(cap[0].length);
37585         if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
37586         tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
37587         if (!this.tokens.links[tag]) {
37588           this.tokens.links[tag] = {
37589             href: cap[2],
37590             title: cap[3]
37591           };
37592         }
37593         continue;
37594       }
37595
37596       // table (gfm)
37597       if (top && (cap = this.rules.table.exec(src))) {
37598         item = {
37599           type: 'table',
37600           header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
37601           align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
37602           cells: cap[3] ? cap[3].replace(/(?: *\| *)?\n$/, '').split('\n') : []
37603         };
37604
37605         if (item.header.length === item.align.length) {
37606           src = src.substring(cap[0].length);
37607
37608           for (i = 0; i < item.align.length; i++) {
37609             if (/^ *-+: *$/.test(item.align[i])) {
37610               item.align[i] = 'right';
37611             } else if (/^ *:-+: *$/.test(item.align[i])) {
37612               item.align[i] = 'center';
37613             } else if (/^ *:-+ *$/.test(item.align[i])) {
37614               item.align[i] = 'left';
37615             } else {
37616               item.align[i] = null;
37617             }
37618           }
37619
37620           for (i = 0; i < item.cells.length; i++) {
37621             item.cells[i] = splitCells(
37622               item.cells[i].replace(/^ *\| *| *\| *$/g, ''),
37623               item.header.length);
37624           }
37625
37626           this.tokens.push(item);
37627
37628           continue;
37629         }
37630       }
37631
37632       // lheading
37633       if (cap = this.rules.lheading.exec(src)) {
37634         src = src.substring(cap[0].length);
37635         this.tokens.push({
37636           type: 'heading',
37637           depth: cap[2] === '=' ? 1 : 2,
37638           text: cap[1]
37639         });
37640         continue;
37641       }
37642
37643       // top-level paragraph
37644       if (top && (cap = this.rules.paragraph.exec(src))) {
37645         src = src.substring(cap[0].length);
37646         this.tokens.push({
37647           type: 'paragraph',
37648           text: cap[1].charAt(cap[1].length - 1) === '\n'
37649             ? cap[1].slice(0, -1)
37650             : cap[1]
37651         });
37652         continue;
37653       }
37654
37655       // text
37656       if (cap = this.rules.text.exec(src)) {
37657         // Top-level should never reach here.
37658         src = src.substring(cap[0].length);
37659         this.tokens.push({
37660           type: 'text',
37661           text: cap[0]
37662         });
37663         continue;
37664       }
37665
37666       if (src) {
37667         throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
37668       }
37669     }
37670
37671     return this.tokens;
37672   };
37673
37674   /**
37675    * Inline-Level Grammar
37676    */
37677
37678   var inline = {
37679     escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
37680     autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
37681     url: noop,
37682     tag: '^comment'
37683       + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
37684       + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
37685       + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?>
37686       + '|^<![a-zA-Z]+\\s[\\s\\S]*?>' // declaration, e.g. <!DOCTYPE html>
37687       + '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>', // CDATA section
37688     link: /^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,
37689     reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
37690     nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
37691     strong: /^__([^\s_])__(?!_)|^\*\*([^\s*])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,
37692     em: /^_([^\s_])_(?!_)|^\*([^\s*"<\[])\*(?!\*)|^_([^\s][\s\S]*?[^\s_])_(?!_|[^\spunctuation])|^_([^\s_][\s\S]*?[^\s])_(?!_|[^\spunctuation])|^\*([^\s"<\[][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,
37693     code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
37694     br: /^( {2,}|\\)\n(?!\s*$)/,
37695     del: noop,
37696     text: /^(`+|[^`])[\s\S]*?(?=[\\<!\[`*]|\b_| {2,}\n|$)/
37697   };
37698
37699   // list of punctuation marks from common mark spec
37700   // without ` and ] to workaround Rule 17 (inline code blocks/links)
37701   inline._punctuation = '!"#$%&\'()*+,\\-./:;<=>?@\\[^_{|}~';
37702   inline.em = edit(inline.em).replace(/punctuation/g, inline._punctuation).getRegex();
37703
37704   inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
37705
37706   inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
37707   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])?)+(?![-_])/;
37708   inline.autolink = edit(inline.autolink)
37709     .replace('scheme', inline._scheme)
37710     .replace('email', inline._email)
37711     .getRegex();
37712
37713   inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
37714
37715   inline.tag = edit(inline.tag)
37716     .replace('comment', block._comment)
37717     .replace('attribute', inline._attribute)
37718     .getRegex();
37719
37720   inline._label = /(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|[^\[\]\\])*?/;
37721   inline._href = /\s*(<(?:\\[<>]?|[^\s<>\\])*>|(?:\\[()]?|\([^\s\x00-\x1f\\]*\)|[^\s\x00-\x1f()\\])*?)/;
37722   inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
37723
37724   inline.link = edit(inline.link)
37725     .replace('label', inline._label)
37726     .replace('href', inline._href)
37727     .replace('title', inline._title)
37728     .getRegex();
37729
37730   inline.reflink = edit(inline.reflink)
37731     .replace('label', inline._label)
37732     .getRegex();
37733
37734   /**
37735    * Normal Inline Grammar
37736    */
37737
37738   inline.normal = merge({}, inline);
37739
37740   /**
37741    * Pedantic Inline Grammar
37742    */
37743
37744   inline.pedantic = merge({}, inline.normal, {
37745     strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
37746     em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,
37747     link: edit(/^!?\[(label)\]\((.*?)\)/)
37748       .replace('label', inline._label)
37749       .getRegex(),
37750     reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/)
37751       .replace('label', inline._label)
37752       .getRegex()
37753   });
37754
37755   /**
37756    * GFM Inline Grammar
37757    */
37758
37759   inline.gfm = merge({}, inline.normal, {
37760     escape: edit(inline.escape).replace('])', '~|])').getRegex(),
37761     _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,
37762     url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
37763     _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
37764     del: /^~+(?=\S)([\s\S]*?\S)~+/,
37765     text: edit(inline.text)
37766       .replace(']|', '~]|')
37767       .replace('|$', '|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&\'*+/=?^_`{\\|}~-]+@|$')
37768       .getRegex()
37769   });
37770
37771   inline.gfm.url = edit(inline.gfm.url, 'i')
37772     .replace('email', inline.gfm._extended_email)
37773     .getRegex();
37774   /**
37775    * GFM + Line Breaks Inline Grammar
37776    */
37777
37778   inline.breaks = merge({}, inline.gfm, {
37779     br: edit(inline.br).replace('{2,}', '*').getRegex(),
37780     text: edit(inline.gfm.text).replace('{2,}', '*').getRegex()
37781   });
37782
37783   /**
37784    * Inline Lexer & Compiler
37785    */
37786
37787   function InlineLexer(links, options) {
37788     this.options = options || marked.defaults;
37789     this.links = links;
37790     this.rules = inline.normal;
37791     this.renderer = this.options.renderer || new Renderer();
37792     this.renderer.options = this.options;
37793
37794     if (!this.links) {
37795       throw new Error('Tokens array requires a `links` property.');
37796     }
37797
37798     if (this.options.pedantic) {
37799       this.rules = inline.pedantic;
37800     } else if (this.options.gfm) {
37801       if (this.options.breaks) {
37802         this.rules = inline.breaks;
37803       } else {
37804         this.rules = inline.gfm;
37805       }
37806     }
37807   }
37808
37809   /**
37810    * Expose Inline Rules
37811    */
37812
37813   InlineLexer.rules = inline;
37814
37815   /**
37816    * Static Lexing/Compiling Method
37817    */
37818
37819   InlineLexer.output = function(src, links, options) {
37820     var inline = new InlineLexer(links, options);
37821     return inline.output(src);
37822   };
37823
37824   /**
37825    * Lexing/Compiling
37826    */
37827
37828   InlineLexer.prototype.output = function(src) {
37829     var out = '',
37830         link,
37831         text,
37832         href,
37833         title,
37834         cap,
37835         prevCapZero;
37836
37837     while (src) {
37838       // escape
37839       if (cap = this.rules.escape.exec(src)) {
37840         src = src.substring(cap[0].length);
37841         out += escape(cap[1]);
37842         continue;
37843       }
37844
37845       // tag
37846       if (cap = this.rules.tag.exec(src)) {
37847         if (!this.inLink && /^<a /i.test(cap[0])) {
37848           this.inLink = true;
37849         } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
37850           this.inLink = false;
37851         }
37852         if (!this.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
37853           this.inRawBlock = true;
37854         } else if (this.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
37855           this.inRawBlock = false;
37856         }
37857
37858         src = src.substring(cap[0].length);
37859         out += this.options.sanitize
37860           ? this.options.sanitizer
37861             ? this.options.sanitizer(cap[0])
37862             : escape(cap[0])
37863           : cap[0];
37864         continue;
37865       }
37866
37867       // link
37868       if (cap = this.rules.link.exec(src)) {
37869         src = src.substring(cap[0].length);
37870         this.inLink = true;
37871         href = cap[2];
37872         if (this.options.pedantic) {
37873           link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
37874
37875           if (link) {
37876             href = link[1];
37877             title = link[3];
37878           } else {
37879             title = '';
37880           }
37881         } else {
37882           title = cap[3] ? cap[3].slice(1, -1) : '';
37883         }
37884         href = href.trim().replace(/^<([\s\S]*)>$/, '$1');
37885         out += this.outputLink(cap, {
37886           href: InlineLexer.escapes(href),
37887           title: InlineLexer.escapes(title)
37888         });
37889         this.inLink = false;
37890         continue;
37891       }
37892
37893       // reflink, nolink
37894       if ((cap = this.rules.reflink.exec(src))
37895           || (cap = this.rules.nolink.exec(src))) {
37896         src = src.substring(cap[0].length);
37897         link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
37898         link = this.links[link.toLowerCase()];
37899         if (!link || !link.href) {
37900           out += cap[0].charAt(0);
37901           src = cap[0].substring(1) + src;
37902           continue;
37903         }
37904         this.inLink = true;
37905         out += this.outputLink(cap, link);
37906         this.inLink = false;
37907         continue;
37908       }
37909
37910       // strong
37911       if (cap = this.rules.strong.exec(src)) {
37912         src = src.substring(cap[0].length);
37913         out += this.renderer.strong(this.output(cap[4] || cap[3] || cap[2] || cap[1]));
37914         continue;
37915       }
37916
37917       // em
37918       if (cap = this.rules.em.exec(src)) {
37919         src = src.substring(cap[0].length);
37920         out += this.renderer.em(this.output(cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1]));
37921         continue;
37922       }
37923
37924       // code
37925       if (cap = this.rules.code.exec(src)) {
37926         src = src.substring(cap[0].length);
37927         out += this.renderer.codespan(escape(cap[2].trim(), true));
37928         continue;
37929       }
37930
37931       // br
37932       if (cap = this.rules.br.exec(src)) {
37933         src = src.substring(cap[0].length);
37934         out += this.renderer.br();
37935         continue;
37936       }
37937
37938       // del (gfm)
37939       if (cap = this.rules.del.exec(src)) {
37940         src = src.substring(cap[0].length);
37941         out += this.renderer.del(this.output(cap[1]));
37942         continue;
37943       }
37944
37945       // autolink
37946       if (cap = this.rules.autolink.exec(src)) {
37947         src = src.substring(cap[0].length);
37948         if (cap[2] === '@') {
37949           text = escape(this.mangle(cap[1]));
37950           href = 'mailto:' + text;
37951         } else {
37952           text = escape(cap[1]);
37953           href = text;
37954         }
37955         out += this.renderer.link(href, null, text);
37956         continue;
37957       }
37958
37959       // url (gfm)
37960       if (!this.inLink && (cap = this.rules.url.exec(src))) {
37961         if (cap[2] === '@') {
37962           text = escape(cap[0]);
37963           href = 'mailto:' + text;
37964         } else {
37965           // do extended autolink path validation
37966           do {
37967             prevCapZero = cap[0];
37968             cap[0] = this.rules._backpedal.exec(cap[0])[0];
37969           } while (prevCapZero !== cap[0]);
37970           text = escape(cap[0]);
37971           if (cap[1] === 'www.') {
37972             href = 'http://' + text;
37973           } else {
37974             href = text;
37975           }
37976         }
37977         src = src.substring(cap[0].length);
37978         out += this.renderer.link(href, null, text);
37979         continue;
37980       }
37981
37982       // text
37983       if (cap = this.rules.text.exec(src)) {
37984         src = src.substring(cap[0].length);
37985         if (this.inRawBlock) {
37986           out += this.renderer.text(cap[0]);
37987         } else {
37988           out += this.renderer.text(escape(this.smartypants(cap[0])));
37989         }
37990         continue;
37991       }
37992
37993       if (src) {
37994         throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
37995       }
37996     }
37997
37998     return out;
37999   };
38000
38001   InlineLexer.escapes = function(text) {
38002     return text ? text.replace(InlineLexer.rules._escapes, '$1') : text;
38003   };
38004
38005   /**
38006    * Compile Link
38007    */
38008
38009   InlineLexer.prototype.outputLink = function(cap, link) {
38010     var href = link.href,
38011         title = link.title ? escape(link.title) : null;
38012
38013     return cap[0].charAt(0) !== '!'
38014       ? this.renderer.link(href, title, this.output(cap[1]))
38015       : this.renderer.image(href, title, escape(cap[1]));
38016   };
38017
38018   /**
38019    * Smartypants Transformations
38020    */
38021
38022   InlineLexer.prototype.smartypants = function(text) {
38023     if (!this.options.smartypants) return text;
38024     return text
38025       // em-dashes
38026       .replace(/---/g, '\u2014')
38027       // en-dashes
38028       .replace(/--/g, '\u2013')
38029       // opening singles
38030       .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
38031       // closing singles & apostrophes
38032       .replace(/'/g, '\u2019')
38033       // opening doubles
38034       .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
38035       // closing doubles
38036       .replace(/"/g, '\u201d')
38037       // ellipses
38038       .replace(/\.{3}/g, '\u2026');
38039   };
38040
38041   /**
38042    * Mangle Links
38043    */
38044
38045   InlineLexer.prototype.mangle = function(text) {
38046     if (!this.options.mangle) return text;
38047     var out = '',
38048         l = text.length,
38049         i = 0,
38050         ch;
38051
38052     for (; i < l; i++) {
38053       ch = text.charCodeAt(i);
38054       if (Math.random() > 0.5) {
38055         ch = 'x' + ch.toString(16);
38056       }
38057       out += '&#' + ch + ';';
38058     }
38059
38060     return out;
38061   };
38062
38063   /**
38064    * Renderer
38065    */
38066
38067   function Renderer(options) {
38068     this.options = options || marked.defaults;
38069   }
38070
38071   Renderer.prototype.code = function(code, infostring, escaped) {
38072     var lang = (infostring || '').match(/\S*/)[0];
38073     if (this.options.highlight) {
38074       var out = this.options.highlight(code, lang);
38075       if (out != null && out !== code) {
38076         escaped = true;
38077         code = out;
38078       }
38079     }
38080
38081     if (!lang) {
38082       return '<pre><code>'
38083         + (escaped ? code : escape(code, true))
38084         + '</code></pre>';
38085     }
38086
38087     return '<pre><code class="'
38088       + this.options.langPrefix
38089       + escape(lang, true)
38090       + '">'
38091       + (escaped ? code : escape(code, true))
38092       + '</code></pre>\n';
38093   };
38094
38095   Renderer.prototype.blockquote = function(quote) {
38096     return '<blockquote>\n' + quote + '</blockquote>\n';
38097   };
38098
38099   Renderer.prototype.html = function(html) {
38100     return html;
38101   };
38102
38103   Renderer.prototype.heading = function(text, level, raw, slugger) {
38104     if (this.options.headerIds) {
38105       return '<h'
38106         + level
38107         + ' id="'
38108         + this.options.headerPrefix
38109         + slugger.slug(raw)
38110         + '">'
38111         + text
38112         + '</h'
38113         + level
38114         + '>\n';
38115     }
38116     // ignore IDs
38117     return '<h' + level + '>' + text + '</h' + level + '>\n';
38118   };
38119
38120   Renderer.prototype.hr = function() {
38121     return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
38122   };
38123
38124   Renderer.prototype.list = function(body, ordered, start) {
38125     var type = ordered ? 'ol' : 'ul',
38126         startatt = (ordered && start !== 1) ? (' start="' + start + '"') : '';
38127     return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
38128   };
38129
38130   Renderer.prototype.listitem = function(text) {
38131     return '<li>' + text + '</li>\n';
38132   };
38133
38134   Renderer.prototype.checkbox = function(checked) {
38135     return '<input '
38136       + (checked ? 'checked="" ' : '')
38137       + 'disabled="" type="checkbox"'
38138       + (this.options.xhtml ? ' /' : '')
38139       + '> ';
38140   };
38141
38142   Renderer.prototype.paragraph = function(text) {
38143     return '<p>' + text + '</p>\n';
38144   };
38145
38146   Renderer.prototype.table = function(header, body) {
38147     if (body) body = '<tbody>' + body + '</tbody>';
38148
38149     return '<table>\n'
38150       + '<thead>\n'
38151       + header
38152       + '</thead>\n'
38153       + body
38154       + '</table>\n';
38155   };
38156
38157   Renderer.prototype.tablerow = function(content) {
38158     return '<tr>\n' + content + '</tr>\n';
38159   };
38160
38161   Renderer.prototype.tablecell = function(content, flags) {
38162     var type = flags.header ? 'th' : 'td';
38163     var tag = flags.align
38164       ? '<' + type + ' align="' + flags.align + '">'
38165       : '<' + type + '>';
38166     return tag + content + '</' + type + '>\n';
38167   };
38168
38169   // span level renderer
38170   Renderer.prototype.strong = function(text) {
38171     return '<strong>' + text + '</strong>';
38172   };
38173
38174   Renderer.prototype.em = function(text) {
38175     return '<em>' + text + '</em>';
38176   };
38177
38178   Renderer.prototype.codespan = function(text) {
38179     return '<code>' + text + '</code>';
38180   };
38181
38182   Renderer.prototype.br = function() {
38183     return this.options.xhtml ? '<br/>' : '<br>';
38184   };
38185
38186   Renderer.prototype.del = function(text) {
38187     return '<del>' + text + '</del>';
38188   };
38189
38190   Renderer.prototype.link = function(href, title, text) {
38191     href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
38192     if (href === null) {
38193       return text;
38194     }
38195     var out = '<a href="' + escape(href) + '"';
38196     if (title) {
38197       out += ' title="' + title + '"';
38198     }
38199     out += '>' + text + '</a>';
38200     return out;
38201   };
38202
38203   Renderer.prototype.image = function(href, title, text) {
38204     href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
38205     if (href === null) {
38206       return text;
38207     }
38208
38209     var out = '<img src="' + href + '" alt="' + text + '"';
38210     if (title) {
38211       out += ' title="' + title + '"';
38212     }
38213     out += this.options.xhtml ? '/>' : '>';
38214     return out;
38215   };
38216
38217   Renderer.prototype.text = function(text) {
38218     return text;
38219   };
38220
38221   /**
38222    * TextRenderer
38223    * returns only the textual part of the token
38224    */
38225
38226   function TextRenderer() {}
38227
38228   // no need for block level renderers
38229
38230   TextRenderer.prototype.strong =
38231   TextRenderer.prototype.em =
38232   TextRenderer.prototype.codespan =
38233   TextRenderer.prototype.del =
38234   TextRenderer.prototype.text = function (text) {
38235     return text;
38236   };
38237
38238   TextRenderer.prototype.link =
38239   TextRenderer.prototype.image = function(href, title, text) {
38240     return '' + text;
38241   };
38242
38243   TextRenderer.prototype.br = function() {
38244     return '';
38245   };
38246
38247   /**
38248    * Parsing & Compiling
38249    */
38250
38251   function Parser(options) {
38252     this.tokens = [];
38253     this.token = null;
38254     this.options = options || marked.defaults;
38255     this.options.renderer = this.options.renderer || new Renderer();
38256     this.renderer = this.options.renderer;
38257     this.renderer.options = this.options;
38258     this.slugger = new Slugger();
38259   }
38260
38261   /**
38262    * Static Parse Method
38263    */
38264
38265   Parser.parse = function(src, options) {
38266     var parser = new Parser(options);
38267     return parser.parse(src);
38268   };
38269
38270   /**
38271    * Parse Loop
38272    */
38273
38274   Parser.prototype.parse = function(src) {
38275     this.inline = new InlineLexer(src.links, this.options);
38276     // use an InlineLexer with a TextRenderer to extract pure text
38277     this.inlineText = new InlineLexer(
38278       src.links,
38279       merge({}, this.options, {renderer: new TextRenderer()})
38280     );
38281     this.tokens = src.reverse();
38282
38283     var out = '';
38284     while (this.next()) {
38285       out += this.tok();
38286     }
38287
38288     return out;
38289   };
38290
38291   /**
38292    * Next Token
38293    */
38294
38295   Parser.prototype.next = function() {
38296     return this.token = this.tokens.pop();
38297   };
38298
38299   /**
38300    * Preview Next Token
38301    */
38302
38303   Parser.prototype.peek = function() {
38304     return this.tokens[this.tokens.length - 1] || 0;
38305   };
38306
38307   /**
38308    * Parse Text Tokens
38309    */
38310
38311   Parser.prototype.parseText = function() {
38312     var body = this.token.text;
38313
38314     while (this.peek().type === 'text') {
38315       body += '\n' + this.next().text;
38316     }
38317
38318     return this.inline.output(body);
38319   };
38320
38321   /**
38322    * Parse Current Token
38323    */
38324
38325   Parser.prototype.tok = function() {
38326     switch (this.token.type) {
38327       case 'space': {
38328         return '';
38329       }
38330       case 'hr': {
38331         return this.renderer.hr();
38332       }
38333       case 'heading': {
38334         return this.renderer.heading(
38335           this.inline.output(this.token.text),
38336           this.token.depth,
38337           unescape(this.inlineText.output(this.token.text)),
38338           this.slugger);
38339       }
38340       case 'code': {
38341         return this.renderer.code(this.token.text,
38342           this.token.lang,
38343           this.token.escaped);
38344       }
38345       case 'table': {
38346         var header = '',
38347             body = '',
38348             i,
38349             row,
38350             cell,
38351             j;
38352
38353         // header
38354         cell = '';
38355         for (i = 0; i < this.token.header.length; i++) {
38356           cell += this.renderer.tablecell(
38357             this.inline.output(this.token.header[i]),
38358             { header: true, align: this.token.align[i] }
38359           );
38360         }
38361         header += this.renderer.tablerow(cell);
38362
38363         for (i = 0; i < this.token.cells.length; i++) {
38364           row = this.token.cells[i];
38365
38366           cell = '';
38367           for (j = 0; j < row.length; j++) {
38368             cell += this.renderer.tablecell(
38369               this.inline.output(row[j]),
38370               { header: false, align: this.token.align[j] }
38371             );
38372           }
38373
38374           body += this.renderer.tablerow(cell);
38375         }
38376         return this.renderer.table(header, body);
38377       }
38378       case 'blockquote_start': {
38379         body = '';
38380
38381         while (this.next().type !== 'blockquote_end') {
38382           body += this.tok();
38383         }
38384
38385         return this.renderer.blockquote(body);
38386       }
38387       case 'list_start': {
38388         body = '';
38389         var ordered = this.token.ordered,
38390             start = this.token.start;
38391
38392         while (this.next().type !== 'list_end') {
38393           body += this.tok();
38394         }
38395
38396         return this.renderer.list(body, ordered, start);
38397       }
38398       case 'list_item_start': {
38399         body = '';
38400         var loose = this.token.loose;
38401
38402         if (this.token.task) {
38403           body += this.renderer.checkbox(this.token.checked);
38404         }
38405
38406         while (this.next().type !== 'list_item_end') {
38407           body += !loose && this.token.type === 'text'
38408             ? this.parseText()
38409             : this.tok();
38410         }
38411
38412         return this.renderer.listitem(body);
38413       }
38414       case 'html': {
38415         // TODO parse inline content if parameter markdown=1
38416         return this.renderer.html(this.token.text);
38417       }
38418       case 'paragraph': {
38419         return this.renderer.paragraph(this.inline.output(this.token.text));
38420       }
38421       case 'text': {
38422         return this.renderer.paragraph(this.parseText());
38423       }
38424       default: {
38425         var errMsg = 'Token with "' + this.token.type + '" type was not found.';
38426         if (this.options.silent) {
38427           console.log(errMsg);
38428         } else {
38429           throw new Error(errMsg);
38430         }
38431       }
38432     }
38433   };
38434
38435   /**
38436    * Slugger generates header id
38437    */
38438
38439   function Slugger () {
38440     this.seen = {};
38441   }
38442
38443   /**
38444    * Convert string to unique id
38445    */
38446
38447   Slugger.prototype.slug = function (value) {
38448     var slug = value
38449       .toLowerCase()
38450       .trim()
38451       .replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, '')
38452       .replace(/\s/g, '-');
38453
38454     if (this.seen.hasOwnProperty(slug)) {
38455       var originalSlug = slug;
38456       do {
38457         this.seen[originalSlug]++;
38458         slug = originalSlug + '-' + this.seen[originalSlug];
38459       } while (this.seen.hasOwnProperty(slug));
38460     }
38461     this.seen[slug] = 0;
38462
38463     return slug;
38464   };
38465
38466   /**
38467    * Helpers
38468    */
38469
38470   function escape(html, encode) {
38471     if (encode) {
38472       if (escape.escapeTest.test(html)) {
38473         return html.replace(escape.escapeReplace, function (ch) { return escape.replacements[ch]; });
38474       }
38475     } else {
38476       if (escape.escapeTestNoEncode.test(html)) {
38477         return html.replace(escape.escapeReplaceNoEncode, function (ch) { return escape.replacements[ch]; });
38478       }
38479     }
38480
38481     return html;
38482   }
38483
38484   escape.escapeTest = /[&<>"']/;
38485   escape.escapeReplace = /[&<>"']/g;
38486   escape.replacements = {
38487     '&': '&amp;',
38488     '<': '&lt;',
38489     '>': '&gt;',
38490     '"': '&quot;',
38491     "'": '&#39;'
38492   };
38493
38494   escape.escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/;
38495   escape.escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g;
38496
38497   function unescape(html) {
38498     // explicitly match decimal, hex, and named HTML entities
38499     return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n) {
38500       n = n.toLowerCase();
38501       if (n === 'colon') return ':';
38502       if (n.charAt(0) === '#') {
38503         return n.charAt(1) === 'x'
38504           ? String.fromCharCode(parseInt(n.substring(2), 16))
38505           : String.fromCharCode(+n.substring(1));
38506       }
38507       return '';
38508     });
38509   }
38510
38511   function edit(regex, opt) {
38512     regex = regex.source || regex;
38513     opt = opt || '';
38514     return {
38515       replace: function(name, val) {
38516         val = val.source || val;
38517         val = val.replace(/(^|[^\[])\^/g, '$1');
38518         regex = regex.replace(name, val);
38519         return this;
38520       },
38521       getRegex: function() {
38522         return new RegExp(regex, opt);
38523       }
38524     };
38525   }
38526
38527   function cleanUrl(sanitize, base, href) {
38528     if (sanitize) {
38529       try {
38530         var prot = decodeURIComponent(unescape(href))
38531           .replace(/[^\w:]/g, '')
38532           .toLowerCase();
38533       } catch (e) {
38534         return null;
38535       }
38536       if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
38537         return null;
38538       }
38539     }
38540     if (base && !originIndependentUrl.test(href)) {
38541       href = resolveUrl(base, href);
38542     }
38543     try {
38544       href = encodeURI(href).replace(/%25/g, '%');
38545     } catch (e) {
38546       return null;
38547     }
38548     return href;
38549   }
38550
38551   function resolveUrl(base, href) {
38552     if (!baseUrls[' ' + base]) {
38553       // we can ignore everything in base after the last slash of its path component,
38554       // but we might need to add _that_
38555       // https://tools.ietf.org/html/rfc3986#section-3
38556       if (/^[^:]+:\/*[^/]*$/.test(base)) {
38557         baseUrls[' ' + base] = base + '/';
38558       } else {
38559         baseUrls[' ' + base] = rtrim(base, '/', true);
38560       }
38561     }
38562     base = baseUrls[' ' + base];
38563
38564     if (href.slice(0, 2) === '//') {
38565       return base.replace(/:[\s\S]*/, ':') + href;
38566     } else if (href.charAt(0) === '/') {
38567       return base.replace(/(:\/*[^/]*)[\s\S]*/, '$1') + href;
38568     } else {
38569       return base + href;
38570     }
38571   }
38572   var baseUrls = {};
38573   var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
38574
38575   function noop() {}
38576   noop.exec = noop;
38577
38578   function merge(obj) {
38579     var i = 1,
38580         target,
38581         key;
38582
38583     for (; i < arguments.length; i++) {
38584       target = arguments[i];
38585       for (key in target) {
38586         if (Object.prototype.hasOwnProperty.call(target, key)) {
38587           obj[key] = target[key];
38588         }
38589       }
38590     }
38591
38592     return obj;
38593   }
38594
38595   function splitCells(tableRow, count) {
38596     // ensure that every cell-delimiting pipe has a space
38597     // before it to distinguish it from an escaped pipe
38598     var row = tableRow.replace(/\|/g, function (match, offset, str) {
38599           var escaped = false,
38600               curr = offset;
38601           while (--curr >= 0 && str[curr] === '\\') escaped = !escaped;
38602           if (escaped) {
38603             // odd number of slashes means | is escaped
38604             // so we leave it alone
38605             return '|';
38606           } else {
38607             // add space before unescaped |
38608             return ' |';
38609           }
38610         }),
38611         cells = row.split(/ \|/),
38612         i = 0;
38613
38614     if (cells.length > count) {
38615       cells.splice(count);
38616     } else {
38617       while (cells.length < count) cells.push('');
38618     }
38619
38620     for (; i < cells.length; i++) {
38621       // leading or trailing whitespace is ignored per the gfm spec
38622       cells[i] = cells[i].trim().replace(/\\\|/g, '|');
38623     }
38624     return cells;
38625   }
38626
38627   // Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').
38628   // /c*$/ is vulnerable to REDOS.
38629   // invert: Remove suffix of non-c chars instead. Default falsey.
38630   function rtrim(str, c, invert) {
38631     if (str.length === 0) {
38632       return '';
38633     }
38634
38635     // Length of suffix matching the invert condition.
38636     var suffLen = 0;
38637
38638     // Step left until we fail to match the invert condition.
38639     while (suffLen < str.length) {
38640       var currChar = str.charAt(str.length - suffLen - 1);
38641       if (currChar === c && !invert) {
38642         suffLen++;
38643       } else if (currChar !== c && invert) {
38644         suffLen++;
38645       } else {
38646         break;
38647       }
38648     }
38649
38650     return str.substr(0, str.length - suffLen);
38651   }
38652
38653   /**
38654    * Marked
38655    */
38656
38657   function marked(src, opt, callback) {
38658     // throw error in case of non string input
38659     if (typeof src === 'undefined' || src === null) {
38660       throw new Error('marked(): input parameter is undefined or null');
38661     }
38662     if (typeof src !== 'string') {
38663       throw new Error('marked(): input parameter is of type '
38664         + Object.prototype.toString.call(src) + ', string expected');
38665     }
38666
38667     if (callback || typeof opt === 'function') {
38668       if (!callback) {
38669         callback = opt;
38670         opt = null;
38671       }
38672
38673       opt = merge({}, marked.defaults, opt || {});
38674
38675       var highlight = opt.highlight,
38676           tokens,
38677           pending,
38678           i = 0;
38679
38680       try {
38681         tokens = Lexer.lex(src, opt);
38682       } catch (e) {
38683         return callback(e);
38684       }
38685
38686       pending = tokens.length;
38687
38688       var done = function(err) {
38689         if (err) {
38690           opt.highlight = highlight;
38691           return callback(err);
38692         }
38693
38694         var out;
38695
38696         try {
38697           out = Parser.parse(tokens, opt);
38698         } catch (e) {
38699           err = e;
38700         }
38701
38702         opt.highlight = highlight;
38703
38704         return err
38705           ? callback(err)
38706           : callback(null, out);
38707       };
38708
38709       if (!highlight || highlight.length < 3) {
38710         return done();
38711       }
38712
38713       delete opt.highlight;
38714
38715       if (!pending) return done();
38716
38717       for (; i < tokens.length; i++) {
38718         (function(token) {
38719           if (token.type !== 'code') {
38720             return --pending || done();
38721           }
38722           return highlight(token.text, token.lang, function(err, code) {
38723             if (err) return done(err);
38724             if (code == null || code === token.text) {
38725               return --pending || done();
38726             }
38727             token.text = code;
38728             token.escaped = true;
38729             --pending || done();
38730           });
38731         })(tokens[i]);
38732       }
38733
38734       return;
38735     }
38736     try {
38737       if (opt) opt = merge({}, marked.defaults, opt);
38738       return Parser.parse(Lexer.lex(src, opt), opt);
38739     } catch (e) {
38740       e.message += '\nPlease report this to https://github.com/markedjs/marked.';
38741       if ((opt || marked.defaults).silent) {
38742         return '<p>An error occurred:</p><pre>'
38743           + escape(e.message + '', true)
38744           + '</pre>';
38745       }
38746       throw e;
38747     }
38748   }
38749
38750   /**
38751    * Options
38752    */
38753
38754   marked.options =
38755   marked.setOptions = function(opt) {
38756     merge(marked.defaults, opt);
38757     return marked;
38758   };
38759
38760   marked.getDefaults = function () {
38761     return {
38762       baseUrl: null,
38763       breaks: false,
38764       gfm: true,
38765       headerIds: true,
38766       headerPrefix: '',
38767       highlight: null,
38768       langPrefix: 'language-',
38769       mangle: true,
38770       pedantic: false,
38771       renderer: new Renderer(),
38772       sanitize: false,
38773       sanitizer: null,
38774       silent: false,
38775       smartLists: false,
38776       smartypants: false,
38777       tables: true,
38778       xhtml: false
38779     };
38780   };
38781
38782   marked.defaults = marked.getDefaults();
38783
38784   /**
38785    * Expose
38786    */
38787
38788   marked.Parser = Parser;
38789   marked.parser = Parser.parse;
38790
38791   marked.Renderer = Renderer;
38792   marked.TextRenderer = TextRenderer;
38793
38794   marked.Lexer = Lexer;
38795   marked.lexer = Lexer.lex;
38796
38797   marked.InlineLexer = InlineLexer;
38798   marked.inlineLexer = InlineLexer.output;
38799
38800   marked.Slugger = Slugger;
38801
38802   marked.parse = marked;
38803
38804   {
38805     module.exports = marked;
38806   }
38807   })(commonjsGlobal || (typeof window !== 'undefined' ? window : commonjsGlobal));
38808   });
38809
38810   function pointBox(loc, context) {
38811       var rect = context.surfaceRect();
38812       var point$$1 = context.curtainProjection(loc);
38813       return {
38814           left: point$$1[0] + rect.left - 40,
38815           top: point$$1[1] + rect.top - 60,
38816           width: 80,
38817           height: 90
38818       };
38819   }
38820
38821
38822   function pad$1(locOrBox, padding, context) {
38823       var box;
38824       if (locOrBox instanceof Array) {
38825           var rect = context.surfaceRect();
38826           var point$$1 = context.curtainProjection(locOrBox);
38827           box = {
38828               left: point$$1[0] + rect.left,
38829               top: point$$1[1] + rect.top
38830           };
38831       } else {
38832           box = locOrBox;
38833       }
38834
38835       return {
38836           left: box.left - padding,
38837           top: box.top - padding,
38838           width: (box.width || 0) + 2 * padding,
38839           height: (box.width || 0) + 2 * padding
38840       };
38841   }
38842
38843
38844   function icon(name, svgklass, useklass) {
38845       return '<svg class="icon ' + (svgklass || '') + '">' +
38846            '<use xlink:href="' + name + '"' +
38847            (useklass ? ' class="' + useklass + '"' : '') + '></use></svg>';
38848   }
38849
38850
38851   function slugify(text) {
38852       return text.toString().toLowerCase()
38853           .replace(/\s+/g, '-')           // Replace spaces with -
38854           .replace(/[^\w\-]+/g, '')       // Remove all non-word chars
38855           .replace(/\-\-+/g, '-')         // Replace multiple - with single -
38856           .replace(/^-+/, '')             // Trim - from start of text
38857           .replace(/-+$/, '');            // Trim - from end of text
38858   }
38859
38860
38861   // console warning for missing walkthrough names
38862   var missingStrings = {};
38863   function checkKey(key, text) {
38864       if (t(key, { default: undefined}) === undefined) {
38865           if (missingStrings.hasOwnProperty(key)) return;  // warn once
38866           missingStrings[key] = text;
38867           var missing = key + ': ' + text;
38868           if (typeof console !== 'undefined') console.log(missing); // eslint-disable-line
38869       }
38870   }
38871
38872
38873   function localize(obj) {
38874       var key;
38875
38876       // Assign name if entity has one..
38877       var name = obj.tags && obj.tags.name;
38878       if (name) {
38879           key = 'intro.graph.name.' + slugify(name);
38880           obj.tags.name = t(key, { default: name });
38881           checkKey(key, name);
38882       }
38883
38884       // Assign street name if entity has one..
38885       var street = obj.tags && obj.tags['addr:street'];
38886       if (street) {
38887           key = 'intro.graph.name.' + slugify(street);
38888           obj.tags['addr:street'] = t(key, { default: street });
38889           checkKey(key, street);
38890
38891           // Add address details common across walkthrough..
38892           var addrTags = [
38893               'block_number', 'city', 'county', 'district', 'hamlet', 'neighbourhood',
38894               'postcode', 'province', 'quarter', 'state', 'subdistrict', 'suburb'
38895           ];
38896           addrTags.forEach(function(k) {
38897               var key = 'intro.graph.' + k;
38898               var tag = 'addr:' + k;
38899               var val = obj.tags && obj.tags[tag];
38900               var str = t(key, { default: val });
38901
38902               if (str) {
38903                   if (str.match(/^<.*>$/) !== null) {
38904                       delete obj.tags[tag];
38905                   } else {
38906                       obj.tags[tag] = str;
38907                   }
38908               }
38909           });
38910       }
38911
38912       return obj;
38913   }
38914
38915
38916   // Used to detect squareness.. some duplicataion of code from actionOrthogonalize.
38917   function isMostlySquare(points) {
38918       // note: uses 15 here instead of the 12 from actionOrthogonalize because
38919       // actionOrthogonalize can actually straighten some larger angles as it iterates
38920       var threshold = 15; // degrees within right or straight
38921       var lowerBound = Math.cos((90 - threshold) * Math.PI / 180);  // near right
38922       var upperBound = Math.cos(threshold * Math.PI / 180);         // near straight
38923       var mag;
38924
38925       for (var i = 0; i < points.length; i++) {
38926           mag = Math.abs(normalizedDotProduct(i, points));
38927           if (mag > lowerBound && mag < upperBound) {
38928               return false;
38929           }
38930       }
38931
38932       return true;
38933
38934
38935       function normalizedDotProduct(i, points) {
38936           var a = points[(i - 1 + points.length) % points.length];
38937           var b = points[i];
38938           var c = points[(i + 1) % points.length];
38939           var p = subtractPoints(a, b);
38940           var q = subtractPoints(c, b);
38941
38942           p = normalizePoint(p);
38943           q = normalizePoint(q);
38944
38945           return p[0] * q[0] + p[1] * q[1];
38946
38947
38948           function subtractPoints(a, b) {
38949               return [a[0] - b[0], a[1] - b[1]];
38950           }
38951
38952           function normalizePoint(point$$1) {
38953               var vector = [0, 0];
38954               var length = Math.sqrt(point$$1[0] * point$$1[0] + point$$1[1] * point$$1[1]);
38955               if (length !== 0) {
38956                   vector[0] = point$$1[0] / length;
38957                   vector[1] = point$$1[1] / length;
38958               }
38959               return vector;
38960           }
38961       }
38962   }
38963
38964
38965   function selectMenuItem(operation) {
38966       var selector$$1 = '.edit-menu .edit-menu-item-' + operation +
38967           ', .radial-menu .radial-menu-item-' + operation;
38968       return select(selector$$1);
38969   }
38970
38971
38972   function transitionTime(point1, point2) {
38973       var distance = geoSphericalDistance(point1, point2);
38974       if (distance === 0)
38975           return 0;
38976       else if (distance < 80)
38977           return 500;
38978       else
38979           return 1000;
38980   }
38981
38982   /** Used for built-in method references. */
38983   var objectProto$i = Object.prototype;
38984
38985   /** Used to check objects for own properties. */
38986   var hasOwnProperty$f = objectProto$i.hasOwnProperty;
38987
38988   /**
38989    * Assigns own enumerable string keyed properties of source objects to the
38990    * destination object. Source objects are applied from left to right.
38991    * Subsequent sources overwrite property assignments of previous sources.
38992    *
38993    * **Note:** This method mutates `object` and is loosely based on
38994    * [`Object.assign`](https://mdn.io/Object/assign).
38995    *
38996    * @static
38997    * @memberOf _
38998    * @since 0.10.0
38999    * @category Object
39000    * @param {Object} object The destination object.
39001    * @param {...Object} [sources] The source objects.
39002    * @returns {Object} Returns `object`.
39003    * @see _.assignIn
39004    * @example
39005    *
39006    * function Foo() {
39007    *   this.a = 1;
39008    * }
39009    *
39010    * function Bar() {
39011    *   this.c = 3;
39012    * }
39013    *
39014    * Foo.prototype.b = 2;
39015    * Bar.prototype.d = 4;
39016    *
39017    * _.assign({ 'a': 0 }, new Foo, new Bar);
39018    * // => { 'a': 1, 'c': 3 }
39019    */
39020   var assign = createAssigner(function(object, source) {
39021     if (isPrototype(source) || isArrayLike(source)) {
39022       copyObject(source, keys$1(source), object);
39023       return;
39024     }
39025     for (var key in source) {
39026       if (hasOwnProperty$f.call(source, key)) {
39027         assignValue(object, key, source[key]);
39028       }
39029     }
39030   });
39031
39032   /* Built-in method references for those with the same name as other `lodash` methods. */
39033   var nativeMax$3 = Math.max;
39034
39035   /**
39036    * Checks if `value` is in `collection`. If `collection` is a string, it's
39037    * checked for a substring of `value`, otherwise
39038    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
39039    * is used for equality comparisons. If `fromIndex` is negative, it's used as
39040    * the offset from the end of `collection`.
39041    *
39042    * @static
39043    * @memberOf _
39044    * @since 0.1.0
39045    * @category Collection
39046    * @param {Array|Object|string} collection The collection to inspect.
39047    * @param {*} value The value to search for.
39048    * @param {number} [fromIndex=0] The index to search from.
39049    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
39050    * @returns {boolean} Returns `true` if `value` is found, else `false`.
39051    * @example
39052    *
39053    * _.includes([1, 2, 3], 1);
39054    * // => true
39055    *
39056    * _.includes([1, 2, 3], 1, 2);
39057    * // => false
39058    *
39059    * _.includes({ 'a': 1, 'b': 2 }, 1);
39060    * // => true
39061    *
39062    * _.includes('abcd', 'bc');
39063    * // => true
39064    */
39065   function includes(collection, value, fromIndex, guard) {
39066     collection = isArrayLike(collection) ? collection : values$1(collection);
39067     fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
39068
39069     var length = collection.length;
39070     if (fromIndex < 0) {
39071       fromIndex = nativeMax$3(length + fromIndex, 0);
39072     }
39073     return isString(collection)
39074       ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
39075       : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
39076   }
39077
39078   function coreGraph$$1(other, mutable) {
39079       if (!(this instanceof coreGraph$$1)) return new coreGraph$$1(other, mutable);
39080
39081       if (other instanceof coreGraph$$1) {
39082           var base = other.base();
39083           this.entities = assign(Object.create(base.entities), other.entities);
39084           this._parentWays = assign(Object.create(base.parentWays), other._parentWays);
39085           this._parentRels = assign(Object.create(base.parentRels), other._parentRels);
39086
39087       } else {
39088           this.entities = Object.create({});
39089           this._parentWays = Object.create({});
39090           this._parentRels = Object.create({});
39091           this.rebase(other || [], [this]);
39092       }
39093
39094       this.transients = {};
39095       this._childNodes = {};
39096       this.frozen = !mutable;
39097   }
39098
39099
39100   coreGraph$$1.prototype = {
39101
39102       hasEntity: function(id) {
39103           return this.entities[id];
39104       },
39105
39106
39107       entity: function(id) {
39108           var entity = this.entities[id];
39109
39110           //https://github.com/openstreetmap/iD/issues/3973#issuecomment-307052376
39111           if (!entity) {
39112               entity = this.entities.__proto__[id];  // eslint-disable-line no-proto
39113           }
39114
39115           if (!entity) {
39116               throw new Error('entity ' + id + ' not found');
39117           }
39118           return entity;
39119       },
39120
39121
39122       transient: function(entity, key, fn) {
39123           var id = entity.id;
39124           var transients = this.transients[id] || (this.transients[id] = {});
39125
39126           if (transients[key] !== undefined) {
39127               return transients[key];
39128           }
39129
39130           transients[key] = fn.call(entity);
39131
39132           return transients[key];
39133       },
39134
39135
39136       parentWays: function(entity) {
39137           var parents = this._parentWays[entity.id];
39138           var result = [];
39139
39140           if (parents) {
39141               for (var i = 0; i < parents.length; i++) {
39142                   result.push(this.entity(parents[i]));
39143               }
39144           }
39145           return result;
39146       },
39147
39148
39149       isPoi: function(entity) {
39150           var parentWays = this._parentWays[entity.id];
39151           return !parentWays || parentWays.length === 0;
39152       },
39153
39154
39155       isShared: function(entity) {
39156           var parentWays = this._parentWays[entity.id];
39157           return parentWays && parentWays.length > 1;
39158       },
39159
39160
39161       parentRelations: function(entity) {
39162           var parents = this._parentRels[entity.id];
39163           var result = [];
39164
39165           if (parents) {
39166               for (var i = 0; i < parents.length; i++) {
39167                   result.push(this.entity(parents[i]));
39168               }
39169           }
39170           return result;
39171       },
39172
39173
39174       childNodes: function(entity) {
39175           if (this._childNodes[entity.id]) return this._childNodes[entity.id];
39176           if (!entity.nodes) return [];
39177
39178           var nodes = [];
39179           for (var i = 0; i < entity.nodes.length; i++) {
39180               nodes[i] = this.entity(entity.nodes[i]);
39181           }
39182
39183           this._childNodes[entity.id] = nodes;
39184           return this._childNodes[entity.id];
39185       },
39186
39187
39188       base: function() {
39189           return {
39190               'entities': utilGetPrototypeOf(this.entities),
39191               'parentWays': utilGetPrototypeOf(this._parentWays),
39192               'parentRels': utilGetPrototypeOf(this._parentRels)
39193           };
39194       },
39195
39196
39197       // Unlike other graph methods, rebase mutates in place. This is because it
39198       // is used only during the history operation that merges newly downloaded
39199       // data into each state. To external consumers, it should appear as if the
39200       // graph always contained the newly downloaded data.
39201       rebase: function(entities, stack, force) {
39202           var base = this.base();
39203           var i, j, k, id;
39204
39205           for (i = 0; i < entities.length; i++) {
39206               var entity = entities[i];
39207
39208               if (!entity.visible || (!force && base.entities[entity.id]))
39209                   continue;
39210
39211               // Merging data into the base graph
39212               base.entities[entity.id] = entity;
39213               this._updateCalculated(undefined, entity, base.parentWays, base.parentRels);
39214
39215               // Restore provisionally-deleted nodes that are discovered to have an extant parent
39216               if (entity.type === 'way') {
39217                   for (j = 0; j < entity.nodes.length; j++) {
39218                       id = entity.nodes[j];
39219                       for (k = 1; k < stack.length; k++) {
39220                           var ents = stack[k].entities;
39221                           if (ents.hasOwnProperty(id) && ents[id] === undefined) {
39222                               delete ents[id];
39223                           }
39224                       }
39225                   }
39226               }
39227           }
39228
39229           for (i = 0; i < stack.length; i++) {
39230               stack[i]._updateRebased();
39231           }
39232       },
39233
39234
39235       _updateRebased: function() {
39236           var base = this.base();
39237           var i, k, child, id, keys;
39238
39239           keys = Object.keys(this._parentWays);
39240           for (i = 0; i < keys.length; i++) {
39241               child = keys[i];
39242               if (base.parentWays[child]) {
39243                   for (k = 0; k < base.parentWays[child].length; k++) {
39244                       id = base.parentWays[child][k];
39245                       if (!this.entities.hasOwnProperty(id) && !includes(this._parentWays[child], id)) {
39246                           this._parentWays[child].push(id);
39247                       }
39248                   }
39249               }
39250           }
39251
39252           keys = Object.keys(this._parentRels);
39253           for (i = 0; i < keys.length; i++) {
39254               child = keys[i];
39255               if (base.parentRels[child]) {
39256                   for (k = 0; k < base.parentRels[child].length; k++) {
39257                       id = base.parentRels[child][k];
39258                       if (!this.entities.hasOwnProperty(id) && !includes(this._parentRels[child], id)) {
39259                           this._parentRels[child].push(id);
39260                       }
39261                   }
39262               }
39263           }
39264
39265           this.transients = {};
39266
39267           // this._childNodes is not updated, under the assumption that
39268           // ways are always downloaded with their child nodes.
39269       },
39270
39271
39272       // Updates calculated properties (parentWays, parentRels) for the specified change
39273       _updateCalculated: function(oldentity, entity, parentWays, parentRels) {
39274           parentWays = parentWays || this._parentWays;
39275           parentRels = parentRels || this._parentRels;
39276
39277           var type = entity && entity.type || oldentity && oldentity.type;
39278           var removed, added, ways, rels, i;
39279
39280           if (type === 'way') {   // Update parentWays
39281               if (oldentity && entity) {
39282                   removed = difference(oldentity.nodes, entity.nodes);
39283                   added = difference(entity.nodes, oldentity.nodes);
39284               } else if (oldentity) {
39285                   removed = oldentity.nodes;
39286                   added = [];
39287               } else if (entity) {
39288                   removed = [];
39289                   added = entity.nodes;
39290               }
39291               for (i = 0; i < removed.length; i++) {
39292                   parentWays[removed[i]] = without(parentWays[removed[i]], oldentity.id);
39293               }
39294               for (i = 0; i < added.length; i++) {
39295                   ways = without(parentWays[added[i]], entity.id);
39296                   ways.push(entity.id);
39297                   parentWays[added[i]] = ways;
39298               }
39299
39300           } else if (type === 'relation') {   // Update parentRels
39301               if (oldentity && entity) {
39302                   removed = difference(oldentity.members, entity.members);
39303                   added = difference(entity.members, oldentity);
39304               } else if (oldentity) {
39305                   removed = oldentity.members;
39306                   added = [];
39307               } else if (entity) {
39308                   removed = [];
39309                   added = entity.members;
39310               }
39311               for (i = 0; i < removed.length; i++) {
39312                   parentRels[removed[i].id] = without(parentRels[removed[i].id], oldentity.id);
39313               }
39314               for (i = 0; i < added.length; i++) {
39315                   rels = without(parentRels[added[i].id], entity.id);
39316                   rels.push(entity.id);
39317                   parentRels[added[i].id] = rels;
39318               }
39319           }
39320       },
39321
39322
39323       replace: function(entity) {
39324           if (this.entities[entity.id] === entity) return this;
39325
39326           return this.update(function() {
39327               this._updateCalculated(this.entities[entity.id], entity);
39328               this.entities[entity.id] = entity;
39329           });
39330       },
39331
39332
39333       remove: function(entity) {
39334           return this.update(function() {
39335               this._updateCalculated(entity, undefined);
39336               this.entities[entity.id] = undefined;
39337           });
39338       },
39339
39340
39341       revert: function(id) {
39342           var baseEntity = this.base().entities[id];
39343           var headEntity = this.entities[id];
39344           if (headEntity === baseEntity) return this;
39345
39346           return this.update(function() {
39347               this._updateCalculated(headEntity, baseEntity);
39348               delete this.entities[id];
39349           });
39350       },
39351
39352
39353       update: function() {
39354           var graph = this.frozen ? coreGraph$$1(this, true) : this;
39355           for (var i = 0; i < arguments.length; i++) {
39356               arguments[i].call(graph, graph);
39357           }
39358
39359           if (this.frozen) graph.frozen = true;
39360
39361           return graph;
39362       },
39363
39364
39365       // Obliterates any existing entities
39366       load: function(entities) {
39367           var base = this.base();
39368           this.entities = Object.create(base.entities);
39369
39370           for (var i in entities) {
39371               this.entities[i] = entities[i];
39372               this._updateCalculated(base.entities[i], this.entities[i]);
39373           }
39374
39375           return this;
39376       }
39377   };
39378
39379   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]}};
39380
39381   /* Built-in method references for those with the same name as other `lodash` methods. */
39382   var nativeMin$1 = Math.min;
39383
39384   /**
39385    * The base implementation of methods like `_.intersection`, without support
39386    * for iteratee shorthands, that accepts an array of arrays to inspect.
39387    *
39388    * @private
39389    * @param {Array} arrays The arrays to inspect.
39390    * @param {Function} [iteratee] The iteratee invoked per element.
39391    * @param {Function} [comparator] The comparator invoked per element.
39392    * @returns {Array} Returns the new array of shared values.
39393    */
39394   function baseIntersection(arrays, iteratee, comparator) {
39395     var includes = comparator ? arrayIncludesWith : arrayIncludes,
39396         length = arrays[0].length,
39397         othLength = arrays.length,
39398         othIndex = othLength,
39399         caches = Array(othLength),
39400         maxLength = Infinity,
39401         result = [];
39402
39403     while (othIndex--) {
39404       var array = arrays[othIndex];
39405       if (othIndex && iteratee) {
39406         array = arrayMap(array, baseUnary(iteratee));
39407       }
39408       maxLength = nativeMin$1(array.length, maxLength);
39409       caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
39410         ? new SetCache(othIndex && array)
39411         : undefined;
39412     }
39413     array = arrays[0];
39414
39415     var index = -1,
39416         seen = caches[0];
39417
39418     outer:
39419     while (++index < length && result.length < maxLength) {
39420       var value = array[index],
39421           computed = iteratee ? iteratee(value) : value;
39422
39423       value = (comparator || value !== 0) ? value : 0;
39424       if (!(seen
39425             ? cacheHas(seen, computed)
39426             : includes(result, computed, comparator)
39427           )) {
39428         othIndex = othLength;
39429         while (--othIndex) {
39430           var cache = caches[othIndex];
39431           if (!(cache
39432                 ? cacheHas(cache, computed)
39433                 : includes(arrays[othIndex], computed, comparator))
39434               ) {
39435             continue outer;
39436           }
39437         }
39438         if (seen) {
39439           seen.push(computed);
39440         }
39441         result.push(value);
39442       }
39443     }
39444     return result;
39445   }
39446
39447   /**
39448    * Casts `value` to an empty array if it's not an array like object.
39449    *
39450    * @private
39451    * @param {*} value The value to inspect.
39452    * @returns {Array|Object} Returns the cast array-like object.
39453    */
39454   function castArrayLikeObject(value) {
39455     return isArrayLikeObject(value) ? value : [];
39456   }
39457
39458   /**
39459    * Creates an array of unique values that are included in all given arrays
39460    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
39461    * for equality comparisons. The order and references of result values are
39462    * determined by the first array.
39463    *
39464    * @static
39465    * @memberOf _
39466    * @since 0.1.0
39467    * @category Array
39468    * @param {...Array} [arrays] The arrays to inspect.
39469    * @returns {Array} Returns the new array of intersecting values.
39470    * @example
39471    *
39472    * _.intersection([2, 1], [2, 3]);
39473    * // => [2]
39474    */
39475   var intersection = baseRest(function(arrays) {
39476     var mapped = arrayMap(arrays, castArrayLikeObject);
39477     return (mapped.length && mapped[0] === arrays[0])
39478       ? baseIntersection(mapped)
39479       : [];
39480   });
39481
39482   function modeDragNode$$1(context) {
39483       var mode = {
39484           id: 'drag-node',
39485           button: 'browse'
39486       };
39487       var hover = behaviorHover(context).altDisables(true)
39488           .on('hover', context.ui().sidebar.hover);
39489       var edit = behaviorEdit(context);
39490
39491       var _nudgeInterval;
39492       var _restoreSelectedIDs = [];
39493       var _wasMidpoint = false;
39494       var _isCancelled = false;
39495       var _activeEntity;
39496       var _startLoc;
39497       var _lastLoc;
39498
39499
39500       function startNudge(entity, nudge) {
39501           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
39502           _nudgeInterval = window.setInterval(function() {
39503               context.pan(nudge);
39504               doMove(entity, nudge);
39505           }, 50);
39506       }
39507
39508
39509       function stopNudge() {
39510           if (_nudgeInterval) {
39511               window.clearInterval(_nudgeInterval);
39512               _nudgeInterval = null;
39513           }
39514       }
39515
39516
39517       function moveAnnotation(entity) {
39518           return t('operations.move.annotation.' + entity.geometry(context.graph()));
39519       }
39520
39521
39522       function connectAnnotation(nodeEntity, targetEntity) {
39523           var nodeGeometry = nodeEntity.geometry(context.graph());
39524           var targetGeometry = targetEntity.geometry(context.graph());
39525           if (nodeGeometry === 'vertex' && targetGeometry === 'vertex') {
39526               var nodeParentWayIDs = context.graph().parentWays(nodeEntity);
39527               var targetParentWayIDs = context.graph().parentWays(targetEntity);
39528               var sharedParentWays = intersection(nodeParentWayIDs, targetParentWayIDs);
39529               // if both vertices are part of the same way
39530               if (sharedParentWays.length !== 0) {
39531                   // if the nodes are next to each other, they are merged
39532                   if (sharedParentWays[0].areAdjacent(nodeEntity.id, targetEntity.id)) {
39533                       return t('operations.connect.annotation.from_vertex.to_adjacent_vertex');
39534                   }
39535                   return t('operations.connect.annotation.from_vertex.to_sibling_vertex');
39536               }
39537           }
39538           return t('operations.connect.annotation.from_' + nodeGeometry + '.to_' + targetGeometry);
39539       }
39540
39541
39542       function origin(entity) {
39543           return context.projection(entity.loc);
39544       }
39545
39546
39547       function keydown() {
39548           if (event.keyCode === utilKeybinding.modifierCodes.alt) {
39549               if (context.surface().classed('nope')) {
39550                   context.surface()
39551                       .classed('nope-suppressed', true);
39552               }
39553               context.surface()
39554                   .classed('nope', false)
39555                   .classed('nope-disabled', true);
39556           }
39557       }
39558
39559
39560       function keyup() {
39561           if (event.keyCode === utilKeybinding.modifierCodes.alt) {
39562               if (context.surface().classed('nope-suppressed')) {
39563                   context.surface()
39564                       .classed('nope', true);
39565               }
39566               context.surface()
39567                   .classed('nope-suppressed', false)
39568                   .classed('nope-disabled', false);
39569           }
39570       }
39571
39572
39573       function start(entity) {
39574           _wasMidpoint = entity.type === 'midpoint';
39575           var hasHidden = context.features().hasHiddenConnections(entity, context.graph());
39576           _isCancelled = event.sourceEvent.shiftKey || hasHidden;
39577
39578
39579           if (_isCancelled) {
39580               if (hasHidden) {
39581                   uiFlash()
39582                       .duration(4000)
39583                       .text(t('modes.drag_node.connected_to_hidden'))();
39584               }
39585               return drag.cancel();
39586           }
39587
39588           if (_wasMidpoint) {
39589               var midpoint = entity;
39590               entity = osmNode();
39591               context.perform(actionAddMidpoint(midpoint, entity));
39592               entity = context.entity(entity.id);   // get post-action entity
39593
39594               var vertex = context.surface().selectAll('.' + entity.id);
39595               drag.target(vertex.node(), entity);
39596
39597           } else {
39598               context.perform(actionNoop());
39599           }
39600
39601           _activeEntity = entity;
39602           _startLoc = entity.loc;
39603
39604           context.surface().selectAll('.' + _activeEntity.id)
39605               .classed('active', true);
39606
39607           context.enter(mode);
39608       }
39609
39610
39611       // related code
39612       // - `behavior/draw.js` `datum()`
39613       function datum() {
39614           var event$$1 = event && event.sourceEvent;
39615           if (!event$$1 || event$$1.altKey) {
39616               return {};
39617           } else {
39618               // When dragging, snap only to touch targets..
39619               // (this excludes area fills and active drawing elements)
39620               var d = event$$1.target.__data__;
39621               return (d && d.properties && d.properties.target) ? d : {};
39622           }
39623       }
39624
39625
39626       function doMove(entity, nudge) {
39627           nudge = nudge || [0, 0];
39628
39629           var currPoint = (event && event.point) || context.projection(_lastLoc);
39630           var currMouse = geoVecSubtract(currPoint, nudge);
39631           var loc = context.projection.invert(currMouse);
39632
39633           if (!_nudgeInterval) {   // If not nudging at the edge of the viewport, try to snap..
39634               // related code
39635               // - `mode/drag_node.js`     `doMode()`
39636               // - `behavior/draw.js`      `click()`
39637               // - `behavior/draw_way.js`  `move()`
39638               var d = datum();
39639               var target = d && d.properties && d.properties.entity;
39640               var targetLoc = target && target.loc;
39641               var targetNodes = d && d.properties && d.properties.nodes;
39642               var edge;
39643
39644               if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
39645                   loc = targetLoc;
39646
39647               } else if (targetNodes) {   // snap to way - a line target with `.nodes`
39648                   edge = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
39649                   if (edge) {
39650                       loc = edge.loc;
39651                   }
39652               }
39653           }
39654
39655           context.replace(
39656               actionMoveNode(entity.id, loc),
39657               moveAnnotation(entity)
39658           );
39659
39660           // Below here: validations
39661           var isInvalid = false;
39662
39663           // Check if this connection to `target` could cause relations to break..
39664           if (target) {
39665               isInvalid = hasRelationConflict(entity, target, edge, context.graph());
39666           }
39667
39668           // Check if this drag causes the geometry to break..
39669           if (!isInvalid) {
39670               isInvalid = hasInvalidGeometry(entity, context.graph());
39671           }
39672
39673
39674           var nope = context.surface().classed('nope');
39675           if (isInvalid === 'relation' || isInvalid === 'restriction') {
39676               if (!nope) {   // about to nope - show hint
39677                   uiFlash()
39678                       .duration(4000)
39679                       .text(t('operations.connect.' + isInvalid,
39680                           { relation: context.presets().item('type/restriction').name() }
39681                       ))();
39682               }
39683           } else {
39684               if (nope) {   // about to un-nope, remove hint
39685                   uiFlash()
39686                       .duration(1)
39687                       .text('')();
39688               }
39689           }
39690
39691
39692           var nopeDisabled = context.surface().classed('nope-disabled');
39693           if (nopeDisabled) {
39694               context.surface()
39695                   .classed('nope', false)
39696                   .classed('nope-suppressed', isInvalid);
39697           } else {
39698               context.surface()
39699                   .classed('nope', isInvalid)
39700                   .classed('nope-suppressed', false);
39701           }
39702
39703           _lastLoc = loc;
39704       }
39705
39706
39707       // Uses `actionConnect.disabled()` to know whether this connection is ok..
39708       function hasRelationConflict(entity, target, edge, graph) {
39709           var testGraph = graph.update();  // copy
39710
39711           // if snapping to way - add midpoint there and consider that the target..
39712           if (edge) {
39713               var midpoint = osmNode();
39714               var action = actionAddMidpoint({
39715                   loc: edge.loc,
39716                   edge: [target.nodes[edge.index - 1], target.nodes[edge.index]]
39717               }, midpoint);
39718
39719               testGraph = action(testGraph);
39720               target = midpoint;
39721           }
39722
39723           // can we connect to it?
39724           var ids = [entity.id, target.id];
39725           return actionConnect(ids).disabled(testGraph);
39726       }
39727
39728
39729       function hasInvalidGeometry(entity, graph) {
39730           var parents = graph.parentWays(entity);
39731           var i, j, k;
39732
39733           for (i = 0; i < parents.length; i++) {
39734               var parent = parents[i];
39735               var nodes = [];
39736               var activeIndex = null;    // which multipolygon ring contains node being dragged
39737
39738               // test any parent multipolygons for valid geometry
39739               var relations = graph.parentRelations(parent);
39740               for (j = 0; j < relations.length; j++) {
39741                   if (!relations[j].isMultipolygon()) continue;
39742
39743                   var rings = osmJoinWays(relations[j].members, graph);
39744
39745                   // find active ring and test it for self intersections
39746                   for (k = 0; k < rings.length; k++) {
39747                       nodes = rings[k].nodes;
39748                       if (find$1(nodes, function(n) { return n.id === entity.id; })) {
39749                           activeIndex = k;
39750                           if (geoHasSelfIntersections(nodes, entity.id)) {
39751                               return true;
39752                           }
39753                       }
39754                       rings[k].coords = nodes.map(function(n) { return n.loc; });
39755                   }
39756
39757                   // test active ring for intersections with other rings in the multipolygon
39758                   for (k = 0; k < rings.length; k++) {
39759                       if (k === activeIndex) continue;
39760
39761                       // make sure active ring doesnt cross passive rings
39762                       if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) {
39763                           return true;
39764                       }
39765                   }
39766               }
39767
39768
39769               // If we still haven't tested this node's parent way for self-intersections.
39770               // (because it's not a member of a multipolygon), test it now.
39771               if (activeIndex === null) {
39772                   nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
39773                   if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) {
39774                       return true;
39775                   }
39776               }
39777
39778           }
39779
39780           return false;
39781       }
39782
39783
39784       function move(entity) {
39785           if (_isCancelled) return;
39786           event.sourceEvent.stopPropagation();
39787
39788           context.surface().classed('nope-disabled', event.sourceEvent.altKey);
39789
39790           _lastLoc = context.projection.invert(event.point);
39791
39792           doMove(entity);
39793           var nudge = geoViewportEdge(event.point, context.map().dimensions());
39794           if (nudge) {
39795               startNudge(entity, nudge);
39796           } else {
39797               stopNudge();
39798           }
39799       }
39800
39801
39802       function end(entity) {
39803           if (_isCancelled) return;
39804
39805           var d = datum();
39806           var nope = (d && d.properties && d.properties.nope) || context.surface().classed('nope');
39807           var target = d && d.properties && d.properties.entity;   // entity to snap to
39808
39809           if (nope) {   // bounce back
39810               context.perform(
39811                   _actionBounceBack(entity.id, _startLoc)
39812               );
39813
39814           } else if (target && target.type === 'way') {
39815               var choice = geoChooseEdge(context.childNodes(target), context.mouse(), context.projection, entity.id);
39816               context.replace(
39817                   actionAddMidpoint({
39818                       loc: choice.loc,
39819                       edge: [target.nodes[choice.index - 1], target.nodes[choice.index]]
39820                   }, entity),
39821                   connectAnnotation(entity, target)
39822               );
39823
39824           } else if (target && target.type === 'node') {
39825               context.replace(
39826                   actionConnect([target.id, entity.id]),
39827                   connectAnnotation(entity, target)
39828               );
39829
39830           } else if (_wasMidpoint) {
39831               context.replace(
39832                   actionNoop(),
39833                   t('operations.add.annotation.vertex')
39834               );
39835
39836           } else {
39837               context.replace(
39838                   actionNoop(),
39839                   moveAnnotation(entity)
39840               );
39841           }
39842
39843           var reselection = _restoreSelectedIDs.filter(function(id) {
39844               return context.graph().hasEntity(id);
39845           });
39846
39847           if (reselection.length) {
39848               context.enter(modeSelect(context, reselection));
39849           } else {
39850               context.enter(modeBrowse(context));
39851           }
39852       }
39853
39854
39855       function _actionBounceBack(nodeID, toLoc) {
39856           var moveNode = actionMoveNode(nodeID, toLoc);
39857           var action = function(graph, t$$1) {
39858               // last time through, pop off the bounceback perform.
39859               // it will then overwrite the initial perform with a moveNode that does nothing
39860               if (t$$1 === 1) context.pop();
39861               return moveNode(graph, t$$1);
39862           };
39863           action.transitionable = true;
39864           return action;
39865       }
39866
39867
39868       function cancel() {
39869           drag.cancel();
39870           context.enter(modeBrowse(context));
39871       }
39872
39873
39874       var drag = behaviorDrag()
39875           .selector('.layer-touch.points .target')
39876           .surface(select('#map').node())
39877           .origin(origin)
39878           .on('start', start)
39879           .on('move', move)
39880           .on('end', end);
39881
39882
39883       mode.enter = function() {
39884           context.install(hover);
39885           context.install(edit);
39886
39887           select(window)
39888               .on('keydown.drawWay', keydown)
39889               .on('keyup.drawWay', keyup);
39890
39891           context.history()
39892               .on('undone.drag-node', cancel);
39893       };
39894
39895
39896       mode.exit = function() {
39897           context.ui().sidebar.hover.cancel();
39898           context.uninstall(hover);
39899           context.uninstall(edit);
39900
39901           select(window)
39902               .on('keydown.hover', null)
39903               .on('keyup.hover', null);
39904
39905           context.history()
39906               .on('undone.drag-node', null);
39907
39908           _activeEntity = null;
39909
39910           context.surface()
39911               .classed('nope', false)
39912               .classed('nope-suppressed', false)
39913               .classed('nope-disabled', false)
39914               .selectAll('.active')
39915               .classed('active', false);
39916
39917           stopNudge();
39918       };
39919
39920
39921       mode.selectedIDs = function() {
39922           if (!arguments.length) return _activeEntity ? [_activeEntity.id] : [];
39923           // no assign
39924           return mode;
39925       };
39926
39927
39928       mode.activeID = function() {
39929           if (!arguments.length) return _activeEntity && _activeEntity.id;
39930           // no assign
39931           return mode;
39932       };
39933
39934
39935       mode.restoreSelectedIDs = function(_) {
39936           if (!arguments.length) return _restoreSelectedIDs;
39937           _restoreSelectedIDs = _;
39938           return mode;
39939       };
39940
39941
39942       mode.behavior = drag;
39943
39944
39945       return mode;
39946   }
39947
39948   function modeDragNote$$1(context) {
39949       var mode = {
39950           id: 'drag-note',
39951           button: 'browse'
39952       };
39953
39954       var edit = behaviorEdit(context);
39955
39956       var _nudgeInterval;
39957       var _lastLoc;
39958       var _note;    // most current note.. dragged note may have stale datum.
39959
39960
39961       function startNudge(nudge) {
39962           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
39963           _nudgeInterval = window.setInterval(function() {
39964               context.pan(nudge);
39965               doMove(nudge);
39966           }, 50);
39967       }
39968
39969
39970       function stopNudge() {
39971           if (_nudgeInterval) {
39972               window.clearInterval(_nudgeInterval);
39973               _nudgeInterval = null;
39974           }
39975       }
39976
39977
39978       function origin(note) {
39979           return context.projection(note.loc);
39980       }
39981
39982
39983       function start(note) {
39984           _note = note;
39985           var osm = services.osm;
39986           if (osm) {
39987               // Get latest note from cache.. The marker may have a stale datum bound to it
39988               // and dragging it around can sometimes delete the users note comment.
39989               _note = osm.getNote(_note.id);
39990           }
39991
39992           context.surface().selectAll('.note-' + _note.id)
39993               .classed('active', true);
39994
39995           context.perform(actionNoop());
39996           context.enter(mode);
39997           context.selectedNoteID(_note.id);
39998       }
39999
40000
40001       function move() {
40002           event.sourceEvent.stopPropagation();
40003           _lastLoc = context.projection.invert(event.point);
40004
40005           doMove();
40006           var nudge = geoViewportEdge(event.point, context.map().dimensions());
40007           if (nudge) {
40008               startNudge(nudge);
40009           } else {
40010               stopNudge();
40011           }
40012       }
40013
40014
40015       function doMove(nudge) {
40016           nudge = nudge || [0, 0];
40017
40018           var currPoint = (event && event.point) || context.projection(_lastLoc);
40019           var currMouse = geoVecSubtract(currPoint, nudge);
40020           var loc = context.projection.invert(currMouse);
40021
40022           _note = _note.move(loc);
40023
40024           var osm = services.osm;
40025           if (osm) {
40026               osm.replaceNote(_note);  // update note cache
40027           }
40028
40029           context.replace(actionNoop());   // trigger redraw
40030       }
40031
40032
40033       function end() {
40034           context.replace(actionNoop());   // trigger redraw
40035
40036           context
40037               .selectedNoteID(_note.id)
40038               .enter(modeSelectNote$$1(context, _note.id));
40039       }
40040
40041
40042       var drag = behaviorDrag()
40043           .selector('.layer-touch.markers .target.note.new')
40044           .surface(select('#map').node())
40045           .origin(origin)
40046           .on('start', start)
40047           .on('move', move)
40048           .on('end', end);
40049
40050
40051       mode.enter = function() {
40052           context.install(edit);
40053       };
40054
40055
40056       mode.exit = function() {
40057           context.ui().sidebar.hover.cancel();
40058           context.uninstall(edit);
40059
40060           context.surface()
40061               .selectAll('.active')
40062               .classed('active', false);
40063
40064           stopNudge();
40065       };
40066
40067       mode.behavior = drag;
40068
40069       return mode;
40070   }
40071
40072   function modeBrowse(context) {
40073       var mode = {
40074           button: 'browse',
40075           id: 'browse',
40076           title: t('modes.browse.title'),
40077           description: t('modes.browse.description')
40078       }, sidebar;
40079
40080       var behaviors = [
40081           behaviorPaste(context),
40082           behaviorHover(context).on('hover', context.ui().sidebar.hover),
40083           behaviorSelect(context),
40084           behaviorLasso(context),
40085           modeDragNode$$1(context).behavior,
40086           modeDragNote$$1(context).behavior
40087       ];
40088
40089
40090       mode.enter = function() {
40091           behaviors.forEach(context.install);
40092
40093           // Get focus on the body.
40094           if (document.activeElement && document.activeElement.blur) {
40095               document.activeElement.blur();
40096           }
40097
40098           if (sidebar) {
40099               context.ui().sidebar.show(sidebar);
40100           } else {
40101               context.ui().sidebar.select(null);
40102           }
40103       };
40104
40105
40106       mode.exit = function() {
40107           context.ui().sidebar.hover.cancel();
40108           behaviors.forEach(context.uninstall);
40109
40110           if (sidebar) {
40111               context.ui().sidebar.hide();
40112           }
40113       };
40114
40115
40116       mode.sidebar = function(_) {
40117           if (!arguments.length) return sidebar;
40118           sidebar = _;
40119           return mode;
40120       };
40121
40122
40123       return mode;
40124   }
40125
40126   function svgIcon(name, svgklass, useklass) {
40127       return function drawIcon(selection) {
40128           selection.selectAll('svg')
40129               .data([0])
40130               .enter()
40131               .append('svg')
40132               .attr('class', 'icon ' + (svgklass || ''))
40133               .append('use')
40134               .attr('xlink:href', name)
40135               .attr('class', useklass);
40136       };
40137   }
40138
40139   // Tooltips and svg mask used to highlight certain features
40140   function uiCurtain() {
40141
40142       var surface = select(null),
40143           tooltip = select(null),
40144           darkness = select(null);
40145
40146       function curtain(selection$$1) {
40147           surface = selection$$1
40148               .append('svg')
40149               .attr('id', 'curtain')
40150               .style('z-index', 1000)
40151               .style('pointer-events', 'none')
40152               .style('position', 'absolute')
40153               .style('top', 0)
40154               .style('left', 0);
40155
40156           darkness = surface.append('path')
40157               .attr('x', 0)
40158               .attr('y', 0)
40159               .attr('class', 'curtain-darkness');
40160
40161           select(window).on('resize.curtain', resize);
40162
40163           tooltip = selection$$1.append('div')
40164               .attr('class', 'tooltip')
40165               .style('z-index', 1002);
40166
40167           tooltip
40168               .append('div')
40169               .attr('class', 'tooltip-arrow');
40170
40171           tooltip
40172               .append('div')
40173               .attr('class', 'tooltip-inner');
40174
40175           resize();
40176
40177
40178           function resize() {
40179               surface
40180                   .attr('width', window.innerWidth)
40181                   .attr('height', window.innerHeight);
40182               curtain.cut(darkness.datum());
40183           }
40184       }
40185
40186
40187       /**
40188        * Reveal cuts the curtain to highlight the given box,
40189        * and shows a tooltip with instructions next to the box.
40190        *
40191        * @param  {String|ClientRect} [box]   box used to cut the curtain
40192        * @param  {String}    [text]          text for a tooltip
40193        * @param  {Object}    [options]
40194        * @param  {string}    [options.tooltipClass]    optional class to add to the tooltip
40195        * @param  {integer}   [options.duration]        transition time in milliseconds
40196        * @param  {string}    [options.buttonText]      if set, create a button with this text label
40197        * @param  {function}  [options.buttonCallback]  if set, the callback for the button
40198        * @param  {String|ClientRect} [options.tooltipBox]  box for tooltip position, if different from box for the curtain
40199        */
40200       curtain.reveal = function(box, text, options) {
40201           if (typeof box === 'string') {
40202               box = select(box).node();
40203           }
40204           if (box && box.getBoundingClientRect) {
40205               box = copyBox(box.getBoundingClientRect());
40206           }
40207
40208           options = options || {};
40209
40210           var tooltipBox;
40211           if (options.tooltipBox) {
40212               tooltipBox = options.tooltipBox;
40213               if (typeof tooltipBox === 'string') {
40214                   tooltipBox = select(tooltipBox).node();
40215               }
40216               if (tooltipBox && tooltipBox.getBoundingClientRect) {
40217                   tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
40218               }
40219           } else {
40220               tooltipBox = box;
40221           }
40222
40223           if (tooltipBox && text) {
40224               // pseudo markdown bold text for the instruction section..
40225               var parts = text.split('**');
40226               var html = parts[0] ? '<span>' + parts[0] + '</span>' : '';
40227               if (parts[1]) {
40228                   html += '<span class="instruction">' + parts[1] + '</span>';
40229               }
40230
40231               html = html.replace(/\*(.*?)\*/g, '<em>$1</em>');   // emphasis
40232               html = html.replace(/\{br\}/g, '<br/><br/>');       // linebreak
40233
40234               if (options.buttonText && options.buttonCallback) {
40235                   html += '<div class="button-section">' +
40236                       '<button href="#" class="button action col8">' + options.buttonText + '</button></div>';
40237               }
40238
40239               var classes = 'curtain-tooltip tooltip in ' + (options.tooltipClass || '');
40240               tooltip
40241                   .classed(classes, true)
40242                   .selectAll('.tooltip-inner')
40243                   .html(html);
40244
40245               if (options.buttonText && options.buttonCallback) {
40246                   var button = tooltip.selectAll('.button-section .button.action');
40247                   button
40248                       .on('click', function() {
40249                           event.preventDefault();
40250                           options.buttonCallback();
40251                       });
40252               }
40253
40254               var tip = copyBox(tooltip.node().getBoundingClientRect()),
40255                   w = window.innerWidth,
40256                   h = window.innerHeight,
40257                   tooltipWidth = 200,
40258                   tooltipArrow = 5,
40259                   side, pos;
40260
40261
40262               // hack: this will have bottom placement,
40263               // so need to reserve extra space for the tooltip illustration.
40264               if (options.tooltipClass === 'intro-mouse') {
40265                   tip.height += 80;
40266               }
40267
40268               // trim box dimensions to just the portion that fits in the window..
40269               if (tooltipBox.top + tooltipBox.height > h) {
40270                   tooltipBox.height -= (tooltipBox.top + tooltipBox.height - h);
40271               }
40272               if (tooltipBox.left + tooltipBox.width > w) {
40273                   tooltipBox.width -= (tooltipBox.left + tooltipBox.width - w);
40274               }
40275
40276               // determine tooltip placement..
40277
40278               if (tooltipBox.top + tooltipBox.height < 100) {
40279                   // tooltip below box..
40280                   side = 'bottom';
40281                   pos = [
40282                       tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
40283                       tooltipBox.top + tooltipBox.height
40284                   ];
40285
40286               } else if (tooltipBox.top > h - 140) {
40287                   // tooltip above box..
40288                   side = 'top';
40289                   pos = [
40290                       tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
40291                       tooltipBox.top - tip.height
40292                   ];
40293
40294               } else {
40295                   // tooltip to the side of the tooltipBox..
40296                   var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
40297
40298                   if (textDirection === 'rtl') {
40299                       if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
40300                           side = 'right';
40301                           pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
40302
40303                       } else {
40304                           side = 'left';
40305                           pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
40306                       }
40307
40308                   } else {
40309                       if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
40310                           side = 'left';
40311                           pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
40312                       }
40313                       else {
40314                           side = 'right';
40315                           pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
40316                       }
40317                   }
40318               }
40319
40320               if (options.duration !== 0 || !tooltip.classed(side)) {
40321                   tooltip.call(uiToggle(true));
40322               }
40323
40324               tooltip
40325                   .style('top', pos[1] + 'px')
40326                   .style('left', pos[0] + 'px')
40327                   .attr('class', classes + ' ' + side);
40328
40329
40330               // shift tooltip-inner if it is very close to the top or bottom edge
40331               // (doesn't affect the placement of the tooltip-arrow)
40332               var shiftY = 0;
40333               if (side === 'left' || side === 'right') {
40334                   if (pos[1] < 60) {
40335                       shiftY = 60 - pos[1];
40336                   }
40337                   else if (pos[1] + tip.height > h - 100) {
40338                       shiftY = h - pos[1] - tip.height - 100;
40339                   }
40340               }
40341               tooltip.selectAll('.tooltip-inner')
40342                   .style('top', shiftY + 'px');
40343
40344           } else {
40345               tooltip
40346                   .classed('in', false)
40347                   .call(uiToggle(false));
40348           }
40349
40350           curtain.cut(box, options.duration);
40351
40352           return tooltip;
40353       };
40354
40355
40356       curtain.cut = function(datum, duration) {
40357           darkness.datum(datum)
40358               .interrupt();
40359
40360           var selection$$1;
40361           if (duration === 0) {
40362               selection$$1 = darkness;
40363           } else {
40364               selection$$1 = darkness
40365                   .transition()
40366                   .duration(duration || 600)
40367                   .ease(linear$1);
40368           }
40369
40370           selection$$1
40371               .attr('d', function(d) {
40372                   var string = 'M 0,0 L 0,' + window.innerHeight + ' L ' +
40373                       window.innerWidth + ',' + window.innerHeight + 'L' +
40374                       window.innerWidth + ',0 Z';
40375
40376                   if (!d) return string;
40377                   return string + 'M' +
40378                       d.left + ',' + d.top + 'L' +
40379                       d.left + ',' + (d.top + d.height) + 'L' +
40380                       (d.left + d.width) + ',' + (d.top + d.height) + 'L' +
40381                       (d.left + d.width) + ',' + (d.top) + 'Z';
40382
40383               });
40384       };
40385
40386
40387       curtain.remove = function() {
40388           surface.remove();
40389           tooltip.remove();
40390           select(window).on('resize.curtain', null);
40391       };
40392
40393
40394       // ClientRects are immutable, so copy them to an object,
40395       // in case we need to trim the height/width.
40396       function copyBox(src) {
40397           return {
40398               top: src.top,
40399               right: src.right,
40400               bottom: src.bottom,
40401               left: src.left,
40402               width: src.width,
40403               height: src.height
40404           };
40405       }
40406
40407
40408       return curtain;
40409   }
40410
40411   function uiIntroWelcome(context, reveal) {
40412       var dispatch$$1 = dispatch('done');
40413       var listener = clickListener();
40414
40415       var chapter = {
40416           title: 'intro.welcome.title'
40417       };
40418
40419
40420       function welcome() {
40421           context.map().centerZoom([-85.63591, 41.94285], 19);
40422           reveal('.intro-nav-wrap .chapter-welcome',
40423               t('intro.welcome.welcome'),
40424               { buttonText: t('intro.ok'), buttonCallback: practice }
40425           );
40426       }
40427
40428       function practice() {
40429           reveal('.intro-nav-wrap .chapter-welcome',
40430               t('intro.welcome.practice'),
40431               { buttonText: t('intro.ok'), buttonCallback: words }
40432           );
40433       }
40434
40435       function words() {
40436           reveal('.intro-nav-wrap .chapter-welcome',
40437               t('intro.welcome.words'),
40438               { buttonText: t('intro.ok'), buttonCallback: mouse$$1 }
40439           );
40440       }
40441
40442
40443       function mouse$$1() {
40444           reveal('.intro-nav-wrap .chapter-welcome',
40445               t('intro.welcome.mouse'),
40446               { buttonText: t('intro.ok'), buttonCallback: leftClick }
40447           );
40448       }
40449
40450
40451       function leftClick() {
40452           var counter = 0;
40453           var times = 5;
40454
40455           var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
40456               t('intro.welcome.leftclick', { num: times }),
40457               { tooltipClass: 'intro-mouse' }
40458           );
40459
40460           tooltip.selectAll('.tooltip-inner')
40461               .insert('svg', 'span')
40462               .attr('class', 'tooltip-illustration')
40463               .append('use')
40464               .attr('xlink:href', '#iD-walkthrough-mouse');
40465
40466           tooltip
40467               .append('div')
40468               .attr('class', 'counter');
40469
40470           tooltip.call(listener);
40471
40472           listener.on('click', function(which) {
40473               if (which === 'left') {
40474                   select('.curtain-tooltip.intro-mouse .counter')
40475                       .text(String(++counter));
40476
40477                   if (counter === times) {
40478                       window.setTimeout(function() { continueTo(rightClick); }, 1000);
40479                   }
40480               }
40481           });
40482
40483           function continueTo(nextStep) {
40484               listener.on('click', null);
40485               tooltip.call(listener.off);
40486               tooltip.select('.counter').remove();
40487               nextStep();
40488           }
40489       }
40490
40491
40492       function rightClick() {
40493           var counter = 0;
40494           var times = 5;
40495
40496           var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
40497               t('intro.welcome.rightclick', { num: times }),
40498               { tooltipClass: 'intro-mouse' }
40499           );
40500
40501           tooltip.selectAll('.tooltip-inner')
40502               .insert('svg', 'span')
40503               .attr('class', 'tooltip-illustration')
40504               .append('use')
40505               .attr('xlink:href', '#iD-walkthrough-mouse');
40506
40507           tooltip
40508               .append('div')
40509               .attr('class', 'counter');
40510
40511           tooltip.call(listener);
40512
40513           listener.on('click', function(which) {
40514               if (which === 'right') {
40515                   select('.curtain-tooltip.intro-mouse .counter')
40516                       .text(String(++counter));
40517
40518                   if (counter === times) {
40519                       window.setTimeout(function() { continueTo(chapters); }, 1000);
40520                   }
40521               }
40522           });
40523
40524           function continueTo(nextStep) {
40525               listener.on('click', null);
40526               tooltip.call(listener.off);
40527               tooltip.select('.counter').remove();
40528               nextStep();
40529           }
40530       }
40531
40532
40533       function chapters() {
40534           dispatch$$1.call('done');
40535           reveal('.intro-nav-wrap .chapter-navigation',
40536               t('intro.welcome.chapters', { next: t('intro.navigation.title') })
40537           );
40538       }
40539
40540
40541       chapter.enter = function() {
40542           welcome();
40543       };
40544
40545
40546       chapter.exit = function() {
40547           listener.off();
40548           select('.curtain-tooltip.intro-mouse')
40549               .selectAll('.counter')
40550               .remove();
40551       };
40552
40553
40554       chapter.restart = function() {
40555           chapter.exit();
40556           chapter.enter();
40557       };
40558
40559
40560       return utilRebind(chapter, dispatch$$1, 'on');
40561   }
40562
40563
40564
40565   function clickListener() {
40566       var dispatch$$1 = dispatch('click');
40567       var minTime = 120;
40568       var tooltip = select(null);
40569       var down = {};
40570
40571       // `down` keeps track of which buttons/keys are down.
40572       // Setting a property in `down` happens immediately.
40573       // Unsetting a property in `down` is delayed because
40574       //   on Windows a contextmenu event happens after keyup/mouseup
40575
40576       function keydown() {
40577           if (event.keyCode === 93)  {   // context menu
40578               event.preventDefault();
40579               event.stopPropagation();
40580               down.menu = event.timeStamp;
40581               tooltip.classed('rightclick', true);
40582           }
40583       }
40584
40585
40586       function keyup() {
40587           if (event.keyCode === 93)  {   // context menu
40588               event.preventDefault();
40589               event.stopPropagation();
40590               var endTime = event.timeStamp;
40591               var startTime = down.menu || endTime;
40592               var delay = (endTime - startTime < minTime) ? minTime : 0;
40593
40594               window.setTimeout(function() {
40595                   tooltip.classed('rightclick', false);
40596                   down.menu = undefined;  // delayed, for Windows
40597               }, delay);
40598
40599               dispatch$$1.call('click', this, 'right');
40600           }
40601       }
40602
40603
40604       function mousedown() {
40605           var button = event.button;
40606           if (button === 0 && !event.ctrlKey) {
40607               tooltip.classed('leftclick', true);
40608           } else if (button === 2) {
40609               tooltip.classed('rightclick', true);
40610           }
40611           down[button] = event.timeStamp;
40612       }
40613
40614
40615       function mouseup() {
40616           var button = event.button;
40617           var endTime = event.timeStamp;
40618           var startTime = down[button] || endTime;
40619           var delay = (endTime - startTime < minTime) ? minTime : 0;
40620
40621           if (button === 0 && !event.ctrlKey) {
40622               window.setTimeout(function() {
40623                   tooltip.classed('leftclick', false);
40624                   down[button] = undefined;  // delayed, for Windows
40625               }, delay);
40626
40627               dispatch$$1.call('click', this, 'left');
40628
40629           } else if (button === 2) {
40630               window.setTimeout(function() {
40631                   tooltip.classed('rightclick', false);
40632                   down[button] = undefined;  // delayed, for Windows
40633               }, delay);
40634
40635               dispatch$$1.call('click', this, 'right');
40636
40637           } else {
40638               window.setTimeout(function() {
40639                   down[button] = undefined;  // delayed, for Windows
40640               }, delay);
40641           }
40642       }
40643
40644
40645       function contextmenu() {
40646           event.preventDefault();
40647           event.stopPropagation();
40648           if (!down[2] && !down.menu) {
40649               tooltip.classed('rightclick', true);
40650               window.setTimeout(function() {
40651                   tooltip.classed('rightclick', false);
40652               }, minTime);
40653               dispatch$$1.call('click', this, 'right');
40654           }
40655       }
40656
40657
40658       var behavior = function(selection$$1) {
40659           tooltip = selection$$1;
40660           down = {};
40661
40662           select(window)
40663               .on('keydown.intro', keydown)
40664               .on('keyup.intro', keyup)
40665               .on('mousedown.intro', mousedown)
40666               .on('mouseup.intro', mouseup)
40667               .on('contextmenu.intro', contextmenu);
40668       };
40669
40670
40671       behavior.off = function() {
40672           select(window)
40673               .on('keydown.intro', null)
40674               .on('keyup.intro', null)
40675               .on('mousedown.intro', null)
40676               .on('mouseup.intro', null)
40677               .on('contextmenu.intro', null);
40678
40679           tooltip
40680               .classed('leftclick', false)
40681               .classed('rightclick', false);
40682       };
40683
40684       return utilRebind(behavior, dispatch$$1, 'on');
40685   }
40686
40687   function uiIntroNavigation(context, reveal) {
40688       var dispatch$$1 = dispatch('done');
40689       var timeouts = [];
40690       var hallId = 'n2061';
40691       var townHall = [-85.63591, 41.94285];
40692       var springStreetId = 'w397';
40693       var springStreetEndId = 'n1834';
40694       var springStreet = [-85.63582, 41.94255];
40695       var onewayField = context.presets().field('oneway');
40696       var maxspeedField = context.presets().field('maxspeed');
40697
40698
40699       var chapter = {
40700           title: 'intro.navigation.title'
40701       };
40702
40703
40704       function timeout(f, t$$1) {
40705           timeouts.push(window.setTimeout(f, t$$1));
40706       }
40707
40708
40709       function eventCancel() {
40710           event.stopPropagation();
40711           event.preventDefault();
40712       }
40713
40714
40715       function isTownHallSelected() {
40716           var ids = context.selectedIDs();
40717           return ids.length === 1 && ids[0] === hallId;
40718       }
40719
40720
40721       function dragMap() {
40722           context.enter(modeBrowse(context));
40723           context.history().reset('initial');
40724
40725           var msec = transitionTime(townHall, context.map().center());
40726           if (msec) { reveal(null, null, { duration: 0 }); }
40727           context.map().centerZoomEase(townHall, 19, msec);
40728
40729           timeout(function() {
40730               var centerStart = context.map().center();
40731
40732               reveal('#surface', t('intro.navigation.drag'));
40733               context.map().on('drawn.intro', function() {
40734                   reveal('#surface', t('intro.navigation.drag'), { duration: 0 });
40735               });
40736
40737               context.map().on('move.intro', function() {
40738                   var centerNow = context.map().center();
40739                   if (centerStart[0] !== centerNow[0] || centerStart[1] !== centerNow[1]) {
40740                       context.map().on('move.intro', null);
40741                       timeout(function() { continueTo(zoomMap); }, 3000);
40742                   }
40743               });
40744
40745           }, msec + 100);
40746
40747           function continueTo(nextStep) {
40748               context.map().on('move.intro drawn.intro', null);
40749               nextStep();
40750           }
40751       }
40752
40753
40754       function zoomMap() {
40755           var zoomStart = context.map().zoom();
40756
40757           reveal('#surface',
40758               t('intro.navigation.zoom', {
40759                   plus: icon('#iD-icon-plus', 'pre-text'),
40760                   minus: icon('#iD-icon-minus', 'pre-text')
40761               })
40762           );
40763
40764           context.map().on('drawn.intro', function() {
40765               reveal('#surface',
40766                   t('intro.navigation.zoom', {
40767                       plus: icon('#iD-icon-plus', 'pre-text'),
40768                       minus: icon('#iD-icon-minus', 'pre-text')
40769                   }), { duration: 0 }
40770               );
40771           });
40772
40773           context.map().on('move.intro', function() {
40774               if (context.map().zoom() !== zoomStart) {
40775                   context.map().on('move.intro', null);
40776                   timeout(function() { continueTo(features); }, 3000);
40777               }
40778           });
40779
40780           function continueTo(nextStep) {
40781               context.map().on('move.intro drawn.intro', null);
40782               nextStep();
40783           }
40784       }
40785
40786
40787       function features() {
40788           var onClick = function() { continueTo(pointsLinesAreas); };
40789
40790           reveal('#surface', t('intro.navigation.features'),
40791               { buttonText: t('intro.ok'), buttonCallback: onClick }
40792           );
40793
40794           context.map().on('drawn.intro', function() {
40795               reveal('#surface', t('intro.navigation.features'),
40796                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
40797               );
40798           });
40799
40800           function continueTo(nextStep) {
40801               context.map().on('drawn.intro', null);
40802               nextStep();
40803           }
40804       }
40805
40806       function pointsLinesAreas() {
40807           var onClick = function() { continueTo(nodesWays); };
40808
40809           reveal('#surface', t('intro.navigation.points_lines_areas'),
40810               { buttonText: t('intro.ok'), buttonCallback: onClick }
40811           );
40812
40813           context.map().on('drawn.intro', function() {
40814               reveal('#surface', t('intro.navigation.points_lines_areas'),
40815                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
40816               );
40817           });
40818
40819           function continueTo(nextStep) {
40820               context.map().on('drawn.intro', null);
40821               nextStep();
40822           }
40823       }
40824
40825       function nodesWays() {
40826           var onClick = function() { continueTo(clickTownHall); };
40827
40828           reveal('#surface', t('intro.navigation.nodes_ways'),
40829               { buttonText: t('intro.ok'), buttonCallback: onClick }
40830           );
40831
40832           context.map().on('drawn.intro', function() {
40833               reveal('#surface', t('intro.navigation.nodes_ways'),
40834                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
40835               );
40836           });
40837
40838           function continueTo(nextStep) {
40839               context.map().on('drawn.intro', null);
40840               nextStep();
40841           }
40842       }
40843
40844       function clickTownHall() {
40845           context.enter(modeBrowse(context));
40846           context.history().reset('initial');
40847
40848           var entity = context.hasEntity(hallId);
40849           if (!entity) return;
40850           reveal(null, null, { duration: 0 });
40851           context.map().centerZoomEase(entity.loc, 19, 500);
40852
40853           timeout(function() {
40854               var entity = context.hasEntity(hallId);
40855               if (!entity) return;
40856               var box = pointBox(entity.loc, context);
40857               reveal(box, t('intro.navigation.click_townhall'));
40858
40859               context.map().on('move.intro drawn.intro', function() {
40860                   var entity = context.hasEntity(hallId);
40861                   if (!entity) return;
40862                   var box = pointBox(entity.loc, context);
40863                   reveal(box, t('intro.navigation.click_townhall'), { duration: 0 });
40864               });
40865
40866               context.on('enter.intro', function() {
40867                   if (isTownHallSelected()) continueTo(selectedTownHall);
40868               });
40869
40870           }, 550);  // after centerZoomEase
40871
40872           context.history().on('change.intro', function() {
40873               if (!context.hasEntity(hallId)) {
40874                   continueTo(clickTownHall);
40875               }
40876           });
40877
40878           function continueTo(nextStep) {
40879               context.on('enter.intro', null);
40880               context.map().on('move.intro drawn.intro', null);
40881               context.history().on('change.intro', null);
40882               nextStep();
40883           }
40884       }
40885
40886
40887       function selectedTownHall() {
40888           if (!isTownHallSelected()) return clickTownHall();
40889
40890           var entity = context.hasEntity(hallId);
40891           if (!entity) return clickTownHall();
40892
40893           var box = pointBox(entity.loc, context);
40894           var onClick = function() { continueTo(editorTownHall); };
40895
40896           reveal(box, t('intro.navigation.selected_townhall'),
40897               { buttonText: t('intro.ok'), buttonCallback: onClick }
40898           );
40899
40900           context.map().on('move.intro drawn.intro', function() {
40901               var entity = context.hasEntity(hallId);
40902               if (!entity) return;
40903               var box = pointBox(entity.loc, context);
40904               reveal(box, t('intro.navigation.selected_townhall'),
40905                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
40906               );
40907           });
40908
40909           context.history().on('change.intro', function() {
40910               if (!context.hasEntity(hallId)) {
40911                   continueTo(clickTownHall);
40912               }
40913           });
40914
40915           function continueTo(nextStep) {
40916               context.map().on('move.intro drawn.intro', null);
40917               context.history().on('change.intro', null);
40918               nextStep();
40919           }
40920       }
40921
40922
40923       function editorTownHall() {
40924           if (!isTownHallSelected()) return clickTownHall();
40925
40926           // disallow scrolling
40927           select('.inspector-wrap').on('wheel.intro', eventCancel);
40928
40929           var onClick = function() { continueTo(presetTownHall); };
40930
40931           reveal('.entity-editor-pane',
40932               t('intro.navigation.editor_townhall'),
40933               { buttonText: t('intro.ok'), buttonCallback: onClick }
40934           );
40935
40936           context.on('exit.intro', function() {
40937               continueTo(clickTownHall);
40938           });
40939
40940           context.history().on('change.intro', function() {
40941               if (!context.hasEntity(hallId)) {
40942                   continueTo(clickTownHall);
40943               }
40944           });
40945
40946           function continueTo(nextStep) {
40947               context.on('exit.intro', null);
40948               context.history().on('change.intro', null);
40949               select('.inspector-wrap').on('wheel.intro', null);
40950               nextStep();
40951           }
40952       }
40953
40954
40955       function presetTownHall() {
40956           if (!isTownHallSelected()) return clickTownHall();
40957
40958           // reset pane, in case user happened to change it..
40959           select('.inspector-wrap .panewrap').style('right', '0%');
40960           // disallow scrolling
40961           select('.inspector-wrap').on('wheel.intro', eventCancel);
40962
40963           // preset match, in case the user happened to change it.
40964           var entity = context.entity(context.selectedIDs()[0]);
40965           var preset = context.presets().match(entity, context.graph());
40966
40967           var onClick = function() { continueTo(fieldsTownHall); };
40968
40969           context.on('exit.intro', function() {
40970               continueTo(clickTownHall);
40971           });
40972
40973           context.history().on('change.intro', function() {
40974               if (!context.hasEntity(hallId)) {
40975                   continueTo(clickTownHall);
40976               }
40977           });
40978
40979           reveal('.inspector-body .preset-list-item.inspector-inner',
40980               t('intro.navigation.preset_townhall', { preset: preset.name() }),
40981               { buttonText: t('intro.ok'), buttonCallback: onClick }
40982           );
40983
40984           function continueTo(nextStep) {
40985               context.on('exit.intro', null);
40986               context.history().on('change.intro', null);
40987               select('.inspector-wrap').on('wheel.intro', null);
40988               nextStep();
40989           }
40990       }
40991
40992
40993       function fieldsTownHall() {
40994           if (!isTownHallSelected()) return clickTownHall();
40995
40996           // reset pane, in case user happened to change it..
40997           select('.inspector-wrap .panewrap').style('right', '0%');
40998           // disallow scrolling
40999           select('.inspector-wrap').on('wheel.intro', eventCancel);
41000
41001           var onClick = function() { continueTo(closeTownHall); };
41002
41003           reveal('.inspector-body .preset-editor',
41004               t('intro.navigation.fields_townhall'),
41005               { buttonText: t('intro.ok'), buttonCallback: onClick }
41006           );
41007
41008           context.on('exit.intro', function() {
41009               continueTo(clickTownHall);
41010           });
41011
41012           context.history().on('change.intro', function() {
41013               if (!context.hasEntity(hallId)) {
41014                   continueTo(clickTownHall);
41015               }
41016           });
41017
41018           function continueTo(nextStep) {
41019               context.on('exit.intro', null);
41020               context.history().on('change.intro', null);
41021               select('.inspector-wrap').on('wheel.intro', null);
41022               nextStep();
41023           }
41024       }
41025
41026
41027       function closeTownHall() {
41028           if (!isTownHallSelected()) return clickTownHall();
41029
41030           var selector$$1 = '.entity-editor-pane button.preset-close svg use';
41031           var href = select(selector$$1).attr('href') || '#iD-icon-close';
41032
41033           reveal('.entity-editor-pane',
41034               t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') })
41035           );
41036
41037           context.on('exit.intro', function() {
41038               continueTo(searchStreet);
41039           });
41040
41041           context.history().on('change.intro', function() {
41042               // update the close icon in the tooltip if the user edits something.
41043               var selector$$1 = '.entity-editor-pane button.preset-close svg use';
41044               var href = select(selector$$1).attr('href') || '#iD-icon-close';
41045
41046               reveal('.entity-editor-pane',
41047                   t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') }),
41048                   { duration: 0 }
41049               );
41050           });
41051
41052           function continueTo(nextStep) {
41053               context.on('exit.intro', null);
41054               context.history().on('change.intro', null);
41055               nextStep();
41056           }
41057       }
41058
41059
41060       function searchStreet() {
41061           context.enter(modeBrowse(context));
41062           context.history().reset('initial');  // ensure spring street exists
41063
41064           var msec = transitionTime(springStreet, context.map().center());
41065           if (msec) { reveal(null, null, { duration: 0 }); }
41066           context.map().centerZoomEase(springStreet, 19, msec);  // ..and user can see it
41067
41068           timeout(function() {
41069               reveal('.search-header input',
41070                   t('intro.navigation.search_street', { name: t('intro.graph.name.spring-street') })
41071               );
41072
41073               select('.search-header input')
41074                   .on('keyup.intro', checkSearchResult);
41075           }, msec + 100);
41076       }
41077
41078
41079       function checkSearchResult() {
41080           var first = select('.feature-list-item:nth-child(0n+2)');  // skip "No Results" item
41081           var firstName = first.select('.entity-name');
41082           var name = t('intro.graph.name.spring-street');
41083
41084           if (!firstName.empty() && firstName.text() === name) {
41085               reveal(first.node(),
41086                   t('intro.navigation.choose_street', { name: name }),
41087                   { duration: 300 }
41088               );
41089
41090               context.on('exit.intro', function() {
41091                   continueTo(selectedStreet);
41092               });
41093
41094               select('.search-header input')
41095                   .on('keydown.intro', eventCancel, true)
41096                   .on('keyup.intro', null);
41097           }
41098
41099           function continueTo(nextStep) {
41100               context.on('exit.intro', null);
41101               select('.search-header input')
41102                   .on('keydown.intro', null)
41103                   .on('keyup.intro', null);
41104               nextStep();
41105           }
41106       }
41107
41108
41109       function selectedStreet() {
41110           if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
41111               return searchStreet();
41112           }
41113
41114           var onClick = function() { continueTo(editorStreet); };
41115           var entity = context.entity(springStreetEndId);
41116           var box = pointBox(entity.loc, context);
41117           box.height = 500;
41118
41119           reveal(box,
41120               t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
41121               { duration: 600, buttonText: t('intro.ok'), buttonCallback: onClick }
41122           );
41123
41124           timeout(function() {
41125               context.map().on('move.intro drawn.intro', function() {
41126                   var entity = context.hasEntity(springStreetEndId);
41127                   if (!entity) return;
41128                   var box = pointBox(entity.loc, context);
41129                   box.height = 500;
41130                   reveal(box,
41131                       t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
41132                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
41133                   );
41134               });
41135           }, 600);  // after reveal.
41136
41137           context.on('enter.intro', function(mode) {
41138               if (!context.hasEntity(springStreetId)) {
41139                   return continueTo(searchStreet);
41140               }
41141               var ids = context.selectedIDs();
41142               if (mode.id !== 'select' || !ids.length || ids[0] !== springStreetId) {
41143                   // keep Spring Street selected..
41144                   context.enter(modeSelect(context, [springStreetId]));
41145               }
41146           });
41147
41148           context.history().on('change.intro', function() {
41149               if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
41150                   timeout(function() {
41151                       continueTo(searchStreet);
41152                   }, 300);  // after any transition (e.g. if user deleted intersection)
41153               }
41154           });
41155
41156           function continueTo(nextStep) {
41157               context.map().on('move.intro drawn.intro', null);
41158               context.on('enter.intro', null);
41159               context.history().on('change.intro', null);
41160               nextStep();
41161           }
41162       }
41163
41164
41165       function editorStreet() {
41166           var selector$$1 = '.entity-editor-pane button.preset-close svg use';
41167           var href = select(selector$$1).attr('href') || '#iD-icon-close';
41168
41169           reveal('.entity-editor-pane',
41170               t('intro.navigation.editor_street', {
41171                   button: icon(href, 'pre-text'),
41172                   field1: onewayField.label(),
41173                   field2: maxspeedField.label()
41174               })
41175           );
41176
41177           context.on('exit.intro', function() {
41178               continueTo(play);
41179           });
41180
41181           context.history().on('change.intro', function() {
41182               // update the close icon in the tooltip if the user edits something.
41183               var selector$$1 = '.entity-editor-pane button.preset-close svg use';
41184               var href = select(selector$$1).attr('href') || '#iD-icon-close';
41185
41186               reveal('.entity-editor-pane',
41187                   t('intro.navigation.editor_street', {
41188                       button: icon(href, 'pre-text'),
41189                       field1: onewayField.label().toLowerCase(),
41190                       field2: maxspeedField.label().toLowerCase()
41191                   }), { duration: 0 }
41192               );
41193           });
41194
41195           function continueTo(nextStep) {
41196               context.on('exit.intro', null);
41197               context.history().on('change.intro', null);
41198               nextStep();
41199           }
41200       }
41201
41202
41203       function play() {
41204           dispatch$$1.call('done');
41205           reveal('#id-container',
41206               t('intro.navigation.play', { next: t('intro.points.title') }), {
41207                   tooltipBox: '.intro-nav-wrap .chapter-point',
41208                   buttonText: t('intro.ok'),
41209                   buttonCallback: function() { reveal('#id-container'); }
41210               }
41211           );
41212       }
41213
41214
41215       chapter.enter = function() {
41216           dragMap();
41217       };
41218
41219
41220       chapter.exit = function() {
41221           timeouts.forEach(window.clearTimeout);
41222           context.on('enter.intro exit.intro', null);
41223           context.map().on('move.intro drawn.intro', null);
41224           context.history().on('change.intro', null);
41225           select('.inspector-wrap').on('wheel.intro', null);
41226           select('.search-header input').on('keydown.intro keyup.intro', null);
41227       };
41228
41229
41230       chapter.restart = function() {
41231           chapter.exit();
41232           chapter.enter();
41233       };
41234
41235
41236       return utilRebind(chapter, dispatch$$1, 'on');
41237   }
41238
41239   function uiIntroPoint(context, reveal) {
41240       var dispatch$$1 = dispatch('done');
41241       var timeouts = [];
41242       var intersection = [-85.63279, 41.94394];
41243       var building = [-85.632422, 41.944045];
41244       var cafePreset = context.presets().item('amenity/cafe');
41245       var _pointID = null;
41246
41247
41248       var chapter = {
41249           title: 'intro.points.title'
41250       };
41251
41252
41253       function timeout(f, t$$1) {
41254           timeouts.push(window.setTimeout(f, t$$1));
41255       }
41256
41257
41258       function revealEditMenu(loc, text, options) {
41259           var rect = context.surfaceRect();
41260           var point$$1 = context.curtainProjection(loc);
41261           var pad = 40;
41262           var width = 250 + (2 * pad);
41263           var height = 250;
41264           var startX = rect.left + point$$1[0];
41265           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
41266           var box = {
41267               left: left,
41268               top: point$$1[1] + rect.top - 60,
41269               width: width,
41270               height: height
41271           };
41272           reveal(box, text, options);
41273       }
41274
41275
41276       function eventCancel() {
41277           event.stopPropagation();
41278           event.preventDefault();
41279       }
41280
41281
41282       function addPoint() {
41283           context.enter(modeBrowse(context));
41284           context.history().reset('initial');
41285
41286           var msec = transitionTime(intersection, context.map().center());
41287           if (msec) { reveal(null, null, { duration: 0 }); }
41288           context.map().centerZoomEase(intersection, 19, msec);
41289
41290           timeout(function() {
41291               var tooltip = reveal('button.add-point',
41292                   t('intro.points.add_point', { button: icon('#iD-icon-point', 'pre-text') }));
41293
41294               _pointID = null;
41295
41296               tooltip.selectAll('.tooltip-inner')
41297                   .insert('svg', 'span')
41298                   .attr('class', 'tooltip-illustration')
41299                   .append('use')
41300                   .attr('xlink:href', '#iD-graphic-points');
41301
41302               context.on('enter.intro', function(mode) {
41303                   if (mode.id !== 'add-point') return;
41304                   continueTo(placePoint);
41305               });
41306           }, msec + 100);
41307
41308           function continueTo(nextStep) {
41309               context.on('enter.intro', null);
41310               nextStep();
41311           }
41312       }
41313
41314
41315       function placePoint() {
41316           if (context.mode().id !== 'add-point') {
41317               return chapter.restart();
41318           }
41319
41320           var pointBox$$1 = pad$1(building, 150, context);
41321           reveal(pointBox$$1, t('intro.points.place_point'));
41322
41323           context.map().on('move.intro drawn.intro', function() {
41324               pointBox$$1 = pad$1(building, 150, context);
41325               reveal(pointBox$$1, t('intro.points.place_point'), { duration: 0 });
41326           });
41327
41328           context.on('enter.intro', function(mode) {
41329               if (mode.id !== 'select') return chapter.restart();
41330               _pointID = context.mode().selectedIDs()[0];
41331               continueTo(searchPreset);
41332           });
41333
41334           function continueTo(nextStep) {
41335               context.map().on('move.intro drawn.intro', null);
41336               context.on('enter.intro', null);
41337               nextStep();
41338           }
41339       }
41340
41341
41342       function searchPreset() {
41343           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
41344               return addPoint();
41345           }
41346
41347           // disallow scrolling
41348           select('.inspector-wrap').on('wheel.intro', eventCancel);
41349
41350           select('.preset-search-input')
41351               .on('keydown.intro', null)
41352               .on('keyup.intro', checkPresetSearch);
41353
41354           reveal('.preset-search-input',
41355               t('intro.points.search_cafe', { preset: cafePreset.name() })
41356           );
41357
41358           context.on('enter.intro', function(mode) {
41359               if (!_pointID || !context.hasEntity(_pointID)) {
41360                   return continueTo(addPoint);
41361               }
41362
41363               var ids = context.selectedIDs();
41364               if (mode.id !== 'select' || !ids.length || ids[0] !== _pointID) {
41365                   // keep the user's point selected..
41366                   context.enter(modeSelect(context, [_pointID]));
41367
41368                   // disallow scrolling
41369                   select('.inspector-wrap').on('wheel.intro', eventCancel);
41370
41371                   select('.preset-search-input')
41372                       .on('keydown.intro', null)
41373                       .on('keyup.intro', checkPresetSearch);
41374
41375                   reveal('.preset-search-input',
41376                       t('intro.points.search_cafe', { preset: cafePreset.name() })
41377                   );
41378
41379                   context.history().on('change.intro', null);
41380               }
41381           });
41382
41383
41384           function checkPresetSearch() {
41385               var first = select('.preset-list-item:first-child');
41386
41387               if (first.classed('preset-amenity-cafe')) {
41388                   select('.preset-search-input')
41389                       .on('keydown.intro', eventCancel, true)
41390                       .on('keyup.intro', null);
41391
41392                   reveal(first.select('.preset-list-button').node(),
41393                       t('intro.points.choose_cafe', { preset: cafePreset.name() }),
41394                       { duration: 300 }
41395                   );
41396
41397                   context.history().on('change.intro', function() {
41398                       continueTo(aboutFeatureEditor);
41399                   });
41400               }
41401           }
41402
41403           function continueTo(nextStep) {
41404               context.on('enter.intro', null);
41405               context.history().on('change.intro', null);
41406               select('.inspector-wrap').on('wheel.intro', null);
41407               select('.preset-search-input').on('keydown.intro keyup.intro', null);
41408               nextStep();
41409           }
41410       }
41411
41412
41413       function aboutFeatureEditor() {
41414           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
41415               return addPoint();
41416           }
41417
41418           timeout(function() {
41419               reveal('.entity-editor-pane', t('intro.points.feature_editor'), {
41420                   tooltipClass: 'intro-points-describe',
41421                   buttonText: t('intro.ok'),
41422                   buttonCallback: function() { continueTo(addName); }
41423               });
41424           }, 400);
41425
41426           context.on('exit.intro', function() {
41427               // if user leaves select mode here, just continue with the tutorial.
41428               continueTo(reselectPoint);
41429           });
41430
41431           function continueTo(nextStep) {
41432               context.on('exit.intro', null);
41433               nextStep();
41434           }
41435       }
41436
41437
41438       function addName() {
41439           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
41440               return addPoint();
41441           }
41442
41443           // reset pane, in case user happened to change it..
41444           select('.inspector-wrap .panewrap').style('right', '0%');
41445
41446           timeout(function() {
41447               // It's possible for the user to add a name in a previous step..
41448               // If so, don't tell them to add the name in this step.
41449               // Give them an OK button instead.
41450               var entity = context.entity(_pointID);
41451               if (entity.tags.name) {
41452                   var tooltip = reveal('.entity-editor-pane', t('intro.points.add_name'), {
41453                       tooltipClass: 'intro-points-describe',
41454                       buttonText: t('intro.ok'),
41455                       buttonCallback: function() { continueTo(addCloseEditor); }
41456                   });
41457                   tooltip.select('.instruction').style('display', 'none');
41458
41459               } else {
41460                   reveal('.entity-editor-pane', t('intro.points.add_name'),
41461                       { tooltipClass: 'intro-points-describe' }
41462                   );
41463               }
41464           }, 400);
41465
41466           context.history().on('change.intro', function() {
41467               continueTo(addCloseEditor);
41468           });
41469
41470           context.on('exit.intro', function() {
41471               // if user leaves select mode here, just continue with the tutorial.
41472               continueTo(reselectPoint);
41473           });
41474
41475           function continueTo(nextStep) {
41476               context.on('exit.intro', null);
41477               context.history().on('change.intro', null);
41478               nextStep();
41479           }
41480       }
41481
41482
41483       function addCloseEditor() {
41484           // reset pane, in case user happened to change it..
41485           select('.inspector-wrap .panewrap').style('right', '0%');
41486
41487           var selector$$1 = '.entity-editor-pane button.preset-close svg use';
41488           var href = select(selector$$1).attr('href') || '#iD-icon-close';
41489
41490           context.on('exit.intro', function() {
41491               continueTo(reselectPoint);
41492           });
41493
41494           reveal('.entity-editor-pane',
41495               t('intro.points.add_close', { button: icon(href, 'pre-text') })
41496           );
41497
41498           function continueTo(nextStep) {
41499               context.on('exit.intro', null);
41500               nextStep();
41501           }
41502       }
41503
41504
41505       function reselectPoint() {
41506           if (!_pointID) return chapter.restart();
41507           var entity = context.hasEntity(_pointID);
41508           if (!entity) return chapter.restart();
41509
41510           // make sure it's still a cafe, in case user somehow changed it..
41511           var oldPreset = context.presets().match(entity, context.graph());
41512           context.replace(actionChangePreset(_pointID, oldPreset, cafePreset));
41513
41514           context.enter(modeBrowse(context));
41515
41516           var msec = transitionTime(entity.loc, context.map().center());
41517           if (msec) { reveal(null, null, { duration: 0 }); }
41518           context.map().centerEase(entity.loc, msec);
41519
41520           timeout(function() {
41521               var box = pointBox(entity.loc, context);
41522               reveal(box, t('intro.points.reselect'), { duration: 600 });
41523
41524               timeout(function() {
41525                   context.map().on('move.intro drawn.intro', function() {
41526                       var entity = context.hasEntity(_pointID);
41527                       if (!entity) return chapter.restart();
41528                       var box = pointBox(entity.loc, context);
41529                       reveal(box, t('intro.points.reselect'), { duration: 0 });
41530                   });
41531               }, 600); // after reveal..
41532
41533               context.on('enter.intro', function(mode) {
41534                   if (mode.id !== 'select') return;
41535                   continueTo(updatePoint);
41536               });
41537
41538           }, msec + 100);
41539
41540           function continueTo(nextStep) {
41541               context.map().on('move.intro drawn.intro', null);
41542               context.on('enter.intro', null);
41543               nextStep();
41544           }
41545       }
41546
41547
41548       function updatePoint() {
41549           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
41550               return continueTo(reselectPoint);
41551           }
41552
41553           // reset pane, in case user happened to untag the point..
41554           select('.inspector-wrap .panewrap').style('right', '0%');
41555
41556           context.on('exit.intro', function() {
41557               continueTo(reselectPoint);
41558           });
41559
41560           context.history().on('change.intro', function() {
41561               continueTo(updateCloseEditor);
41562           });
41563
41564           timeout(function() {
41565               reveal('.entity-editor-pane', t('intro.points.update'),
41566                   { tooltipClass: 'intro-points-describe' }
41567               );
41568           }, 400);
41569
41570           function continueTo(nextStep) {
41571               context.on('exit.intro', null);
41572               context.history().on('change.intro', null);
41573               nextStep();
41574           }
41575       }
41576
41577
41578       function updateCloseEditor() {
41579           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
41580               return continueTo(reselectPoint);
41581           }
41582
41583           // reset pane, in case user happened to change it..
41584           select('.inspector-wrap .panewrap').style('right', '0%');
41585
41586           context.on('exit.intro', function() {
41587               continueTo(rightClickPoint);
41588           });
41589
41590           timeout(function() {
41591               reveal('.entity-editor-pane',
41592                   t('intro.points.update_close', { button: icon('#iD-icon-apply', 'pre-text') })
41593               );
41594           }, 500);
41595
41596           function continueTo(nextStep) {
41597               context.on('exit.intro', null);
41598               nextStep();
41599           }
41600       }
41601
41602
41603       function rightClickPoint() {
41604           if (!_pointID) return chapter.restart();
41605           var entity = context.hasEntity(_pointID);
41606           if (!entity) return chapter.restart();
41607
41608           context.enter(modeBrowse(context));
41609
41610           var box = pointBox(entity.loc, context);
41611           reveal(box, t('intro.points.rightclick'), { duration: 600 });
41612
41613           timeout(function() {
41614               context.map().on('move.intro drawn.intro', function() {
41615                   var entity = context.hasEntity(_pointID);
41616                   if (!entity) return chapter.restart();
41617                   var box = pointBox(entity.loc, context);
41618                   reveal(box, t('intro.points.rightclick'), { duration: 0 });
41619               });
41620           }, 600); // after reveal
41621
41622           context.on('enter.intro', function(mode) {
41623               if (mode.id !== 'select') return;
41624               var ids = context.selectedIDs();
41625               if (ids.length !== 1 || ids[0] !== _pointID) return;
41626
41627               timeout(function() {
41628                   var node = selectMenuItem('delete').node();
41629                   if (!node) return;
41630                   continueTo(enterDelete);
41631               }, 300);  // after menu visible
41632           });
41633
41634           function continueTo(nextStep) {
41635               context.on('enter.intro', null);
41636               context.map().on('move.intro drawn.intro', null);
41637               nextStep();
41638           }
41639       }
41640
41641
41642       function enterDelete() {
41643           if (!_pointID) return chapter.restart();
41644           var entity = context.hasEntity(_pointID);
41645           if (!entity) return chapter.restart();
41646
41647           var node = selectMenuItem('delete').node();
41648           if (!node) { return continueTo(rightClickPoint); }
41649
41650           revealEditMenu(entity.loc,
41651               t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') })
41652           );
41653
41654           timeout(function() {
41655               context.map().on('move.intro drawn.intro', function() {
41656                   revealEditMenu(entity.loc,
41657                       t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') }),
41658                       { duration: 0}
41659                   );
41660               });
41661           }, 300); // after menu visible
41662
41663           context.on('exit.intro', function() {
41664               if (!_pointID) return chapter.restart();
41665               var entity = context.hasEntity(_pointID);
41666               if (entity) return continueTo(rightClickPoint);  // point still exists
41667           });
41668
41669           context.history().on('change.intro', function(changed) {
41670               if (changed.deleted().length) {
41671                   continueTo(undo);
41672               }
41673           });
41674
41675           function continueTo(nextStep) {
41676               context.map().on('move.intro drawn.intro', null);
41677               context.history().on('change.intro', null);
41678               context.on('exit.intro', null);
41679               nextStep();
41680           }
41681       }
41682
41683
41684       function undo() {
41685           context.history().on('change.intro', function() {
41686               continueTo(play);
41687           });
41688
41689           var iconName = '#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo');
41690           reveal('#bar button.undo-button',
41691               t('intro.points.undo', { button: icon(iconName, 'pre-text') })
41692           );
41693
41694           function continueTo(nextStep) {
41695               context.history().on('change.intro', null);
41696               nextStep();
41697           }
41698       }
41699
41700
41701       function play() {
41702           dispatch$$1.call('done');
41703           reveal('#id-container',
41704               t('intro.points.play', { next: t('intro.areas.title') }), {
41705                   tooltipBox: '.intro-nav-wrap .chapter-area',
41706                   buttonText: t('intro.ok'),
41707                   buttonCallback: function() { reveal('#id-container'); }
41708               }
41709           );
41710       }
41711
41712
41713       chapter.enter = function() {
41714           addPoint();
41715       };
41716
41717
41718       chapter.exit = function() {
41719           timeouts.forEach(window.clearTimeout);
41720           context.on('enter.intro exit.intro', null);
41721           context.map().on('move.intro drawn.intro', null);
41722           context.history().on('change.intro', null);
41723           select('.inspector-wrap').on('wheel.intro', eventCancel);
41724           select('.preset-search-input').on('keydown.intro keyup.intro', null);
41725       };
41726
41727
41728       chapter.restart = function() {
41729           chapter.exit();
41730           chapter.enter();
41731       };
41732
41733
41734       return utilRebind(chapter, dispatch$$1, 'on');
41735   }
41736
41737   function uiIntroArea(context, reveal) {
41738       var dispatch$$1 = dispatch('done');
41739       var playground = [-85.63552, 41.94159];
41740       var playgroundPreset = context.presets().item('leisure/playground');
41741       var descriptionField = context.presets().field('description');
41742       var timeouts = [];
41743       var _areaID;
41744
41745
41746       var chapter = {
41747           title: 'intro.areas.title'
41748       };
41749
41750
41751       function timeout(f, t$$1) {
41752           timeouts.push(window.setTimeout(f, t$$1));
41753       }
41754
41755
41756       function eventCancel() {
41757           event.stopPropagation();
41758           event.preventDefault();
41759       }
41760
41761
41762       function revealPlayground(center, text, options) {
41763           var padding = 180 * Math.pow(2, context.map().zoom() - 19.5);
41764           var box = pad$1(center, padding, context);
41765           reveal(box, text, options);
41766       }
41767
41768
41769       function addArea() {
41770           context.enter(modeBrowse(context));
41771           context.history().reset('initial');
41772           _areaID = null;
41773
41774           var msec = transitionTime(playground, context.map().center());
41775           if (msec) { reveal(null, null, { duration: 0 }); }
41776           context.map().centerZoomEase(playground, 19, msec);
41777
41778           timeout(function() {
41779               var tooltip = reveal('button.add-area',
41780                   t('intro.areas.add_playground', { button: icon('#iD-icon-area', 'pre-text') }));
41781
41782               tooltip.selectAll('.tooltip-inner')
41783                   .insert('svg', 'span')
41784                   .attr('class', 'tooltip-illustration')
41785                   .append('use')
41786                   .attr('xlink:href', '#iD-graphic-areas');
41787
41788               context.on('enter.intro', function(mode) {
41789                   if (mode.id !== 'add-area') return;
41790                   continueTo(startPlayground);
41791               });
41792           }, msec + 100);
41793
41794           function continueTo(nextStep) {
41795               context.on('enter.intro', null);
41796               nextStep();
41797           }
41798       }
41799
41800
41801       function startPlayground() {
41802           if (context.mode().id !== 'add-area') {
41803               return chapter.restart();
41804           }
41805
41806           _areaID = null;
41807           context.map().zoomEase(19.5, 500);
41808
41809           timeout(function() {
41810               revealPlayground(playground,
41811                   t('intro.areas.start_playground'), { duration: 250 }
41812               );
41813
41814               timeout(function() {
41815                   context.map().on('move.intro drawn.intro', function() {
41816                       revealPlayground(playground,
41817                           t('intro.areas.start_playground'), { duration: 0 }
41818                       );
41819                   });
41820                   context.on('enter.intro', function(mode) {
41821                       if (mode.id !== 'draw-area') return chapter.restart();
41822                       continueTo(continuePlayground);
41823                   });
41824               }, 250);  // after reveal
41825
41826           }, 550);  // after easing
41827
41828           function continueTo(nextStep) {
41829               context.map().on('move.intro drawn.intro', null);
41830               context.on('enter.intro', null);
41831               nextStep();
41832           }
41833       }
41834
41835
41836       function continuePlayground() {
41837           if (context.mode().id !== 'draw-area') {
41838               return chapter.restart();
41839           }
41840
41841           _areaID = null;
41842           revealPlayground(playground,
41843               t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
41844               { duration: 250 }
41845           );
41846
41847           timeout(function() {
41848               context.map().on('move.intro drawn.intro', function() {
41849                   revealPlayground(playground,
41850                       t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
41851                       { duration: 0 }
41852                   );
41853               });
41854           }, 250);  // after reveal
41855
41856           context.on('enter.intro', function(mode) {
41857               if (mode.id === 'draw-area') {
41858                   var entity = context.hasEntity(context.selectedIDs()[0]);
41859                   if (entity && entity.nodes.length >= 6) {
41860                       return continueTo(finishPlayground);
41861                   } else {
41862                       return;
41863                   }
41864               } else if (mode.id === 'select') {
41865                   _areaID = context.selectedIDs()[0];
41866                   return continueTo(searchPresets);
41867               } else {
41868                   return chapter.restart();
41869               }
41870           });
41871
41872           function continueTo(nextStep) {
41873               context.map().on('move.intro drawn.intro', null);
41874               context.on('enter.intro', null);
41875               nextStep();
41876           }
41877       }
41878
41879
41880       function finishPlayground() {
41881           if (context.mode().id !== 'draw-area') {
41882               return chapter.restart();
41883           }
41884
41885           _areaID = null;
41886           revealPlayground(playground,
41887               t('intro.areas.finish_playground'), { duration: 250 }
41888           );
41889
41890           timeout(function() {
41891               context.map().on('move.intro drawn.intro', function() {
41892                   revealPlayground(playground,
41893                       t('intro.areas.finish_playground'), { duration: 0 }
41894                   );
41895               });
41896           }, 250);  // after reveal
41897
41898           context.on('enter.intro', function(mode) {
41899               if (mode.id === 'draw-area') {
41900                   return;
41901               } else if (mode.id === 'select') {
41902                   _areaID = context.selectedIDs()[0];
41903                   return continueTo(searchPresets);
41904               } else {
41905                   return chapter.restart();
41906               }
41907           });
41908
41909           function continueTo(nextStep) {
41910               context.map().on('move.intro drawn.intro', null);
41911               context.on('enter.intro', null);
41912               nextStep();
41913           }
41914       }
41915
41916
41917       function searchPresets() {
41918           if (!_areaID || !context.hasEntity(_areaID)) {
41919               return addArea();
41920           }
41921           var ids = context.selectedIDs();
41922           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
41923               context.enter(modeSelect(context, [_areaID]));
41924           }
41925
41926           // disallow scrolling
41927           select('.inspector-wrap').on('wheel.intro', eventCancel);
41928
41929           timeout(function() {
41930               // reset pane, in case user somehow happened to change it..
41931               select('.inspector-wrap .panewrap').style('right', '-100%');
41932
41933               select('.preset-search-input')
41934                   .on('keydown.intro', null)
41935                   .on('keyup.intro', checkPresetSearch);
41936
41937               reveal('.preset-search-input',
41938                   t('intro.areas.search_playground', { preset: playgroundPreset.name() })
41939               );
41940           }, 400);  // after preset list pane visible..
41941
41942           context.on('enter.intro', function(mode) {
41943               if (!_areaID || !context.hasEntity(_areaID)) {
41944                   return continueTo(addArea);
41945               }
41946
41947               var ids = context.selectedIDs();
41948               if (mode.id !== 'select' || !ids.length || ids[0] !== _areaID) {
41949                   // keep the user's area selected..
41950                   context.enter(modeSelect(context, [_areaID]));
41951
41952                   // reset pane, in case user somehow happened to change it..
41953                   select('.inspector-wrap .panewrap').style('right', '-100%');
41954                   // disallow scrolling
41955                   select('.inspector-wrap').on('wheel.intro', eventCancel);
41956
41957                   select('.preset-search-input')
41958                       .on('keydown.intro', null)
41959                       .on('keyup.intro', checkPresetSearch);
41960
41961                   reveal('.preset-search-input',
41962                       t('intro.areas.search_playground', { preset: playgroundPreset.name() })
41963                   );
41964
41965                   context.history().on('change.intro', null);
41966               }
41967           });
41968
41969           function checkPresetSearch() {
41970               var first = select('.preset-list-item:first-child');
41971
41972               if (first.classed('preset-leisure-playground')) {
41973                   reveal(first.select('.preset-list-button').node(),
41974                       t('intro.areas.choose_playground', { preset: playgroundPreset.name() }),
41975                       { duration: 300 }
41976                   );
41977
41978                   select('.preset-search-input')
41979                       .on('keydown.intro', eventCancel, true)
41980                       .on('keyup.intro', null);
41981
41982                   context.history().on('change.intro', function() {
41983                       continueTo(clickAddField);
41984                   });
41985               }
41986           }
41987
41988           function continueTo(nextStep) {
41989               select('.inspector-wrap').on('wheel.intro', null);
41990               context.on('enter.intro', null);
41991               context.history().on('change.intro', null);
41992               select('.preset-search-input').on('keydown.intro keyup.intro', null);
41993               nextStep();
41994           }
41995       }
41996
41997
41998       function clickAddField() {
41999           if (!_areaID || !context.hasEntity(_areaID)) {
42000               return addArea();
42001           }
42002           var ids = context.selectedIDs();
42003           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
42004               return searchPresets();
42005           }
42006
42007           if (!select('.form-field-description').empty()) {
42008               return continueTo(describePlayground);
42009           }
42010
42011           // disallow scrolling
42012           select('.inspector-wrap').on('wheel.intro', eventCancel);
42013
42014           timeout(function() {
42015               // reset pane, in case user somehow happened to change it..
42016               select('.inspector-wrap .panewrap').style('right', '0%');
42017
42018               // It's possible for the user to add a description in a previous step..
42019               // If they did this already, just continue to next step.
42020               var entity = context.entity(_areaID);
42021               if (entity.tags.description) {
42022                   return continueTo(play);
42023               }
42024
42025               // scroll "Add field" into view
42026               var box = select('.more-fields').node().getBoundingClientRect();
42027               if (box.top > 300) {
42028                   var pane = select('.entity-editor-pane .inspector-body');
42029                   var start = pane.node().scrollTop;
42030                   var end = start + (box.top - 300);
42031
42032                   pane
42033                       .transition()
42034                       .duration(250)
42035                       .tween('scroll.inspector', function() {
42036                           var node = this;
42037                           var i = interpolateNumber(start, end);
42038                           return function(t$$1) {
42039                               node.scrollTop = i(t$$1);
42040                           };
42041                       });
42042               }
42043
42044               timeout(function() {
42045                   reveal('.more-fields .combobox-input',
42046                       t('intro.areas.add_field'),
42047                       { duration: 300 }
42048                   );
42049
42050                   select('.more-fields .combobox-input')
42051                       .on('click.intro', function() {
42052                           // Watch for the combobox to appear...
42053                           var watcher;
42054                           watcher = window.setInterval(function() {
42055                               if (!select('div.combobox').empty()) {
42056                                   window.clearInterval(watcher);
42057                                   continueTo(chooseDescriptionField);
42058                               }
42059                           }, 300);
42060                       });
42061               }, 300);  // after "Add Field" visible
42062
42063           }, 400);  // after editor pane visible
42064
42065           context.on('exit.intro', function() {
42066               return continueTo(searchPresets);
42067           });
42068
42069           function continueTo(nextStep) {
42070               select('.inspector-wrap').on('wheel.intro', null);
42071               select('.more-fields .combobox-input').on('click.intro', null);
42072               context.on('exit.intro', null);
42073               nextStep();
42074           }
42075       }
42076
42077
42078       function chooseDescriptionField() {
42079           if (!_areaID || !context.hasEntity(_areaID)) {
42080               return addArea();
42081           }
42082           var ids = context.selectedIDs();
42083           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
42084               return searchPresets();
42085           }
42086
42087           if (!select('.form-field-description').empty()) {
42088               return continueTo(describePlayground);
42089           }
42090
42091           // Make sure combobox is ready..
42092           if (select('div.combobox').empty()) {
42093               return continueTo(clickAddField);
42094           }
42095           // Watch for the combobox to go away..
42096           var watcher;
42097           watcher = window.setInterval(function() {
42098               if (select('div.combobox').empty()) {
42099                   window.clearInterval(watcher);
42100                   timeout(function() {
42101                       if (select('.form-field-description').empty()) {
42102                           continueTo(retryChooseDescription);
42103                       } else {
42104                           continueTo(describePlayground);
42105                       }
42106                   }, 300);  // after description field added.
42107               }
42108           }, 300);
42109
42110           reveal('div.combobox',
42111               t('intro.areas.choose_field', { field: descriptionField.label() }),
42112               { duration: 300 }
42113           );
42114
42115           context.on('exit.intro', function() {
42116               return continueTo(searchPresets);
42117           });
42118
42119           function continueTo(nextStep) {
42120               if (watcher) window.clearInterval(watcher);
42121               context.on('exit.intro', null);
42122               nextStep();
42123           }
42124       }
42125
42126
42127       function describePlayground() {
42128           if (!_areaID || !context.hasEntity(_areaID)) {
42129               return addArea();
42130           }
42131           var ids = context.selectedIDs();
42132           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
42133               return searchPresets();
42134           }
42135
42136           // reset pane, in case user happened to change it..
42137           select('.inspector-wrap .panewrap').style('right', '0%');
42138
42139           if (select('.form-field-description').empty()) {
42140               return continueTo(retryChooseDescription);
42141           }
42142
42143           context.on('exit.intro', function() {
42144               continueTo(play);
42145           });
42146
42147           reveal('.entity-editor-pane',
42148               t('intro.areas.describe_playground', { button: icon('#iD-icon-apply', 'pre-text') }),
42149               { duration: 300 }
42150           );
42151
42152           function continueTo(nextStep) {
42153               context.on('exit.intro', null);
42154               nextStep();
42155           }
42156       }
42157
42158
42159       function retryChooseDescription() {
42160           if (!_areaID || !context.hasEntity(_areaID)) {
42161               return addArea();
42162           }
42163           var ids = context.selectedIDs();
42164           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
42165               return searchPresets();
42166           }
42167
42168           // reset pane, in case user happened to change it..
42169           select('.inspector-wrap .panewrap').style('right', '0%');
42170
42171           reveal('.entity-editor-pane',
42172               t('intro.areas.retry_add_field', { field: descriptionField.label() }), {
42173               buttonText: t('intro.ok'),
42174               buttonCallback: function() { continueTo(clickAddField); }
42175           });
42176
42177           context.on('exit.intro', function() {
42178               return continueTo(searchPresets);
42179           });
42180
42181           function continueTo(nextStep) {
42182               context.on('exit.intro', null);
42183               nextStep();
42184           }
42185       }
42186
42187
42188       function play() {
42189           dispatch$$1.call('done');
42190           reveal('#id-container',
42191               t('intro.areas.play', { next: t('intro.lines.title') }), {
42192                   tooltipBox: '.intro-nav-wrap .chapter-line',
42193                   buttonText: t('intro.ok'),
42194                   buttonCallback: function() { reveal('#id-container'); }
42195               }
42196           );
42197       }
42198
42199
42200       chapter.enter = function() {
42201           addArea();
42202       };
42203
42204
42205       chapter.exit = function() {
42206           timeouts.forEach(window.clearTimeout);
42207           context.on('enter.intro exit.intro', null);
42208           context.map().on('move.intro drawn.intro', null);
42209           context.history().on('change.intro', null);
42210           select('.inspector-wrap').on('wheel.intro', null);
42211           select('.preset-search-input').on('keydown.intro keyup.intro', null);
42212           select('.more-fields .combobox-input').on('click.intro', null);
42213       };
42214
42215
42216       chapter.restart = function() {
42217           chapter.exit();
42218           chapter.enter();
42219       };
42220
42221
42222       return utilRebind(chapter, dispatch$$1, 'on');
42223   }
42224
42225   function uiIntroLine(context, reveal) {
42226       var dispatch$$1 = dispatch('done');
42227       var timeouts = [];
42228       var _tulipRoadID = null;
42229       var flowerRoadID = 'w646';
42230       var tulipRoadStart = [-85.6297754121684, 41.95805253325314];
42231       var tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204];
42232       var tulipRoadIntersection = [-85.62974496187628, 41.95742515554585];
42233       var roadCategory = context.presets().item('category-road');
42234       var residentialPreset = context.presets().item('highway/residential');
42235       var woodRoadID = 'w525';
42236       var woodRoadEndID = 'n2862';
42237       var woodRoadAddNode = [-85.62390110349587, 41.95397111462291];
42238       var woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487];
42239       var woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872];
42240       var washingtonStreetID = 'w522';
42241       var twelfthAvenueID = 'w1';
42242       var eleventhAvenueEndID = 'n3550';
42243       var twelfthAvenueEndID = 'n5';
42244       var _washingtonSegmentID = null;
42245       var eleventhAvenueEnd = context.entity(eleventhAvenueEndID).loc;
42246       var twelfthAvenueEnd = context.entity(twelfthAvenueEndID).loc;
42247       var deleteLinesLoc = [-85.6219395542764, 41.95228033922477];
42248       var twelfthAvenue = [-85.62219310052491, 41.952505413152956];
42249
42250
42251       var chapter = {
42252           title: 'intro.lines.title'
42253       };
42254
42255
42256       function timeout(f, t$$1) {
42257           timeouts.push(window.setTimeout(f, t$$1));
42258       }
42259
42260
42261       function eventCancel() {
42262           event.stopPropagation();
42263           event.preventDefault();
42264       }
42265
42266
42267       function revealEditMenu(loc, text, options) {
42268           var rect = context.surfaceRect();
42269           var point$$1 = context.curtainProjection(loc);
42270           var pad = 40;
42271           var width = 250 + (2 * pad);
42272           var height = 350;
42273           var startX = rect.left + point$$1[0];
42274           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
42275           var box = {
42276               left: left,
42277               top: point$$1[1] + rect.top - 60,
42278               width: width,
42279               height: height
42280           };
42281           reveal(box, text, options);
42282       }
42283
42284
42285       function addLine() {
42286           context.enter(modeBrowse(context));
42287           context.history().reset('initial');
42288
42289           var msec = transitionTime(tulipRoadStart, context.map().center());
42290           if (msec) { reveal(null, null, { duration: 0 }); }
42291           context.map().centerZoomEase(tulipRoadStart, 18.5, msec);
42292
42293           timeout(function() {
42294               var tooltip = reveal('button.add-line',
42295                   t('intro.lines.add_line', { button: icon('#iD-icon-line', 'pre-text') }));
42296
42297               tooltip.selectAll('.tooltip-inner')
42298                   .insert('svg', 'span')
42299                   .attr('class', 'tooltip-illustration')
42300                   .append('use')
42301                   .attr('xlink:href', '#iD-graphic-lines');
42302
42303               context.on('enter.intro', function(mode) {
42304                   if (mode.id !== 'add-line') return;
42305                   continueTo(startLine);
42306               });
42307           }, msec + 100);
42308
42309           function continueTo(nextStep) {
42310               context.on('enter.intro', null);
42311               nextStep();
42312           }
42313       }
42314
42315
42316       function startLine() {
42317           if (context.mode().id !== 'add-line') return chapter.restart();
42318
42319           _tulipRoadID = null;
42320
42321           var padding = 70 * Math.pow(2, context.map().zoom() - 18);
42322           var box = pad$1(tulipRoadStart, padding, context);
42323           box.height = box.height + 100;
42324           reveal(box, t('intro.lines.start_line'));
42325
42326           context.map().on('move.intro drawn.intro', function() {
42327               padding = 70 * Math.pow(2, context.map().zoom() - 18);
42328               box = pad$1(tulipRoadStart, padding, context);
42329               box.height = box.height + 100;
42330               reveal(box, t('intro.lines.start_line'), { duration: 0 });
42331           });
42332
42333           context.on('enter.intro', function(mode) {
42334               if (mode.id !== 'draw-line') return chapter.restart();
42335               continueTo(drawLine);
42336           });
42337
42338           function continueTo(nextStep) {
42339               context.map().on('move.intro drawn.intro', null);
42340               context.on('enter.intro', null);
42341               nextStep();
42342           }
42343       }
42344
42345
42346       function drawLine() {
42347           if (context.mode().id !== 'draw-line') return chapter.restart();
42348
42349           _tulipRoadID = context.mode().selectedIDs()[0];
42350           context.map().centerEase(tulipRoadMidpoint, 500);
42351
42352           timeout(function() {
42353               var padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
42354               var box = pad$1(tulipRoadMidpoint, padding, context);
42355               box.height = box.height * 2;
42356               reveal(box,
42357                   t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') })
42358               );
42359
42360               context.map().on('move.intro drawn.intro', function() {
42361                   padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
42362                   box = pad$1(tulipRoadMidpoint, padding, context);
42363                   box.height = box.height * 2;
42364                   reveal(box,
42365                       t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') }),
42366                       { duration: 0 }
42367                   );
42368               });
42369           }, 550);  // after easing..
42370
42371           context.history().on('change.intro', function() {
42372               if (isLineConnected()) {
42373                   continueTo(continueLine);
42374               }
42375           });
42376
42377           context.on('enter.intro', function(mode) {
42378               if (mode.id === 'draw-line') {
42379                   return;
42380               } else if (mode.id === 'select') {
42381                   continueTo(retryIntersect);
42382                   return;
42383               } else {
42384                   return chapter.restart();
42385               }
42386           });
42387
42388           function continueTo(nextStep) {
42389               context.map().on('move.intro drawn.intro', null);
42390               context.history().on('change.intro', null);
42391               context.on('enter.intro', null);
42392               nextStep();
42393           }
42394       }
42395
42396
42397       function isLineConnected() {
42398           var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
42399           if (!entity) return false;
42400
42401           var drawNodes = context.graph().childNodes(entity);
42402           return some(drawNodes, function(node) {
42403               return some(context.graph().parentWays(node), function(parent) {
42404                   return parent.id === flowerRoadID;
42405               });
42406           });
42407       }
42408
42409
42410       function retryIntersect() {
42411           select(window).on('mousedown.intro', eventCancel, true);
42412
42413           var box = pad$1(tulipRoadIntersection, 80, context);
42414           reveal(box,
42415               t('intro.lines.retry_intersect', { name: t('intro.graph.name.flower-street') })
42416           );
42417
42418           timeout(chapter.restart, 3000);
42419       }
42420
42421
42422       function continueLine() {
42423           if (context.mode().id !== 'draw-line') return chapter.restart();
42424           var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
42425           if (!entity) return chapter.restart();
42426
42427           context.map().centerEase(tulipRoadIntersection, 500);
42428
42429           reveal('#surface', t('intro.lines.continue_line'));
42430
42431           context.on('enter.intro', function(mode) {
42432               if (mode.id === 'draw-line')
42433                   return;
42434               else if (mode.id === 'select')
42435                   return continueTo(chooseCategoryRoad);
42436               else
42437                   return chapter.restart();
42438           });
42439
42440           function continueTo(nextStep) {
42441               context.on('enter.intro', null);
42442               nextStep();
42443           }
42444       }
42445
42446
42447       function chooseCategoryRoad() {
42448           if (context.mode().id !== 'select') return chapter.restart();
42449
42450           context.on('exit.intro', function() {
42451               return chapter.restart();
42452           });
42453
42454           var button = select('.preset-category-road .preset-list-button');
42455           if (button.empty()) return chapter.restart();
42456
42457           // disallow scrolling
42458           select('.inspector-wrap').on('wheel.intro', eventCancel);
42459
42460           timeout(function() {
42461               // reset pane, in case user somehow happened to change it..
42462               select('.inspector-wrap .panewrap').style('right', '-100%');
42463
42464               reveal(button.node(),
42465                   t('intro.lines.choose_category_road', { category: roadCategory.name() })
42466               );
42467
42468               button.on('click.intro', function() {
42469                   continueTo(choosePresetResidential);
42470               });
42471
42472           }, 400);  // after editor pane visible
42473
42474           function continueTo(nextStep) {
42475               select('.inspector-wrap').on('wheel.intro', null);
42476               select('.preset-list-button').on('click.intro', null);
42477               context.on('exit.intro', null);
42478               nextStep();
42479           }
42480       }
42481
42482
42483       function choosePresetResidential() {
42484           if (context.mode().id !== 'select') return chapter.restart();
42485
42486           context.on('exit.intro', function() {
42487               return chapter.restart();
42488           });
42489
42490           var subgrid = select('.preset-category-road .subgrid');
42491           if (subgrid.empty()) return chapter.restart();
42492
42493           subgrid.selectAll(':not(.preset-highway-residential) .preset-list-button')
42494               .on('click.intro', function() {
42495                   continueTo(retryPresetResidential);
42496               });
42497
42498           subgrid.selectAll('.preset-highway-residential .preset-list-button')
42499               .on('click.intro', function() {
42500                   continueTo(nameRoad);
42501               });
42502
42503           timeout(function() {
42504               reveal(subgrid.node(),
42505                   t('intro.lines.choose_preset_residential', { preset: residentialPreset.name() }),
42506                   { tooltipBox: '.preset-highway-residential .preset-list-button', duration: 300 }
42507               );
42508           }, 300);
42509
42510           function continueTo(nextStep) {
42511               select('.preset-list-button').on('click.intro', null);
42512               context.on('exit.intro', null);
42513               nextStep();
42514           }
42515       }
42516
42517
42518       // selected wrong road type
42519       function retryPresetResidential() {
42520           if (context.mode().id !== 'select') return chapter.restart();
42521
42522           context.on('exit.intro', function() {
42523               return chapter.restart();
42524           });
42525
42526           // disallow scrolling
42527           select('.inspector-wrap').on('wheel.intro', eventCancel);
42528
42529           timeout(function() {
42530               var button = select('.entity-editor-pane .preset-list-button');
42531
42532               reveal(button.node(),
42533                   t('intro.lines.retry_preset_residential', { preset: residentialPreset.name() })
42534               );
42535
42536               button.on('click.intro', function() {
42537                   continueTo(chooseCategoryRoad);
42538               });
42539
42540           }, 500);
42541
42542           function continueTo(nextStep) {
42543               select('.inspector-wrap').on('wheel.intro', null);
42544               select('.preset-list-button').on('click.intro', null);
42545               context.on('exit.intro', null);
42546               nextStep();
42547           }
42548       }
42549
42550
42551       function nameRoad() {
42552           context.on('exit.intro', function() {
42553               continueTo(didNameRoad);
42554           });
42555
42556           timeout(function() {
42557               reveal('.entity-editor-pane',
42558                   t('intro.lines.name_road', { button: icon('#iD-icon-apply', 'pre-text') }),
42559                   { tooltipClass: 'intro-lines-name_road' }
42560               );
42561           }, 500);
42562
42563           function continueTo(nextStep) {
42564               context.on('exit.intro', null);
42565               nextStep();
42566           }
42567       }
42568
42569
42570       function didNameRoad() {
42571           context.history().checkpoint('doneAddLine');
42572
42573           timeout(function() {
42574               reveal('#surface', t('intro.lines.did_name_road'), {
42575                   buttonText: t('intro.ok'),
42576                   buttonCallback: function() { continueTo(updateLine); }
42577               });
42578           }, 500);
42579
42580           function continueTo(nextStep) {
42581               nextStep();
42582           }
42583       }
42584
42585
42586       function updateLine() {
42587           context.history().reset('doneAddLine');
42588           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
42589               return chapter.restart();
42590           }
42591
42592           var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
42593           if (msec) { reveal(null, null, { duration: 0 }); }
42594           context.map().centerZoomEase(woodRoadDragMidpoint, 19, msec);
42595
42596           timeout(function() {
42597               var padding = 250 * Math.pow(2, context.map().zoom() - 19);
42598               var box = pad$1(woodRoadDragMidpoint, padding, context);
42599               var advance = function() { continueTo(addNode); };
42600
42601               reveal(box, t('intro.lines.update_line'),
42602                   { buttonText: t('intro.ok'), buttonCallback: advance }
42603               );
42604
42605               context.map().on('move.intro drawn.intro', function() {
42606                   var padding = 250 * Math.pow(2, context.map().zoom() - 19);
42607                   var box = pad$1(woodRoadDragMidpoint, padding, context);
42608                   reveal(box, t('intro.lines.update_line'),
42609                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
42610                   );
42611               });
42612           }, msec + 100);
42613
42614           function continueTo(nextStep) {
42615               context.map().on('move.intro drawn.intro', null);
42616               nextStep();
42617           }
42618       }
42619
42620
42621       function addNode() {
42622           context.history().reset('doneAddLine');
42623           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
42624               return chapter.restart();
42625           }
42626
42627           var padding = 40 * Math.pow(2, context.map().zoom() - 19);
42628           var box = pad$1(woodRoadAddNode, padding, context);
42629           reveal(box, t('intro.lines.add_node'));
42630
42631           context.map().on('move.intro drawn.intro', function() {
42632               var padding = 40 * Math.pow(2, context.map().zoom() - 19);
42633               var box = pad$1(woodRoadAddNode, padding, context);
42634               reveal(box, t('intro.lines.add_node'), { duration: 0 });
42635           });
42636
42637           context.history().on('change.intro', function(changed) {
42638               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
42639                   return continueTo(updateLine);
42640               }
42641               if (changed.created().length === 1) {
42642                   timeout(function() { continueTo(startDragEndpoint); }, 500);
42643               }
42644           });
42645
42646           context.on('enter.intro', function(mode) {
42647               if (mode.id !== 'select') {
42648                   continueTo(updateLine);
42649               }
42650           });
42651
42652           function continueTo(nextStep) {
42653               context.map().on('move.intro drawn.intro', null);
42654               context.history().on('change.intro', null);
42655               context.on('enter.intro', null);
42656               nextStep();
42657           }
42658       }
42659
42660
42661       function startDragEndpoint() {
42662           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
42663               return continueTo(updateLine);
42664           }
42665           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
42666           var box = pad$1(woodRoadDragEndpoint, padding, context);
42667           reveal(box, t('intro.lines.start_drag_endpoint'));
42668
42669           context.map().on('move.intro drawn.intro', function() {
42670               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
42671                   return continueTo(updateLine);
42672               }
42673               var padding = 100 * Math.pow(2, context.map().zoom() - 19);
42674               var box = pad$1(woodRoadDragEndpoint, padding, context);
42675               reveal(box, t('intro.lines.start_drag_endpoint'), { duration: 0 });
42676
42677               var entity = context.entity(woodRoadEndID);
42678               if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
42679                   continueTo(finishDragEndpoint);
42680               }
42681           });
42682
42683           function continueTo(nextStep) {
42684               context.map().on('move.intro drawn.intro', null);
42685               nextStep();
42686           }
42687       }
42688
42689
42690       function finishDragEndpoint() {
42691           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
42692               return continueTo(updateLine);
42693           }
42694
42695           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
42696           var box = pad$1(woodRoadDragEndpoint, padding, context);
42697           reveal(box, t('intro.lines.finish_drag_endpoint'));
42698
42699           context.map().on('move.intro drawn.intro', function() {
42700               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
42701                   return continueTo(updateLine);
42702               }
42703               var padding = 100 * Math.pow(2, context.map().zoom() - 19);
42704               var box = pad$1(woodRoadDragEndpoint, padding, context);
42705               reveal(box, t('intro.lines.finish_drag_endpoint'), { duration: 0 });
42706
42707               var entity = context.entity(woodRoadEndID);
42708               if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
42709                   continueTo(startDragEndpoint);
42710               }
42711           });
42712
42713           context.on('enter.intro', function() {
42714               continueTo(startDragMidpoint);
42715           });
42716
42717           function continueTo(nextStep) {
42718               context.map().on('move.intro drawn.intro', null);
42719               context.on('enter.intro', null);
42720               nextStep();
42721           }
42722       }
42723
42724
42725       function startDragMidpoint() {
42726           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
42727               return continueTo(updateLine);
42728           }
42729           if (context.selectedIDs().indexOf(woodRoadID) === -1) {
42730               context.enter(modeSelect(context, [woodRoadID]));
42731           }
42732
42733           var padding = 80 * Math.pow(2, context.map().zoom() - 19);
42734           var box = pad$1(woodRoadDragMidpoint, padding, context);
42735           reveal(box, t('intro.lines.start_drag_midpoint'));
42736
42737           context.map().on('move.intro drawn.intro', function() {
42738               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
42739                   return continueTo(updateLine);
42740               }
42741               var padding = 80 * Math.pow(2, context.map().zoom() - 19);
42742               var box = pad$1(woodRoadDragMidpoint, padding, context);
42743               reveal(box, t('intro.lines.start_drag_midpoint'), { duration: 0 });
42744           });
42745
42746           context.history().on('change.intro', function(changed) {
42747               if (changed.created().length === 1) {
42748                   continueTo(continueDragMidpoint);
42749               }
42750           });
42751
42752           context.on('enter.intro', function(mode) {
42753               if (mode.id !== 'select') {
42754                   // keep Wood Road selected so midpoint triangles are drawn..
42755                   context.enter(modeSelect(context, [woodRoadID]));
42756               }
42757           });
42758
42759           function continueTo(nextStep) {
42760               context.map().on('move.intro drawn.intro', null);
42761               context.history().on('change.intro', null);
42762               context.on('enter.intro', null);
42763               nextStep();
42764           }
42765       }
42766
42767
42768       function continueDragMidpoint() {
42769           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
42770               return continueTo(updateLine);
42771           }
42772
42773           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
42774           var box = pad$1(woodRoadDragEndpoint, padding, context);
42775           box.height += 400;
42776
42777           var advance = function() {
42778               context.history().checkpoint('doneUpdateLine');
42779               continueTo(deleteLines);
42780           };
42781
42782           reveal(box, t('intro.lines.continue_drag_midpoint'),
42783               { buttonText: t('intro.ok'), buttonCallback: advance }
42784           );
42785
42786           context.map().on('move.intro drawn.intro', function() {
42787               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
42788                   return continueTo(updateLine);
42789               }
42790               var padding = 100 * Math.pow(2, context.map().zoom() - 19);
42791               var box = pad$1(woodRoadDragEndpoint, padding, context);
42792               box.height += 400;
42793               reveal(box, t('intro.lines.continue_drag_midpoint'),
42794                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
42795               );
42796           });
42797
42798           function continueTo(nextStep) {
42799               context.map().on('move.intro drawn.intro', null);
42800               nextStep();
42801           }
42802       }
42803
42804
42805       function deleteLines() {
42806           context.history().reset('doneUpdateLine');
42807           context.enter(modeBrowse(context));
42808
42809           if (!context.hasEntity(washingtonStreetID) ||
42810               !context.hasEntity(twelfthAvenueID) ||
42811               !context.hasEntity(eleventhAvenueEndID)) {
42812               return chapter.restart();
42813           }
42814
42815           var msec = transitionTime(deleteLinesLoc, context.map().center());
42816           if (msec) { reveal(null, null, { duration: 0 }); }
42817           context.map().centerZoomEase(deleteLinesLoc, 18, msec);
42818
42819           timeout(function() {
42820               var padding = 200 * Math.pow(2, context.map().zoom() - 18);
42821               var box = pad$1(deleteLinesLoc, padding, context);
42822               box.top -= 200;
42823               box.height += 400;
42824               var advance = function() { continueTo(rightClickIntersection); };
42825
42826               reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
42827                   { buttonText: t('intro.ok'), buttonCallback: advance }
42828               );
42829
42830               context.map().on('move.intro drawn.intro', function() {
42831                   var padding = 200 * Math.pow(2, context.map().zoom() - 18);
42832                   var box = pad$1(deleteLinesLoc, padding, context);
42833                   box.top -= 200;
42834                   box.height += 400;
42835                   reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
42836                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
42837                   );
42838               });
42839
42840               context.history().on('change.intro', function() {
42841                   timeout(function() {
42842                       continueTo(deleteLines);
42843                   }, 500);  // after any transition (e.g. if user deleted intersection)
42844               });
42845
42846           }, msec + 100);
42847
42848           function continueTo(nextStep) {
42849               context.map().on('move.intro drawn.intro', null);
42850               context.history().on('change.intro', null);
42851               nextStep();
42852           }
42853       }
42854
42855
42856       function rightClickIntersection() {
42857           context.history().reset('doneUpdateLine');
42858           context.enter(modeBrowse(context));
42859
42860           context.map().centerZoomEase(eleventhAvenueEnd, 18, 500);
42861
42862           timeout(function() {
42863               var padding = 60 * Math.pow(2, context.map().zoom() - 18);
42864               var box = pad$1(eleventhAvenueEnd, padding, context);
42865               reveal(box, t('intro.lines.rightclick_intersection',
42866                   { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') })
42867               );
42868
42869               context.map().on('move.intro drawn.intro', function() {
42870                   var padding = 60 * Math.pow(2, context.map().zoom() - 18);
42871                   var box = pad$1(eleventhAvenueEnd, padding, context);
42872                   reveal(box, t('intro.lines.rightclick_intersection',
42873                       { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') }),
42874                       { duration: 0 }
42875                   );
42876               });
42877
42878               context.on('enter.intro', function(mode) {
42879                   if (mode.id !== 'select') return;
42880                   var ids = context.selectedIDs();
42881                   if (ids.length !== 1 || ids[0] !== eleventhAvenueEndID) return;
42882
42883                   timeout(function() {
42884                       var node = selectMenuItem('split').node();
42885                       if (!node) return;
42886                       continueTo(splitIntersection);
42887                   }, 300);  // after menu visible
42888               });
42889
42890               context.history().on('change.intro', function() {
42891                   timeout(function() {
42892                       continueTo(deleteLines);
42893                   }, 300);  // after any transition (e.g. if user deleted intersection)
42894               });
42895
42896           }, 600);
42897
42898           function continueTo(nextStep) {
42899               context.map().on('move.intro drawn.intro', null);
42900               context.on('enter.intro', null);
42901               context.history().on('change.intro', null);
42902               nextStep();
42903           }
42904       }
42905
42906
42907       function splitIntersection() {
42908           if (!context.hasEntity(washingtonStreetID) ||
42909               !context.hasEntity(twelfthAvenueID) ||
42910               !context.hasEntity(eleventhAvenueEndID)) {
42911               return continueTo(deleteLines);
42912           }
42913
42914           var node = selectMenuItem('split').node();
42915           if (!node) { return continueTo(rightClickIntersection); }
42916
42917           var wasChanged = false;
42918           var menuCoords = context.map().mouseCoordinates();
42919           _washingtonSegmentID = null;
42920
42921           revealEditMenu(menuCoords, t('intro.lines.split_intersection',
42922               { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') })
42923           );
42924
42925           context.map().on('move.intro drawn.intro', function() {
42926               var node = selectMenuItem('split').node();
42927               if (!wasChanged && !node) { return continueTo(rightClickIntersection); }
42928
42929               revealEditMenu(menuCoords, t('intro.lines.split_intersection',
42930                   { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') }),
42931                   { duration: 0 }
42932               );
42933           });
42934
42935           context.history().on('change.intro', function(changed) {
42936               wasChanged = true;
42937               timeout(function() {
42938                   if (context.history().undoAnnotation() === t('operations.split.annotation.line')) {
42939                       _washingtonSegmentID = changed.created()[0].id;
42940                       continueTo(didSplit);
42941                   } else {
42942                       _washingtonSegmentID = null;
42943                       continueTo(retrySplit);
42944                   }
42945               }, 300);  // after any transition (e.g. if user deleted intersection)
42946           });
42947
42948           function continueTo(nextStep) {
42949               context.map().on('move.intro drawn.intro', null);
42950               context.history().on('change.intro', null);
42951               nextStep();
42952           }
42953       }
42954
42955
42956       function retrySplit() {
42957           context.enter(modeBrowse(context));
42958           context.map().centerZoomEase(eleventhAvenueEnd, 18, 500);
42959           var advance = function() { continueTo(rightClickIntersection); };
42960
42961           var padding = 60 * Math.pow(2, context.map().zoom() - 18);
42962           var box = pad$1(eleventhAvenueEnd, padding, context);
42963           reveal(box, t('intro.lines.retry_split'),
42964               { buttonText: t('intro.ok'), buttonCallback: advance }
42965           );
42966
42967           context.map().on('move.intro drawn.intro', function() {
42968               var padding = 60 * Math.pow(2, context.map().zoom() - 18);
42969               var box = pad$1(eleventhAvenueEnd, padding, context);
42970               reveal(box, t('intro.lines.retry_split'),
42971                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
42972               );
42973           });
42974
42975           function continueTo(nextStep) {
42976               context.map().on('move.intro drawn.intro', null);
42977               nextStep();
42978           }
42979       }
42980
42981
42982       function didSplit() {
42983           if (!_washingtonSegmentID ||
42984               !context.hasEntity(_washingtonSegmentID) ||
42985               !context.hasEntity(washingtonStreetID) ||
42986               !context.hasEntity(twelfthAvenueID) ||
42987               !context.hasEntity(eleventhAvenueEndID)) {
42988               return continueTo(rightClickIntersection);
42989           }
42990
42991           var ids = context.selectedIDs();
42992           var string = 'intro.lines.did_split_' + (ids.length > 1 ? 'multi' : 'single');
42993           var street = t('intro.graph.name.washington-street');
42994
42995           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
42996           var box = pad$1(twelfthAvenue, padding, context);
42997           box.width = box.width / 2;
42998           reveal(box, t(string, { street1: street, street2: street }),
42999               { duration: 500 }
43000           );
43001
43002           timeout(function() {
43003               context.map().centerZoomEase(twelfthAvenue, 18, 500);
43004
43005               context.map().on('move.intro drawn.intro', function() {
43006                   var padding = 200 * Math.pow(2, context.map().zoom() - 18);
43007                   var box = pad$1(twelfthAvenue, padding, context);
43008                   box.width = box.width / 2;
43009                   reveal(box, t(string, { street1: street, street2: street }),
43010                       { duration: 0 }
43011                   );
43012               });
43013           }, 600);  // after initial reveal and curtain cut
43014
43015           context.on('enter.intro', function() {
43016               var ids = context.selectedIDs();
43017               if (ids.length === 1 && ids[0] === _washingtonSegmentID) {
43018                   continueTo(multiSelect);
43019               }
43020           });
43021
43022           context.history().on('change.intro', function() {
43023               if (!_washingtonSegmentID ||
43024                   !context.hasEntity(_washingtonSegmentID) ||
43025                   !context.hasEntity(washingtonStreetID) ||
43026                   !context.hasEntity(twelfthAvenueID) ||
43027                   !context.hasEntity(eleventhAvenueEndID)) {
43028                   return continueTo(rightClickIntersection);
43029               }
43030           });
43031
43032           function continueTo(nextStep) {
43033               context.map().on('move.intro drawn.intro', null);
43034               context.on('enter.intro', null);
43035               context.history().on('change.intro', null);
43036               nextStep();
43037           }
43038       }
43039
43040
43041       function multiSelect() {
43042           if (!_washingtonSegmentID ||
43043               !context.hasEntity(_washingtonSegmentID) ||
43044               !context.hasEntity(washingtonStreetID) ||
43045               !context.hasEntity(twelfthAvenueID) ||
43046               !context.hasEntity(eleventhAvenueEndID)) {
43047               return continueTo(rightClickIntersection);
43048           }
43049
43050           var ids = context.selectedIDs();
43051           var hasWashington = ids.indexOf(_washingtonSegmentID) !== -1;
43052           var hasTwelfth = ids.indexOf(twelfthAvenueID) !== -1;
43053
43054           if (hasWashington && hasTwelfth) {
43055               return continueTo(multiRightClick);
43056           } else if (!hasWashington && !hasTwelfth) {
43057               return continueTo(didSplit);
43058           }
43059
43060           context.map().centerZoomEase(twelfthAvenue, 18, 500);
43061
43062           timeout(function() {
43063               var selected, other, padding, box;
43064               if (hasWashington) {
43065                   selected = t('intro.graph.name.washington-street');
43066                   other = t('intro.graph.name.12th-avenue');
43067                   padding = 60 * Math.pow(2, context.map().zoom() - 18);
43068                   box = pad$1(twelfthAvenueEnd, padding, context);
43069                   box.width *= 3;
43070               } else {
43071                   selected = t('intro.graph.name.12th-avenue');
43072                   other = t('intro.graph.name.washington-street');
43073                   padding = 200 * Math.pow(2, context.map().zoom() - 18);
43074                   box = pad$1(twelfthAvenue, padding, context);
43075                   box.width /= 2;
43076               }
43077
43078               reveal(box,
43079                   t('intro.lines.multi_select', { selected: selected, other1: other, other2: other })
43080               );
43081
43082               context.map().on('move.intro drawn.intro', function() {
43083                   if (hasWashington) {
43084                       selected = t('intro.graph.name.washington-street');
43085                       other = t('intro.graph.name.12th-avenue');
43086                       padding = 60 * Math.pow(2, context.map().zoom() - 18);
43087                       box = pad$1(twelfthAvenueEnd, padding, context);
43088                       box.width *= 3;
43089                   } else {
43090                       selected = t('intro.graph.name.12th-avenue');
43091                       other = t('intro.graph.name.washington-street');
43092                       padding = 200 * Math.pow(2, context.map().zoom() - 18);
43093                       box = pad$1(twelfthAvenue, padding, context);
43094                       box.width /= 2;
43095                   }
43096
43097                   reveal(box,
43098                       t('intro.lines.multi_select', { selected: selected, other1: other, other2: other }),
43099                       { duration: 0 }
43100                   );
43101               });
43102
43103               context.on('enter.intro', function() {
43104                   continueTo(multiSelect);
43105               });
43106
43107               context.history().on('change.intro', function() {
43108                   if (!_washingtonSegmentID ||
43109                       !context.hasEntity(_washingtonSegmentID) ||
43110                       !context.hasEntity(washingtonStreetID) ||
43111                       !context.hasEntity(twelfthAvenueID) ||
43112                       !context.hasEntity(eleventhAvenueEndID)) {
43113                       return continueTo(rightClickIntersection);
43114                   }
43115               });
43116           }, 600);
43117
43118           function continueTo(nextStep) {
43119               context.map().on('move.intro drawn.intro', null);
43120               context.on('enter.intro', null);
43121               context.history().on('change.intro', null);
43122               nextStep();
43123           }
43124       }
43125
43126
43127       function multiRightClick() {
43128           if (!_washingtonSegmentID ||
43129               !context.hasEntity(_washingtonSegmentID) ||
43130               !context.hasEntity(washingtonStreetID) ||
43131               !context.hasEntity(twelfthAvenueID) ||
43132               !context.hasEntity(eleventhAvenueEndID)) {
43133               return continueTo(rightClickIntersection);
43134           }
43135
43136           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
43137           var box = pad$1(twelfthAvenue, padding, context);
43138           reveal(box, t('intro.lines.multi_rightclick'));
43139
43140           context.map().on('move.intro drawn.intro', function() {
43141               var padding = 200 * Math.pow(2, context.map().zoom() - 18);
43142               var box = pad$1(twelfthAvenue, padding, context);
43143               reveal(box, t('intro.lines.multi_rightclick'), { duration: 0 });
43144           });
43145
43146           select(window).on('click.intro contextmenu.intro', function() {
43147               timeout(function() {
43148                   var ids = context.selectedIDs();
43149                   if (ids.length === 2 &&
43150                       ids.indexOf(twelfthAvenueID) !== -1 &&
43151                       ids.indexOf(_washingtonSegmentID) !== -1) {
43152                           var node = selectMenuItem('delete').node();
43153                           if (!node) return;
43154                           continueTo(multiDelete);
43155                   } else if (ids.length === 1 &&
43156                       ids.indexOf(_washingtonSegmentID) !== -1) {
43157                       return continueTo(multiSelect);
43158                   } else {
43159                       return continueTo(didSplit);
43160                   }
43161               }, 300);  // after edit menu visible
43162           }, true);
43163
43164           context.history().on('change.intro', function() {
43165               if (!_washingtonSegmentID ||
43166                   !context.hasEntity(_washingtonSegmentID) ||
43167                   !context.hasEntity(washingtonStreetID) ||
43168                   !context.hasEntity(twelfthAvenueID) ||
43169                   !context.hasEntity(eleventhAvenueEndID)) {
43170                   return continueTo(rightClickIntersection);
43171               }
43172           });
43173
43174           function continueTo(nextStep) {
43175               context.map().on('move.intro drawn.intro', null);
43176               select(window).on('click.intro contextmenu.intro', null, true);
43177               context.history().on('change.intro', null);
43178               nextStep();
43179           }
43180       }
43181
43182
43183       function multiDelete() {
43184           if (!_washingtonSegmentID ||
43185               !context.hasEntity(_washingtonSegmentID) ||
43186               !context.hasEntity(washingtonStreetID) ||
43187               !context.hasEntity(twelfthAvenueID) ||
43188               !context.hasEntity(eleventhAvenueEndID)) {
43189               return continueTo(rightClickIntersection);
43190           }
43191
43192           var node = selectMenuItem('delete').node();
43193           if (!node) return continueTo(multiRightClick);
43194
43195           var menuCoords = context.map().mouseCoordinates();
43196           revealEditMenu(menuCoords,
43197               t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') })
43198           );
43199
43200           context.map().on('move.intro drawn.intro', function() {
43201               revealEditMenu(menuCoords,
43202                   t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') }),
43203                   { duration: 0 }
43204               );
43205           });
43206
43207           context.on('exit.intro', function() {
43208               if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
43209                   return continueTo(multiSelect);  // left select mode but roads still exist
43210               }
43211           });
43212
43213           context.history().on('change.intro', function() {
43214               if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
43215                   continueTo(retryDelete);         // changed something but roads still exist
43216               } else {
43217                   continueTo(play);
43218               }
43219           });
43220
43221           function continueTo(nextStep) {
43222               context.map().on('move.intro drawn.intro', null);
43223               context.on('exit.intro', null);
43224               context.history().on('change.intro', null);
43225               nextStep();
43226           }
43227       }
43228
43229
43230       function retryDelete() {
43231           context.enter(modeBrowse(context));
43232
43233           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
43234           var box = pad$1(twelfthAvenue, padding, context);
43235           reveal(box, t('intro.lines.retry_delete'), {
43236               buttonText: t('intro.ok'),
43237               buttonCallback: function() { continueTo(multiSelect); }
43238           });
43239
43240           function continueTo(nextStep) {
43241               nextStep();
43242           }
43243       }
43244
43245
43246       function play() {
43247           dispatch$$1.call('done');
43248           reveal('#id-container',
43249               t('intro.lines.play', { next: t('intro.buildings.title') }), {
43250                   tooltipBox: '.intro-nav-wrap .chapter-building',
43251                   buttonText: t('intro.ok'),
43252                   buttonCallback: function() { reveal('#id-container'); }
43253               }
43254           );
43255      }
43256
43257
43258       chapter.enter = function() {
43259           addLine();
43260       };
43261
43262
43263       chapter.exit = function() {
43264           timeouts.forEach(window.clearTimeout);
43265           select(window).on('mousedown.intro', null, true);
43266           context.on('enter.intro exit.intro', null);
43267           context.map().on('move.intro drawn.intro', null);
43268           context.history().on('change.intro', null);
43269           select('.inspector-wrap').on('wheel.intro', null);
43270           select('.preset-list-button').on('click.intro', null);
43271       };
43272
43273
43274       chapter.restart = function() {
43275           chapter.exit();
43276           chapter.enter();
43277       };
43278
43279
43280       return utilRebind(chapter, dispatch$$1, 'on');
43281   }
43282
43283   function uiIntroBuilding(context, reveal) {
43284       var dispatch$$1 = dispatch('done');
43285       var house = [-85.62815, 41.95638];
43286       var tank = [-85.62732, 41.95347];
43287       var buildingCatetory = context.presets().item('category-building');
43288       var housePreset = context.presets().item('building/house');
43289       var tankPreset = context.presets().item('man_made/storage_tank');
43290       var timeouts = [];
43291       var _houseID = null;
43292       var _tankID = null;
43293
43294
43295       var chapter = {
43296           title: 'intro.buildings.title'
43297       };
43298
43299
43300       function timeout(f, t$$1) {
43301           timeouts.push(window.setTimeout(f, t$$1));
43302       }
43303
43304
43305       function eventCancel() {
43306           event.stopPropagation();
43307           event.preventDefault();
43308       }
43309
43310
43311       function revealHouse(center, text, options) {
43312           var padding = 160 * Math.pow(2, context.map().zoom() - 20);
43313           var box = pad$1(center, padding, context);
43314           reveal(box, text, options);
43315       }
43316
43317
43318       function revealTank(center, text, options) {
43319           var padding = 190 * Math.pow(2, context.map().zoom() - 19.5);
43320           var box = pad$1(center, padding, context);
43321           reveal(box, text, options);
43322       }
43323
43324
43325       function revealEditMenu(loc, text, options) {
43326           var rect = context.surfaceRect();
43327           var point$$1 = context.curtainProjection(loc);
43328           var pad = 40;
43329           var width = 250 + (2 * pad);
43330           var height = 350;
43331           var startX = rect.left + point$$1[0];
43332           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
43333           var box = {
43334               left: left,
43335               top: point$$1[1] + rect.top - 60,
43336               width: width,
43337               height: height
43338           };
43339           reveal(box, text, options);
43340       }
43341
43342
43343       function addHouse() {
43344           context.enter(modeBrowse(context));
43345           context.history().reset('initial');
43346           _houseID = null;
43347
43348           var msec = transitionTime(house, context.map().center());
43349           if (msec) { reveal(null, null, { duration: 0 }); }
43350           context.map().centerZoomEase(house, 19, msec);
43351
43352           timeout(function() {
43353               var tooltip = reveal('button.add-area',
43354                   t('intro.buildings.add_building', { button: icon('#iD-icon-area', 'pre-text') }));
43355
43356               tooltip.selectAll('.tooltip-inner')
43357                   .insert('svg', 'span')
43358                   .attr('class', 'tooltip-illustration')
43359                   .append('use')
43360                   .attr('xlink:href', '#iD-graphic-buildings');
43361
43362               context.on('enter.intro', function(mode) {
43363                   if (mode.id !== 'add-area') return;
43364                   continueTo(startHouse);
43365               });
43366           }, msec + 100);
43367
43368           function continueTo(nextStep) {
43369               context.on('enter.intro', null);
43370               nextStep();
43371           }
43372       }
43373
43374
43375       function startHouse() {
43376           if (context.mode().id !== 'add-area') {
43377               return continueTo(addHouse);
43378           }
43379
43380           _houseID = null;
43381           context.map().zoomEase(20, 500);
43382
43383           timeout(function() {
43384               revealHouse(house, t('intro.buildings.start_building'));
43385
43386               context.map().on('move.intro drawn.intro', function() {
43387                   revealHouse(house, t('intro.buildings.start_building'), { duration: 0 });
43388               });
43389
43390               context.on('enter.intro', function(mode) {
43391                   if (mode.id !== 'draw-area') return chapter.restart();
43392                   continueTo(continueHouse);
43393               });
43394
43395           }, 550);  // after easing
43396
43397           function continueTo(nextStep) {
43398               context.map().on('move.intro drawn.intro', null);
43399               context.on('enter.intro', null);
43400               nextStep();
43401           }
43402       }
43403
43404
43405       function continueHouse() {
43406           if (context.mode().id !== 'draw-area') {
43407               return continueTo(addHouse);
43408           }
43409
43410           _houseID = null;
43411
43412           revealHouse(house, t('intro.buildings.continue_building'));
43413
43414           context.map().on('move.intro drawn.intro', function() {
43415               revealHouse(house, t('intro.buildings.continue_building'), { duration: 0 });
43416           });
43417
43418           context.on('enter.intro', function(mode) {
43419               if (mode.id === 'draw-area') {
43420                   return;
43421               } else if (mode.id === 'select') {
43422                   var graph = context.graph();
43423                   var way = context.entity(context.selectedIDs()[0]);
43424                   var nodes = graph.childNodes(way);
43425                   var points = uniq(nodes).map(function(n) { return context.projection(n.loc); });
43426
43427                   if (isMostlySquare(points)) {
43428                       _houseID = way.id;
43429                       return continueTo(chooseCategoryBuilding);
43430                   } else {
43431                       return continueTo(retryHouse);
43432                   }
43433
43434               } else {
43435                   return chapter.restart();
43436               }
43437           });
43438
43439           function continueTo(nextStep) {
43440               context.map().on('move.intro drawn.intro', null);
43441               context.on('enter.intro', null);
43442               nextStep();
43443           }
43444       }
43445
43446
43447       function retryHouse() {
43448           var onClick = function() { continueTo(addHouse); };
43449
43450           revealHouse(house, t('intro.buildings.retry_building'),
43451               { buttonText: t('intro.ok'), buttonCallback: onClick }
43452           );
43453
43454           context.map().on('move.intro drawn.intro', function() {
43455               revealHouse(house, t('intro.buildings.retry_building'),
43456                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
43457               );
43458           });
43459
43460           function continueTo(nextStep) {
43461               context.map().on('move.intro drawn.intro', null);
43462               nextStep();
43463           }
43464       }
43465
43466
43467       function chooseCategoryBuilding() {
43468           if (!_houseID || !context.hasEntity(_houseID)) {
43469               return addHouse();
43470           }
43471           var ids = context.selectedIDs();
43472           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
43473               context.enter(modeSelect(context, [_houseID]));
43474           }
43475
43476           // disallow scrolling
43477           select('.inspector-wrap').on('wheel.intro', eventCancel);
43478
43479           timeout(function() {
43480               // reset pane, in case user somehow happened to change it..
43481               select('.inspector-wrap .panewrap').style('right', '-100%');
43482
43483               var button = select('.preset-category-building .preset-list-button');
43484
43485               reveal(button.node(),
43486                   t('intro.buildings.choose_category_building', { category: buildingCatetory.name() })
43487               );
43488
43489               button.on('click.intro', function() {
43490                   button.on('click.intro', null);
43491                   continueTo(choosePresetHouse);
43492               });
43493
43494           }, 400);  // after preset list pane visible..
43495
43496
43497           context.on('enter.intro', function(mode) {
43498               if (!_houseID || !context.hasEntity(_houseID)) {
43499                   return continueTo(addHouse);
43500               }
43501               var ids = context.selectedIDs();
43502               if (mode.id !== 'select' || !ids.length || ids[0] !== _houseID) {
43503                   return continueTo(chooseCategoryBuilding);
43504               }
43505           });
43506
43507           function continueTo(nextStep) {
43508               select('.inspector-wrap').on('wheel.intro', null);
43509               select('.preset-list-button').on('click.intro', null);
43510               context.on('enter.intro', null);
43511               nextStep();
43512           }
43513       }
43514
43515
43516       function choosePresetHouse() {
43517           if (!_houseID || !context.hasEntity(_houseID)) {
43518               return addHouse();
43519           }
43520           var ids = context.selectedIDs();
43521           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
43522               context.enter(modeSelect(context, [_houseID]));
43523           }
43524
43525           // disallow scrolling
43526           select('.inspector-wrap').on('wheel.intro', eventCancel);
43527
43528           timeout(function() {
43529               // reset pane, in case user somehow happened to change it..
43530               select('.inspector-wrap .panewrap').style('right', '-100%');
43531
43532               var button = select('.preset-building-house .preset-list-button');
43533
43534               reveal(button.node(),
43535                   t('intro.buildings.choose_preset_house', { preset: housePreset.name() }),
43536                   { duration: 300 }
43537               );
43538
43539               button.on('click.intro', function() {
43540                   button.on('click.intro', null);
43541                   continueTo(closeEditorHouse);
43542               });
43543
43544           }, 400);  // after preset list pane visible..
43545
43546           context.on('enter.intro', function(mode) {
43547               if (!_houseID || !context.hasEntity(_houseID)) {
43548                   return continueTo(addHouse);
43549               }
43550               var ids = context.selectedIDs();
43551               if (mode.id !== 'select' || !ids.length || ids[0] !== _houseID) {
43552                   return continueTo(chooseCategoryBuilding);
43553               }
43554           });
43555
43556           function continueTo(nextStep) {
43557               select('.inspector-wrap').on('wheel.intro', null);
43558               select('.preset-list-button').on('click.intro', null);
43559               context.on('enter.intro', null);
43560               nextStep();
43561           }
43562       }
43563
43564
43565       function closeEditorHouse() {
43566           if (!_houseID || !context.hasEntity(_houseID)) {
43567               return addHouse();
43568           }
43569           var ids = context.selectedIDs();
43570           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
43571               context.enter(modeSelect(context, [_houseID]));
43572           }
43573
43574           context.history().checkpoint('hasHouse');
43575
43576           context.on('exit.intro', function() {
43577               continueTo(rightClickHouse);
43578           });
43579
43580           timeout(function() {
43581               reveal('.entity-editor-pane',
43582                   t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
43583               );
43584           }, 500);
43585
43586           function continueTo(nextStep) {
43587               context.on('exit.intro', null);
43588               nextStep();
43589           }
43590       }
43591
43592
43593       function rightClickHouse() {
43594           if (!_houseID) return chapter.restart();
43595
43596           context.enter(modeBrowse(context));
43597           context.history().reset('hasHouse');
43598           var zoom = context.map().zoom();
43599           if (zoom < 20) {
43600               zoom = 20;
43601           }
43602           context.map().centerZoomEase(house, zoom, 500);
43603
43604           context.on('enter.intro', function(mode) {
43605               if (mode.id !== 'select') return;
43606               var ids = context.selectedIDs();
43607               if (ids.length !== 1 || ids[0] !== _houseID) return;
43608
43609               timeout(function() {
43610                   var node = selectMenuItem('orthogonalize').node();
43611                   if (!node) return;
43612                   continueTo(clickSquare);
43613               }, 300);  // after menu visible
43614           });
43615
43616           context.map().on('move.intro drawn.intro', function() {
43617               revealHouse(house, t('intro.buildings.rightclick_building'), { duration: 0 });
43618           });
43619
43620           context.history().on('change.intro', function() {
43621               continueTo(rightClickHouse);
43622           });
43623
43624           function continueTo(nextStep) {
43625               context.on('enter.intro', null);
43626               context.map().on('move.intro drawn.intro', null);
43627               context.history().on('change.intro', null);
43628               nextStep();
43629           }
43630       }
43631
43632
43633       function clickSquare() {
43634           if (!_houseID) return chapter.restart();
43635           var entity = context.hasEntity(_houseID);
43636           if (!entity) return continueTo(rightClickHouse);
43637
43638           var node = selectMenuItem('orthogonalize').node();
43639           if (!node) { return continueTo(rightClickHouse); }
43640
43641           var wasChanged = false;
43642           var menuCoords = context.map().mouseCoordinates();
43643
43644           revealEditMenu(menuCoords,
43645               t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') })
43646           );
43647
43648           context.on('enter.intro', function(mode) {
43649               if (mode.id === 'browse') {
43650                   continueTo(rightClickHouse);
43651               } else if (mode.id === 'move' || mode.id === 'rotate') {
43652                   continueTo(retryClickSquare);
43653               }
43654           });
43655
43656           context.map().on('move.intro drawn.intro', function() {
43657               var node = selectMenuItem('orthogonalize').node();
43658               if (!wasChanged && !node) { return continueTo(rightClickHouse); }
43659
43660               revealEditMenu(menuCoords,
43661                   t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') }),
43662                   { duration: 0 }
43663               );
43664           });
43665
43666           context.history().on('change.intro', function() {
43667               wasChanged = true;
43668               context.history().on('change.intro', null);
43669
43670               // Something changed.  Wait for transition to complete and check undo annotation.
43671               timeout(function() {
43672                   if (context.history().undoAnnotation() === t('operations.orthogonalize.annotation.area')) {
43673                       continueTo(doneSquare);
43674                   } else {
43675                       continueTo(retryClickSquare);
43676                   }
43677               }, 500);  // after transitioned actions
43678           });
43679
43680           function continueTo(nextStep) {
43681               context.on('enter.intro', null);
43682               context.map().on('move.intro drawn.intro', null);
43683               context.history().on('change.intro', null);
43684               nextStep();
43685           }
43686       }
43687
43688
43689       function retryClickSquare() {
43690           context.enter(modeBrowse(context));
43691
43692           revealHouse(house, t('intro.buildings.retry_square'), {
43693               buttonText: t('intro.ok'),
43694               buttonCallback: function() { continueTo(rightClickHouse); }
43695           });
43696
43697           function continueTo(nextStep) {
43698               nextStep();
43699           }
43700       }
43701
43702
43703       function doneSquare() {
43704           context.history().checkpoint('doneSquare');
43705
43706           revealHouse(house, t('intro.buildings.done_square'), {
43707               buttonText: t('intro.ok'),
43708               buttonCallback: function() { continueTo(addTank); }
43709           });
43710
43711           function continueTo(nextStep) {
43712               nextStep();
43713           }
43714       }
43715
43716
43717       function addTank() {
43718           context.enter(modeBrowse(context));
43719           context.history().reset('doneSquare');
43720           _tankID = null;
43721
43722           var msec = transitionTime(tank, context.map().center());
43723           if (msec) { reveal(null, null, { duration: 0 }); }
43724           context.map().centerZoomEase(tank, 19.5, msec);
43725
43726           timeout(function() {
43727               reveal('button.add-area',
43728                   t('intro.buildings.add_tank', { button: icon('#iD-icon-area', 'pre-text') })
43729               );
43730
43731               context.on('enter.intro', function(mode) {
43732                   if (mode.id !== 'add-area') return;
43733                   continueTo(startTank);
43734               });
43735           }, msec + 100);
43736
43737           function continueTo(nextStep) {
43738               context.on('enter.intro', null);
43739               nextStep();
43740           }
43741       }
43742
43743
43744       function startTank() {
43745           if (context.mode().id !== 'add-area') {
43746               return continueTo(addTank);
43747           }
43748
43749           _tankID = null;
43750
43751           timeout(function() {
43752               revealTank(tank, t('intro.buildings.start_tank'));
43753
43754               context.map().on('move.intro drawn.intro', function() {
43755                   revealTank(tank, t('intro.buildings.start_tank'), { duration: 0 });
43756               });
43757
43758               context.on('enter.intro', function(mode) {
43759                   if (mode.id !== 'draw-area') return chapter.restart();
43760                   continueTo(continueTank);
43761               });
43762
43763           }, 550);  // after easing
43764
43765           function continueTo(nextStep) {
43766               context.map().on('move.intro drawn.intro', null);
43767               context.on('enter.intro', null);
43768               nextStep();
43769           }
43770       }
43771
43772
43773       function continueTank() {
43774           if (context.mode().id !== 'draw-area') {
43775               return continueTo(addTank);
43776           }
43777
43778           _tankID = null;
43779
43780           revealTank(tank, t('intro.buildings.continue_tank'));
43781
43782           context.map().on('move.intro drawn.intro', function() {
43783               revealTank(tank, t('intro.buildings.continue_tank'), { duration: 0 });
43784           });
43785
43786           context.on('enter.intro', function(mode) {
43787               if (mode.id === 'draw-area') {
43788                   return;
43789               } else if (mode.id === 'select') {
43790                   _tankID = context.selectedIDs()[0];
43791                   return continueTo(searchPresetTank);
43792               } else {
43793                   return continueTo(addTank);
43794               }
43795           });
43796
43797           function continueTo(nextStep) {
43798               context.map().on('move.intro drawn.intro', null);
43799               context.on('enter.intro', null);
43800               nextStep();
43801           }
43802       }
43803
43804
43805       function searchPresetTank() {
43806           if (!_tankID || !context.hasEntity(_tankID)) {
43807               return addTank();
43808           }
43809           var ids = context.selectedIDs();
43810           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _tankID) {
43811               context.enter(modeSelect(context, [_tankID]));
43812           }
43813
43814           // disallow scrolling
43815           select('.inspector-wrap').on('wheel.intro', eventCancel);
43816
43817           timeout(function() {
43818               // reset pane, in case user somehow happened to change it..
43819               select('.inspector-wrap .panewrap').style('right', '-100%');
43820
43821               select('.preset-search-input')
43822                   .on('keydown.intro', null)
43823                   .on('keyup.intro', checkPresetSearch);
43824
43825               reveal('.preset-search-input',
43826                   t('intro.buildings.search_tank', { preset: tankPreset.name() })
43827               );
43828           }, 400);  // after preset list pane visible..
43829
43830           context.on('enter.intro', function(mode) {
43831               if (!_tankID || !context.hasEntity(_tankID)) {
43832                   return continueTo(addTank);
43833               }
43834
43835               var ids = context.selectedIDs();
43836               if (mode.id !== 'select' || !ids.length || ids[0] !== _tankID) {
43837                   // keep the user's area selected..
43838                   context.enter(modeSelect(context, [_tankID]));
43839
43840                   // reset pane, in case user somehow happened to change it..
43841                   select('.inspector-wrap .panewrap').style('right', '-100%');
43842                   // disallow scrolling
43843                   select('.inspector-wrap').on('wheel.intro', eventCancel);
43844
43845                   select('.preset-search-input')
43846                       .on('keydown.intro', null)
43847                       .on('keyup.intro', checkPresetSearch);
43848
43849                   reveal('.preset-search-input',
43850                       t('intro.buildings.search_tank', { preset: tankPreset.name() })
43851                   );
43852
43853                   context.history().on('change.intro', null);
43854               }
43855           });
43856
43857           function checkPresetSearch() {
43858               var first = select('.preset-list-item:first-child');
43859
43860               if (first.classed('preset-man_made-storage_tank')) {
43861                   reveal(first.select('.preset-list-button').node(),
43862                       t('intro.buildings.choose_tank', { preset: tankPreset.name() }),
43863                       { duration: 300 }
43864                   );
43865
43866                   select('.preset-search-input')
43867                       .on('keydown.intro', eventCancel, true)
43868                       .on('keyup.intro', null);
43869
43870                   context.history().on('change.intro', function() {
43871                       continueTo(closeEditorTank);
43872                   });
43873               }
43874           }
43875
43876           function continueTo(nextStep) {
43877               select('.inspector-wrap').on('wheel.intro', null);
43878               context.on('enter.intro', null);
43879               context.history().on('change.intro', null);
43880               select('.preset-search-input').on('keydown.intro keyup.intro', null);
43881               nextStep();
43882           }
43883       }
43884
43885
43886       function closeEditorTank() {
43887           if (!_tankID || !context.hasEntity(_tankID)) {
43888               return addTank();
43889           }
43890           var ids = context.selectedIDs();
43891           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _tankID) {
43892               context.enter(modeSelect(context, [_tankID]));
43893           }
43894
43895           context.history().checkpoint('hasTank');
43896
43897           context.on('exit.intro', function() {
43898               continueTo(rightClickTank);
43899           });
43900
43901           timeout(function() {
43902               reveal('.entity-editor-pane',
43903                   t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
43904               );
43905           }, 500);
43906
43907           function continueTo(nextStep) {
43908               context.on('exit.intro', null);
43909               nextStep();
43910           }
43911       }
43912
43913
43914       function rightClickTank() {
43915           if (!_tankID) return continueTo(addTank);
43916
43917           context.enter(modeBrowse(context));
43918           context.history().reset('hasTank');
43919           context.map().centerEase(tank, 500);
43920
43921           timeout(function() {
43922               context.on('enter.intro', function(mode) {
43923                   if (mode.id !== 'select') return;
43924                   var ids = context.selectedIDs();
43925                   if (ids.length !== 1 || ids[0] !== _tankID) return;
43926
43927                   timeout(function() {
43928                       var node = selectMenuItem('circularize').node();
43929                       if (!node) return;
43930                       continueTo(clickCircle);
43931                   }, 300);  // after menu visible
43932               });
43933
43934               revealTank(tank, t('intro.buildings.rightclick_tank'));
43935
43936               context.map().on('move.intro drawn.intro', function() {
43937                   revealTank(tank, t('intro.buildings.rightclick_tank'), { duration: 0 });
43938               });
43939
43940               context.history().on('change.intro', function() {
43941                   continueTo(rightClickTank);
43942               });
43943
43944           }, 600);
43945
43946           function continueTo(nextStep) {
43947               context.on('enter.intro', null);
43948               context.map().on('move.intro drawn.intro', null);
43949               context.history().on('change.intro', null);
43950               nextStep();
43951           }
43952       }
43953
43954
43955       function clickCircle() {
43956           if (!_tankID) return chapter.restart();
43957           var entity = context.hasEntity(_tankID);
43958           if (!entity) return continueTo(rightClickTank);
43959
43960           var node = selectMenuItem('circularize').node();
43961           if (!node) { return continueTo(rightClickTank); }
43962
43963           var wasChanged = false;
43964           var menuCoords = context.map().mouseCoordinates();
43965
43966           revealEditMenu(menuCoords,
43967               t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') })
43968           );
43969
43970           context.on('enter.intro', function(mode) {
43971               if (mode.id === 'browse') {
43972                   continueTo(rightClickTank);
43973               } else if (mode.id === 'move' || mode.id === 'rotate') {
43974                   continueTo(retryClickCircle);
43975               }
43976           });
43977
43978           context.map().on('move.intro drawn.intro', function() {
43979               var node = selectMenuItem('circularize').node();
43980               if (!wasChanged && !node) { return continueTo(rightClickTank); }
43981
43982               revealEditMenu(menuCoords,
43983                   t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') }),
43984                   { duration: 0 }
43985               );
43986           });
43987
43988           context.history().on('change.intro', function() {
43989               wasChanged = true;
43990               context.history().on('change.intro', null);
43991
43992               // Something changed.  Wait for transition to complete and check undo annotation.
43993               timeout(function() {
43994                   if (context.history().undoAnnotation() === t('operations.circularize.annotation.area')) {
43995                       continueTo(play);
43996                   } else {
43997                       continueTo(retryClickCircle);
43998                   }
43999               }, 500);  // after transitioned actions
44000           });
44001
44002           function continueTo(nextStep) {
44003               context.on('enter.intro', null);
44004               context.map().on('move.intro drawn.intro', null);
44005               context.history().on('change.intro', null);
44006               nextStep();
44007           }
44008       }
44009
44010
44011       function retryClickCircle() {
44012           context.enter(modeBrowse(context));
44013
44014           revealTank(tank, t('intro.buildings.retry_circle'), {
44015               buttonText: t('intro.ok'),
44016               buttonCallback: function() { continueTo(rightClickTank); }
44017           });
44018
44019           function continueTo(nextStep) {
44020               nextStep();
44021           }
44022       }
44023
44024
44025       function play() {
44026           dispatch$$1.call('done');
44027           reveal('#id-container',
44028               t('intro.buildings.play', { next: t('intro.startediting.title') }), {
44029                   tooltipBox: '.intro-nav-wrap .chapter-startEditing',
44030                   buttonText: t('intro.ok'),
44031                   buttonCallback: function() { reveal('#id-container'); }
44032               }
44033           );
44034       }
44035
44036
44037       chapter.enter = function() {
44038           addHouse();
44039       };
44040
44041
44042       chapter.exit = function() {
44043           timeouts.forEach(window.clearTimeout);
44044           context.on('enter.intro exit.intro', null);
44045           context.map().on('move.intro drawn.intro', null);
44046           context.history().on('change.intro', null);
44047           select('.inspector-wrap').on('wheel.intro', null);
44048           select('.preset-search-input').on('keydown.intro keyup.intro', null);
44049           select('.more-fields .combobox-input').on('click.intro', null);
44050       };
44051
44052
44053       chapter.restart = function() {
44054           chapter.exit();
44055           chapter.enter();
44056       };
44057
44058
44059       return utilRebind(chapter, dispatch$$1, 'on');
44060   }
44061
44062   function uiModal(selection$$1, blocking) {
44063       var keybinding = utilKeybinding('modal');
44064       var previous = selection$$1.select('div.modal');
44065       var animate = previous.empty();
44066
44067       previous.transition()
44068           .duration(200)
44069           .style('opacity', 0)
44070           .remove();
44071
44072       var shaded = selection$$1
44073           .append('div')
44074           .attr('class', 'shaded')
44075           .style('opacity', 0);
44076
44077       shaded.close = function() {
44078           shaded
44079               .transition()
44080               .duration(200)
44081               .style('opacity',0)
44082               .remove();
44083
44084           modal
44085               .transition()
44086               .duration(200)
44087               .style('top','0px');
44088
44089           select(document)
44090               .call(keybinding.unbind);
44091       };
44092
44093
44094       var modal = shaded
44095           .append('div')
44096           .attr('class', 'modal fillL col6');
44097
44098       if (!blocking) {
44099           shaded.on('click.remove-modal', function() {
44100               if (event.target === this) {
44101                   shaded.close();
44102               }
44103           });
44104
44105           modal.append('button')
44106               .attr('class', 'close')
44107               .on('click', shaded.close)
44108               .call(svgIcon('#iD-icon-close'));
44109
44110           keybinding
44111               .on('⌫', shaded.close)
44112               .on('⎋', shaded.close);
44113
44114           select(document)
44115               .call(keybinding);
44116       }
44117
44118       modal
44119           .append('div')
44120           .attr('class', 'content');
44121
44122       if (animate) {
44123           shaded.transition().style('opacity', 1);
44124       } else {
44125           shaded.style('opacity', 1);
44126       }
44127
44128
44129       return shaded;
44130   }
44131
44132   function uiIntroStartEditing(context, reveal) {
44133       var dispatch$$1 = dispatch('done', 'startEditing');
44134       var modalSelection = select(null);
44135
44136
44137       var chapter = {
44138           title: 'intro.startediting.title'
44139       };
44140
44141       function showHelp() {
44142           reveal('.map-control.help-control',
44143               t('intro.startediting.help', { button: icon('#iD-icon-help', 'pre-text'), key: t('help.key') }), {
44144                   buttonText: t('intro.ok'),
44145                   buttonCallback: function() { shortcuts(); }
44146               }
44147           );
44148       }
44149
44150       function shortcuts() {
44151           reveal('.map-control.help-control',
44152               t('intro.startediting.shortcuts', { key: t('shortcuts.toggle.key') }), {
44153                   buttonText: t('intro.ok'),
44154                   buttonCallback: function() { showSave(); }
44155               }
44156           );
44157       }
44158
44159       function showSave() {
44160           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
44161           reveal('#bar button.save',
44162               t('intro.startediting.save'), {
44163                   buttonText: t('intro.ok'),
44164                   buttonCallback: function() { showStart(); }
44165               }
44166           );
44167       }
44168
44169       function showStart() {
44170           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
44171
44172           modalSelection = uiModal(context.container());
44173
44174           modalSelection.select('.modal')
44175               .attr('class', 'modal-splash modal col6');
44176
44177           modalSelection.selectAll('.close').remove();
44178
44179           var startbutton = modalSelection.select('.content')
44180               .attr('class', 'fillL')
44181               .append('button')
44182                   .attr('class', 'modal-section huge-modal-button')
44183                   .on('click', function() {
44184                       modalSelection.remove();
44185                   });
44186
44187               startbutton
44188                   .append('svg')
44189                   .attr('class', 'illustration')
44190                   .append('use')
44191                   .attr('xlink:href', '#iD-logo-walkthrough');
44192
44193               startbutton
44194                   .append('h2')
44195                   .text(t('intro.startediting.start'));
44196
44197           dispatch$$1.call('startEditing');
44198       }
44199
44200
44201       chapter.enter = function() {
44202           showHelp();
44203       };
44204
44205
44206       chapter.exit = function() {
44207           modalSelection.remove();
44208           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
44209       };
44210
44211
44212       return utilRebind(chapter, dispatch$$1, 'on');
44213   }
44214
44215   var chapterUi = {
44216       welcome: uiIntroWelcome,
44217       navigation: uiIntroNavigation,
44218       point: uiIntroPoint,
44219       area: uiIntroArea,
44220       line: uiIntroLine,
44221       building: uiIntroBuilding,
44222       startEditing: uiIntroStartEditing
44223   };
44224
44225   var chapterFlow = [
44226       'welcome',
44227       'navigation',
44228       'point',
44229       'area',
44230       'line',
44231       'building',
44232       'startEditing'
44233   ];
44234
44235
44236   function uiIntro(context) {
44237       var INTRO_IMAGERY = 'EsriWorldImageryClarity';
44238       var introGraph = {};
44239       var _currChapter;
44240
44241       // create entities for intro graph and localize names
44242       for (var id in dataIntroGraph) {
44243           introGraph[id] = osmEntity$$1(localize(dataIntroGraph[id]));
44244       }
44245
44246
44247       function intro(selection$$1) {
44248           context.enter(modeBrowse(context));
44249
44250           // Save current map state
44251           var osm = context.connection();
44252           var history = context.history().toJSON();
44253           var hash = window.location.hash;
44254           var center = context.map().center();
44255           var zoom = context.map().zoom();
44256           var background = context.background().baseLayerSource();
44257           var overlays = context.background().overlayLayerSources();
44258           var opacity = d3_selectAll('#map .layer-background').style('opacity');
44259           var caches = osm && osm.caches();
44260           var baseEntities = context.history().graph().base().entities;
44261           var countryCode = services.geocoder.countryCode;
44262
44263           // Show sidebar and disable the sidebar resizing button
44264           // (this needs to be before `context.inIntro(true)`)
44265           context.ui().sidebar.expand();
44266           d3_selectAll('button.sidebar-toggle').classed('disabled', true);
44267
44268           // Block saving
44269           context.inIntro(true);
44270
44271           // Load semi-real data used in intro
44272           if (osm) { osm.toggle(false).reset(); }
44273           context.history().reset();
44274           context.history().merge(values$1(coreGraph$$1().load(introGraph).entities));
44275           context.history().checkpoint('initial');
44276
44277           // Setup imagery
44278           var imagery = context.background().findSource(INTRO_IMAGERY);
44279           if (imagery) {
44280               context.background().baseLayerSource(imagery);
44281           } else {
44282               context.background().bing();
44283           }
44284           overlays.forEach(function(d) {
44285               context.background().toggleOverlayLayer(d);
44286           });
44287
44288           // Setup data layers (only OSM)
44289           var layers = context.layers();
44290           layers.all().forEach(function(item) {
44291               // if the layer has the function `enabled`
44292               if (typeof item.layer.enabled === 'function') {
44293                   item.layer.enabled(item.id === 'osm');
44294               }
44295           });
44296
44297           // Mock geocoder
44298           services.geocoder.countryCode = function(location, callback) {
44299               callback(null, t('intro.graph.countrycode'));
44300           };
44301
44302
44303           d3_selectAll('#map .layer-background').style('opacity', 1);
44304
44305           var curtain = uiCurtain();
44306           selection$$1.call(curtain);
44307
44308           // Store that the user started the walkthrough..
44309           context.storage('walkthrough_started', 'yes');
44310
44311           // Restore previous walkthrough progress..
44312           var storedProgress = context.storage('walkthrough_progress') || '';
44313           var progress = storedProgress.split(';').filter(Boolean);
44314
44315           var chapters = chapterFlow.map(function(chapter, i) {
44316               var s = chapterUi[chapter](context, curtain.reveal)
44317                   .on('done', function() {
44318                       context.presets().init();  // clear away "recent" presets
44319
44320                       buttons.filter(function(d) {
44321                           return d.title === s.title;
44322                       }).classed('finished', true);
44323
44324                       if (i < chapterFlow.length - 1) {
44325                           var next = chapterFlow[i + 1];
44326                           select('button.chapter-' + next)
44327                               .classed('next', true);
44328                       }
44329
44330                       // Store walkthrough progress..
44331                       progress.push(chapter);
44332                       context.storage('walkthrough_progress', uniq(progress).join(';'));
44333                   });
44334               return s;
44335           });
44336
44337           chapters[chapters.length - 1].on('startEditing', function() {
44338               // Store walkthrough progress..
44339               progress.push('startEditing');
44340               context.storage('walkthrough_progress', uniq(progress).join(';'));
44341
44342               // Store if walkthrough is completed..
44343               var incomplete = difference(chapterFlow, progress);
44344               if (!incomplete.length) {
44345                   context.storage('walkthrough_completed', 'yes');
44346               }
44347
44348               curtain.remove();
44349               navwrap.remove();
44350               d3_selectAll('#map .layer-background').style('opacity', opacity);
44351               d3_selectAll('button.sidebar-toggle').classed('disabled', false);
44352               if (osm) { osm.toggle(true).reset().caches(caches); }
44353               context.history().reset().merge(values$1(baseEntities));
44354               context.background().baseLayerSource(background);
44355               overlays.forEach(function(d) { context.background().toggleOverlayLayer(d); });
44356               if (history) { context.history().fromJSON(history, false); }
44357               context.map().centerZoom(center, zoom);
44358               window.location.replace(hash);
44359               services.geocoder.countryCode = countryCode;
44360               context.inIntro(false);
44361           });
44362
44363           var navwrap = selection$$1
44364               .append('div')
44365               .attr('class', 'intro-nav-wrap fillD');
44366
44367           navwrap
44368               .append('svg')
44369               .attr('class', 'intro-nav-wrap-logo')
44370               .append('use')
44371               .attr('xlink:href', '#iD-logo-walkthrough');
44372
44373           var buttonwrap = navwrap
44374               .append('div')
44375               .attr('class', 'joined')
44376               .selectAll('button.chapter');
44377
44378           var buttons = buttonwrap
44379               .data(chapters)
44380               .enter()
44381               .append('button')
44382               .attr('class', function(d, i) { return 'chapter chapter-' + chapterFlow[i]; })
44383               .on('click', enterChapter);
44384
44385           buttons
44386               .append('span')
44387               .text(function(d) { return t(d.title); });
44388
44389           buttons
44390               .append('span')
44391               .attr('class', 'status')
44392               .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
44393
44394           enterChapter(chapters[0]);
44395
44396
44397           function enterChapter(newChapter) {
44398               if (_currChapter) { _currChapter.exit(); }
44399               context.enter(modeBrowse(context));
44400
44401               _currChapter = newChapter;
44402               _currChapter.enter();
44403
44404               buttons
44405                   .classed('next', false)
44406                   .classed('active', function(d) {
44407                       return d.title === _currChapter.title;
44408                   });
44409           }
44410       }
44411
44412
44413       return intro;
44414   }
44415
44416   function uiConfirm(selection) {
44417       var modalSelection = uiModal(selection);
44418
44419       modalSelection.select('.modal')
44420           .classed('modal-alert', true);
44421
44422       var section = modalSelection.select('.content');
44423
44424       section.append('div')
44425           .attr('class', 'modal-section header');
44426
44427       section.append('div')
44428           .attr('class', 'modal-section message-text');
44429
44430       var buttons = section.append('div')
44431           .attr('class', 'modal-section buttons cf');
44432
44433
44434       modalSelection.okButton = function() {
44435           buttons
44436               .append('button')
44437               .attr('class', 'button ok-button action')
44438               .on('click.confirm', function() {
44439                   modalSelection.remove();
44440               })
44441               .text(t('confirm.okay'))
44442               .node()
44443               .focus();
44444
44445           return modalSelection;
44446       };
44447
44448
44449       return modalSelection;
44450   }
44451
44452   function uiSettingsCustomData(context) {
44453       var dispatch$$1 = dispatch('change');
44454
44455       function render(selection$$1) {
44456           var dataLayer = context.layers().layer('data');
44457           var _origSettings = {
44458               fileList: (dataLayer && dataLayer.fileList()) || null,
44459               url: context.storage('settings-custom-data-url')
44460           };
44461           var _currSettings = cloneDeep(_origSettings);
44462
44463           // var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
44464           var modal = uiConfirm(selection$$1).okButton();
44465
44466           modal
44467               .classed('settings-modal settings-custom-data', true);
44468
44469           modal.select('.modal-section.header')
44470               .append('h3')
44471               .text(t('settings.custom_data.header'));
44472
44473
44474           var textSection = modal.select('.modal-section.message-text');
44475
44476           textSection
44477               .append('pre')
44478               .attr('class', 'instructions-file')
44479               .text(t('settings.custom_data.file.instructions'));
44480
44481           textSection
44482               .append('input')
44483               .attr('class', 'field-file')
44484               .attr('type', 'file')
44485               .property('files', _currSettings.fileList)  // works for all except IE11
44486               .on('change', function() {
44487                   var files = event.target.files;
44488                   if (files && files.length) {
44489                       _currSettings.url = '';
44490                       textSection.select('.field-url').property('value', '');
44491                       _currSettings.fileList = files;
44492                   } else {
44493                       _currSettings.fileList = null;
44494                   }
44495               });
44496
44497           textSection
44498               .append('h4')
44499               .text(t('settings.custom_data.or'));
44500
44501           textSection
44502               .append('pre')
44503               .attr('class', 'instructions-url')
44504               .text(t('settings.custom_data.url.instructions'));
44505
44506           textSection
44507               .append('textarea')
44508               .attr('class', 'field-url')
44509               .attr('placeholder', t('settings.custom_data.url.placeholder'))
44510               .call(utilNoAuto)
44511               .property('value', _currSettings.url);
44512
44513
44514           // insert a cancel button
44515           var buttonSection = modal.select('.modal-section.buttons');
44516
44517           buttonSection
44518               .insert('button', '.ok-button')
44519               .attr('class', 'button cancel-button secondary-action')
44520               .text(t('confirm.cancel'));
44521
44522
44523           buttonSection.select('.cancel-button')
44524               .on('click.cancel', clickCancel);
44525
44526           buttonSection.select('.ok-button')
44527               .attr('disabled', isSaveDisabled)
44528               .on('click.save', clickSave);
44529
44530
44531           function isSaveDisabled() {
44532               return null;
44533           }
44534
44535
44536           // restore the original url
44537           function clickCancel() {
44538               textSection.select('.field-url').property('value', _origSettings.url);
44539               context.storage('settings-custom-data-url', _origSettings.url);
44540               this.blur();
44541               modal.close();
44542           }
44543
44544           // accept the current url
44545           function clickSave() {
44546               _currSettings.url = textSection.select('.field-url').property('value').trim();
44547
44548               // one or the other but not both
44549               if (_currSettings.url) { _currSettings.fileList = null; }
44550               if (_currSettings.fileList) { _currSettings.url = ''; }
44551
44552               context.storage('settings-custom-data-url', _currSettings.url);
44553               this.blur();
44554               modal.close();
44555               dispatch$$1.call('change', this, _currSettings);
44556           }
44557       }
44558
44559       return utilRebind(render, dispatch$$1, 'on');
44560   }
44561
44562   function uiTooltipHtml(text, key, heading) {
44563       var s = '';
44564
44565       if (heading) {
44566           s += '<div class="tooltip-heading"><span>' + heading + '</span></div>';
44567       }
44568       if (text) {
44569           s += '<div class="tooltip-text"><span>' + text + '</span></div>';
44570       }
44571       if (key) {
44572           s += '<div class="keyhint-wrap"><span>' + t('tooltip_keyhint') + '</span>' +
44573               '<span class="keyhint">' + key + '</span></div>';
44574       }
44575
44576       return s;
44577   }
44578
44579   function uiMapData(context) {
44580       var key = t('map_data.key');
44581       var features = context.features().keys();
44582       var layers = context.layers();
44583       var fills = ['wireframe', 'partial', 'full'];
44584
44585       var settingsCustomData = uiSettingsCustomData(context)
44586           .on('change', customChanged);
44587
44588       var pane = select(null);
44589
44590       var _fillSelected = context.storage('area-fill') || 'partial';
44591       var _shown = false;
44592       var _dataLayerContainer = select(null);
44593       var _fillList = select(null);
44594       var _featureList = select(null);
44595       var _QAList = select(null);
44596
44597
44598       function showsFeature(d) {
44599           return context.features().enabled(d);
44600       }
44601
44602
44603       function autoHiddenFeature(d) {
44604           if (d.type === 'kr_error') return context.errors().autoHidden(d);
44605           return context.features().autoHidden(d);
44606       }
44607
44608
44609       function clickFeature(d) {
44610           context.features().toggle(d);
44611           update();
44612       }
44613
44614
44615       function showsQA(d) {
44616           var QAKeys = [d];
44617           var QALayers = layers.all().filter(function(obj) { return QAKeys.indexOf(obj.id) !== -1; });
44618           var data = QALayers.filter(function(obj) { return obj.layer.supported(); });
44619
44620           function layerSupported(d) {
44621               return d.layer && d.layer.supported();
44622           }
44623           function layerEnabled(d) {
44624               return layerSupported(d) && d.layer.enabled();
44625           }
44626
44627           return layerEnabled(data[0]);
44628       }
44629
44630
44631       function showsFill(d) {
44632           return _fillSelected === d;
44633       }
44634
44635
44636       function setFill(d) {
44637           fills.forEach(function(opt) {
44638               context.surface().classed('fill-' + opt, Boolean(opt === d));
44639           });
44640
44641           _fillSelected = d;
44642           context.storage('area-fill', d);
44643           if (d !== 'wireframe') {
44644               context.storage('area-fill-toggle', d);
44645           }
44646           update();
44647       }
44648
44649
44650       function showsLayer(which) {
44651           var layer = layers.layer(which);
44652           if (layer) {
44653               return layer.enabled();
44654           }
44655           return false;
44656       }
44657
44658
44659       function setLayer(which, enabled) {
44660           var layer = layers.layer(which);
44661           if (layer) {
44662               layer.enabled(enabled);
44663
44664               if (!enabled && (which === 'osm' || which === 'notes')) {
44665                   context.enter(modeBrowse(context));
44666               }
44667
44668               update();
44669           }
44670       }
44671
44672
44673       function toggleLayer(which) {
44674           setLayer(which, !showsLayer(which));
44675       }
44676
44677
44678       function drawPhotoItems(selection$$1) {
44679           var photoKeys = ['streetside', 'mapillary-images', 'mapillary-signs', 'openstreetcam-images'];
44680           var photoLayers = layers.all().filter(function(obj) { return photoKeys.indexOf(obj.id) !== -1; });
44681           var data = photoLayers.filter(function(obj) { return obj.layer.supported(); });
44682
44683           function layerSupported(d) {
44684               return d.layer && d.layer.supported();
44685           }
44686           function layerEnabled(d) {
44687               return layerSupported(d) && d.layer.enabled();
44688           }
44689
44690           var ul = selection$$1
44691               .selectAll('.layer-list-photos')
44692               .data([0]);
44693
44694           ul = ul.enter()
44695               .append('ul')
44696               .attr('class', 'layer-list layer-list-photos')
44697               .merge(ul);
44698
44699           var li = ul.selectAll('.list-item-photos')
44700               .data(data);
44701
44702           li.exit()
44703               .remove();
44704
44705           var liEnter = li.enter()
44706               .append('li')
44707               .attr('class', function(d) { return 'list-item-photos list-item-' + d.id; });
44708
44709           var labelEnter = liEnter
44710               .append('label')
44711               .each(function(d) {
44712                   select(this)
44713                       .call(tooltip()
44714                           .title(t(d.id.replace('-', '_') + '.tooltip'))
44715                           .placement('top')
44716                       );
44717               });
44718
44719           labelEnter
44720               .append('input')
44721               .attr('type', 'checkbox')
44722               .on('change', function(d) { toggleLayer(d.id); });
44723
44724           labelEnter
44725               .append('span')
44726               .text(function(d) { return t(d.id.replace('-', '_') + '.title'); });
44727
44728
44729           // Update
44730           li
44731               .merge(liEnter)
44732               .classed('active', layerEnabled)
44733               .selectAll('input')
44734               .property('checked', layerEnabled);
44735       }
44736
44737
44738       function drawOsmItems(selection$$1) {
44739           var osmKeys = ['osm', 'notes'];
44740           var osmLayers = layers.all().filter(function(obj) { return osmKeys.indexOf(obj.id) !== -1; });
44741
44742           var ul = selection$$1
44743               .selectAll('.layer-list-osm')
44744               .data([0]);
44745
44746           ul = ul.enter()
44747               .append('ul')
44748               .attr('class', 'layer-list layer-list-osm')
44749               .merge(ul);
44750
44751           var li = ul.selectAll('.list-item')
44752               .data(osmLayers);
44753
44754           li.exit()
44755               .remove();
44756
44757           var liEnter = li.enter()
44758               .append('li')
44759               .attr('class', function(d) { return 'list-item list-item-' + d.id; });
44760
44761           var labelEnter = liEnter
44762               .append('label')
44763               .each(function(d) {
44764                   select(this)
44765                       .call(tooltip()
44766                           .title(t('map_data.layers.' + d.id + '.tooltip'))
44767                           .placement('bottom')
44768                       );
44769               });
44770
44771           labelEnter
44772               .append('input')
44773               .attr('type', 'checkbox')
44774               .on('change', function(d) { toggleLayer(d.id); });
44775
44776           labelEnter
44777               .append('span')
44778               .text(function(d) { return t('map_data.layers.' + d.id + '.title'); });
44779
44780
44781           // Update
44782           li
44783               .merge(liEnter)
44784               .classed('active', function (d) { return d.layer.enabled(); })
44785               .selectAll('input')
44786               .property('checked', function (d) { return d.layer.enabled(); });
44787       }
44788
44789
44790       function drawQAItems(selection$$1) {
44791           var qaKeys = ['keepRight'];
44792           var qaLayers = layers.all().filter(function(obj) { return qaKeys.indexOf(obj.id) !== -1; });
44793
44794           var ul = selection$$1
44795               .selectAll('.layer-list-qa')
44796               .data([0]);
44797
44798           ul = ul.enter()
44799               .append('ul')
44800               .attr('class', 'layer-list layer-list-qa')
44801               .merge(ul);
44802
44803           var li = ul.selectAll('.list-item')
44804               .data(qaLayers);
44805
44806           li.exit()
44807               .remove();
44808
44809           var liEnter = li.enter()
44810               .append('li')
44811               .attr('class', function(d) { return 'list-item list-item-' + d.id; });
44812
44813           var labelEnter = liEnter
44814               .append('label')
44815               .each(function(d) {
44816                   select(this)
44817                       .call(tooltip()
44818                           .title(t('map_data.layers.' + d.id + '.tooltip'))
44819                           .placement('bottom')
44820                       );
44821               });
44822
44823           labelEnter
44824               .append('input')
44825               .attr('type', 'checkbox')
44826               .on('change', function(d) { toggleLayer(d.id); });
44827
44828           labelEnter
44829               .append('span')
44830               .text(function(d) { return t('map_data.layers.' + d.id + '.title'); });
44831
44832
44833           // Update
44834           li
44835               .merge(liEnter)
44836               .classed('active', function (d) { return d.layer.enabled(); })
44837               .selectAll('input')
44838               .property('checked', function (d) { return d.layer.enabled(); });
44839       }
44840
44841
44842       // Beta feature - sample vector layers to support Detroit Mapping Challenge
44843       // https://github.com/osmus/detroit-mapping-challenge
44844       function drawVectorItems(selection$$1) {
44845           var dataLayer = layers.layer('data');
44846           var vtData = [
44847               {
44848                   name: 'Detroit Neighborhoods/Parks',
44849                   src: 'neighborhoods-parks',
44850                   tooltip: 'Neighborhood boundaries and parks as compiled by City of Detroit in concert with community groups.',
44851                   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'
44852               }, {
44853                   name: 'Detroit Composite POIs',
44854                   src: 'composite-poi',
44855                   tooltip: 'Fire Inspections, Business Licenses, and other public location data collated from the City of Detroit.',
44856                   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'
44857               }, {
44858                   name: 'Detroit All-The-Places POIs',
44859                   src: 'alltheplaces-poi',
44860                   tooltip: 'Public domain business location data created by web scrapers.',
44861                   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'
44862               }
44863           ];
44864
44865           // Only show this if the map is around Detroit..
44866           var detroit = geoExtent$$1([-83.5, 42.1], [-82.8, 42.5]);
44867           var showVectorItems = (context.map().zoom() > 9 && detroit.contains(context.map().center()));
44868
44869           var container = selection$$1.selectAll('.vectortile-container')
44870               .data(showVectorItems ? [0] : []);
44871
44872           container.exit()
44873               .remove();
44874
44875           var containerEnter = container.enter()
44876               .append('div')
44877               .attr('class', 'vectortile-container');
44878
44879           containerEnter
44880               .append('h4')
44881               .attr('class', 'vectortile-header')
44882               .text('Detroit Vector Tiles (Beta)');
44883
44884           containerEnter
44885               .append('ul')
44886               .attr('class', 'layer-list layer-list-vectortile');
44887
44888           containerEnter
44889               .append('div')
44890               .attr('class', 'vectortile-footer')
44891               .append('a')
44892               .attr('target', '_blank')
44893               .attr('tabindex', -1)
44894               .call(svgIcon('#iD-icon-out-link', 'inline'))
44895               .attr('href', 'https://github.com/osmus/detroit-mapping-challenge')
44896               .append('span')
44897               .text('About these layers');
44898
44899           container = container
44900               .merge(containerEnter);
44901
44902
44903           var ul = container.selectAll('.layer-list-vectortile');
44904
44905           var li = ul.selectAll('.list-item')
44906               .data(vtData);
44907
44908           li.exit()
44909               .remove();
44910
44911           var liEnter = li.enter()
44912               .append('li')
44913               .attr('class', function(d) { return 'list-item list-item-' + d.src; });
44914
44915           var labelEnter = liEnter
44916               .append('label')
44917               .each(function(d) {
44918                   select(this).call(
44919                       tooltip().title(d.tooltip).placement('top')
44920                   );
44921               });
44922
44923           labelEnter
44924               .append('input')
44925               .attr('type', 'radio')
44926               .attr('name', 'vectortile')
44927               .on('change', selectVTLayer);
44928
44929           labelEnter
44930               .append('span')
44931               .text(function(d) { return d.name; });
44932
44933           // Update
44934           li
44935               .merge(liEnter)
44936               .classed('active', isVTLayerSelected)
44937               .selectAll('input')
44938               .property('checked', isVTLayerSelected);
44939
44940
44941           function isVTLayerSelected(d) {
44942               return dataLayer && dataLayer.template() === d.template;
44943           }
44944
44945           function selectVTLayer(d) {
44946               context.storage('settings-custom-data-url', d.template);
44947               if (dataLayer) {
44948                   dataLayer.template(d.template, d.src);
44949                   dataLayer.enabled(true);
44950               }
44951           }
44952       }
44953
44954
44955       function drawCustomDataItems(selection$$1) {
44956           var dataLayer = layers.layer('data');
44957           var hasData = dataLayer && dataLayer.hasData();
44958           var showsData = hasData && dataLayer.enabled();
44959
44960           var ul = selection$$1
44961               .selectAll('.layer-list-data')
44962               .data(dataLayer ? [0] : []);
44963
44964           // Exit
44965           ul.exit()
44966               .remove();
44967
44968           // Enter
44969           var ulEnter = ul.enter()
44970               .append('ul')
44971               .attr('class', 'layer-list layer-list-data');
44972
44973           var liEnter = ulEnter
44974               .append('li')
44975               .attr('class', 'list-item-data');
44976
44977           liEnter
44978               .append('button')
44979               .call(tooltip()
44980                   .title(t('settings.custom_data.tooltip'))
44981                   .placement((textDirection === 'rtl') ? 'right' : 'left')
44982               )
44983               .on('click', editCustom)
44984               .call(svgIcon('#iD-icon-more'));
44985
44986           liEnter
44987               .append('button')
44988               .call(tooltip()
44989                   .title(t('map_data.layers.custom.zoom'))
44990                   .placement((textDirection === 'rtl') ? 'right' : 'left')
44991               )
44992               .on('click', function() {
44993                   event.preventDefault();
44994                   event.stopPropagation();
44995                   dataLayer.fitZoom();
44996               })
44997               .call(svgIcon('#iD-icon-search'));
44998
44999           var labelEnter = liEnter
45000               .append('label')
45001               .call(tooltip()
45002                   .title(t('map_data.layers.custom.tooltip'))
45003                   .placement('top')
45004               );
45005
45006           labelEnter
45007               .append('input')
45008               .attr('type', 'checkbox')
45009               .on('change', function() { toggleLayer('data'); });
45010
45011           labelEnter
45012               .append('span')
45013               .text(t('map_data.layers.custom.title'));
45014
45015           // Update
45016           ul = ul
45017               .merge(ulEnter);
45018
45019           ul.selectAll('.list-item-data')
45020               .classed('active', showsData)
45021               .selectAll('label')
45022               .classed('deemphasize', !hasData)
45023               .selectAll('input')
45024               .property('disabled', !hasData)
45025               .property('checked', showsData);
45026       }
45027
45028
45029       function editCustom() {
45030           event.preventDefault();
45031           context.container()
45032               .call(settingsCustomData);
45033       }
45034
45035
45036       function customChanged(d) {
45037           var dataLayer = layers.layer('data');
45038
45039           if (d && d.url) {
45040               dataLayer.url(d.url);
45041           } else if (d && d.fileList) {
45042               dataLayer.fileList(d.fileList);
45043           }
45044       }
45045
45046
45047       function drawListItems(selection$$1, data, type, name, change, active) {
45048           var items = selection$$1.selectAll('li')
45049               .data(data);
45050
45051           // Exit
45052           items.exit()
45053               .remove();
45054
45055           // Enter
45056           var enter = items.enter()
45057               .append('li')
45058               .attr('class', 'layer')
45059               .call(tooltip()
45060                   .html(true)
45061                   .title(function(d) {
45062                       var tip = t(name + '.' + d + '.tooltip');
45063                       var key = (d === 'wireframe' ? t('area_fill.wireframe.key') : null);
45064                       if ((name === 'feature' || name === 'keepRight') && autoHiddenFeature(d)) {
45065                           var msg = showsLayer('osm') ? t('map_data.autohidden') : t('map_data.osmhidden');
45066                           tip += '<div>' + msg + '</div>';
45067                       }
45068                       return uiTooltipHtml(tip, key);
45069                   })
45070                   .placement('top')
45071               );
45072
45073           var label = enter
45074               .append('label');
45075
45076           label
45077               .append('input')
45078               .attr('type', type)
45079               .attr('name', name)
45080               .on('change', change);
45081
45082           label
45083               .append('span')
45084               .text(function(d) { return t(name + '.' + d + '.description'); });
45085
45086           // Update
45087           items = items
45088               .merge(enter);
45089
45090           items
45091               .classed('active', active)
45092               .selectAll('input')
45093               .property('checked', active)
45094               .property('indeterminate', function(d) {
45095                   return ((name === 'feature' || name === 'keepRight') && autoHiddenFeature(d));
45096               });
45097       }
45098
45099
45100       function renderDataLayers(selection$$1) {
45101           var container = selection$$1.selectAll('.data-layer-container')
45102               .data([0]);
45103
45104           _dataLayerContainer = container.enter()
45105               .append('div')
45106               .attr('class', 'data-layer-container')
45107               .merge(container);
45108
45109           updateDataLayers();
45110       }
45111
45112
45113       function renderFillList(selection$$1) {
45114           var container = selection$$1.selectAll('.layer-fill-list')
45115               .data([0]);
45116
45117           _fillList = container.enter()
45118               .append('ul')
45119               .attr('class', 'layer-list layer-fill-list')
45120               .merge(container);
45121
45122           updateFillList();
45123       }
45124
45125
45126       function renderFeatureList(selection$$1) {
45127           var container = selection$$1.selectAll('.layer-feature-list')
45128               .data([0]);
45129
45130           _featureList = container.enter()
45131               .append('ul')
45132               .attr('class', 'layer-list layer-feature-list')
45133               .merge(container);
45134
45135           updateFeatureList();
45136       }
45137
45138       function updateDataLayers() {
45139           _dataLayerContainer
45140               .call(drawOsmItems)
45141               .call(drawQAItems)
45142               .call(drawPhotoItems)
45143               .call(drawCustomDataItems)
45144               .call(drawVectorItems);      // Beta - Detroit mapping challenge
45145       }
45146
45147       function updateFillList() {
45148           _fillList
45149               .call(drawListItems, fills, 'radio', 'area_fill', setFill, showsFill);
45150       }
45151
45152       function updateFeatureList() {
45153           _featureList
45154               .call(drawListItems, features, 'checkbox', 'feature', clickFeature, showsFeature);
45155       }
45156
45157       function update() {
45158
45159           if (!pane.select('.disclosure-wrap-data_layers').classed('hide')) {
45160               updateDataLayers();
45161           }
45162           if (!pane.select('.disclosure-wrap-fill_area').classed('hide')) {
45163               updateFillList();
45164           }
45165           if (!pane.select('.disclosure-wrap-map_features').classed('hide')) {
45166               updateFeatureList();
45167           }
45168
45169           _QAList
45170               .call(drawListItems, ['keep-right'], 'checkbox', 'QA', function(d) { toggleLayer(d); }, showsQA);
45171       }
45172
45173
45174       function toggleWireframe() {
45175           if (event) {
45176               event.preventDefault();
45177               event.stopPropagation();
45178           }
45179
45180           if (_fillSelected === 'wireframe') {
45181               _fillSelected = context.storage('area-fill-toggle') || 'partial';
45182           } else {
45183               _fillSelected = 'wireframe';
45184           }
45185
45186           setFill(_fillSelected);
45187           context.map().pan([0,0]);  // trigger a redraw
45188       }
45189
45190
45191       function mapData(selection$$1) {
45192
45193           function hidePane() {
45194               setVisible(false);
45195           }
45196
45197           function togglePane() {
45198               if (event) event.preventDefault();
45199               paneTooltip.hide(button);
45200               setVisible(!button.classed('active'));
45201           }
45202
45203           function setVisible(show) {
45204               if (show !== _shown) {
45205                   button.classed('active', show);
45206                   _shown = show;
45207
45208                   if (show) {
45209                       uiBackground.hidePane();
45210                       uiHelp.hidePane();
45211                       update();
45212
45213                       pane
45214                           .style('display', 'block')
45215                           .style('right', '-300px')
45216                           .transition()
45217                           .duration(200)
45218                           .style('right', '0px');
45219
45220                   } else {
45221                       pane
45222                           .style('display', 'block')
45223                           .style('right', '0px')
45224                           .transition()
45225                           .duration(200)
45226                           .style('right', '-300px')
45227                           .on('end', function() {
45228                               select(this).style('display', 'none');
45229                           });
45230                   }
45231               }
45232           }
45233
45234
45235           pane = selection$$1
45236               .append('div')
45237               .attr('class', 'fillL map-pane hide');
45238
45239           var paneTooltip = tooltip()
45240               .placement((textDirection === 'rtl') ? 'right' : 'left')
45241               .html(true)
45242               .title(uiTooltipHtml(t('map_data.description'), key));
45243
45244           var button = selection$$1
45245               .append('button')
45246               .attr('tabindex', -1)
45247               .on('click', togglePane)
45248               .call(svgIcon('#iD-icon-data', 'light'))
45249               .call(paneTooltip);
45250
45251
45252           var heading = pane
45253               .append('div')
45254               .attr('class', 'pane-heading');
45255
45256           heading
45257               .append('h2')
45258               .text(t('map_data.title'));
45259
45260           heading
45261               .append('button')
45262               .on('click', function() { uiMapData.hidePane(); })
45263               .call(svgIcon('#iD-icon-close'));
45264
45265
45266           var content = pane
45267               .append('div')
45268               .attr('class', 'pane-content');
45269
45270
45271           // data layers
45272           content
45273               .append('div')
45274               .attr('class', 'map-data-data-layers')
45275               .call(uiDisclosure(context, 'data_layers', true)
45276                   .title(t('map_data.data_layers'))
45277                   .content(renderDataLayers)
45278               );
45279
45280           // area fills
45281           content
45282               .append('div')
45283               .attr('class', 'map-data-area-fills')
45284               .call(uiDisclosure(context, 'fill_area', false)
45285                   .title(t('map_data.fill_area'))
45286                   .content(renderFillList)
45287               );
45288
45289           // feature filters
45290           content
45291               .append('div')
45292               .attr('class', 'map-data-feature-filters')
45293               .call(uiDisclosure(context, 'map_features', false)
45294                   .title(t('map_data.map_features'))
45295                   .content(renderFeatureList)
45296               );
45297
45298
45299           // add listeners
45300           context.features()
45301               .on('change.map_data-update', update);
45302
45303           update();
45304           setFill(_fillSelected);
45305
45306           context.keybinding()
45307               .on(key, togglePane)
45308               .on(t('area_fill.wireframe.key'), toggleWireframe);
45309
45310           uiMapData.hidePane = hidePane;
45311           uiMapData.togglePane = togglePane;
45312           uiMapData.setVisible = setVisible;
45313       }
45314
45315       return mapData;
45316   }
45317
45318   function uiShortcuts(context) {
45319       var detected = utilDetect();
45320       var _activeTab = 0;
45321       var _modalSelection;
45322       var _selection = select(null);
45323
45324
45325       context.keybinding()
45326           .on([t('shortcuts.toggle.key'), '?'], function () {
45327               if (d3_selectAll('.modal-shortcuts').size()) {  // already showing
45328                   if (_modalSelection) {
45329                       _modalSelection.close();
45330                       _modalSelection = null;
45331                   }
45332               } else {
45333                   _modalSelection = uiModal(_selection);
45334                   shortcutsModal(_modalSelection);
45335               }
45336           });
45337
45338
45339       function shortcutsModal(_modalSelection) {
45340           _modalSelection.select('.modal')
45341               .classed('modal-shortcuts', true);
45342
45343           var shortcutsModal = _modalSelection.select('.content');
45344
45345           shortcutsModal
45346               .append('div')
45347               .attr('class', 'modal-section')
45348               .append('h3')
45349               .text(t('shortcuts.title'));
45350
45351           shortcutsModal
45352               .call(render);
45353       }
45354
45355
45356       function render(selection$$1) {
45357           var wrapper = selection$$1
45358               .selectAll('.wrapper')
45359               .data([0]);
45360
45361           var wrapperEnter = wrapper
45362               .enter()
45363               .append('div')
45364               .attr('class', 'wrapper modal-section');
45365
45366           var tabsBar = wrapperEnter
45367               .append('div')
45368               .attr('class', 'tabs-bar');
45369
45370           var shortcutsList = wrapperEnter
45371               .append('div')
45372               .attr('class', 'shortcuts-list');
45373
45374           wrapper = wrapper.merge(wrapperEnter);
45375
45376           var tabs = tabsBar
45377               .selectAll('.tab')
45378               .data(dataShortcuts);
45379
45380           var tabsEnter = tabs
45381               .enter()
45382               .append('div')
45383               .attr('class', 'tab')
45384               .on('click', function (d, i) {
45385                   _activeTab = i;
45386                   render(selection$$1);
45387               });
45388
45389           tabsEnter
45390               .append('span')
45391               .text(function (d) { return t(d.text); });
45392
45393           tabs = tabs
45394               .merge(tabsEnter);
45395
45396           // Update
45397           wrapper.selectAll('.tab')
45398               .classed('active', function (d, i) {
45399                   return i === _activeTab;
45400               });
45401
45402
45403           var shortcuts = shortcutsList
45404               .selectAll('.shortcut-tab')
45405               .data(dataShortcuts);
45406
45407           var shortcutsEnter = shortcuts
45408               .enter()
45409               .append('div')
45410               .attr('class', function(d) { return 'shortcut-tab shortcut-tab-' + d.tab; });
45411
45412           var columnsEnter = shortcutsEnter
45413               .selectAll('.shortcut-column')
45414               .data(function (d) { return d.columns; })
45415               .enter()
45416               .append('table')
45417               .attr('class', 'shortcut-column');
45418
45419           var rowsEnter = columnsEnter
45420               .selectAll('.shortcut-row')
45421               .data(function (d) { return d.rows; })
45422               .enter()
45423               .append('tr')
45424               .attr('class', 'shortcut-row');
45425
45426
45427           var sectionRows = rowsEnter
45428               .filter(function (d) { return !d.shortcuts; });
45429
45430           sectionRows
45431               .append('td');
45432
45433           sectionRows
45434               .append('td')
45435               .attr('class', 'shortcut-section')
45436               .append('h3')
45437               .text(function (d) { return t(d.text); });
45438
45439
45440           var shortcutRows = rowsEnter
45441               .filter(function (d) { return d.shortcuts; });
45442
45443           var shortcutKeys = shortcutRows
45444               .append('td')
45445               .attr('class', 'shortcut-keys');
45446
45447           var modifierKeys = shortcutKeys
45448               .filter(function (d) { return d.modifiers; });
45449
45450           modifierKeys
45451               .selectAll('kbd.modifier')
45452               .data(function (d) {
45453                   if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
45454                       return ['⌘'];
45455                   } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
45456                       return [];
45457                   } else {
45458                       return d.modifiers;
45459                   }
45460               })
45461               .enter()
45462               .each(function () {
45463                   var selection$$1 = select(this);
45464
45465                   selection$$1
45466                       .append('kbd')
45467                       .attr('class', 'modifier')
45468                       .text(function (d) { return uiCmd.display(d); });
45469
45470                   selection$$1
45471                       .append('span')
45472                       .text('+');
45473               });
45474
45475
45476           shortcutKeys
45477               .selectAll('kbd.shortcut')
45478               .data(function (d) {
45479                   var arr = d.shortcuts;
45480                   if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
45481                       arr = ['Y'];
45482                   } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
45483                       arr = ['F11'];
45484                   }
45485
45486                   // replace translations
45487                   arr = arr.map(function(s) {
45488                       return uiCmd.display(s.indexOf('.') !== -1 ? t(s) : s);
45489                   });
45490
45491                   return uniq(arr).map(function(s) {
45492                       return {
45493                           shortcut: s,
45494                           separator: d.separator
45495                       };
45496                   });
45497               })
45498               .enter()
45499               .each(function (d, i, nodes) {
45500                   var selection$$1 = select(this);
45501                   var click = d.shortcut.toLowerCase().match(/(.*).click/);
45502
45503                   if (click && click[1]) {   // replace "left_click", "right_click" with mouse icon
45504                       selection$$1
45505                           .call(svgIcon('#iD-walkthrough-mouse', 'mouseclick', click[1]));
45506                   } else {
45507                       selection$$1
45508                           .append('kbd')
45509                           .attr('class', 'shortcut')
45510                           .text(function (d) { return d.shortcut; });
45511                   }
45512
45513                   if (i < nodes.length - 1) {
45514                       selection$$1
45515                           .append('span')
45516                           .text(d.separator || '\u00a0' + t('shortcuts.or') + '\u00a0');
45517                   }
45518               });
45519
45520
45521           shortcutKeys
45522               .filter(function(d) { return d.gesture; })
45523               .each(function () {
45524                   var selection$$1 = select(this);
45525
45526                   selection$$1
45527                       .append('span')
45528                       .text('+');
45529
45530                   selection$$1
45531                       .append('span')
45532                       .attr('class', 'gesture')
45533                       .text(function (d) { return t(d.gesture); });
45534               });
45535
45536
45537           shortcutRows
45538               .append('td')
45539               .attr('class', 'shortcut-desc')
45540               .text(function (d) { return d.text ? t(d.text) : '\u00a0'; });
45541
45542
45543           shortcuts = shortcuts
45544               .merge(shortcutsEnter);
45545
45546           // Update
45547           wrapper.selectAll('.shortcut-tab')
45548               .style('display', function (d, i) {
45549                   return i === _activeTab ? 'flex' : 'none';
45550               });
45551       }
45552
45553
45554       return function(selection$$1, show) {
45555           _selection = selection$$1;
45556           if (show) {
45557               _modalSelection = uiModal(selection$$1);
45558               shortcutsModal(_modalSelection);
45559           }
45560       };
45561   }
45562
45563   function uiHelp(context) {
45564       var key = t('help.key');
45565
45566       var docKeys = [
45567           ['help', [
45568               'welcome',
45569               'open_data_h',
45570               'open_data',
45571               'before_start_h',
45572               'before_start',
45573               'open_source_h',
45574               'open_source',
45575               'open_source_help'
45576           ]],
45577           ['overview', [
45578               'navigation_h',
45579               'navigation_drag',
45580               'navigation_zoom',
45581               'features_h',
45582               'features',
45583               'nodes_ways'
45584           ]],
45585           ['editing', [
45586               'select_h',
45587               'select_left_click',
45588               'select_right_click',
45589               'multiselect_h',
45590               'multiselect_shift_click',
45591               'multiselect_lasso',
45592               'undo_redo_h',
45593               'undo_redo',
45594               'save_h',
45595               'save',
45596               'save_validation',
45597               'upload_h',
45598               'upload',
45599               'backups_h',
45600               'backups',
45601               'keyboard_h',
45602               'keyboard'
45603           ]],
45604           ['feature_editor', [
45605               'intro',
45606               'definitions',
45607               'type_h',
45608               'type',
45609               'type_picker',
45610               'fields_h',
45611               'fields_all_fields',
45612               'fields_example',
45613               'fields_add_field',
45614               'tags_h',
45615               'tags_all_tags',
45616               'tags_resources'
45617           ]],
45618           ['points', [
45619               'intro',
45620               'add_point_h',
45621               'add_point',
45622               'add_point_finish',
45623               'move_point_h',
45624               'move_point',
45625               'delete_point_h',
45626               'delete_point',
45627               'delete_point_command'
45628           ]],
45629           ['lines', [
45630               'intro',
45631               'add_line_h',
45632               'add_line',
45633               'add_line_draw',
45634               'add_line_finish',
45635               'modify_line_h',
45636               'modify_line_dragnode',
45637               'modify_line_addnode',
45638               'connect_line_h',
45639               'connect_line',
45640               'connect_line_display',
45641               'connect_line_drag',
45642               'connect_line_tag',
45643               'disconnect_line_h',
45644               'disconnect_line_command',
45645               'move_line_h',
45646               'move_line_command',
45647               'move_line_connected',
45648               'delete_line_h',
45649               'delete_line',
45650               'delete_line_command'
45651           ]],
45652           ['areas', [
45653               'intro',
45654               'point_or_area_h',
45655               'point_or_area',
45656               'add_area_h',
45657               'add_area_command',
45658               'add_area_draw',
45659               'add_area_finish',
45660               'square_area_h',
45661               'square_area_command',
45662               'modify_area_h',
45663               'modify_area_dragnode',
45664               'modify_area_addnode',
45665               'delete_area_h',
45666               'delete_area',
45667               'delete_area_command'
45668           ]],
45669           ['relations', [
45670               'intro',
45671               'edit_relation_h',
45672               'edit_relation',
45673               'edit_relation_add',
45674               'edit_relation_delete',
45675               'maintain_relation_h',
45676               'maintain_relation',
45677               'relation_types_h',
45678               'multipolygon_h',
45679               'multipolygon',
45680               'multipolygon_create',
45681               'multipolygon_merge',
45682               'turn_restriction_h',
45683               'turn_restriction',
45684               'turn_restriction_field',
45685               'turn_restriction_editing',
45686               'route_h',
45687               'route',
45688               'route_add',
45689               'boundary_h',
45690               'boundary',
45691               'boundary_add'
45692           ]],
45693           ['notes', [
45694               'intro',
45695               'add_note_h',
45696               'add_note',
45697               'move_note',
45698               'update_note_h',
45699               'update_note',
45700               'save_note_h',
45701               'save_note'
45702           ]],
45703
45704           ['imagery', [
45705               'intro',
45706               'sources_h',
45707               'choosing',
45708               'sources',
45709               'offsets_h',
45710               'offset',
45711               'offset_change'
45712           ]],
45713           ['streetlevel', [
45714               'intro',
45715               'using_h',
45716               'using',
45717               'photos',
45718               'viewer'
45719           ]],
45720           ['gps', [
45721               'intro',
45722               'survey',
45723               'using_h',
45724               'using',
45725               'tracing',
45726               'upload'
45727           ]],
45728           ['qa', [
45729               'intro',
45730               'tools_h',
45731               'tools',
45732               'issues_h',
45733               'issues'
45734           ]]
45735       ];
45736
45737       var headings = {
45738           'help.help.open_data_h': 3,
45739           'help.help.before_start_h': 3,
45740           'help.help.open_source_h': 3,
45741           'help.overview.navigation_h': 3,
45742           'help.overview.features_h': 3,
45743           'help.editing.select_h': 3,
45744           'help.editing.multiselect_h': 3,
45745           'help.editing.undo_redo_h': 3,
45746           'help.editing.save_h': 3,
45747           'help.editing.upload_h': 3,
45748           'help.editing.backups_h': 3,
45749           'help.editing.keyboard_h': 3,
45750           'help.feature_editor.type_h': 3,
45751           'help.feature_editor.fields_h': 3,
45752           'help.feature_editor.tags_h': 3,
45753           'help.points.add_point_h': 3,
45754           'help.points.move_point_h': 3,
45755           'help.points.delete_point_h': 3,
45756           'help.lines.add_line_h': 3,
45757           'help.lines.modify_line_h': 3,
45758           'help.lines.connect_line_h': 3,
45759           'help.lines.disconnect_line_h': 3,
45760           'help.lines.move_line_h': 3,
45761           'help.lines.delete_line_h': 3,
45762           'help.areas.point_or_area_h': 3,
45763           'help.areas.add_area_h': 3,
45764           'help.areas.square_area_h': 3,
45765           'help.areas.modify_area_h': 3,
45766           'help.areas.delete_area_h': 3,
45767           'help.relations.edit_relation_h': 3,
45768           'help.relations.maintain_relation_h': 3,
45769           'help.relations.relation_types_h': 2,
45770           'help.relations.multipolygon_h': 3,
45771           'help.relations.turn_restriction_h': 3,
45772           'help.relations.route_h': 3,
45773           'help.relations.boundary_h': 3,
45774           'help.notes.add_note_h': 3,
45775           'help.notes.update_note_h': 3,
45776           'help.notes.save_note_h': 3,
45777           'help.imagery.sources_h': 3,
45778           'help.imagery.offsets_h': 3,
45779           'help.streetlevel.using_h': 3,
45780           'help.gps.using_h': 3,
45781           'help.qa.tools_h': 3,
45782           'help.qa.issues_h': 3
45783       };
45784
45785       var replacements = {
45786           point: icon('#iD-icon-point', 'pre-text'),
45787           line: icon('#iD-icon-line', 'pre-text'),
45788           area: icon('#iD-icon-area', 'pre-text'),
45789           note: icon('#iD-icon-note', 'pre-text add-note'),
45790           plus: icon('#iD-icon-plus', 'pre-text'),
45791           minus: icon('#iD-icon-minus', 'pre-text'),
45792           orthogonalize: icon('#iD-operation-orthogonalize', 'pre-text'),
45793           disconnect: icon('#iD-operation-disconnect', 'pre-text'),
45794           layers: icon('#iD-icon-layers', 'pre-text'),
45795           data: icon('#iD-icon-data', 'pre-text'),
45796           inspect: icon('#iD-icon-inspect', 'pre-text'),
45797           move: icon('#iD-operation-move', 'pre-text'),
45798           merge: icon('#iD-operation-merge', 'pre-text'),
45799           delete: icon('#iD-operation-delete', 'pre-text'),
45800           close: icon('#iD-icon-close', 'pre-text'),
45801           undo: icon(textDirection === 'rtl' ? '#iD-icon-redo' : '#iD-icon-undo', 'pre-text'),
45802           redo: icon(textDirection === 'rtl' ? '#iD-icon-undo' : '#iD-icon-redo', 'pre-text'),
45803           save: icon('#iD-icon-save', 'pre-text'),
45804           leftclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'left'),
45805           rightclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'right'),
45806           shift: uiCmd.display('⇧'),
45807           alt: uiCmd.display('⌥'),
45808           return: uiCmd.display('↵'),
45809           version: context.version
45810       };
45811
45812       // For each section, squash all the texts into a single markdown document
45813       var docs = docKeys.map(function(key) {
45814           var helpkey = 'help.' + key[0];
45815           var text = key[1].reduce(function(all, part) {
45816               var subkey = helpkey + '.' + part;
45817               var depth = headings[subkey];                              // is this subkey a heading?
45818               var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
45819               return all + hhh + t(subkey, replacements) + '\n\n';
45820           }, '');
45821
45822           return {
45823               title: t(helpkey + '.title'),
45824               html: marked(text.trim())
45825           };
45826       });
45827
45828
45829       function help(selection$$1) {
45830
45831           function hidePane() {
45832               setVisible(false);
45833           }
45834
45835
45836           function togglePane() {
45837               if (event) event.preventDefault();
45838               tooltipBehavior.hide(button);
45839               setVisible(!button.classed('active'));
45840           }
45841
45842
45843           function setVisible(show) {
45844               if (show !== shown) {
45845                   button.classed('active', show);
45846                   shown = show;
45847
45848                   if (show) {
45849                       uiBackground.hidePane();
45850                       uiMapData.hidePane();
45851
45852                       pane.style('display', 'block')
45853                           .style('right', '-500px')
45854                           .transition()
45855                           .duration(200)
45856                           .style('right', '0px');
45857
45858                   } else {
45859                       pane.style('right', '0px')
45860                           .transition()
45861                           .duration(200)
45862                           .style('right', '-500px')
45863                           .on('end', function() {
45864                               select(this).style('display', 'none');
45865                           });
45866                   }
45867               }
45868           }
45869
45870
45871           function clickHelp(d, i) {
45872               var rtl = (textDirection === 'rtl');
45873               content.property('scrollTop', 0);
45874               doctitle.html(d.title);
45875
45876               body.html(d.html);
45877               body.selectAll('a')
45878                   .attr('target', '_blank');
45879               menuItems.classed('selected', function(m) {
45880                   return m.title === d.title;
45881               });
45882
45883               nav.html('');
45884               if (rtl) {
45885                   nav.call(drawNext).call(drawPrevious);
45886               } else {
45887                   nav.call(drawPrevious).call(drawNext);
45888               }
45889
45890
45891               function drawNext(selection$$1) {
45892                   if (i < docs.length - 1) {
45893                       var nextLink = selection$$1
45894                           .append('a')
45895                           .attr('class', 'next')
45896                           .on('click', function() {
45897                               clickHelp(docs[i + 1], i + 1);
45898                           });
45899
45900                       nextLink
45901                           .append('span')
45902                           .text(docs[i + 1].title)
45903                           .call(svgIcon((rtl ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
45904                   }
45905               }
45906
45907
45908               function drawPrevious(selection$$1) {
45909                   if (i > 0) {
45910                       var prevLink = selection$$1
45911                           .append('a')
45912                           .attr('class', 'previous')
45913                           .on('click', function() {
45914                               clickHelp(docs[i - 1], i - 1);
45915                           });
45916
45917                       prevLink
45918                           .call(svgIcon((rtl ? '#iD-icon-forward' : '#iD-icon-backward'), 'inline'))
45919                           .append('span')
45920                           .text(docs[i - 1].title);
45921                   }
45922               }
45923           }
45924
45925
45926           function clickWalkthrough() {
45927               if (context.inIntro()) return;
45928               context.container().call(uiIntro(context));
45929               setVisible(false);
45930           }
45931
45932
45933           function clickShortcuts() {
45934               context.container().call(uiShortcuts(context), true);
45935           }
45936
45937
45938           var pane = selection$$1.append('div')
45939               .attr('class', 'help-wrap map-pane fillL hide');
45940
45941           var tooltipBehavior = tooltip()
45942               .placement((textDirection === 'rtl') ? 'right' : 'left')
45943               .html(true)
45944               .title(uiTooltipHtml(t('help.title'), key));
45945
45946           var button = selection$$1.append('button')
45947               .attr('tabindex', -1)
45948               .on('click', togglePane)
45949               .call(svgIcon('#iD-icon-help', 'light'))
45950               .call(tooltipBehavior);
45951
45952           var shown = false;
45953
45954
45955           var heading = pane
45956               .append('div')
45957               .attr('class', 'pane-heading');
45958
45959           var doctitle = heading
45960               .append('h2')
45961               .text(t('help.title'));
45962
45963           heading
45964               .append('button')
45965               .on('click', function() { uiHelp.hidePane(); })
45966               .call(svgIcon('#iD-icon-close'));
45967
45968
45969           var content = pane
45970               .append('div')
45971               .attr('class', 'pane-content');
45972
45973           var toc = content
45974               .append('ul')
45975               .attr('class', 'toc');
45976
45977           var menuItems = toc.selectAll('li')
45978               .data(docs)
45979               .enter()
45980               .append('li')
45981               .append('a')
45982               .html(function(d) { return d.title; })
45983               .on('click', clickHelp);
45984
45985           var shortcuts = toc
45986               .append('li')
45987               .attr('class', 'shortcuts')
45988               .call(tooltip()
45989                   .html(true)
45990                   .title(uiTooltipHtml(t('shortcuts.tooltip'), '?'))
45991                   .placement('top')
45992               )
45993               .append('a')
45994               .on('click', clickShortcuts);
45995
45996           shortcuts
45997               .append('div')
45998               .text(t('shortcuts.title'));
45999
46000           var walkthrough = toc
46001               .append('li')
46002               .attr('class', 'walkthrough')
46003               .append('a')
46004               .on('click', clickWalkthrough);
46005
46006           walkthrough
46007               .append('svg')
46008               .attr('class', 'logo logo-walkthrough')
46009               .append('use')
46010               .attr('xlink:href', '#iD-logo-walkthrough');
46011
46012           walkthrough
46013               .append('div')
46014               .text(t('splash.walkthrough'));
46015
46016
46017           var helpContent = content
46018               .append('div')
46019               .attr('class', 'left-content');
46020
46021           var body = helpContent
46022               .append('div')
46023               .attr('class', 'body');
46024
46025           var nav = helpContent
46026               .append('div')
46027               .attr('class', 'nav');
46028
46029           clickHelp(docs[0], 0);
46030
46031           context.keybinding()
46032               .on(key, togglePane);
46033
46034           uiHelp.hidePane = hidePane;
46035           uiHelp.togglePane = togglePane;
46036           uiHelp.setVisible = setVisible;
46037       }
46038
46039       return help;
46040   }
46041
46042   function localeDateString(s) {
46043       if (!s) return null;
46044       var detected = utilDetect();
46045       var options = { day: 'numeric', month: 'short', year: 'numeric' };
46046       var d = new Date(s);
46047       if (isNaN(d.getTime())) return null;
46048       return d.toLocaleDateString(detected.locale, options);
46049   }
46050
46051   function vintageRange(vintage) {
46052       var s;
46053       if (vintage.start || vintage.end) {
46054           s = (vintage.start || '?');
46055           if (vintage.start !== vintage.end) {
46056               s += ' - ' + (vintage.end || '?');
46057           }
46058       }
46059       return s;
46060   }
46061
46062
46063   function rendererBackgroundSource(data) {
46064       var source = clone(data);
46065       var offset = [0, 0];
46066       var name = source.name;
46067       var description = source.description;
46068       var best = !!source.best;
46069       var template = source.template;
46070
46071       source.tileSize = data.tileSize || 256;
46072       source.zoomExtent = data.zoomExtent || [0, 22];
46073       source.overzoom = data.overzoom !== false;
46074
46075       source.offset = function(_) {
46076           if (!arguments.length) return offset;
46077           offset = _;
46078           return source;
46079       };
46080
46081
46082       source.nudge = function(_, zoomlevel) {
46083           offset[0] += _[0] / Math.pow(2, zoomlevel);
46084           offset[1] += _[1] / Math.pow(2, zoomlevel);
46085           return source;
46086       };
46087
46088
46089       source.name = function() {
46090           var id_safe = source.id.replace(/\./g, '<TX_DOT>');
46091           return t('imagery.' + id_safe + '.name', { default: name });
46092       };
46093
46094
46095       source.description = function() {
46096           var id_safe = source.id.replace(/\./g, '<TX_DOT>');
46097           return t('imagery.' + id_safe + '.description', { default: description });
46098       };
46099
46100
46101       source.best = function() {
46102           return best;
46103       };
46104
46105
46106       source.area = function() {
46107           if (!data.polygon) return Number.MAX_VALUE;  // worldwide
46108           var area = d3_geoArea({ type: 'MultiPolygon', coordinates: [ data.polygon ] });
46109           return isNaN(area) ? 0 : area;
46110       };
46111
46112
46113       source.imageryUsed = function() {
46114           return name || source.id;
46115       };
46116
46117
46118       source.template = function(_) {
46119           if (!arguments.length) return template;
46120           if (source.id === 'custom') template = _;
46121           return source;
46122       };
46123
46124
46125       source.url = function(coord) {
46126           if (this.type === 'wms') {
46127               var tileToProjectedCoords = (function(x, y, z) {
46128                   //polyfill for IE11, PhantomJS
46129                   var sinh = Math.sinh || function(x) {
46130                       var y = Math.exp(x);
46131                       return (y - 1 / y) / 2;
46132                   };
46133
46134                   var zoomSize = Math.pow(2, z);
46135                   var lon = x / zoomSize * Math.PI * 2 - Math.PI;
46136                   var lat = Math.atan(sinh(Math.PI * (1 - 2 * y / zoomSize)));
46137
46138                   switch (this.projection) {
46139                       case 'EPSG:4326':
46140                           return {
46141                               x: lon * 180 / Math.PI,
46142                               y: lat * 180 / Math.PI
46143                           };
46144                       default: // EPSG:3857 and synonyms
46145                           var mercCoords = mercatorRaw(lon, lat);
46146                           return {
46147                               x: 20037508.34 / Math.PI * mercCoords[0],
46148                               y: 20037508.34 / Math.PI * mercCoords[1]
46149                           };
46150                   }
46151               }).bind(this);
46152
46153               var tileSize = this.tileSize;
46154               var projection$$1 = this.projection;
46155               var minXmaxY = tileToProjectedCoords(coord[0], coord[1], coord[2]);
46156               var maxXminY = tileToProjectedCoords(coord[0]+1, coord[1]+1, coord[2]);
46157               return template.replace(/\{(\w+)\}/g, function (token, key) {
46158                 switch (key) {
46159                   case 'width':
46160                   case 'height':
46161                     return tileSize;
46162                   case 'proj':
46163                     return projection$$1;
46164                   case 'wkid':
46165                     return projection$$1.replace(/^EPSG:/, '');
46166                   case 'bbox':
46167                     return minXmaxY.x + ',' + maxXminY.y + ',' + maxXminY.x + ',' + minXmaxY.y;
46168                   case 'w':
46169                     return minXmaxY.x;
46170                   case 's':
46171                     return maxXminY.y;
46172                   case 'n':
46173                     return maxXminY.x;
46174                   case 'e':
46175                     return minXmaxY.y;
46176                   default:
46177                     return token;
46178                 }
46179               });
46180           }
46181           return template
46182               .replace('{x}', coord[0])
46183               .replace('{y}', coord[1])
46184               // TMS-flipped y coordinate
46185               .replace(/\{[t-]y\}/, Math.pow(2, coord[2]) - coord[1] - 1)
46186               .replace(/\{z(oom)?\}/, coord[2])
46187               .replace(/\{switch:([^}]+)\}/, function(s, r) {
46188                   var subdomains = r.split(',');
46189                   return subdomains[(coord[0] + coord[1]) % subdomains.length];
46190               })
46191               .replace('{u}', function() {
46192                   var u = '';
46193                   for (var zoom = coord[2]; zoom > 0; zoom--) {
46194                       var b = 0;
46195                       var mask = 1 << (zoom - 1);
46196                       if ((coord[0] & mask) !== 0) b++;
46197                       if ((coord[1] & mask) !== 0) b += 2;
46198                       u += b.toString();
46199                   }
46200                   return u;
46201               });
46202       };
46203
46204
46205       source.validZoom = function(z) {
46206           return source.zoomExtent[0] <= z &&
46207               (source.overzoom || source.zoomExtent[1] > z);
46208       };
46209
46210
46211       source.isLocatorOverlay = function() {
46212           return source.id === 'mapbox_locator_overlay';
46213       };
46214
46215
46216       /* hides a source from the list, but leaves it available for use */
46217       source.isHidden = function() {
46218           return source.id === 'DigitalGlobe-Premium-vintage' ||
46219               source.id === 'DigitalGlobe-Standard-vintage';
46220       };
46221
46222
46223       source.copyrightNotices = function() {};
46224
46225
46226       source.getMetadata = function(center, tileCoord, callback) {
46227           var vintage = {
46228               start: localeDateString(source.startDate),
46229               end: localeDateString(source.endDate)
46230           };
46231           vintage.range = vintageRange(vintage);
46232
46233           var metadata = { vintage: vintage };
46234           callback(null, metadata);
46235       };
46236
46237
46238       return source;
46239   }
46240
46241
46242   rendererBackgroundSource.Bing = function(data, dispatch) {
46243       // http://msdn.microsoft.com/en-us/library/ff701716.aspx
46244       // http://msdn.microsoft.com/en-us/library/ff701701.aspx
46245
46246       data.template = 'https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z';
46247
46248       var bing = rendererBackgroundSource(data);
46249       var key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU'; // Same as P2 and JOSM
46250       var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' +
46251               key;
46252       var cache = {};
46253       var inflight = {};
46254       var providers = [];
46255
46256       d3_json(url, function(err, json$$1) {
46257           providers = json$$1.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
46258               return {
46259                   attribution: provider.attribution,
46260                   areas: provider.coverageAreas.map(function(area) {
46261                       return {
46262                           zoom: [area.zoomMin, area.zoomMax],
46263                           extent: geoExtent$$1([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
46264                       };
46265                   })
46266               };
46267           });
46268           dispatch.call('change');
46269       });
46270
46271
46272       bing.copyrightNotices = function(zoom, extent) {
46273           zoom = Math.min(zoom, 21);
46274           return providers.filter(function(provider) {
46275               return some(provider.areas, function(area) {
46276                   return extent.intersects(area.extent) &&
46277                       area.zoom[0] <= zoom &&
46278                       area.zoom[1] >= zoom;
46279               });
46280           }).map(function(provider) {
46281               return provider.attribution;
46282           }).join(', ');
46283       };
46284
46285
46286       bing.getMetadata = function(center, tileCoord, callback) {
46287           var tileId = tileCoord.slice(0, 3).join('/');
46288           var zoom = Math.min(tileCoord[2], 21);
46289           var centerPoint = center[1] + ',' + center[0];  // lat,lng
46290           var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/' + centerPoint +
46291                   '?zl=' + zoom + '&key=' + key;
46292
46293           if (inflight[tileId]) return;
46294
46295           if (!cache[tileId]) {
46296               cache[tileId] = {};
46297           }
46298           if (cache[tileId] && cache[tileId].metadata) {
46299               return callback(null, cache[tileId].metadata);
46300           }
46301
46302           inflight[tileId] = true;
46303           d3_json(url, function(error, result) {
46304               delete inflight[tileId];
46305
46306               var err;
46307               if (error) {
46308                   err = error;
46309               } else if (!result && 'Unknown Error') {
46310                   err = result.errorDetails;
46311               }
46312               if (err) {
46313                   return callback(err);
46314               } else {
46315                   var vintage = {
46316                       start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
46317                       end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
46318                   };
46319                   vintage.range = vintageRange(vintage);
46320
46321                   var metadata = { vintage: vintage };
46322                   cache[tileId].metadata = metadata;
46323                   return callback(null, metadata);
46324               }
46325           });
46326       };
46327
46328
46329       bing.terms_url = 'https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details';
46330
46331
46332       return bing;
46333   };
46334
46335
46336
46337   rendererBackgroundSource.Esri = function(data) {
46338       // in addition to using the tilemap at zoom level 20, overzoom real tiles - #4327 (deprecated technique, but it works)
46339       if (data.template.match(/blankTile/) === null) {
46340           data.template = data.template + '?blankTile=false';
46341       }
46342
46343       var esri = rendererBackgroundSource(data);
46344       var cache = {};
46345       var inflight = {};
46346       var _prevCenter;
46347
46348       // use a tilemap service to set maximum zoom for esri tiles dynamically
46349       // https://developers.arcgis.com/documentation/tiled-elevation-service/
46350       esri.fetchTilemap = function(center) {
46351           // skip if we have already fetched a tilemap within 5km
46352           if (_prevCenter && geoSphericalDistance(center, _prevCenter) < 5000) return;
46353           _prevCenter = center;
46354
46355           // tiles are available globally to zoom level 19, afterward they may or may not be present
46356           var z = 20;
46357
46358           // first generate a random url using the template
46359           var dummyUrl = esri.url([1,2,3]);
46360
46361           // calculate url z/y/x from the lat/long of the center of the map
46362           var x = (Math.floor((center[0] + 180) / 360 * Math.pow(2, z)));
46363           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)));
46364
46365           // fetch an 8x8 grid to leverage cache
46366           var tilemapUrl = dummyUrl.replace(/tile\/[0-9]+\/[0-9]+\/[0-9]+\?blankTile=false/, 'tilemap') + '/' + z + '/' + y + '/' + x + '/8/8';
46367
46368           // make the request and introspect the response from the tilemap server
46369           d3_json(tilemapUrl, function (err, tilemap) {
46370               if (err || !tilemap) return;
46371
46372               var hasTiles = true;
46373               for (var i = 0; i < tilemap.data.length; i++) {
46374                   // 0 means an individual tile in the grid doesn't exist
46375                   if (!tilemap.data[i]) {
46376                       hasTiles = false;
46377                       break;
46378                   }
46379               }
46380
46381               // if any tiles are missing at level 20 we restrict maxZoom to 19
46382               esri.zoomExtent[1] = (hasTiles ? 22 : 19);
46383           });
46384       };
46385
46386       esri.getMetadata = function(center, tileCoord, callback) {
46387           var tileId = tileCoord.slice(0, 3).join('/');
46388           var zoom = Math.min(tileCoord[2], esri.zoomExtent[1]);
46389           var centerPoint = center[0] + ',' + center[1];  // long, lat (as it should be)
46390           var unknown = t('info_panels.background.unknown');
46391           var metadataLayer;
46392           var vintage = {};
46393           var metadata = {};
46394
46395           if (inflight[tileId]) return;
46396
46397           switch (true) {
46398               case (zoom >= 20 && esri.id === 'EsriWorldImageryClarity'):
46399                   metadataLayer = 4;
46400                   break;
46401               case zoom >= 19:
46402                   metadataLayer = 3;
46403                   break;
46404               case zoom >= 17:
46405                   metadataLayer = 2;
46406                   break;
46407               case zoom >= 13:
46408                   metadataLayer = 0;
46409                   break;
46410               default:
46411                   metadataLayer = 99;
46412           }
46413
46414           var url;
46415           // build up query using the layer appropriate to the current zoom
46416           if (esri.id === 'EsriWorldImagery') {
46417               url = 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/';
46418           } else if (esri.id === 'EsriWorldImageryClarity') {
46419               url = 'https://serviceslab.arcgisonline.com/arcgis/rest/services/Clarity_World_Imagery/MapServer/';
46420           }
46421
46422           url += metadataLayer + '/query?returnGeometry=false&geometry=' + centerPoint + '&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json';
46423
46424           if (!cache[tileId]) {
46425               cache[tileId] = {};
46426           }
46427           if (cache[tileId] && cache[tileId].metadata) {
46428               return callback(null, cache[tileId].metadata);
46429           }
46430
46431           // accurate metadata is only available >= 13
46432           if (metadataLayer === 99) {
46433               vintage = {
46434                   start: null,
46435                   end: null,
46436                   range: null
46437               };
46438               metadata = {
46439                   vintage: null,
46440                   source: unknown,
46441                   description: unknown,
46442                   resolution: unknown,
46443                   accuracy: unknown
46444               };
46445
46446               callback(null, metadata);
46447
46448           } else {
46449               inflight[tileId] = true;
46450               d3_json(url, function(error, result) {
46451                   delete inflight[tileId];
46452
46453                   var err;
46454                   if (error) {
46455                       err = error;
46456                   } else if (!result) {
46457                       err = 'Unknown Error';
46458                   } else if (result.features && result.features.length < 1) {
46459                       err = 'No Results';
46460                   } else if (result.error && result.error.message) {
46461                       err = result.error.message;
46462                   }
46463
46464                   if (err) {
46465                       return callback(err);
46466                   } else {
46467                       // pass through the discrete capture date from metadata
46468                       var captureDate = localeDateString(result.features[0].attributes.SRC_DATE2);
46469                       vintage = {
46470                           start: captureDate,
46471                           end: captureDate,
46472                           range: captureDate
46473                       };
46474                       metadata = {
46475                           vintage: vintage,
46476                           source: clean(result.features[0].attributes.NICE_NAME),
46477                           description: clean(result.features[0].attributes.NICE_DESC),
46478                           resolution: clean(result.features[0].attributes.SRC_RES),
46479                           accuracy: clean(result.features[0].attributes.SRC_ACC)
46480                       };
46481
46482                       // append units - meters
46483                       if (isFinite(metadata.resolution)) {
46484                           metadata.resolution += ' m';
46485                       }
46486                       if (isFinite(metadata.accuracy)) {
46487                           metadata.accuracy += ' m';
46488                       }
46489
46490                       cache[tileId].metadata = metadata;
46491                       return callback(null, metadata);
46492                   }
46493               });
46494           }
46495
46496
46497           function clean(val) {
46498               return String(val).trim() || unknown;
46499           }
46500       };
46501
46502       return esri;
46503   };
46504
46505
46506   rendererBackgroundSource.None = function() {
46507       var source = rendererBackgroundSource({ id: 'none', template: '' });
46508
46509
46510       source.name = function() {
46511           return t('background.none');
46512       };
46513
46514
46515       source.imageryUsed = function() {
46516           return null;
46517       };
46518
46519
46520       source.area = function() {
46521           return -1;  // sources in background pane are sorted by area
46522       };
46523
46524
46525       return source;
46526   };
46527
46528
46529   rendererBackgroundSource.Custom = function(template) {
46530       var source = rendererBackgroundSource({ id: 'custom', template: template });
46531
46532
46533       source.name = function() {
46534           return t('background.custom');
46535       };
46536
46537
46538       source.imageryUsed = function() {
46539           return 'Custom (' + source.template() + ')';
46540       };
46541
46542
46543       source.area = function() {
46544           return -2;  // sources in background pane are sorted by area
46545       };
46546
46547
46548       return source;
46549   };
46550
46551   function rendererTileLayer(context) {
46552       var transformProp = utilPrefixCSSProperty('Transform');
46553       var tiler = utilTiler();
46554
46555       var _tileSize = 256;
46556       var _projection;
46557       var _cache = {};
46558       var _tileOrigin;
46559       var _zoom;
46560       var _source;
46561
46562
46563       function tileSizeAtZoom(d, z) {
46564           var EPSILON = 0.002;    // close seams
46565           return ((_tileSize * Math.pow(2, z - d[2])) / _tileSize) + EPSILON;
46566       }
46567
46568
46569       function atZoom(t$$1, distance) {
46570           var power = Math.pow(2, distance);
46571           return [
46572               Math.floor(t$$1[0] * power),
46573               Math.floor(t$$1[1] * power),
46574               t$$1[2] + distance
46575           ];
46576       }
46577
46578
46579       function lookUp(d) {
46580           for (var up = -1; up > -d[2]; up--) {
46581               var tile = atZoom(d, up);
46582               if (_cache[_source.url(tile)] !== false) {
46583                   return tile;
46584               }
46585           }
46586       }
46587
46588
46589       function uniqueBy(a, n) {
46590           var o = [];
46591           var seen = {};
46592           for (var i = 0; i < a.length; i++) {
46593               if (seen[a[i][n]] === undefined) {
46594                   o.push(a[i]);
46595                   seen[a[i][n]] = true;
46596               }
46597           }
46598           return o;
46599       }
46600
46601
46602       function addSource(d) {
46603           d.push(_source.url(d));
46604           return d;
46605       }
46606
46607
46608       // Update tiles based on current state of `projection`.
46609       function background(selection$$1) {
46610           _zoom = geoScaleToZoom(_projection.scale(), _tileSize);
46611
46612           var pixelOffset;
46613           if (_source) {
46614               pixelOffset = [
46615                   _source.offset()[0] * Math.pow(2, _zoom),
46616                   _source.offset()[1] * Math.pow(2, _zoom)
46617               ];
46618           } else {
46619               pixelOffset = [0, 0];
46620           }
46621
46622           var translate = [
46623               _projection.translate()[0] + pixelOffset[0],
46624               _projection.translate()[1] + pixelOffset[1]
46625           ];
46626
46627           tiler
46628               .scale(_projection.scale() * 2 * Math.PI)
46629               .translate(translate);
46630
46631           _tileOrigin = [
46632               _projection.scale() * Math.PI - translate[0],
46633               _projection.scale() * Math.PI - translate[1]
46634           ];
46635
46636           render(selection$$1);
46637       }
46638
46639
46640       // Derive the tiles onscreen, remove those offscreen and position them.
46641       // Important that this part not depend on `_projection` because it's
46642       // rentered when tiles load/error (see #644).
46643       function render(selection$$1) {
46644           if (!_source) return;
46645           var requests = [];
46646           var showDebug = context.getDebug('tile') && !_source.overlay;
46647
46648           if (_source.validZoom(_zoom)) {
46649               tiler.skipNullIsland(!!_source.overlay);
46650
46651               tiler().forEach(function(d) {
46652                   addSource(d);
46653                   if (d[3] === '') return;
46654                   if (typeof d[3] !== 'string') return; // Workaround for #2295
46655                   requests.push(d);
46656                   if (_cache[d[3]] === false && lookUp(d)) {
46657                       requests.push(addSource(lookUp(d)));
46658                   }
46659               });
46660
46661               requests = uniqueBy(requests, 3).filter(function(r) {
46662                   // don't re-request tiles which have failed in the past
46663                   return _cache[r[3]] !== false;
46664               });
46665           }
46666
46667           function load(d) {
46668               _cache[d[3]] = true;
46669               select(this)
46670                   .on('error', null)
46671                   .on('load', null)
46672                   .classed('tile-loaded', true);
46673               render(selection$$1);
46674           }
46675
46676           function error(d) {
46677               _cache[d[3]] = false;
46678               select(this)
46679                   .on('error', null)
46680                   .on('load', null)
46681                   .remove();
46682               render(selection$$1);
46683           }
46684
46685           function imageTransform(d) {
46686               var ts = _tileSize * Math.pow(2, _zoom - d[2]);
46687               var scale = tileSizeAtZoom(d, _zoom);
46688               return 'translate(' +
46689                   ((d[0] * ts) - _tileOrigin[0]) + 'px,' +
46690                   ((d[1] * ts) - _tileOrigin[1]) + 'px) ' +
46691                   'scale(' + scale + ',' + scale + ')';
46692           }
46693
46694           function tileCenter(d) {
46695               var ts = _tileSize * Math.pow(2, _zoom - d[2]);
46696               return [
46697                   ((d[0] * ts) - _tileOrigin[0] + (ts / 2)),
46698                   ((d[1] * ts) - _tileOrigin[1] + (ts / 2))
46699               ];
46700           }
46701
46702           function debugTransform(d) {
46703               var coord = tileCenter(d);
46704               return 'translate(' + coord[0] + 'px,' + coord[1] + 'px)';
46705           }
46706
46707
46708           // Pick a representative tile near the center of the viewport
46709           // (This is useful for sampling the imagery vintage)
46710           var dims = tiler.size();
46711           var mapCenter = [dims[0] / 2, dims[1] / 2];
46712           var minDist = Math.max(dims[0], dims[1]);
46713           var nearCenter;
46714
46715           requests.forEach(function(d) {
46716               var c = tileCenter(d);
46717               var dist = geoVecLength(c, mapCenter);
46718               if (dist < minDist) {
46719                   minDist = dist;
46720                   nearCenter = d;
46721               }
46722           });
46723
46724
46725           var image = selection$$1.selectAll('img')
46726               .data(requests, function(d) { return d[3]; });
46727
46728           image.exit()
46729               .style(transformProp, imageTransform)
46730               .classed('tile-removing', true)
46731               .classed('tile-center', false)
46732               .each(function() {
46733                   var tile = select(this);
46734                   window.setTimeout(function() {
46735                       if (tile.classed('tile-removing')) {
46736                           tile.remove();
46737                       }
46738                   }, 300);
46739               });
46740
46741           image.enter()
46742             .append('img')
46743               .attr('class', 'tile')
46744               .attr('src', function(d) { return d[3]; })
46745               .on('error', error)
46746               .on('load', load)
46747             .merge(image)
46748               .style(transformProp, imageTransform)
46749               .classed('tile-debug', showDebug)
46750               .classed('tile-removing', false)
46751               .classed('tile-center', function(d) { return d === nearCenter; });
46752
46753
46754
46755           var debug = selection$$1.selectAll('.tile-label-debug')
46756               .data(showDebug ? requests : [], function(d) { return d[3]; });
46757
46758           debug.exit()
46759               .remove();
46760
46761           if (showDebug) {
46762               var debugEnter = debug.enter()
46763                   .append('div')
46764                   .attr('class', 'tile-label-debug');
46765
46766               debugEnter
46767                   .append('div')
46768                   .attr('class', 'tile-label-debug-coord');
46769
46770               debugEnter
46771                   .append('div')
46772                   .attr('class', 'tile-label-debug-vintage');
46773
46774               debug = debug.merge(debugEnter);
46775
46776               debug
46777                   .style(transformProp, debugTransform);
46778
46779               debug
46780                   .selectAll('.tile-label-debug-coord')
46781                   .text(function(d) { return d[2] + ' / ' + d[0] + ' / ' + d[1]; });
46782
46783               debug
46784                   .selectAll('.tile-label-debug-vintage')
46785                   .each(function(d) {
46786                       var span = select(this);
46787                       var center = context.projection.invert(tileCenter(d));
46788                       _source.getMetadata(center, d, function(err, result) {
46789                           span.text((result && result.vintage && result.vintage.range) ||
46790                               t('info_panels.background.vintage') + ': ' + t('info_panels.background.unknown')
46791                           );
46792                       });
46793                   });
46794           }
46795
46796       }
46797
46798
46799       background.projection = function(_) {
46800           if (!arguments.length) return _projection;
46801           _projection = _;
46802           return background;
46803       };
46804
46805
46806       background.dimensions = function(_) {
46807           if (!arguments.length) return tiler.size();
46808           tiler.size(_);
46809           return background;
46810       };
46811
46812
46813       background.source = function(_) {
46814           if (!arguments.length) return _source;
46815           _source = _;
46816           _tileSize = _source.tileSize;
46817           _cache = {};
46818           tiler.tileSize(_source.tileSize).zoomExtent(_source.zoomExtent);
46819           return background;
46820       };
46821
46822
46823       return background;
46824   }
46825
46826   function rendererBackground(context) {
46827       var dispatch$$1 = dispatch('change');
46828       var detected = utilDetect();
46829       var baseLayer = rendererTileLayer(context).projection(context.projection);
46830       var _isValid = true;
46831       var _overlayLayers = [];
46832       var _backgroundSources = [];
46833       var _brightness = 1;
46834       var _contrast = 1;
46835       var _saturation = 1;
46836       var _sharpness = 1;
46837
46838
46839       function background(selection$$1) {
46840           // If we are displaying an Esri basemap at high zoom,
46841           // check its tilemap to see how high the zoom can go
46842           if (context.map().zoom() > 18) {
46843               var basemap = baseLayer.source();
46844               if (basemap && /^EsriWorldImagery/.test(basemap.id)) {
46845                   var center = context.map().center();
46846                   basemap.fetchTilemap(center);
46847               }
46848           }
46849
46850           // Is the imagery valid here? - #4827
46851           var sources = background.sources(context.map().extent());
46852           var wasValid = _isValid;
46853           _isValid = !!sources
46854               .filter(function(d) { return d === baseLayer.source(); }).length;
46855
46856           if (wasValid !== _isValid) {      // change in valid status
46857               background.updateImagery();
46858           }
46859
46860
46861           var baseFilter = '';
46862           if (detected.cssfilters) {
46863               if (_brightness !== 1) {
46864                   baseFilter += 'brightness(' + _brightness + ')';
46865               }
46866               if (_contrast !== 1) {
46867                   baseFilter += 'contrast(' + _contrast + ')';
46868               }
46869               if (_saturation !== 1) {
46870                   baseFilter += 'saturate(' + _saturation + ')';
46871               }
46872               if (_sharpness < 1) {  // gaussian blur
46873                   var blur = interpolateNumber(0.5, 5)(1 - _sharpness);
46874                   baseFilter += 'blur(' + blur + 'px)';
46875               }
46876           }
46877
46878           var base = selection$$1.selectAll('.layer-background')
46879               .data([0]);
46880
46881           base = base.enter()
46882               .insert('div', '.layer-data')
46883               .attr('class', 'layer layer-background')
46884               .merge(base);
46885
46886           if (detected.cssfilters) {
46887               base.style('filter', baseFilter || null);
46888           } else {
46889               base.style('opacity', _brightness);
46890           }
46891
46892
46893           var imagery = base.selectAll('.layer-imagery')
46894               .data([0]);
46895
46896           imagery.enter()
46897               .append('div')
46898               .attr('class', 'layer layer-imagery')
46899               .merge(imagery)
46900               .call(baseLayer);
46901
46902
46903           var maskFilter = '';
46904           var mixBlendMode = '';
46905           if (detected.cssfilters && _sharpness > 1) {  // apply unsharp mask
46906               mixBlendMode = 'overlay';
46907               maskFilter = 'saturate(0) blur(3px) invert(1)';
46908
46909               var contrast = _sharpness - 1;
46910               maskFilter += ' contrast(' + contrast + ')';
46911
46912               var brightness = interpolateNumber(1, 0.85)(_sharpness - 1);
46913               maskFilter += ' brightness(' + brightness + ')';
46914           }
46915
46916           var mask = base.selectAll('.layer-unsharp-mask')
46917               .data(detected.cssfilters && _sharpness > 1 ? [0] : []);
46918
46919           mask.exit()
46920               .remove();
46921
46922           mask.enter()
46923               .append('div')
46924               .attr('class', 'layer layer-mask layer-unsharp-mask')
46925               .merge(mask)
46926               .call(baseLayer)
46927               .style('filter', maskFilter || null)
46928               .style('mix-blend-mode', mixBlendMode || null);
46929
46930
46931           var overlays = selection$$1.selectAll('.layer-overlay')
46932               .data(_overlayLayers, function(d) { return d.source().name(); });
46933
46934           overlays.exit()
46935               .remove();
46936
46937           overlays.enter()
46938               .insert('div', '.layer-data')
46939               .attr('class', 'layer layer-overlay')
46940               .merge(overlays)
46941               .each(function(layer) { select(this).call(layer); });
46942       }
46943
46944
46945       background.updateImagery = function() {
46946           var b = baseLayer.source();
46947           if (context.inIntro() || !b) return;
46948
46949           var o = _overlayLayers
46950               .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
46951               .map(function (d) { return d.source().id; })
46952               .join(',');
46953
46954           var meters = geoOffsetToMeters(b.offset());
46955           var epsilon = 0.01;
46956           var x = +meters[0].toFixed(2);
46957           var y = +meters[1].toFixed(2);
46958           var q = utilStringQs(window.location.hash.substring(1));
46959
46960           var id = b.id;
46961           if (id === 'custom') {
46962               id = 'custom:' + b.template();
46963           }
46964
46965           if (id) {
46966               q.background = id;
46967           } else {
46968               delete q.background;
46969           }
46970
46971           if (o) {
46972               q.overlays = o;
46973           } else {
46974               delete q.overlays;
46975           }
46976
46977           if (Math.abs(x) > epsilon || Math.abs(y) > epsilon) {
46978               q.offset = x + ',' + y;
46979           } else {
46980               delete q.offset;
46981           }
46982
46983           if (!window.mocha) {
46984               window.location.replace('#' + utilQsString(q, true));
46985           }
46986
46987           var imageryUsed = [];
46988
46989           var current = b.imageryUsed();
46990           if (current && _isValid) {
46991               imageryUsed.push(current);
46992           }
46993
46994           _overlayLayers
46995               .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
46996               .forEach(function (d) { imageryUsed.push(d.source().imageryUsed()); });
46997
46998           var data$$1 = context.layers().layer('data');
46999           if (data$$1 && data$$1.enabled() && data$$1.hasData()) {
47000               imageryUsed.push(data$$1.getSrc());
47001           }
47002
47003           var streetside = context.layers().layer('streetside');
47004           if (streetside && streetside.enabled()) {
47005               imageryUsed.push('Bing Streetside');
47006           }
47007
47008           var mapillary_images = context.layers().layer('mapillary-images');
47009           if (mapillary_images && mapillary_images.enabled()) {
47010               imageryUsed.push('Mapillary Images');
47011           }
47012
47013           var mapillary_signs = context.layers().layer('mapillary-signs');
47014           if (mapillary_signs && mapillary_signs.enabled()) {
47015               imageryUsed.push('Mapillary Signs');
47016           }
47017
47018           var openstreetcam_images = context.layers().layer('openstreetcam-images');
47019           if (openstreetcam_images && openstreetcam_images.enabled()) {
47020               imageryUsed.push('OpenStreetCam Images');
47021           }
47022
47023           context.history().imageryUsed(imageryUsed);
47024       };
47025
47026
47027       background.sources = function(extent) {
47028           if (!data.imagery || !data.imagery.query) return [];   // called before init()?
47029
47030           var matchIDs = {};
47031           var matchImagery = data.imagery.query.bbox(extent.rectangle(), true) || [];
47032           matchImagery.forEach(function(d) { matchIDs[d.id] = true; });
47033
47034           return _backgroundSources.filter(function(source) {
47035               return matchIDs[source.id] || !source.polygon;   // no polygon = worldwide
47036           });
47037       };
47038
47039
47040       background.dimensions = function(d) {
47041           if (!d) return;
47042           baseLayer.dimensions(d);
47043
47044           _overlayLayers.forEach(function(layer) {
47045               layer.dimensions(d);
47046           });
47047       };
47048
47049
47050       background.baseLayerSource = function(d) {
47051           if (!arguments.length) return baseLayer.source();
47052
47053           // test source against OSM imagery blacklists..
47054           var osm = context.connection();
47055           if (!osm) return background;
47056
47057           var blacklists = context.connection().imageryBlacklists();
47058           var template = d.template();
47059           var fail = false;
47060           var tested = 0;
47061           var regex;
47062
47063           for (var i = 0; i < blacklists.length; i++) {
47064               try {
47065                   regex = new RegExp(blacklists[i]);
47066                   fail = regex.test(template);
47067                   tested++;
47068                   if (fail) break;
47069               } catch (e) {
47070                   /* noop */
47071               }
47072           }
47073
47074           // ensure at least one test was run.
47075           if (!tested) {
47076               regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
47077               fail = regex.test(template);
47078           }
47079
47080           baseLayer.source(!fail ? d : background.findSource('none'));
47081           dispatch$$1.call('change');
47082           background.updateImagery();
47083           return background;
47084       };
47085
47086
47087       background.findSource = function(id) {
47088           return find$1(_backgroundSources, function(d) {
47089               return d.id && d.id === id;
47090           });
47091       };
47092
47093
47094       background.bing = function() {
47095           background.baseLayerSource(background.findSource('Bing'));
47096       };
47097
47098
47099       background.showsLayer = function(d) {
47100           return d.id === baseLayer.source().id ||
47101               _overlayLayers.some(function(layer) { return d.id === layer.source().id; });
47102       };
47103
47104
47105       background.overlayLayerSources = function() {
47106           return _overlayLayers.map(function (l) { return l.source(); });
47107       };
47108
47109
47110       background.toggleOverlayLayer = function(d) {
47111           var layer;
47112           for (var i = 0; i < _overlayLayers.length; i++) {
47113               layer = _overlayLayers[i];
47114               if (layer.source() === d) {
47115                   _overlayLayers.splice(i, 1);
47116                   dispatch$$1.call('change');
47117                   background.updateImagery();
47118                   return;
47119               }
47120           }
47121
47122           layer = rendererTileLayer(context)
47123               .source(d)
47124               .projection(context.projection)
47125               .dimensions(baseLayer.dimensions()
47126           );
47127
47128           _overlayLayers.push(layer);
47129           dispatch$$1.call('change');
47130           background.updateImagery();
47131       };
47132
47133
47134       background.nudge = function(d, zoom) {
47135           baseLayer.source().nudge(d, zoom);
47136           dispatch$$1.call('change');
47137           background.updateImagery();
47138           return background;
47139       };
47140
47141
47142       background.offset = function(d) {
47143           if (!arguments.length) return baseLayer.source().offset();
47144           baseLayer.source().offset(d);
47145           dispatch$$1.call('change');
47146           background.updateImagery();
47147           return background;
47148       };
47149
47150
47151       background.brightness = function(d) {
47152           if (!arguments.length) return _brightness;
47153           _brightness = d;
47154           if (context.mode()) dispatch$$1.call('change');
47155           return background;
47156       };
47157
47158
47159       background.contrast = function(d) {
47160           if (!arguments.length) return _contrast;
47161           _contrast = d;
47162           if (context.mode()) dispatch$$1.call('change');
47163           return background;
47164       };
47165
47166
47167       background.saturation = function(d) {
47168           if (!arguments.length) return _saturation;
47169           _saturation = d;
47170           if (context.mode()) dispatch$$1.call('change');
47171           return background;
47172       };
47173
47174
47175       background.sharpness = function(d) {
47176           if (!arguments.length) return _sharpness;
47177           _sharpness = d;
47178           if (context.mode()) dispatch$$1.call('change');
47179           return background;
47180       };
47181
47182
47183       background.init = function() {
47184           function parseMap(qmap) {
47185               if (!qmap) return false;
47186               var args = qmap.split('/').map(Number);
47187               if (args.length < 3 || args.some(isNaN)) return false;
47188               return geoExtent$$1([args[2], args[1]]);
47189           }
47190
47191           var q = utilStringQs(window.location.hash.substring(1));
47192           var requested = q.background || q.layer;
47193           var extent = parseMap(q.map);
47194           var first;
47195           var best;
47196
47197
47198           data.imagery = data.imagery || [];
47199           data.imagery.features = {};
47200
47201           // build efficient index and querying for data.imagery
47202           var features = data.imagery.map(function(source) {
47203               if (!source.polygon) return null;
47204
47205               // Add an extra array nest to each element in `source.polygon`
47206               // so the rings are not treated as a bunch of holes:
47207               // what we have: [ [[outer],[hole],[hole]] ]
47208               // what we want: [ [[outer]],[[outer]],[[outer]] ]
47209               var rings = source.polygon.map(function(ring) { return [ring]; });
47210
47211               var feature = {
47212                   type: 'Feature',
47213                   properties: { id: source.id },
47214                   geometry: { type: 'MultiPolygon', coordinates: rings }
47215               };
47216
47217               data.imagery.features[source.id] = feature;
47218               return feature;
47219
47220           }).filter(Boolean);
47221
47222           data.imagery.query = whichPolygon_1({
47223               type: 'FeatureCollection',
47224               features: features
47225           });
47226
47227
47228           // Add all the available imagery sources
47229           _backgroundSources = data.imagery.map(function(source) {
47230               if (source.type === 'bing') {
47231                   return rendererBackgroundSource.Bing(source, dispatch$$1);
47232               } else if (/^EsriWorldImagery/.test(source.id)) {
47233                   return rendererBackgroundSource.Esri(source);
47234               } else {
47235                   return rendererBackgroundSource(source);
47236               }
47237           });
47238
47239           first = _backgroundSources.length && _backgroundSources[0];
47240
47241           // Add 'None'
47242           _backgroundSources.unshift(rendererBackgroundSource.None());
47243
47244           // Add 'Custom'
47245           var template = context.storage('background-custom-template') || '';
47246           var custom = rendererBackgroundSource.Custom(template);
47247           _backgroundSources.unshift(custom);
47248
47249
47250           // Decide which background layer to display
47251           if (!requested && extent) {
47252               best = find$1(this.sources(extent), function(s) { return s.best(); });
47253           }
47254           if (requested && requested.indexOf('custom:') === 0) {
47255               template = requested.replace(/^custom:/, '');
47256               background.baseLayerSource(custom.template(template));
47257               context.storage('background-custom-template', template);
47258           } else {
47259               background.baseLayerSource(
47260                   background.findSource(requested) ||
47261                   best ||
47262                   background.findSource(context.storage('background-last-used')) ||
47263                   background.findSource('Bing') ||
47264                   first ||
47265                   background.findSource('none')
47266               );
47267           }
47268
47269           var locator = find$1(_backgroundSources, function(d) {
47270               return d.overlay && d.default;
47271           });
47272
47273           if (locator) {
47274               background.toggleOverlayLayer(locator);
47275           }
47276
47277           var overlays = (q.overlays || '').split(',');
47278           overlays.forEach(function(overlay) {
47279               overlay = background.findSource(overlay);
47280               if (overlay) {
47281                   background.toggleOverlayLayer(overlay);
47282               }
47283           });
47284
47285           if (q.gpx) {
47286               var gpx = context.layers().layer('data');
47287               if (gpx) {
47288                   gpx.url(q.gpx, '.gpx');
47289               }
47290           }
47291
47292           if (q.offset) {
47293               var offset = q.offset.replace(/;/g, ',').split(',').map(function(n) {
47294                   return !isNaN(n) && n;
47295               });
47296
47297               if (offset.length === 2) {
47298                   background.offset(geoMetersToOffset(offset));
47299               }
47300           }
47301       };
47302
47303
47304       return utilRebind(background, dispatch$$1, 'on');
47305   }
47306
47307   function rendererFeatures(context) {
47308       var traffic_roads = {
47309           'motorway': true,
47310           'motorway_link': true,
47311           'trunk': true,
47312           'trunk_link': true,
47313           'primary': true,
47314           'primary_link': true,
47315           'secondary': true,
47316           'secondary_link': true,
47317           'tertiary': true,
47318           'tertiary_link': true,
47319           'residential': true,
47320           'unclassified': true,
47321           'living_street': true
47322       };
47323
47324       var service_roads = {
47325           'service': true,
47326           'road': true,
47327           'track': true
47328       };
47329
47330       var paths = {
47331           'path': true,
47332           'footway': true,
47333           'cycleway': true,
47334           'bridleway': true,
47335           'steps': true,
47336           'pedestrian': true,
47337           'corridor': true
47338       };
47339
47340       var past_futures = {
47341           'proposed': true,
47342           'construction': true,
47343           'abandoned': true,
47344           'dismantled': true,
47345           'disused': true,
47346           'razed': true,
47347           'demolished': true,
47348           'obliterated': true
47349       };
47350
47351       var dispatch$$1 = dispatch('change', 'redraw'),
47352           _cullFactor = 1,
47353           _cache = {},
47354           _features = {},
47355           _stats = {},
47356           _keys = [],
47357           _hidden = [];
47358
47359
47360       function update() {
47361           if (!window.mocha) {
47362               var q = utilStringQs(window.location.hash.substring(1));
47363               var disabled = features.disabled();
47364               if (disabled.length) {
47365                   q.disable_features = disabled.join(',');
47366               } else {
47367                   delete q.disable_features;
47368               }
47369               window.location.replace('#' + utilQsString(q, true));
47370               context.storage('disabled-features', disabled.join(','));
47371           }
47372           _hidden = features.hidden();
47373           dispatch$$1.call('change');
47374           dispatch$$1.call('redraw');
47375       }
47376
47377
47378       function defineFeature(k, filter, max) {
47379           var isEnabled = true;
47380
47381           _keys.push(k);
47382           _features[k] = {
47383               filter: filter,
47384               enabled: isEnabled,   // whether the user wants it enabled..
47385               count: 0,
47386               currentMax: (max || Infinity),
47387               defaultMax: (max || Infinity),
47388               enable: function() { this.enabled = true; this.currentMax = this.defaultMax; },
47389               disable: function() { this.enabled = false; this.currentMax = 0; },
47390               hidden: function() { return !context.editable() || this.count > this.currentMax * _cullFactor; },
47391               autoHidden: function() { return this.hidden() && this.currentMax > 0; }
47392           };
47393       }
47394
47395
47396       defineFeature('points', function isPoint(entity, resolver, geometry) {
47397           return geometry === 'point';
47398       }, 200);
47399
47400       defineFeature('traffic_roads', function isTrafficRoad(entity) {
47401           return traffic_roads[entity.tags.highway];
47402       });
47403
47404       defineFeature('service_roads', function isServiceRoad(entity) {
47405           return service_roads[entity.tags.highway];
47406       });
47407
47408       defineFeature('paths', function isPath(entity) {
47409           return paths[entity.tags.highway];
47410       });
47411
47412       defineFeature('buildings', function isBuilding(entity) {
47413           return (
47414               !!entity.tags['building:part'] ||
47415               (!!entity.tags.building && entity.tags.building !== 'no') ||
47416               entity.tags.parking === 'multi-storey' ||
47417               entity.tags.parking === 'sheds' ||
47418               entity.tags.parking === 'carports' ||
47419               entity.tags.parking === 'garage_boxes'
47420           );
47421       }, 250);
47422
47423       defineFeature('landuse', function isLanduse(entity, resolver, geometry) {
47424           return geometry === 'area' &&
47425               !_features.buildings.filter(entity) &&
47426               !_features.water.filter(entity);
47427       });
47428
47429       defineFeature('boundaries', function isBoundary(entity) {
47430           return (
47431               !!entity.tags.boundary
47432           ) && !(
47433               traffic_roads[entity.tags.highway] ||
47434               service_roads[entity.tags.highway] ||
47435               paths[entity.tags.highway]
47436           );
47437       });
47438
47439       defineFeature('water', function isWater(entity) {
47440           return (
47441               !!entity.tags.waterway ||
47442               entity.tags.natural === 'water' ||
47443               entity.tags.natural === 'coastline' ||
47444               entity.tags.natural === 'bay' ||
47445               entity.tags.landuse === 'pond' ||
47446               entity.tags.landuse === 'basin' ||
47447               entity.tags.landuse === 'reservoir' ||
47448               entity.tags.landuse === 'salt_pond'
47449           );
47450       });
47451
47452       defineFeature('rail', function isRail(entity) {
47453           return (
47454               !!entity.tags.railway ||
47455               entity.tags.landuse === 'railway'
47456           ) && !(
47457               traffic_roads[entity.tags.highway] ||
47458               service_roads[entity.tags.highway] ||
47459               paths[entity.tags.highway]
47460           );
47461       });
47462
47463       defineFeature('power', function isPower(entity) {
47464           return !!entity.tags.power;
47465       });
47466
47467       // contains a past/future tag, but not in active use as a road/path/cycleway/etc..
47468       defineFeature('past_future', function isPastFuture(entity) {
47469           if (
47470               traffic_roads[entity.tags.highway] ||
47471               service_roads[entity.tags.highway] ||
47472               paths[entity.tags.highway]
47473           ) { return false; }
47474
47475           var strings = Object.keys(entity.tags);
47476
47477           for (var i = 0; i < strings.length; i++) {
47478               var s = strings[i];
47479               if (past_futures[s] || past_futures[entity.tags[s]]) { return true; }
47480           }
47481           return false;
47482       });
47483
47484       // Lines or areas that don't match another feature filter.
47485       // IMPORTANT: The 'others' feature must be the last one defined,
47486       //   so that code in getMatches can skip this test if `hasMatch = true`
47487       defineFeature('others', function isOther(entity, resolver, geometry) {
47488           return (geometry === 'line' || geometry === 'area');
47489       });
47490
47491
47492       function features() {}
47493
47494
47495       features.features = function() {
47496           return _features;
47497       };
47498
47499
47500       features.keys = function() {
47501           return _keys;
47502       };
47503
47504
47505       features.enabled = function(k) {
47506           if (!arguments.length) {
47507               return _keys.filter(function(k) { return _features[k].enabled; });
47508           }
47509           return _features[k] && _features[k].enabled;
47510       };
47511
47512
47513       features.disabled = function(k) {
47514           if (!arguments.length) {
47515               return _keys.filter(function(k) { return !_features[k].enabled; });
47516           }
47517           return _features[k] && !_features[k].enabled;
47518       };
47519
47520
47521       features.hidden = function(k) {
47522           if (!arguments.length) {
47523               return _keys.filter(function(k) { return _features[k].hidden(); });
47524           }
47525           return _features[k] && _features[k].hidden();
47526       };
47527
47528
47529       features.autoHidden = function(k) {
47530           if (!arguments.length) {
47531               return _keys.filter(function(k) { return _features[k].autoHidden(); });
47532           }
47533           return _features[k] && _features[k].autoHidden();
47534       };
47535
47536
47537       features.enable = function(k) {
47538           if (_features[k] && !_features[k].enabled) {
47539               _features[k].enable();
47540               update();
47541           }
47542       };
47543
47544
47545       features.disable = function(k) {
47546           if (_features[k] && _features[k].enabled) {
47547               _features[k].disable();
47548               update();
47549           }
47550       };
47551
47552
47553       features.toggle = function(k) {
47554           if (_features[k]) {
47555               (function(f) { return f.enabled ? f.disable() : f.enable(); }(_features[k]));
47556               update();
47557           }
47558       };
47559
47560
47561       features.resetStats = function() {
47562           for (var i = 0; i < _keys.length; i++) {
47563               _features[_keys[i]].count = 0;
47564           }
47565           dispatch$$1.call('change');
47566       };
47567
47568
47569       features.gatherStats = function(d, resolver, dimensions) {
47570           var needsRedraw = false,
47571               type = groupBy(d, function(ent) { return ent.type; }),
47572               entities = [].concat(type.relation || [], type.way || [], type.node || []),
47573               currHidden, geometry, matches, i, j;
47574
47575           for (i = 0; i < _keys.length; i++) {
47576               _features[_keys[i]].count = 0;
47577           }
47578
47579           // adjust the threshold for point/building culling based on viewport size..
47580           // a _cullFactor of 1 corresponds to a 1000x1000px viewport..
47581           _cullFactor = dimensions[0] * dimensions[1] / 1000000;
47582
47583           for (i = 0; i < entities.length; i++) {
47584               geometry = entities[i].geometry(resolver);
47585               if (!(geometry === 'vertex' || geometry === 'relation')) {
47586                   matches = Object.keys(features.getMatches(entities[i], resolver, geometry));
47587                   for (j = 0; j < matches.length; j++) {
47588                       _features[matches[j]].count++;
47589                   }
47590               }
47591           }
47592
47593           currHidden = features.hidden();
47594           if (currHidden !== _hidden) {
47595               _hidden = currHidden;
47596               needsRedraw = true;
47597               dispatch$$1.call('change');
47598           }
47599
47600           return needsRedraw;
47601       };
47602
47603
47604       features.stats = function() {
47605           for (var i = 0; i < _keys.length; i++) {
47606               _stats[_keys[i]] = _features[_keys[i]].count;
47607           }
47608
47609           return _stats;
47610       };
47611
47612
47613       features.clear = function(d) {
47614           for (var i = 0; i < d.length; i++) {
47615               features.clearEntity(d[i]);
47616           }
47617       };
47618
47619
47620       features.clearEntity = function(entity) {
47621           delete _cache[osmEntity$$1.key(entity)];
47622       };
47623
47624
47625       features.reset = function() {
47626           _cache = {};
47627       };
47628
47629
47630       features.getMatches = function(entity, resolver, geometry) {
47631           if (geometry === 'vertex' || geometry === 'relation') return {};
47632
47633           var ent = osmEntity$$1.key(entity);
47634           if (!_cache[ent]) {
47635               _cache[ent] = {};
47636           }
47637
47638           if (!_cache[ent].matches) {
47639               var matches = {},
47640                   hasMatch = false;
47641
47642               for (var i = 0; i < _keys.length; i++) {
47643                   if (_keys[i] === 'others') {
47644                       if (hasMatch) continue;
47645
47646                       // Multipolygon members:
47647                       // If an entity...
47648                       //   1. is a way that hasn't matched other 'interesting' feature rules,
47649                       //   2. and it belongs to a single parent multipolygon relation
47650                       // ...then match whatever feature rules the parent multipolygon has matched.
47651                       // see #2548, #2887
47652                       //
47653                       // IMPORTANT:
47654                       // For this to work, getMatches must be called on relations before ways.
47655                       //
47656                       if (entity.type === 'way') {
47657                           var parents = features.getParents(entity, resolver, geometry);
47658                           if (parents.length === 1 && parents[0].isMultipolygon()) {
47659                               var pkey = osmEntity$$1.key(parents[0]);
47660                               if (_cache[pkey] && _cache[pkey].matches) {
47661                                   matches = clone(_cache[pkey].matches);
47662                                   continue;
47663                               }
47664                           }
47665                       }
47666                   }
47667
47668                   if (_features[_keys[i]].filter(entity, resolver, geometry)) {
47669                       matches[_keys[i]] = hasMatch = true;
47670                   }
47671               }
47672               _cache[ent].matches = matches;
47673           }
47674
47675           return _cache[ent].matches;
47676       };
47677
47678
47679       features.getParents = function(entity, resolver, geometry) {
47680           if (geometry === 'point') return [];
47681
47682           var ent = osmEntity$$1.key(entity);
47683           if (!_cache[ent]) {
47684               _cache[ent] = {};
47685           }
47686
47687           if (!_cache[ent].parents) {
47688               var parents = [];
47689               if (geometry === 'vertex') {
47690                   parents = resolver.parentWays(entity);
47691               } else {   // 'line', 'area', 'relation'
47692                   parents = resolver.parentRelations(entity);
47693               }
47694               _cache[ent].parents = parents;
47695           }
47696           return _cache[ent].parents;
47697       };
47698
47699
47700       features.isHiddenFeature = function(entity, resolver, geometry) {
47701           if (!_hidden.length) return false;
47702           if (!entity.version) return false;
47703
47704           var matches = features.getMatches(entity, resolver, geometry);
47705
47706           for (var i = 0; i < _hidden.length; i++) {
47707               if (matches[_hidden[i]]) return true;
47708           }
47709           return false;
47710       };
47711
47712
47713       features.isHiddenChild = function(entity, resolver, geometry) {
47714           if (!_hidden.length) return false;
47715           if (!entity.version || geometry === 'point') return false;
47716
47717           var parents = features.getParents(entity, resolver, geometry);
47718           if (!parents.length) return false;
47719
47720           for (var i = 0; i < parents.length; i++) {
47721               if (!features.isHidden(parents[i], resolver, parents[i].geometry(resolver))) {
47722                   return false;
47723               }
47724           }
47725           return true;
47726       };
47727
47728
47729       features.hasHiddenConnections = function(entity, resolver) {
47730           if (!_hidden.length) return false;
47731           var childNodes, connections;
47732
47733           if (entity.type === 'midpoint') {
47734               childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
47735               connections = [];
47736           } else {
47737               childNodes = entity.nodes ? resolver.childNodes(entity) : [];
47738               connections = features.getParents(entity, resolver, entity.geometry(resolver));
47739           }
47740
47741           // gather ways connected to child nodes..
47742           connections = reduce(childNodes, function(result, e) {
47743               return resolver.isShared(e) ? union(result, resolver.parentWays(e)) : result;
47744           }, connections);
47745
47746           return connections.length ? some(connections, function(e) {
47747               return features.isHidden(e, resolver, e.geometry(resolver));
47748           }) : false;
47749       };
47750
47751
47752       features.isHidden = function(entity, resolver, geometry) {
47753           if (!_hidden.length) return false;
47754           if (!entity.version) return false;
47755
47756           var fn = (geometry === 'vertex' ? features.isHiddenChild : features.isHiddenFeature);
47757           return fn(entity, resolver, geometry);
47758       };
47759
47760
47761       features.filter = function(d, resolver) {
47762           if (!_hidden.length) return d;
47763
47764           var result = [];
47765           for (var i = 0; i < d.length; i++) {
47766               var entity = d[i];
47767               if (!features.isHidden(entity, resolver, entity.geometry(resolver))) {
47768                   result.push(entity);
47769               }
47770           }
47771           return result;
47772       };
47773
47774
47775       features.init = function() {
47776           var storage = context.storage('disabled-features');
47777           if (storage) {
47778               var storageDisabled = storage.replace(/;/g, ',').split(',');
47779               storageDisabled.forEach(features.disable);
47780           }
47781
47782           var q = utilStringQs(window.location.hash.substring(1));
47783           if (q.disable_features) {
47784               var hashDisabled = q.disable_features.replace(/;/g, ',').split(',');
47785               hashDisabled.forEach(features.disable);
47786           }
47787       };
47788
47789       return utilRebind(features, dispatch$$1, 'on');
47790   }
47791
47792   function utilBindOnce(target, type, listener, capture) {
47793       var typeOnce = type + '.once';
47794       function one() {
47795           target.on(typeOnce, null);
47796           listener.apply(this, arguments);
47797       }
47798       target.on(typeOnce, one, capture);
47799       return this;
47800   }
47801
47802   // constants
47803   var TILESIZE = 256;
47804   var kMin = geoZoomToScale(2, TILESIZE);
47805   var kMax = geoZoomToScale(24, TILESIZE);
47806
47807   function clamp(num, min, max) {
47808       return Math.max(min, Math.min(num, max));
47809   }
47810
47811
47812   function rendererMap(context) {
47813       var dispatch$$1 = dispatch('move', 'drawn');
47814       var projection = context.projection;
47815       var curtainProjection = context.curtainProjection;
47816       var drawLayers = svgLayers(projection, context);
47817       var drawPoints = svgPoints$$1(projection, context);
47818       var drawVertices = svgVertices$$1(projection, context);
47819       var drawLines = svgLines$$1(projection, context);
47820       var drawAreas = svgAreas$$1(projection, context);
47821       var drawMidpoints = svgMidpoints$$1(projection, context);
47822       var drawLabels = svgLabels(projection, context);
47823
47824       var _selection = select(null);
47825       var supersurface = select(null);
47826       var wrapper = select(null);
47827       var surface = select(null);
47828
47829       var _dimensions = [1, 1];
47830       var _dblClickEnabled = true;
47831       var _redrawEnabled = true;
47832       var _gestureTransformStart;
47833       var _transformStart = projection.transform();
47834       var _transformLast;
47835       var _isTransformed = false;
47836       var _minzoom = 0;
47837       var _getMouseCoords;
47838       var _mouseEvent;
47839
47840       var zoom$$1 = d3_zoom()
47841           .scaleExtent([kMin, kMax])
47842           .interpolate(interpolate)
47843           .filter(zoomEventFilter)
47844           .on('zoom', zoomPan);
47845
47846       var scheduleRedraw = throttle(redraw, 750);
47847       // var isRedrawScheduled = false;
47848       // var pendingRedrawCall;
47849       // function scheduleRedraw() {
47850       //     // Only schedule the redraw if one has not already been set.
47851       //     if (isRedrawScheduled) return;
47852       //     isRedrawScheduled = true;
47853       //     var that = this;
47854       //     var args = arguments;
47855       //     pendingRedrawCall = window.requestIdleCallback(function () {
47856       //         // Reset the boolean so future redraws can be set.
47857       //         isRedrawScheduled = false;
47858       //         redraw.apply(that, args);
47859       //     }, { timeout: 1400 });
47860       // }
47861
47862       function cancelPendingRedraw() {
47863           scheduleRedraw.cancel();
47864           // isRedrawScheduled = false;
47865           // window.cancelIdleCallback(pendingRedrawCall);
47866       }
47867
47868
47869       function map(selection$$1) {
47870           _selection = selection$$1;
47871
47872           context
47873               .on('change.map', immediateRedraw);
47874
47875           var osm = context.connection();
47876           if (osm) {
47877               osm.on('change.map', immediateRedraw);
47878           }
47879
47880           context.history()
47881               .on('change.map', immediateRedraw)
47882               .on('undone.map redone.map', function(stack) {
47883                   var mode = context.mode().id;
47884                   if (mode !== 'browse' && mode !== 'select') return;
47885
47886                   var followSelected = false;
47887                   if (Array.isArray(stack.selectedIDs)) {
47888                       followSelected = (stack.selectedIDs.length === 1 && stack.selectedIDs[0][0] === 'n');
47889                       context.enter(
47890                           modeSelect(context, stack.selectedIDs).follow(followSelected)
47891                       );
47892                   }
47893                   if (!followSelected && stack.transform) {
47894                       map.transformEase(stack.transform);
47895                   }
47896               });
47897
47898           context.background()
47899               .on('change.map', immediateRedraw);
47900
47901           context.features()
47902               .on('redraw.map', immediateRedraw);
47903
47904           drawLayers
47905               .on('change.map', function() {
47906                   context.background().updateImagery();
47907                   immediateRedraw();
47908               });
47909
47910           selection$$1
47911               .on('dblclick.map', dblClick)
47912               .call(zoom$$1)
47913               .call(zoom$$1.transform, projection.transform());
47914
47915           supersurface = selection$$1.append('div')
47916               .attr('id', 'supersurface')
47917               .call(utilSetTransform, 0, 0);
47918
47919           // Need a wrapper div because Opera can't cope with an absolutely positioned
47920           // SVG element: http://bl.ocks.org/jfirebaugh/6fbfbd922552bf776c16
47921           wrapper = supersurface
47922               .append('div')
47923               .attr('class', 'layer layer-data');
47924
47925           map.surface = surface = wrapper
47926               .call(drawLayers)
47927               .selectAll('.surface')
47928               .attr('id', 'surface');
47929
47930           surface
47931               .call(drawLabels.observe)
47932               .on('gesturestart.surface', function() {
47933                   _gestureTransformStart = projection.transform();
47934               })
47935               .on('gesturechange.surface', gestureChange)
47936               .on('mousedown.zoom', function() {
47937                   if (event.button === 2) {
47938                       event.stopPropagation();
47939                   }
47940               }, true)
47941               .on('mouseup.zoom', function() {
47942                   if (resetTransform()) {
47943                       immediateRedraw();
47944                   }
47945               })
47946               .on('mousemove.map', function() {
47947                   _mouseEvent = event;
47948               })
47949               .on('mouseover.vertices', function() {
47950                   if (map.editable() && !_isTransformed) {
47951                       var hover = event.target.__data__;
47952                       surface.call(drawVertices.drawHover, context.graph(), hover, map.extent());
47953                       dispatch$$1.call('drawn', this, { full: false });
47954                   }
47955               })
47956               .on('mouseout.vertices', function() {
47957                   if (map.editable() && !_isTransformed) {
47958                       var hover = event.relatedTarget && event.relatedTarget.__data__;
47959                       surface.call(drawVertices.drawHover, context.graph(), hover, map.extent());
47960                       dispatch$$1.call('drawn', this, { full: false });
47961                   }
47962               });
47963
47964           supersurface
47965               .call(context.background());
47966
47967           context.on('enter.map',  function() {
47968               if (map.editable() && !_isTransformed) {
47969                   // redraw immediately any objects affected by a change in selectedIDs.
47970                   var graph = context.graph();
47971                   var selectedAndParents = {};
47972                   context.selectedIDs().forEach(function(id) {
47973                       var entity = graph.hasEntity(id);
47974                       if (entity) {
47975                           selectedAndParents[entity.id] = entity;
47976                           if (entity.type === 'node') {
47977                               graph.parentWays(entity).forEach(function(parent) {
47978                                   selectedAndParents[parent.id] = parent;
47979                               });
47980                           }
47981                       }
47982                   });
47983                   var data = values$1(selectedAndParents);
47984                   var filter = function(d) { return d.id in selectedAndParents; };
47985
47986                   data = context.features().filter(data, graph);
47987
47988                   surface
47989                       .call(drawVertices.drawSelected, graph, map.extent())
47990                       .call(drawLines, graph, data, filter)
47991                       .call(drawAreas, graph, data, filter)
47992                       .call(drawMidpoints, graph, data, filter, map.trimmedExtent());
47993
47994                   dispatch$$1.call('drawn', this, { full: false });
47995
47996                   // redraw everything else later
47997                   scheduleRedraw();
47998               }
47999           });
48000
48001           map.dimensions(utilGetDimensions(selection$$1));
48002       }
48003
48004
48005       function zoomEventFilter() {
48006           // Fix for #2151, (see also d3/d3-zoom#60, d3/d3-brush#18)
48007           // Intercept `mousedown` and check if there is an orphaned zoom gesture.
48008           // This can happen if a previous `mousedown` occurred without a `mouseup`.
48009           // If we detect this, dispatch `mouseup` to complete the orphaned gesture,
48010           // so that d3-zoom won't stop propagation of new `mousedown` events.
48011           if (event.type === 'mousedown') {
48012               var hasOrphan = false;
48013               var listeners = window.__on;
48014               for (var i = 0; i < listeners.length; i++) {
48015                   var listener = listeners[i];
48016                   if (listener.name === 'zoom' && listener.type === 'mouseup') {
48017                       hasOrphan = true;
48018                       break;
48019                   }
48020               }
48021               if (hasOrphan) {
48022                   var event$$1 = window.CustomEvent;
48023                   if (event$$1) {
48024                       event$$1 = new event$$1('mouseup');
48025                   } else {
48026                       event$$1 = window.document.createEvent('Event');
48027                       event$$1.initEvent('mouseup', false, false);
48028                   }
48029                   // Event needs to be dispatched with an event.view property.
48030                   event$$1.view = window;
48031                   window.dispatchEvent(event$$1);
48032               }
48033           }
48034
48035           return event.button !== 2;   // ignore right clicks
48036       }
48037
48038
48039       function pxCenter() {
48040           return [_dimensions[0] / 2, _dimensions[1] / 2];
48041       }
48042
48043
48044       function drawVector(difference, extent) {
48045           var mode = context.mode();
48046           var graph = context.graph();
48047           var features = context.features();
48048           var all = context.intersects(map.extent());
48049           var fullRedraw = false;
48050           var data;
48051           var filter;
48052
48053           if (difference) {
48054               var complete = difference.complete(map.extent());
48055               data = compact(values$1(complete));
48056               filter = function(d) { return d.id in complete; };
48057               features.clear(data);
48058
48059           } else {
48060               // force a full redraw if gatherStats detects that a feature
48061               // should be auto-hidden (e.g. points or buildings)..
48062               if (features.gatherStats(all, graph, _dimensions)) {
48063                   extent = undefined;
48064               }
48065
48066               if (extent) {
48067                   data = context.intersects(map.extent().intersection(extent));
48068                   var set$$1 = set$2(map$3(data, 'id'));
48069                   filter = function(d) { return set$$1.has(d.id); };
48070
48071               } else {
48072                   data = all;
48073                   fullRedraw = true;
48074                   filter = utilFunctor(true);
48075               }
48076           }
48077
48078           data = features.filter(data, graph);
48079
48080           if (mode && mode.id === 'select') {
48081               // update selected vertices - the user might have just double-clicked a way,
48082               // creating a new vertex, triggering a partial redraw without a mode change
48083               surface.call(drawVertices.drawSelected, graph, map.extent());
48084           }
48085
48086           surface
48087               .call(drawVertices, graph, data, filter, map.extent(), fullRedraw)
48088               .call(drawLines, graph, data, filter)
48089               .call(drawAreas, graph, data, filter)
48090               .call(drawMidpoints, graph, data, filter, map.trimmedExtent())
48091               .call(drawLabels, graph, data, filter, _dimensions, fullRedraw)
48092               .call(drawPoints, graph, data, filter);
48093
48094           dispatch$$1.call('drawn', this, {full: true});
48095       }
48096
48097
48098       function editOff() {
48099           context.features().resetStats();
48100           surface.selectAll('.layer-osm *').remove();
48101           surface.selectAll('.layer-touch:not(.markers) *').remove();
48102
48103           var allowed = {
48104               'browse': true,
48105               'save': true,
48106               'select-note': true,
48107               'select-data': true,
48108               'select-error': true
48109           };
48110
48111           var mode = context.mode();
48112           if (mode && !allowed[mode.id]) {
48113               context.enter(modeBrowse(context));
48114           }
48115
48116           dispatch$$1.call('drawn', this, {full: true});
48117       }
48118
48119
48120       function dblClick() {
48121           if (!_dblClickEnabled) {
48122               event.preventDefault();
48123               event.stopImmediatePropagation();
48124           }
48125       }
48126
48127
48128       function gestureChange() {
48129           // Remap Safari gesture events to wheel events - #5492
48130           // We want these disabled most places, but enabled for zoom/unzoom on map surface
48131           // https://developer.mozilla.org/en-US/docs/Web/API/GestureEvent
48132           var e = event;
48133           e.preventDefault();
48134
48135           var props = {
48136               deltaMode: 0,    // dummy values to ignore in zoomPan
48137               deltaY: 1,       // dummy values to ignore in zoomPan
48138               clientX: e.clientX,
48139               clientY: e.clientY,
48140               screenX: e.screenX,
48141               screenY: e.screenY,
48142               x: e.x,
48143               y: e.y
48144           };
48145
48146           var e2 = new WheelEvent('wheel', props);
48147           e2._scale = e.scale;         // preserve the original scale
48148           e2._rotation = e.rotation;   // preserve the original rotation
48149
48150           _selection.node().dispatchEvent(e2);
48151       }
48152
48153
48154       function zoomPan(manualEvent) {
48155           var event$$1 = (manualEvent || event);
48156           var source = event$$1.sourceEvent;
48157           var eventTransform = event$$1.transform;
48158           var x = eventTransform.x;
48159           var y = eventTransform.y;
48160           var k = eventTransform.k;
48161
48162           if (_transformStart.x === x &&
48163               _transformStart.y === y &&
48164               _transformStart.k === k) {
48165               return;  // no change
48166           }
48167
48168           // Special handling of 'wheel' events:
48169           // They might be triggered by the user scrolling the mouse wheel,
48170           // or 2-finger pinch/zoom gestures, the transform may need adjustment.
48171           if (source && source.type === 'wheel') {
48172               var detected = utilDetect();
48173               var dX = source.deltaX;
48174               var dY = source.deltaY;
48175               var x2 = x;
48176               var y2 = y;
48177               var k2 = k;
48178               var t0, p0, p1;
48179
48180               // Normalize mousewheel scroll speed (Firefox) - #3029
48181               // If wheel delta is provided in LINE units, recalculate it in PIXEL units
48182               // We are essentially redoing the calculations that occur here:
48183               //   https://github.com/d3/d3-zoom/blob/78563a8348aa4133b07cac92e2595c2227ca7cd7/src/zoom.js#L203
48184               // See this for more info:
48185               //   https://github.com/basilfx/normalize-wheel/blob/master/src/normalizeWheel.js
48186               if (source.deltaMode === 1 /* LINE */) {
48187                   // Convert from lines to pixels, more if the user is scrolling fast.
48188                   // (I made up the exp function to roughly match Firefox to what Chrome does)
48189                   // These numbers should be floats, because integers are treated as pan gesture below.
48190                   var lines = Math.abs(source.deltaY);
48191                   var sign = (source.deltaY > 0) ? 1 : -1;
48192                   dY = sign * clamp(
48193                       Math.exp((lines - 1) * 0.75) * 4.000244140625,
48194                       4.000244140625,    // min
48195                       350.000244140625   // max
48196                   );
48197
48198                   // On Firefox Windows and Linux we always get +/- the scroll line amount (default 3)
48199                   // There doesn't seem to be any scroll accelleration.
48200                   // This multiplier increases the speed a little bit - #5512
48201                   if (detected.os !== 'mac') {
48202                       dY *= 5;
48203                   }
48204
48205                   // recalculate x2,y2,k2
48206                   t0 = _isTransformed ? _transformLast : _transformStart;
48207                   p0 = _getMouseCoords(source);
48208                   p1 = t0.invert(p0);
48209                   k2 = t0.k * Math.pow(2, -dY / 500);
48210                   x2 = p0[0] - p1[0] * k2;
48211                   y2 = p0[1] - p1[1] * k2;
48212
48213               // 2 finger map pinch zooming (Safari) - #5492
48214               // These are fake `wheel` events we made from Safari `gesturechange` events..
48215               } else if (source._scale) {
48216                   // recalculate x2,y2,k2
48217                   t0 = _gestureTransformStart;
48218                   p0 = _getMouseCoords(source);
48219                   p1 = t0.invert(p0);
48220                   k2 = t0.k * source._scale;
48221                   x2 = p0[0] - p1[0] * k2;
48222                   y2 = p0[1] - p1[1] * k2;
48223
48224               // 2 finger map pinch zooming (all browsers except Safari) - #5492
48225               // Pinch zooming via the `wheel` event will always have:
48226               // - `ctrlKey = true`
48227               // - `deltaY` is not round integer pixels (ignore `deltaX`)
48228               } else if (source.ctrlKey && !isInteger(dY)) {
48229                   dY *= 6;   // slightly scale up whatever the browser gave us
48230
48231                   // recalculate x2,y2,k2
48232                   t0 = _isTransformed ? _transformLast : _transformStart;
48233                   p0 = _getMouseCoords(source);
48234                   p1 = t0.invert(p0);
48235                   k2 = t0.k * Math.pow(2, -dY / 500);
48236                   x2 = p0[0] - p1[0] * k2;
48237                   y2 = p0[1] - p1[1] * k2;
48238
48239               // Trackpad scroll zooming with shift or alt/option key down
48240               } else if ((source.altKey || source.shiftKey) && isInteger(dY)) {
48241                   // recalculate x2,y2,k2
48242                   t0 = _isTransformed ? _transformLast : _transformStart;
48243                   p0 = _getMouseCoords(source);
48244                   p1 = t0.invert(p0);
48245                   k2 = t0.k * Math.pow(2, -dY / 500);
48246                   x2 = p0[0] - p1[0] * k2;
48247                   y2 = p0[1] - p1[1] * k2;
48248
48249               // 2 finger map panning (Mac only, all browsers) - #5492, #5512
48250               // Panning via the `wheel` event will always have:
48251               // - `ctrlKey = false`
48252               // - `deltaX`,`deltaY` are round integer pixels
48253               } else if (detected.os === 'mac' && !source.ctrlKey && isInteger(dX) && isInteger(dY)) {
48254                   p1 = projection.translate();
48255                   x2 = p1[0] - dX;
48256                   y2 = p1[1] - dY;
48257                   k2 = projection.scale();
48258               }
48259
48260               // something changed - replace the event transform
48261               if (x2 !== x || y2 !== y || k2 !== k) {
48262                   x = x2;
48263                   y = y2;
48264                   k = k2;
48265                   eventTransform = identity$7.translate(x2, y2).scale(k2);
48266                   _selection.node().__zoom = eventTransform;
48267               }
48268
48269           }
48270
48271           if (geoScaleToZoom(k, TILESIZE) < _minzoom) {
48272               surface.interrupt();
48273               uiFlash().text(t('cannot_zoom'))();
48274               setCenterZoom(map.center(), context.minEditableZoom(), 0, true);
48275               scheduleRedraw();
48276               dispatch$$1.call('move', this, map);
48277               return;
48278           }
48279
48280           projection.transform(eventTransform);
48281
48282           var scale = k / _transformStart.k;
48283           var tX = (x / scale - _transformStart.x) * scale;
48284           var tY = (y / scale - _transformStart.y) * scale;
48285
48286           if (context.inIntro()) {
48287               curtainProjection.transform({
48288                   x: x - tX,
48289                   y: y - tY,
48290                   k: k
48291               });
48292           }
48293
48294           if (source) {
48295               _mouseEvent = event$$1;
48296           }
48297           _isTransformed = true;
48298           _transformLast = eventTransform;
48299           utilSetTransform(supersurface, tX, tY, scale);
48300           scheduleRedraw();
48301
48302           dispatch$$1.call('move', this, map);
48303
48304
48305           function isInteger(val) {
48306               return typeof val === 'number' && isFinite(val) && Math.floor(val) === val;
48307           }
48308       }
48309
48310
48311       function resetTransform() {
48312           if (!_isTransformed) return false;
48313
48314           // deprecation warning - Radial Menu to be removed in iD v3
48315           surface.selectAll('.edit-menu, .radial-menu').interrupt().remove();
48316           utilSetTransform(supersurface, 0, 0);
48317           _isTransformed = false;
48318           if (context.inIntro()) {
48319               curtainProjection.transform(projection.transform());
48320           }
48321           return true;
48322       }
48323
48324
48325       function redraw(difference, extent) {
48326           if (surface.empty() || !_redrawEnabled) return;
48327
48328           // If we are in the middle of a zoom/pan, we can't do differenced redraws.
48329           // It would result in artifacts where differenced entities are redrawn with
48330           // one transform and unchanged entities with another.
48331           if (resetTransform()) {
48332               difference = extent = undefined;
48333           }
48334
48335           var zoom$$1 = map.zoom();
48336           var z = String(~~zoom$$1);
48337
48338           if (surface.attr('data-zoom') !== z) {
48339               surface.attr('data-zoom', z);
48340           }
48341
48342           // class surface as `lowzoom` around z17-z18.5 (based on latitude)
48343           var lat = map.center()[1];
48344           var lowzoom = linear$2()
48345               .domain([-60, 0, 60])
48346               .range([17, 18.5, 17])
48347               .clamp(true);
48348
48349           surface
48350               .classed('low-zoom', zoom$$1 <= lowzoom(lat));
48351
48352
48353           if (!difference) {
48354               supersurface.call(context.background());
48355           }
48356
48357           wrapper
48358               .call(drawLayers);
48359
48360           // OSM
48361           if (map.editable()) {
48362               context.loadTiles(projection);
48363               drawVector(difference, extent);
48364           } else {
48365               editOff();
48366           }
48367
48368           _transformStart = projection.transform();
48369
48370           return map;
48371       }
48372
48373
48374
48375       var immediateRedraw = function(difference, extent) {
48376           if (!difference && !extent) cancelPendingRedraw();
48377           redraw(difference, extent);
48378       };
48379
48380
48381       map.mouse = function() {
48382           var event$$1 = _mouseEvent || event;
48383           if (event$$1) {
48384               var s;
48385               while ((s = event$$1.sourceEvent)) { event$$1 = s; }
48386               return _getMouseCoords(event$$1);
48387           }
48388           return null;
48389       };
48390
48391
48392       // returns Lng/Lat
48393       map.mouseCoordinates = function() {
48394           var coord = map.mouse() || pxCenter();
48395           return projection.invert(coord);
48396       };
48397
48398
48399       map.dblclickEnable = function(val) {
48400           if (!arguments.length) return _dblClickEnabled;
48401           _dblClickEnabled = val;
48402           return map;
48403       };
48404
48405
48406       map.redrawEnable = function(val) {
48407           if (!arguments.length) return _redrawEnabled;
48408           _redrawEnabled = val;
48409           return map;
48410       };
48411
48412
48413       map.isTransformed = function() {
48414           return _isTransformed;
48415       };
48416
48417
48418       function setTransform(t2, duration, force) {
48419           var t$$1 = projection.transform();
48420           if (!force && t2.k === t$$1.k && t2.x === t$$1.x && t2.y === t$$1.y) return false;
48421
48422           if (duration) {
48423               _selection
48424                   .transition()
48425                   .duration(duration)
48426                   .on('start', function() { map.startEase(); })
48427                   .call(zoom$$1.transform, identity$7.translate(t2.x, t2.y).scale(t2.k));
48428           } else {
48429               projection.transform(t2);
48430               _transformStart = t2;
48431               _selection.call(zoom$$1.transform, _transformStart);
48432           }
48433
48434           return true;
48435       }
48436
48437
48438       function setCenterZoom(loc2, z2, duration, force) {
48439           var c = map.center();
48440           var z = map.zoom();
48441           if (loc2[0] === c[0] && loc2[1] === c[1] && z2 === z && !force) return false;
48442
48443           var proj = geoRawMercator().transform(projection.transform());  // copy projection
48444
48445           var k2 = clamp(geoZoomToScale(z2, TILESIZE), kMin, kMax);
48446           proj.scale(k2);
48447
48448           var t$$1 = proj.translate();
48449           var point$$1 = proj(loc2);
48450
48451           var center = pxCenter();
48452           t$$1[0] += center[0] - point$$1[0];
48453           t$$1[1] += center[1] - point$$1[1];
48454
48455           return setTransform(identity$7.translate(t$$1[0], t$$1[1]).scale(k2), duration, force);
48456       }
48457
48458
48459       map.pan = function(delta, duration) {
48460           var t$$1 = projection.translate();
48461           var k = projection.scale();
48462
48463           t$$1[0] += delta[0];
48464           t$$1[1] += delta[1];
48465
48466           if (duration) {
48467               _selection
48468                   .transition()
48469                   .duration(duration)
48470                   .on('start', function() { map.startEase(); })
48471                   .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
48472           } else {
48473               projection.translate(t$$1);
48474               _transformStart = projection.transform();
48475               _selection.call(zoom$$1.transform, _transformStart);
48476               dispatch$$1.call('move', this, map);
48477               immediateRedraw();
48478           }
48479
48480           return map;
48481       };
48482
48483
48484       map.dimensions = function(val) {
48485           if (!arguments.length) return _dimensions;
48486
48487           _dimensions = val;
48488           drawLayers.dimensions(_dimensions);
48489           context.background().dimensions(_dimensions);
48490           projection.clipExtent([[0, 0], _dimensions]);
48491           _getMouseCoords = utilFastMouse(supersurface.node());
48492
48493           scheduleRedraw();
48494           return map;
48495       };
48496
48497
48498       function zoomIn(delta) {
48499           setCenterZoom(map.center(), ~~map.zoom() + delta, 250, true);
48500       }
48501
48502       function zoomOut(delta) {
48503           setCenterZoom(map.center(), ~~map.zoom() - delta, 250, true);
48504       }
48505
48506       map.zoomIn = function() { zoomIn(1); };
48507       map.zoomInFurther = function() { zoomIn(4); };
48508
48509       map.zoomOut = function() { zoomOut(1); };
48510       map.zoomOutFurther = function() { zoomOut(4); };
48511
48512
48513       map.center = function(loc2) {
48514           if (!arguments.length) {
48515               return projection.invert(pxCenter());
48516           }
48517
48518           if (setCenterZoom(loc2, map.zoom())) {
48519               dispatch$$1.call('move', this, map);
48520           }
48521
48522           scheduleRedraw();
48523           return map;
48524       };
48525
48526
48527       map.zoom = function(z2) {
48528           if (!arguments.length) {
48529               return Math.max(geoScaleToZoom(projection.scale(), TILESIZE), 0);
48530           }
48531
48532           if (z2 < _minzoom) {
48533               surface.interrupt();
48534               uiFlash().text(t('cannot_zoom'))();
48535               z2 = context.minEditableZoom();
48536           }
48537
48538           if (setCenterZoom(map.center(), z2)) {
48539               dispatch$$1.call('move', this, map);
48540           }
48541
48542           scheduleRedraw();
48543           return map;
48544       };
48545
48546
48547       map.centerZoom = function(loc2, z2) {
48548           if (setCenterZoom(loc2, z2)) {
48549               dispatch$$1.call('move', this, map);
48550           }
48551
48552           scheduleRedraw();
48553           return map;
48554       };
48555
48556
48557       map.zoomTo = function(entity) {
48558           var extent = entity.extent(context.graph());
48559           if (!isFinite(extent.area())) return map;
48560
48561           var z2 = clamp(map.trimmedExtentZoom(extent), context.minEditableZoom(), 20);
48562           return map.centerZoom(extent.center(), z2);
48563       };
48564
48565
48566       map.centerEase = function(loc2, duration) {
48567           duration = duration || 250;
48568           setCenterZoom(loc2, map.zoom(), duration);
48569           return map;
48570       };
48571
48572
48573       map.zoomEase = function(z2, duration) {
48574           duration = duration || 250;
48575           setCenterZoom(map.center(), z2, duration, false);
48576           return map;
48577       };
48578
48579
48580       map.centerZoomEase = function(loc2, z2, duration) {
48581           duration = duration || 250;
48582           setCenterZoom(loc2, z2, duration, false);
48583           return map;
48584       };
48585
48586
48587       map.transformEase = function(t2, duration) {
48588           duration = duration || 250;
48589           setTransform(t2, duration, false);
48590           return map;
48591       };
48592
48593
48594       map.zoomToEase = function(entity, duration) {
48595           var extent = entity.extent(context.graph());
48596           if (!isFinite(extent.area())) return map;
48597
48598           var z2 = clamp(map.trimmedExtentZoom(extent), context.minEditableZoom(), 20);
48599           return map.centerZoomEase(extent.center(), z2, duration);
48600       };
48601
48602
48603       map.startEase = function() {
48604           utilBindOnce(surface, 'mousedown.ease', function() {
48605               map.cancelEase();
48606           });
48607           return map;
48608       };
48609
48610
48611       map.cancelEase = function() {
48612           _selection.interrupt();
48613           return map;
48614       };
48615
48616
48617       map.extent = function(val) {
48618           if (!arguments.length) {
48619               return new geoExtent$$1(
48620                   projection.invert([0, _dimensions[1]]),
48621                   projection.invert([_dimensions[0], 0])
48622               );
48623           } else {
48624               var extent = geoExtent$$1(val);
48625               map.centerZoom(extent.center(), map.extentZoom(extent));
48626           }
48627       };
48628
48629
48630       map.trimmedExtent = function(val) {
48631           if (!arguments.length) {
48632               var headerY = 60;
48633               var footerY = 30;
48634               var pad = 10;
48635               return new geoExtent$$1(
48636                   projection.invert([pad, _dimensions[1] - footerY - pad]),
48637                   projection.invert([_dimensions[0] - pad, headerY + pad])
48638               );
48639           } else {
48640               var extent = geoExtent$$1(val);
48641               map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
48642           }
48643       };
48644
48645
48646       function calcExtentZoom(extent, dim) {
48647           var tl = projection([extent[0][0], extent[1][1]]);
48648           var br = projection([extent[1][0], extent[0][1]]);
48649
48650           // Calculate maximum zoom that fits extent
48651           var hFactor = (br[0] - tl[0]) / dim[0];
48652           var vFactor = (br[1] - tl[1]) / dim[1];
48653           var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
48654           var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
48655           var newZoom = map.zoom() - Math.max(hZoomDiff, vZoomDiff);
48656
48657           return newZoom;
48658       }
48659
48660
48661       map.extentZoom = function(val) {
48662           return calcExtentZoom(geoExtent$$1(val), _dimensions);
48663       };
48664
48665
48666       map.trimmedExtentZoom = function(val) {
48667           var trimY = 120;
48668           var trimX = 40;
48669           var trimmed = [_dimensions[0] - trimX, _dimensions[1] - trimY];
48670           return calcExtentZoom(geoExtent$$1(val), trimmed);
48671       };
48672
48673
48674       map.editable = function() {
48675           var osmLayer = surface.selectAll('.data-layer.osm');
48676           if (!osmLayer.empty() && osmLayer.classed('disabled')) return false;
48677
48678           return map.zoom() >= context.minEditableZoom();
48679       };
48680
48681
48682       map.notesEditable = function() {
48683           var noteLayer = surface.selectAll('.data-layer.notes');
48684           if (!noteLayer.empty() && noteLayer.classed('disabled')) return false;
48685
48686           return map.zoom() >= context.minEditableZoom();
48687       };
48688
48689
48690       map.minzoom = function(val) {
48691           if (!arguments.length) return _minzoom;
48692           _minzoom = val;
48693           return map;
48694       };
48695
48696
48697       map.layers = drawLayers;
48698
48699
48700       return utilRebind(map, dispatch$$1, 'on');
48701   }
48702
48703   function uiMapInMap(context) {
48704
48705       function map_in_map(selection$$1) {
48706           var backgroundLayer = rendererTileLayer(context);
48707           var overlayLayers = {};
48708           var projection$$1 = geoRawMercator();
48709           var dataLayer = svgData$$1(projection$$1, context).showLabels(false);
48710           var debugLayer = svgDebug$$1(projection$$1, context);
48711           var zoom$$1 = d3_zoom()
48712               .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(24)])
48713               .on('start', zoomStarted)
48714               .on('zoom', zoomed)
48715               .on('end', zoomEnded);
48716           var isTransformed = false;
48717           var isHidden = true;
48718           var skipEvents = false;
48719           var gesture = null;
48720           var zDiff = 6;    // by default, minimap renders at (main zoom - 6)
48721           var wrap = select(null);
48722           var tiles = select(null);
48723           var viewport = select(null);
48724           var tStart;    // transform at start of gesture
48725           var tCurr;     // transform at most recent event
48726           var timeoutId;
48727
48728
48729           function zoomStarted() {
48730               if (skipEvents) return;
48731               tStart = tCurr = projection$$1.transform();
48732               gesture = null;
48733           }
48734
48735
48736           function zoomed() {
48737               if (skipEvents) return;
48738
48739               var x = event.transform.x;
48740               var y = event.transform.y;
48741               var k = event.transform.k;
48742               var isZooming = (k !== tStart.k);
48743               var isPanning = (x !== tStart.x || y !== tStart.y);
48744
48745               if (!isZooming && !isPanning) {
48746                   return;  // no change
48747               }
48748
48749               // lock in either zooming or panning, don't allow both in minimap.
48750               if (!gesture) {
48751                   gesture = isZooming ? 'zoom' : 'pan';
48752               }
48753
48754               var tMini = projection$$1.transform();
48755               var tX, tY, scale;
48756
48757               if (gesture === 'zoom') {
48758                   var dMini = utilGetDimensions(wrap);
48759                   var cMini = geoVecScale(dMini, 0.5);
48760                   scale = k / tMini.k;
48761                   tX = (cMini[0] / scale - cMini[0]) * scale;
48762                   tY = (cMini[1] / scale - cMini[1]) * scale;
48763               } else {
48764                   k = tMini.k;
48765                   scale = 1;
48766                   tX = x - tMini.x;
48767                   tY = y - tMini.y;
48768               }
48769
48770               utilSetTransform(tiles, tX, tY, scale);
48771               utilSetTransform(viewport, 0, 0, scale);
48772               isTransformed = true;
48773               tCurr = identity$7.translate(x, y).scale(k);
48774
48775               var zMain = geoScaleToZoom(context.projection.scale());
48776               var zMini = geoScaleToZoom(k);
48777
48778               zDiff = zMain - zMini;
48779
48780               queueRedraw();
48781           }
48782
48783
48784           function zoomEnded() {
48785               if (skipEvents) return;
48786               if (gesture !== 'pan') return;
48787
48788               updateProjection();
48789               gesture = null;
48790               var dMini = utilGetDimensions(wrap);
48791               var cMini = geoVecScale(dMini, 0.5);
48792               context.map().center(projection$$1.invert(cMini));   // recenter main map..
48793           }
48794
48795
48796           function updateProjection() {
48797               var loc = context.map().center();
48798               var dMini = utilGetDimensions(wrap);
48799               var cMini = geoVecScale(dMini, 0.5);
48800               var tMain = context.projection.transform();
48801               var zMain = geoScaleToZoom(tMain.k);
48802               var zMini = Math.max(zMain - zDiff, 0.5);
48803               var kMini = geoZoomToScale(zMini);
48804
48805               projection$$1
48806                   .translate([tMain.x, tMain.y])
48807                   .scale(kMini);
48808
48809               var point$$1 = projection$$1(loc);
48810               var mouse$$1 = (gesture === 'pan') ? geoVecSubtract([tCurr.x, tCurr.y], [tStart.x, tStart.y]) : [0, 0];
48811               var xMini = cMini[0] - point$$1[0] + tMain.x + mouse$$1[0];
48812               var yMini = cMini[1] - point$$1[1] + tMain.y + mouse$$1[1];
48813
48814               projection$$1
48815                   .translate([xMini, yMini])
48816                   .clipExtent([[0, 0], dMini]);
48817
48818               tCurr = projection$$1.transform();
48819
48820               if (isTransformed) {
48821                   utilSetTransform(tiles, 0, 0);
48822                   utilSetTransform(viewport, 0, 0);
48823                   isTransformed = false;
48824               }
48825
48826               zoom$$1
48827                   .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(zMain - 3)]);
48828
48829               skipEvents = true;
48830               wrap.call(zoom$$1.transform, tCurr);
48831               skipEvents = false;
48832           }
48833
48834
48835           function redraw() {
48836               clearTimeout(timeoutId);
48837               if (isHidden) return;
48838
48839               updateProjection();
48840
48841               var dMini = utilGetDimensions(wrap);
48842               var zMini = geoScaleToZoom(projection$$1.scale());
48843
48844               // setup tile container
48845               tiles = wrap
48846                   .selectAll('.map-in-map-tiles')
48847                   .data([0]);
48848
48849               tiles = tiles.enter()
48850                   .append('div')
48851                   .attr('class', 'map-in-map-tiles')
48852                   .merge(tiles);
48853
48854               // redraw background
48855               backgroundLayer
48856                   .source(context.background().baseLayerSource())
48857                   .projection(projection$$1)
48858                   .dimensions(dMini);
48859
48860               var background = tiles
48861                   .selectAll('.map-in-map-background')
48862                   .data([0]);
48863
48864               background.enter()
48865                   .append('div')
48866                   .attr('class', 'map-in-map-background')
48867                   .merge(background)
48868                   .call(backgroundLayer);
48869
48870
48871               // redraw overlay
48872               var overlaySources = context.background().overlayLayerSources();
48873               var activeOverlayLayers = [];
48874               for (var i = 0; i < overlaySources.length; i++) {
48875                   if (overlaySources[i].validZoom(zMini)) {
48876                       if (!overlayLayers[i]) overlayLayers[i] = rendererTileLayer(context);
48877                       activeOverlayLayers.push(overlayLayers[i]
48878                           .source(overlaySources[i])
48879                           .projection(projection$$1)
48880                           .dimensions(dMini));
48881                   }
48882               }
48883
48884               var overlay = tiles
48885                   .selectAll('.map-in-map-overlay')
48886                   .data([0]);
48887
48888               overlay = overlay.enter()
48889                   .append('div')
48890                   .attr('class', 'map-in-map-overlay')
48891                   .merge(overlay);
48892
48893
48894               var overlays = overlay
48895                   .selectAll('div')
48896                   .data(activeOverlayLayers, function(d) { return d.source().name(); });
48897
48898               overlays.exit()
48899                   .remove();
48900
48901               overlays = overlays.enter()
48902                   .append('div')
48903                   .merge(overlays)
48904                   .each(function(layer) { select(this).call(layer); });
48905
48906
48907               var dataLayers = tiles
48908                   .selectAll('.map-in-map-data')
48909                   .data([0]);
48910
48911               dataLayers.exit()
48912                   .remove();
48913
48914               dataLayers = dataLayers.enter()
48915                   .append('svg')
48916                   .attr('class', 'map-in-map-data')
48917                   .merge(dataLayers)
48918                   .call(dataLayer)
48919                   .call(debugLayer);
48920
48921
48922               // redraw viewport bounding box
48923               if (gesture !== 'pan') {
48924                   var getPath = d3_geoPath(projection$$1);
48925                   var bbox = { type: 'Polygon', coordinates: [context.map().extent().polygon()] };
48926
48927                   viewport = wrap.selectAll('.map-in-map-viewport')
48928                       .data([0]);
48929
48930                   viewport = viewport.enter()
48931                       .append('svg')
48932                       .attr('class', 'map-in-map-viewport')
48933                       .merge(viewport);
48934
48935
48936                   var path = viewport.selectAll('.map-in-map-bbox')
48937                       .data([bbox]);
48938
48939                   path.enter()
48940                       .append('path')
48941                       .attr('class', 'map-in-map-bbox')
48942                       .merge(path)
48943                       .attr('d', getPath)
48944                       .classed('thick', function(d) { return getPath.area(d) < 30; });
48945               }
48946           }
48947
48948
48949           function queueRedraw() {
48950               clearTimeout(timeoutId);
48951               timeoutId = setTimeout(function() { redraw(); }, 750);
48952           }
48953
48954
48955           function toggle() {
48956               if (event) event.preventDefault();
48957
48958               isHidden = !isHidden;
48959
48960               select('.minimap-toggle-item')
48961                   .classed('active', !isHidden)
48962                   .select('input')
48963                   .property('checked', !isHidden);
48964
48965               if (isHidden) {
48966                   wrap
48967                       .style('display', 'block')
48968                       .style('opacity', '1')
48969                       .transition()
48970                       .duration(200)
48971                       .style('opacity', '0')
48972                       .on('end', function() {
48973                           selection$$1.selectAll('.map-in-map')
48974                               .style('display', 'none');
48975                       });
48976               } else {
48977                   wrap
48978                       .style('display', 'block')
48979                       .style('opacity', '0')
48980                       .transition()
48981                       .duration(200)
48982                       .style('opacity', '1')
48983                       .on('end', function() {
48984                           redraw();
48985                       });
48986               }
48987           }
48988
48989
48990           uiMapInMap.toggle = toggle;
48991
48992           wrap = selection$$1.selectAll('.map-in-map')
48993               .data([0]);
48994
48995           wrap = wrap.enter()
48996               .append('div')
48997               .attr('class', 'map-in-map')
48998               .style('display', (isHidden ? 'none' : 'block'))
48999               .call(zoom$$1)
49000               .on('dblclick.zoom', null)
49001               .merge(wrap);
49002
49003           context.map()
49004               .on('drawn.map-in-map', function(drawn) {
49005                   if (drawn.full === true) {
49006                       redraw();
49007                   }
49008               });
49009
49010           redraw();
49011
49012           context.keybinding()
49013               .on(t('background.minimap.key'), toggle);
49014       }
49015
49016       return map_in_map;
49017   }
49018
49019   function uiSettingsCustomBackground(context) {
49020       var dispatch$$1 = dispatch('change');
49021
49022       function render(selection) {
49023           var _origSettings = {
49024               template: context.storage('background-custom-template')
49025           };
49026           var _currSettings = cloneDeep(_origSettings);
49027           var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
49028           var modal = uiConfirm(selection).okButton();
49029
49030           modal
49031               .classed('settings-modal settings-custom-background', true);
49032
49033           modal.select('.modal-section.header')
49034               .append('h3')
49035               .text(t('settings.custom_background.header'));
49036
49037
49038           var textSection = modal.select('.modal-section.message-text');
49039
49040           textSection
49041               .append('pre')
49042               .attr('class', 'instructions-template')
49043               .text(t('settings.custom_background.instructions', { example: example }));
49044
49045           textSection
49046               .append('textarea')
49047               .attr('class', 'field-template')
49048               .attr('placeholder', t('settings.custom_background.template.placeholder'))
49049               .call(utilNoAuto)
49050               .property('value', _currSettings.template);
49051
49052
49053           // insert a cancel button
49054           var buttonSection = modal.select('.modal-section.buttons');
49055
49056           buttonSection
49057               .insert('button', '.ok-button')
49058               .attr('class', 'button cancel-button secondary-action')
49059               .text(t('confirm.cancel'));
49060
49061
49062           buttonSection.select('.cancel-button')
49063               .on('click.cancel', clickCancel);
49064
49065           buttonSection.select('.ok-button')
49066               .attr('disabled', isSaveDisabled)
49067               .on('click.save', clickSave);
49068
49069
49070           function isSaveDisabled() {
49071               return null;
49072           }
49073
49074
49075           // restore the original template
49076           function clickCancel() {
49077               textSection.select('.field-template').property('value', _origSettings.template);
49078               context.storage('background-custom-template', _origSettings.template);
49079               this.blur();
49080               modal.close();
49081           }
49082
49083           // accept the current template
49084           function clickSave() {
49085               _currSettings.template = textSection.select('.field-template').property('value');
49086               context.storage('background-custom-template', _currSettings.template);
49087               this.blur();
49088               modal.close();
49089               dispatch$$1.call('change', this, _currSettings);
49090           }
49091       }
49092
49093       return utilRebind(render, dispatch$$1, 'on');
49094   }
49095
49096   function uiBackground(context) {
49097       var key = t('background.key');
49098
49099       var pane = select(null);
49100
49101       var _customSource = context.background().findSource('custom');
49102       var _previousBackground = context.background().findSource(context.storage('background-last-used-toggle'));
49103       var _shown = false;
49104
49105       var _backgroundList = select(null);
49106       var _overlayList = select(null);
49107       var _displayOptionsContainer = select(null);
49108       var _offsetContainer = select(null);
49109
49110       var backgroundDisplayOptions = uiBackgroundDisplayOptions(context);
49111       var backgroundOffset = uiBackgroundOffset(context);
49112
49113       var settingsCustomBackground = uiSettingsCustomBackground(context)
49114           .on('change', customChanged);
49115
49116
49117       function setTooltips(selection$$1) {
49118           selection$$1.each(function(d, i, nodes) {
49119               var item = select(this).select('label');
49120               var span = item.select('span');
49121               var placement = (i < nodes.length / 2) ? 'bottom' : 'top';
49122               var description = d.description();
49123               var isOverflowing = (span.property('clientWidth') !== span.property('scrollWidth'));
49124
49125               item.call(tooltip().destroyAny);
49126
49127               if (d === _previousBackground) {
49128                   item.call(tooltip()
49129                       .placement(placement)
49130                       .html(true)
49131                       .title(function() {
49132                           var tip = '<div>' + t('background.switch') + '</div>';
49133                           return uiTooltipHtml(tip, uiCmd('⌘' + key));
49134                       })
49135                   );
49136               } else if (description || isOverflowing) {
49137                   item.call(tooltip()
49138                       .placement(placement)
49139                       .title(description || d.name())
49140                   );
49141               }
49142           });
49143       }
49144
49145
49146       function updateLayerSelections(selection$$1) {
49147           function active(d) {
49148               return context.background().showsLayer(d);
49149           }
49150
49151           selection$$1.selectAll('.layer')
49152               .classed('active', active)
49153               .classed('switch', function(d) { return d === _previousBackground; })
49154               .call(setTooltips)
49155               .selectAll('input')
49156               .property('checked', active);
49157       }
49158
49159
49160       function chooseBackground(d) {
49161           if (d.id === 'custom' && !d.template()) {
49162               return editCustom();
49163           }
49164
49165           event.preventDefault();
49166           _previousBackground = context.background().baseLayerSource();
49167           context.storage('background-last-used-toggle', _previousBackground.id);
49168           context.storage('background-last-used', d.id);
49169           context.background().baseLayerSource(d);
49170           _backgroundList.call(updateLayerSelections);
49171           document.activeElement.blur();
49172       }
49173
49174
49175       function customChanged(d) {
49176           if (d && d.template) {
49177               _customSource.template(d.template);
49178               chooseBackground(_customSource);
49179           } else {
49180               _customSource.template('');
49181               chooseBackground(context.background().findSource('none'));
49182           }
49183       }
49184
49185
49186       function editCustom() {
49187           event.preventDefault();
49188           context.container()
49189               .call(settingsCustomBackground);
49190       }
49191
49192
49193       function chooseOverlay(d) {
49194           event.preventDefault();
49195           context.background().toggleOverlayLayer(d);
49196           _overlayList.call(updateLayerSelections);
49197           document.activeElement.blur();
49198       }
49199
49200
49201       function drawListItems(layerList, type, change, filter) {
49202           var sources = context.background()
49203               .sources(context.map().extent())
49204               .filter(filter);
49205
49206           var layerLinks = layerList.selectAll('li.layer')
49207               .data(sources, function(d) { return d.name(); });
49208
49209           layerLinks.exit()
49210               .remove();
49211
49212           var enter = layerLinks.enter()
49213               .append('li')
49214               .attr('class', 'layer')
49215               .classed('layer-custom', function(d) { return d.id === 'custom'; })
49216               .classed('best', function(d) { return d.best(); });
49217
49218           enter.filter(function(d) { return d.id === 'custom'; })
49219               .append('button')
49220               .attr('class', 'layer-browse')
49221               .call(tooltip()
49222                   .title(t('settings.custom_background.tooltip'))
49223                   .placement((textDirection === 'rtl') ? 'right' : 'left')
49224               )
49225               .on('click', editCustom)
49226               .call(svgIcon('#iD-icon-more'));
49227
49228           enter.filter(function(d) { return d.best(); })
49229               .append('div')
49230               .attr('class', 'best')
49231               .call(tooltip()
49232                   .title(t('background.best_imagery'))
49233                   .placement((textDirection === 'rtl') ? 'right' : 'left')
49234               )
49235               .append('span')
49236               .html('&#9733;');
49237
49238           var label = enter
49239               .append('label');
49240
49241           label
49242               .append('input')
49243               .attr('type', type)
49244               .attr('name', 'layers')
49245               .on('change', change);
49246
49247           label
49248               .append('span')
49249               .text(function(d) { return d.name(); });
49250
49251
49252           layerList.selectAll('li.layer')
49253               .sort(sortSources)
49254               .style('display', layerList.selectAll('li.layer').data().length > 0 ? 'block' : 'none');
49255
49256           layerList
49257               .call(updateLayerSelections);
49258
49259
49260           function sortSources(a, b) {
49261               return a.best() && !b.best() ? -1
49262                   : b.best() && !a.best() ? 1
49263                   : d3_descending(a.area(), b.area()) || ascending(a.name(), b.name()) || 0;
49264           }
49265       }
49266
49267
49268       function renderBackgroundList(selection$$1) {
49269
49270           // the background list
49271           var container = selection$$1.selectAll('.layer-background-list')
49272               .data([0]);
49273
49274           _backgroundList = container.enter()
49275               .append('ul')
49276               .attr('class', 'layer-list layer-background-list')
49277               .attr('dir', 'auto')
49278               .merge(container);
49279
49280
49281           // add minimap toggle below list
49282           var minimapEnter = selection$$1.selectAll('.minimap-toggle-list')
49283               .data([0])
49284               .enter()
49285               .append('ul')
49286               .attr('class', 'layer-list minimap-toggle-list')
49287               .append('li')
49288               .attr('class', 'layer minimap-toggle-item');
49289
49290           var minimapLabelEnter = minimapEnter
49291               .append('label')
49292               .call(tooltip()
49293                   .html(true)
49294                   .title(uiTooltipHtml(t('background.minimap.tooltip'), t('background.minimap.key')))
49295                   .placement('top')
49296               );
49297
49298           minimapLabelEnter
49299               .append('input')
49300               .attr('type', 'checkbox')
49301               .on('change', function() {
49302                   event.preventDefault();
49303                   uiMapInMap.toggle();
49304               });
49305
49306           minimapLabelEnter
49307               .append('span')
49308               .text(t('background.minimap.description'));
49309
49310
49311           // "Info / Report a Problem" link
49312           selection$$1.selectAll('.imagery-faq')
49313               .data([0])
49314               .enter()
49315               .append('div')
49316               .attr('class', 'imagery-faq')
49317               .append('a')
49318               .attr('target', '_blank')
49319               .attr('tabindex', -1)
49320               .call(svgIcon('#iD-icon-out-link', 'inline'))
49321               .attr('href', 'https://github.com/openstreetmap/iD/blob/master/FAQ.md#how-can-i-report-an-issue-with-background-imagery')
49322               .append('span')
49323               .text(t('background.imagery_source_faq'));
49324
49325           updateBackgroundList();
49326       }
49327
49328
49329       function renderOverlayList(selection$$1) {
49330           var container = selection$$1.selectAll('.layer-overlay-list')
49331               .data([0]);
49332
49333           _overlayList = container.enter()
49334               .append('ul')
49335               .attr('class', 'layer-list layer-overlay-list')
49336               .attr('dir', 'auto')
49337               .merge(container);
49338
49339           updateOverlayList();
49340       }
49341
49342       function updateBackgroundList() {
49343           _backgroundList
49344               .call(drawListItems, 'radio', chooseBackground, function(d) { return !d.isHidden() && !d.overlay; });
49345       }
49346
49347       function updateOverlayList() {
49348           _overlayList
49349               .call(drawListItems, 'checkbox', chooseOverlay, function(d) { return !d.isHidden() && d.overlay; });
49350       }
49351
49352
49353       function update() {
49354
49355           if (!pane.select('.disclosure-wrap-background_list').classed('hide')) {
49356               updateBackgroundList();
49357           }
49358
49359           if (!pane.select('.disclosure-wrap-overlay_list').classed('hide')) {
49360               updateOverlayList();
49361           }
49362
49363           _displayOptionsContainer
49364               .call(backgroundDisplayOptions);
49365
49366           _offsetContainer
49367               .call(backgroundOffset);
49368       }
49369
49370
49371       function quickSwitch() {
49372           if (event) {
49373               event.stopImmediatePropagation();
49374               event.preventDefault();
49375           }
49376           if (_previousBackground) {
49377               chooseBackground(_previousBackground);
49378           }
49379       }
49380
49381
49382       function background(selection$$1) {
49383
49384           function hidePane() {
49385               setVisible(false);
49386           }
49387
49388           function togglePane() {
49389               if (event) event.preventDefault();
49390               paneTooltip.hide(button);
49391               setVisible(!button.classed('active'));
49392           }
49393
49394           function setVisible(show) {
49395               if (show !== _shown) {
49396                   button.classed('active', show);
49397                   _shown = show;
49398
49399                   if (show) {
49400                       uiMapData.hidePane();
49401                       uiHelp.hidePane();
49402                       update();
49403
49404                       pane
49405                           .style('display', 'block')
49406                           .style('right', '-300px')
49407                           .transition()
49408                           .duration(200)
49409                           .style('right', '0px');
49410
49411                   } else {
49412                       pane
49413                           .style('display', 'block')
49414                           .style('right', '0px')
49415                           .transition()
49416                           .duration(200)
49417                           .style('right', '-300px')
49418                           .on('end', function() {
49419                               select(this).style('display', 'none');
49420                           });
49421                   }
49422               }
49423           }
49424
49425
49426           pane = selection$$1
49427               .append('div')
49428               .attr('class', 'fillL map-pane hide');
49429
49430           var paneTooltip = tooltip()
49431               .placement((textDirection === 'rtl') ? 'right' : 'left')
49432               .html(true)
49433               .title(uiTooltipHtml(t('background.description'), key));
49434
49435           var button = selection$$1
49436               .append('button')
49437               .attr('tabindex', -1)
49438               .on('click', togglePane)
49439               .call(svgIcon('#iD-icon-layers', 'light'))
49440               .call(paneTooltip);
49441
49442
49443           var heading = pane
49444               .append('div')
49445               .attr('class', 'pane-heading');
49446
49447           heading
49448               .append('h2')
49449               .text(t('background.title'));
49450
49451           heading
49452               .append('button')
49453               .on('click', function() { uiBackground.hidePane(); })
49454               .call(svgIcon('#iD-icon-close'));
49455
49456
49457           var content = pane
49458               .append('div')
49459               .attr('class', 'pane-content');
49460
49461           // background list
49462           content
49463               .append('div')
49464               .attr('class', 'background-background-list-container')
49465               .call(uiDisclosure(context, 'background_list', true)
49466                   .title(t('background.backgrounds'))
49467                   .content(renderBackgroundList)
49468               );
49469
49470           // overlay list
49471           content
49472               .append('div')
49473               .attr('class', 'background-overlay-list-container')
49474               .call(uiDisclosure(context, 'overlay_list', true)
49475                   .title(t('background.overlays'))
49476                   .content(renderOverlayList)
49477               );
49478
49479           // display options
49480           _displayOptionsContainer = content
49481               .append('div')
49482               .attr('class', 'background-display-options');
49483
49484           // offset controls
49485           _offsetContainer = content
49486               .append('div')
49487               .attr('class', 'background-offset');
49488
49489
49490           // add listeners
49491           context.map()
49492               .on('move.background-update', debounce(utilCallWhenIdle(update), 1000));
49493
49494           context.background()
49495               .on('change.background-update', update);
49496
49497
49498           update();
49499
49500           context.keybinding()
49501               .on(key, togglePane)
49502               .on(uiCmd('⌘' + key), quickSwitch);
49503
49504           uiBackground.hidePane = hidePane;
49505           uiBackground.togglePane = togglePane;
49506           uiBackground.setVisible = setVisible;
49507       }
49508
49509       return background;
49510   }
49511
49512   function uiContributors(context) {
49513       var osm = context.connection(),
49514           debouncedUpdate = debounce(function() { update(); }, 1000),
49515           limit = 4,
49516           hidden = false,
49517           wrap = select(null);
49518
49519
49520       function update() {
49521           if (!osm) return;
49522
49523           var users = {},
49524               entities = context.intersects(context.map().extent());
49525
49526           entities.forEach(function(entity) {
49527               if (entity && entity.user) users[entity.user] = true;
49528           });
49529
49530           var u = Object.keys(users),
49531               subset = u.slice(0, u.length > limit ? limit - 1 : limit);
49532
49533           wrap.html('')
49534               .call(svgIcon('#iD-icon-nearby', 'pre-text light'));
49535
49536           var userList = select(document.createElement('span'));
49537
49538           userList.selectAll()
49539               .data(subset)
49540               .enter()
49541               .append('a')
49542               .attr('class', 'user-link')
49543               .attr('href', function(d) { return osm.userURL(d); })
49544               .attr('target', '_blank')
49545               .attr('tabindex', -1)
49546               .text(String);
49547
49548           if (u.length > limit) {
49549               var count = select(document.createElement('span'));
49550
49551               count.append('a')
49552                   .attr('target', '_blank')
49553                   .attr('tabindex', -1)
49554                   .attr('href', function() {
49555                       return osm.changesetsURL(context.map().center(), context.map().zoom());
49556                   })
49557                   .text(u.length - limit + 1);
49558
49559               wrap.append('span')
49560                   .html(t('contributors.truncated_list', { users: userList.html(), count: count.html() }));
49561
49562           } else {
49563               wrap.append('span')
49564                   .html(t('contributors.list', { users: userList.html() }));
49565           }
49566
49567           if (!u.length) {
49568               hidden = true;
49569               wrap
49570                   .transition()
49571                   .style('opacity', 0);
49572
49573           } else if (hidden) {
49574               wrap
49575                   .transition()
49576                   .style('opacity', 1);
49577           }
49578       }
49579
49580
49581       return function(selection$$1) {
49582           if (!osm) return;
49583           wrap = selection$$1;
49584           update();
49585
49586           osm.on('loaded.contributors', debouncedUpdate);
49587           context.map().on('move.contributors', debouncedUpdate);
49588       };
49589   }
49590
49591   function uiFeatureInfo(context) {
49592       function update(selection$$1) {
49593           var features = context.features(),
49594               stats = features.stats(),
49595               count = 0,
49596               hiddenList = compact(map$3(features.hidden(), function(k) {
49597                   if (stats[k]) {
49598                       count += stats[k];
49599                       return String(stats[k]) + ' ' + t('feature.' + k + '.description');
49600                   }
49601               }));
49602
49603           selection$$1.html('');
49604
49605           if (hiddenList.length) {
49606               var tooltipBehavior = tooltip()
49607                   .placement('top')
49608                   .html(true)
49609                   .title(function() {
49610                       return uiTooltipHtml(hiddenList.join('<br/>'));
49611                   });
49612
49613               var warning = selection$$1.append('a')
49614                   .attr('href', '#')
49615                   .attr('tabindex', -1)
49616                   .html(t('feature_info.hidden_warning', { count: count }))
49617                   .call(tooltipBehavior)
49618                   .on('click', function() {
49619                       tooltipBehavior.hide(warning);
49620                       // open map data panel?
49621                       event.preventDefault();
49622                   });
49623           }
49624
49625           selection$$1
49626               .classed('hide', !hiddenList.length);
49627       }
49628
49629
49630       return function(selection$$1) {
49631           update(selection$$1);
49632
49633           context.features().on('change.feature_info', function() {
49634               update(selection$$1);
49635           });
49636       };
49637   }
49638
49639   function uiFullScreen(context) {
49640       var element = context.container().node();
49641       // var button = d3_select(null);
49642
49643
49644       function getFullScreenFn() {
49645           if (element.requestFullscreen) {
49646               return element.requestFullscreen;
49647           } else if (element.msRequestFullscreen) {
49648               return element.msRequestFullscreen;
49649           } else if (element.mozRequestFullScreen) {
49650               return element.mozRequestFullScreen;
49651           } else if (element.webkitRequestFullscreen) {
49652               return element.webkitRequestFullscreen;
49653           }
49654       }
49655
49656
49657       function getExitFullScreenFn() {
49658           if (document.exitFullscreen) {
49659               return document.exitFullscreen;
49660           } else if (document.msExitFullscreen) {
49661               return document.msExitFullscreen;
49662           } else if (document.mozCancelFullScreen) {
49663               return document.mozCancelFullScreen;
49664           } else if (document.webkitExitFullscreen) {
49665               return document.webkitExitFullscreen;
49666           }
49667       }
49668
49669
49670       function isFullScreen() {
49671           return document.fullscreenElement ||
49672               document.mozFullScreenElement ||
49673               document.webkitFullscreenElement ||
49674               document.msFullscreenElement;
49675       }
49676
49677
49678       function isSupported() {
49679           return !!getFullScreenFn();
49680       }
49681
49682
49683       function fullScreen() {
49684           event.preventDefault();
49685           if (!isFullScreen()) {
49686               // button.classed('active', true);
49687               getFullScreenFn().apply(element);
49688           } else {
49689               // button.classed('active', false);
49690               getExitFullScreenFn().apply(document);
49691           }
49692       }
49693
49694
49695       return function() { // selection) {
49696           if (!isSupported()) return;
49697
49698           // button = selection.append('button')
49699           //     .attr('title', t('full_screen'))
49700           //     .attr('tabindex', -1)
49701           //     .on('click', fullScreen)
49702           //     .call(tooltip);
49703
49704           // button.append('span')
49705           //     .attr('class', 'icon full-screen');
49706
49707           var detected = utilDetect();
49708           var keys = (detected.os === 'mac' ? [uiCmd('⌃⌘F'), 'f11'] : ['f11']);
49709           context.keybinding().on(keys, fullScreen);
49710       };
49711   }
49712
49713   function uiLoading(context) {
49714       var _modalSelection = select(null);
49715       var _message = '';
49716       var _blocking = false;
49717
49718
49719       var loading = function(selection$$1) {
49720           _modalSelection = uiModal(selection$$1, _blocking);
49721
49722           var loadertext = _modalSelection.select('.content')
49723               .classed('loading-modal', true)
49724               .append('div')
49725               .attr('class', 'modal-section fillL');
49726
49727           loadertext
49728               .append('img')
49729               .attr('class', 'loader')
49730               .attr('src', context.imagePath('loader-white.gif'));
49731
49732           loadertext
49733               .append('h3')
49734               .text(_message);
49735
49736           _modalSelection.select('button.close')
49737               .attr('class', 'hide');
49738
49739           return loading;
49740       };
49741
49742
49743       loading.message = function(_) {
49744           if (!arguments.length) return _message;
49745           _message = _;
49746           return loading;
49747       };
49748
49749
49750       loading.blocking = function(_) {
49751           if (!arguments.length) return _blocking;
49752           _blocking = _;
49753           return loading;
49754       };
49755
49756
49757       loading.close = function() {
49758           _modalSelection.remove();
49759       };
49760
49761
49762       return loading;
49763   }
49764
49765   function uiGeolocate(context) {
49766       var geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ };
49767       var locating = uiLoading(context).message(t('geolocate.locating')).blocking(true);
49768       var layer = context.layers().layer('geolocate');
49769       var _position;
49770       var _extent;
49771       var _timeoutID;
49772
49773
49774       function click() {
49775           if (context.inIntro()) return;
49776           context.enter(modeBrowse(context));
49777           if (!layer.enabled()) {
49778               if (!_position) {
49779                   context.container().call(locating);
49780                   navigator.geolocation.getCurrentPosition(success, error, geoOptions);
49781               } else {
49782                   zoomTo();
49783               }
49784           } else {
49785               layer.enabled(null, false);
49786           }
49787           // This timeout ensures that we still call finish() even if
49788           // the user declines to share their location in Firefox
49789           _timeoutID = setTimeout(finish, 10000 /* 10sec */ );
49790       }
49791
49792       function zoomTo() {
49793           var map = context.map();
49794           layer.enabled(_position, true);
49795           map.centerZoomEase(_extent.center(), Math.min(20, map.extentZoom(_extent)));
49796       }
49797
49798
49799       function success(geolocation) {
49800           _position = geolocation;
49801           var coords = _position.coords;
49802           _extent = geoExtent$$1([coords.longitude, coords.latitude]).padByMeters(coords.accuracy);
49803           zoomTo();
49804           finish();
49805       }
49806
49807
49808       function error() {
49809           finish();
49810       }
49811
49812
49813       function finish() {
49814           locating.close();  // unblock ui
49815           if (_timeoutID) { clearTimeout(_timeoutID); }
49816           _timeoutID = undefined;
49817       }
49818
49819
49820       return function(selection) {
49821           if (!navigator.geolocation) return;
49822
49823           selection
49824               .append('button')
49825               .attr('tabindex', -1)
49826               .attr('title', t('geolocate.title'))
49827               .on('click', click)
49828               .call(svgIcon('#iD-icon-geolocate', 'light'))
49829               .call(tooltip()
49830                   .placement((textDirection === 'rtl') ? 'right' : 'left'));
49831       };
49832   }
49833
49834   function uiPanelBackground(context) {
49835       var background = context.background();
49836       var currSourceName = null;
49837       var metadata = {};
49838       var metadataKeys = [
49839           'zoom', 'vintage', 'source', 'description', 'resolution', 'accuracy'
49840       ];
49841
49842       var debouncedRedraw = debounce(redraw, 250);
49843
49844       function redraw(selection$$1) {
49845           var source = background.baseLayerSource();
49846           var isDG = (source.id.match(/^DigitalGlobe/i) !== null);
49847
49848           if (currSourceName !== source.name()) {
49849               currSourceName = source.name();
49850               metadata = {};
49851           }
49852
49853           selection$$1.html('');
49854
49855           var list = selection$$1
49856               .append('ul')
49857               .attr('class', 'background-info');
49858
49859           list
49860               .append('li')
49861               .text(currSourceName);
49862
49863           metadataKeys.forEach(function(k) {
49864               // DigitalGlobe vintage is available in raster layers for now.
49865               if (isDG && k === 'vintage') return;
49866
49867               list
49868                   .append('li')
49869                   .attr('class', 'background-info-list-' + k)
49870                   .classed('hide', !metadata[k])
49871                   .text(t('info_panels.background.' + k) + ':')
49872                   .append('span')
49873                   .attr('class', 'background-info-span-' + k)
49874                   .text(metadata[k]);
49875           });
49876
49877           debouncedGetMetadata(selection$$1);
49878
49879           var toggleTiles = context.getDebug('tile') ? 'hide_tiles' : 'show_tiles';
49880
49881           selection$$1
49882               .append('a')
49883               .text(t('info_panels.background.' + toggleTiles))
49884               .attr('href', '#')
49885               .attr('class', 'button button-toggle-tiles')
49886               .on('click', function() {
49887                   event.preventDefault();
49888                   context.setDebug('tile', !context.getDebug('tile'));
49889                   selection$$1.call(redraw);
49890               });
49891
49892           if (isDG) {
49893               var key = source.id + '-vintage';
49894               var sourceVintage = context.background().findSource(key);
49895               var showsVintage = context.background().showsLayer(sourceVintage);
49896               var toggleVintage = showsVintage ? 'hide_vintage' : 'show_vintage';
49897               selection$$1
49898                   .append('a')
49899                   .text(t('info_panels.background.' + toggleVintage))
49900                   .attr('href', '#')
49901                   .attr('class', 'button button-toggle-vintage')
49902                   .on('click', function() {
49903                       event.preventDefault();
49904                       context.background().toggleOverlayLayer(sourceVintage);
49905                       selection$$1.call(redraw);
49906                   });
49907           }
49908
49909           // disable if necessary
49910           ['DigitalGlobe-Premium', 'DigitalGlobe-Standard'].forEach(function(layerId) {
49911               if (source.id !== layerId) {
49912                   var key = layerId + '-vintage';
49913                   var sourceVintage = context.background().findSource(key);
49914                   if (context.background().showsLayer(sourceVintage)) {
49915                       context.background().toggleOverlayLayer(sourceVintage);
49916                   }
49917               }
49918           });
49919       }
49920
49921
49922       var debouncedGetMetadata = debounce(getMetadata, 250);
49923
49924       function getMetadata(selection$$1) {
49925           var tile = select('.layer-background img.tile-center');   // tile near viewport center
49926           if (tile.empty()) return;
49927
49928           var sourceName = currSourceName,
49929               d = tile.datum(),
49930               zoom = (d && d.length >= 3 && d[2]) || Math.floor(context.map().zoom()),
49931               center = context.map().center();
49932
49933           // update zoom
49934           metadata.zoom = String(zoom);
49935           selection$$1.selectAll('.background-info-list-zoom')
49936               .classed('hide', false)
49937               .selectAll('.background-info-span-zoom')
49938               .text(metadata.zoom);
49939
49940           if (!d || !d.length >= 3) return;
49941
49942           background.baseLayerSource().getMetadata(center, d, function(err, result) {
49943               if (err || currSourceName !== sourceName) return;
49944
49945               // update vintage
49946               var vintage = result.vintage;
49947               metadata.vintage = (vintage && vintage.range) || t('info_panels.background.unknown');
49948               selection$$1.selectAll('.background-info-list-vintage')
49949                   .classed('hide', false)
49950                   .selectAll('.background-info-span-vintage')
49951                   .text(metadata.vintage);
49952
49953               // update other metdata
49954               without(metadataKeys, 'zoom', 'vintage')
49955                   .forEach(function(k) {
49956                       var val = result[k];
49957                       metadata[k] = val;
49958                       selection$$1.selectAll('.background-info-list-' + k)
49959                           .classed('hide', !val)
49960                           .selectAll('.background-info-span-' + k)
49961                           .text(val);
49962                   });
49963           });
49964       }
49965
49966
49967       var panel = function(selection$$1) {
49968           selection$$1.call(redraw);
49969
49970           context.map()
49971               .on('drawn.info-background', function() {
49972                   selection$$1.call(debouncedRedraw);
49973               })
49974               .on('move.info-background', function() {
49975                   selection$$1.call(debouncedGetMetadata);
49976               });
49977
49978       };
49979
49980       panel.off = function() {
49981           context.map()
49982               .on('drawn.info-background', null)
49983               .on('move.info-background', null);
49984       };
49985
49986       panel.id = 'background';
49987       panel.title = t('info_panels.background.title');
49988       panel.key = t('info_panels.background.key');
49989
49990
49991       return panel;
49992   }
49993
49994   function uiPanelHistory(context) {
49995       var osm;
49996
49997       function displayTimestamp(timestamp) {
49998           if (!timestamp) return t('info_panels.history.unknown');
49999           var detected = utilDetect();
50000           var options = {
50001               day: 'numeric', month: 'short', year: 'numeric',
50002               hour: 'numeric', minute: 'numeric', second: 'numeric'
50003           };
50004           var d = new Date(timestamp);
50005           if (isNaN(d.getTime())) return t('info_panels.history.unknown');
50006           return d.toLocaleString(detected.locale, options);
50007       }
50008
50009
50010       function displayUser(selection, userName) {
50011           if (!userName) {
50012               selection
50013                   .append('span')
50014                   .text(t('info_panels.history.unknown'));
50015               return;
50016           }
50017
50018           selection
50019               .append('span')
50020               .attr('class', 'user-name')
50021               .text(userName);
50022
50023           var links = selection
50024               .append('div')
50025               .attr('class', 'links');
50026
50027           if (osm) {
50028               links
50029                   .append('a')
50030                   .attr('class', 'user-osm-link')
50031                   .attr('href', osm.userURL(userName))
50032                   .attr('target', '_blank')
50033                   .attr('tabindex', -1)
50034                   .text('OSM');
50035           }
50036
50037           links
50038               .append('a')
50039               .attr('class', 'user-hdyc-link')
50040               .attr('href', 'https://hdyc.neis-one.org/?' + userName)
50041               .attr('target', '_blank')
50042               .attr('tabindex', -1)
50043               .text('HDYC');
50044       }
50045
50046
50047       function displayChangeset(selection, changeset) {
50048           if (!changeset) {
50049               selection
50050                   .append('span')
50051                   .text(t('info_panels.history.unknown'));
50052               return;
50053           }
50054
50055           selection
50056               .append('span')
50057               .attr('class', 'changeset-id')
50058               .text(changeset);
50059
50060           var links = selection
50061               .append('div')
50062               .attr('class', 'links');
50063
50064           if (osm) {
50065               links
50066                   .append('a')
50067                   .attr('class', 'changeset-osm-link')
50068                   .attr('href', osm.changesetURL(changeset))
50069                   .attr('target', '_blank')
50070                   .attr('tabindex', -1)
50071                   .text('OSM');
50072           }
50073
50074           links
50075               .append('a')
50076               .attr('class', 'changeset-osmcha-link')
50077               .attr('href', 'https://osmcha.mapbox.com/changesets/' + changeset)
50078               .attr('target', '_blank')
50079               .attr('tabindex', -1)
50080               .text('OSMCha');
50081       }
50082
50083
50084       function redraw(selection) {
50085           var selectedNoteID = context.selectedNoteID();
50086           osm = context.connection();
50087
50088           var selected, note, entity;
50089           if (selectedNoteID && osm) {       // selected 1 note
50090               selected = [ t('note.note') + ' ' + selectedNoteID ];
50091               note = osm.getNote(selectedNoteID);
50092           } else {                           // selected 1..n entities
50093               selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); });
50094               if (selected.length) {
50095                   entity = context.entity(selected[0]);
50096               }
50097           }
50098
50099           var singular = selected.length === 1 ? selected[0] : null;
50100
50101           selection.html('');
50102
50103           selection
50104               .append('h4')
50105               .attr('class', 'history-heading')
50106               .text(singular || t('info_panels.history.selected', { n: selected.length }));
50107
50108           if (!singular) return;
50109
50110           if (entity) {
50111               selection.call(redrawEntity, entity);
50112           } else if (note) {
50113               selection.call(redrawNote, note);
50114           }
50115       }
50116
50117
50118       function redrawNote(selection, note) {
50119           if (!note || note.isNew()) {
50120               selection
50121                   .append('div')
50122                   .text(t('info_panels.history.note_no_history'));
50123               return;
50124           }
50125
50126           var list = selection
50127               .append('ul');
50128
50129           list
50130               .append('li')
50131               .text(t('info_panels.history.note_comments') + ':')
50132               .append('span')
50133               .text(note.comments.length);
50134
50135           if (note.comments.length) {
50136               list
50137                   .append('li')
50138                   .text(t('info_panels.history.note_created_date') + ':')
50139                   .append('span')
50140                   .text(displayTimestamp(note.comments[0].date));
50141
50142               list
50143                   .append('li')
50144                   .text(t('info_panels.history.note_created_user') + ':')
50145                   .call(displayUser, note.comments[0].user);
50146           }
50147
50148           if (osm) {
50149               selection
50150                   .append('a')
50151                   .attr('class', 'view-history-on-osm')
50152                   .attr('target', '_blank')
50153                   .attr('tabindex', -1)
50154                   .attr('href', osm.noteURL(note))
50155                   .call(svgIcon('#iD-icon-out-link', 'inline'))
50156                   .append('span')
50157                   .text(t('info_panels.history.note_link_text'));
50158           }
50159       }
50160
50161
50162       function redrawEntity(selection, entity) {
50163           if (!entity || entity.isNew()) {
50164               selection
50165                   .append('div')
50166                   .text(t('info_panels.history.no_history'));
50167               return;
50168           }
50169
50170           var list = selection
50171               .append('ul');
50172
50173           list
50174               .append('li')
50175               .text(t('info_panels.history.version') + ':')
50176               .append('span')
50177               .text(entity.version);
50178
50179           list
50180               .append('li')
50181               .text(t('info_panels.history.last_edit') + ':')
50182               .append('span')
50183               .text(displayTimestamp(entity.timestamp));
50184
50185           list
50186               .append('li')
50187               .text(t('info_panels.history.edited_by') + ':')
50188               .call(displayUser, entity.user);
50189
50190           list
50191               .append('li')
50192               .text(t('info_panels.history.changeset') + ':')
50193               .call(displayChangeset, entity.changeset);
50194
50195           if (osm) {
50196               selection
50197                   .append('a')
50198                   .attr('class', 'view-history-on-osm')
50199                   .attr('target', '_blank')
50200                   .attr('tabindex', -1)
50201                   .attr('href', osm.historyURL(entity))
50202                   .call(svgIcon('#iD-icon-out-link', 'inline'))
50203                   .append('span')
50204                   .text(t('info_panels.history.link_text'));
50205           }
50206       }
50207
50208
50209       var panel = function(selection) {
50210           selection.call(redraw);
50211
50212           context.map()
50213               .on('drawn.info-history', function() {
50214                   selection.call(redraw);
50215               });
50216
50217           context
50218               .on('enter.info-history', function() {
50219                   selection.call(redraw);
50220               });
50221       };
50222
50223       panel.off = function() {
50224           context.map().on('drawn.info-history', null);
50225           context.on('enter.info-history', null);
50226       };
50227
50228       panel.id = 'history';
50229       panel.title = t('info_panels.history.title');
50230       panel.key = t('info_panels.history.key');
50231
50232
50233       return panel;
50234   }
50235
50236   var OSM_PRECISION = 7;
50237   var locale$2 = utilDetect().locale;
50238
50239   /**
50240    * Returns a localized representation of the given length measurement.
50241    *
50242    * @param {Number} m area in meters
50243    * @param {Boolean} isImperial true for U.S. customary units; false for metric
50244    */
50245   function displayLength(m, isImperial) {
50246       var d = m * (isImperial ? 3.28084 : 1);
50247       var unit;
50248
50249       if (isImperial) {
50250           if (d >= 5280) {
50251               d /= 5280;
50252               unit = 'miles';
50253           } else {
50254               unit = 'feet';
50255           }
50256       } else {
50257           if (d >= 1000) {
50258               d /= 1000;
50259               unit = 'kilometers';
50260           } else {
50261               unit = 'meters';
50262           }
50263       }
50264
50265       return t('units.' + unit, {
50266           quantity: d.toLocaleString(locale$2, {
50267               maximumSignificantDigits: 4
50268           })
50269       });
50270   }
50271
50272   /**
50273    * Returns a localized representation of the given area measurement.
50274    *
50275    * @param {Number} m2 area in square meters
50276    * @param {Boolean} isImperial true for U.S. customary units; false for metric
50277    */
50278   function displayArea(m2, isImperial) {
50279       var d = m2 * (isImperial ? 10.7639111056 : 1);
50280       var d1, d2, area;
50281       var unit1 = '';
50282       var unit2 = '';
50283
50284       if (isImperial) {
50285           if (d >= 6969600) { // > 0.25mi² show mi²
50286               d1 = d / 27878400;
50287               unit1 = 'square_miles';
50288           } else {
50289               d1 = d;
50290               unit1 = 'square_feet';
50291           }
50292
50293           if (d > 4356 && d < 43560000) { // 0.1 - 1000 acres
50294               d2 = d / 43560;
50295               unit2 = 'acres';
50296           }
50297
50298       } else {
50299           if (d >= 250000) { // > 0.25km² show km²
50300               d1 = d / 1000000;
50301               unit1 = 'square_kilometers';
50302           } else {
50303               d1 = d;
50304               unit1 = 'square_meters';
50305           }
50306
50307           if (d > 1000 && d < 10000000) { // 0.1 - 1000 hectares
50308               d2 = d / 10000;
50309               unit2 = 'hectares';
50310           }
50311       }
50312
50313       area = t('units.' + unit1, {
50314           quantity: d1.toLocaleString(locale$2, {
50315               maximumSignificantDigits: 4
50316           })
50317       });
50318
50319       if (d2) {
50320           return t('units.area_pair', {
50321               area1: area,
50322               area2: t('units.' + unit2, {
50323                   quantity: d2.toLocaleString(locale$2, {
50324                       maximumSignificantDigits: 2
50325                   })
50326               })
50327           });
50328       } else {
50329           return area;
50330       }
50331   }
50332
50333   function wrap(x, min, max) {
50334       var d = max - min;
50335       return ((x - min) % d + d) % d + min;
50336   }
50337
50338   function clamp$1(x, min, max) {
50339       return Math.max(min, Math.min(x, max));
50340   }
50341
50342   function displayCoordinate(deg, pos, neg) {
50343       var min = (Math.abs(deg) - Math.floor(Math.abs(deg))) * 60;
50344       var sec = (min - Math.floor(min)) * 60;
50345       var displayDegrees = t('units.arcdegrees', {
50346           quantity: Math.floor(Math.abs(deg)).toLocaleString(locale$2)
50347       });
50348       var displayCoordinate;
50349
50350       if (Math.floor(sec) > 0) {
50351           displayCoordinate = displayDegrees +
50352               t('units.arcminutes', {
50353                   quantity: Math.floor(min).toLocaleString(locale$2)
50354               }) +
50355               t('units.arcseconds', {
50356                   quantity: Math.round(sec).toLocaleString(locale$2)
50357               });
50358       } else if (Math.floor(min) > 0) {
50359           displayCoordinate = displayDegrees +
50360               t('units.arcminutes', {
50361                   quantity: Math.round(min).toLocaleString(locale$2)
50362               });
50363       } else {
50364           displayCoordinate = t('units.arcdegrees', {
50365               quantity: Math.round(Math.abs(deg)).toLocaleString(locale$2)
50366           });
50367       }
50368
50369       if (deg === 0) {
50370           return displayCoordinate;
50371       } else {
50372           return t('units.coordinate', {
50373               coordinate: displayCoordinate,
50374               direction: t('units.' + (deg > 0 ? pos : neg))
50375           });
50376       }
50377   }
50378
50379   /**
50380    * Returns given coordinate pair in degree-minute-second format.
50381    *
50382    * @param {Array<Number>} coord longitude and latitude
50383    */
50384   function dmsCoordinatePair(coord) {
50385       return t('units.coordinate_pair', {
50386           latitude: displayCoordinate(clamp$1(coord[1], -90, 90), 'north', 'south'),
50387           longitude: displayCoordinate(wrap(coord[0], -180, 180), 'east', 'west')
50388       });
50389   }
50390
50391   /**
50392    * Returns the given coordinate pair in decimal format.
50393    * note: unlocalized to avoid comma ambiguity - see #4765
50394    *
50395    * @param {Array<Number>} coord longitude and latitude
50396    */
50397   function decimalCoordinatePair(coord) {
50398       return t('units.coordinate_pair', {
50399           latitude: clamp$1(coord[1], -90, 90).toFixed(OSM_PRECISION),
50400           longitude: wrap(coord[0], -180, 180).toFixed(OSM_PRECISION)
50401       });
50402   }
50403
50404   function uiPanelLocation(context) {
50405       var currLocation = '';
50406
50407
50408       function redraw(selection) {
50409           selection.html('');
50410
50411           var list = selection
50412               .append('ul');
50413
50414           // Mouse coordinates
50415           var coord = context.map().mouseCoordinates();
50416           if (coord.some(isNaN)) {
50417               coord = context.map().center();
50418           }
50419
50420           list
50421               .append('li')
50422               .text(dmsCoordinatePair(coord))
50423               .append('li')
50424               .text(decimalCoordinatePair(coord));
50425
50426           // Location Info
50427           selection
50428               .append('div')
50429               .attr('class', 'location-info')
50430               .text(currLocation || ' ');
50431
50432           debouncedGetLocation(selection, coord);
50433       }
50434
50435
50436       var debouncedGetLocation = debounce(getLocation, 250);
50437       function getLocation(selection, coord) {
50438           if (!services.geocoder) {
50439               currLocation = t('info_panels.location.unknown_location');
50440               selection.selectAll('.location-info')
50441                   .text(currLocation);
50442           } else {
50443               services.geocoder.reverse(coord, function(err, result) {
50444                   currLocation = result ? result.display_name : t('info_panels.location.unknown_location');
50445                   selection.selectAll('.location-info')
50446                       .text(currLocation);
50447               });
50448           }
50449       }
50450
50451
50452       var panel = function(selection) {
50453           selection.call(redraw);
50454
50455           context.surface()
50456               .on('mousemove.info-location', function() {
50457                   selection.call(redraw);
50458               });
50459       };
50460
50461       panel.off = function() {
50462           context.surface()
50463               .on('mousemove.info-location', null);
50464       };
50465
50466       panel.id = 'location';
50467       panel.title = t('info_panels.location.title');
50468       panel.key = t('info_panels.location.key');
50469
50470
50471       return panel;
50472   }
50473
50474   function uiPanelMeasurement(context) {
50475       var locale = utilDetect().locale,
50476           isImperial = (locale.toLowerCase() === 'en-us');
50477
50478
50479       function radiansToMeters(r) {
50480           // using WGS84 authalic radius (6371007.1809 m)
50481           return r * 6371007.1809;
50482       }
50483
50484       function steradiansToSqmeters(r) {
50485           // http://gis.stackexchange.com/a/124857/40446
50486           return r / (4 * Math.PI) * 510065621724000;
50487       }
50488
50489
50490       function toLineString(feature) {
50491           if (feature.type === 'LineString') return feature;
50492
50493           var result = { type: 'LineString', coordinates: [] };
50494           if (feature.type === 'Polygon') {
50495               result.coordinates = feature.coordinates[0];
50496           } else if (feature.type === 'MultiPolygon') {
50497               result.coordinates = feature.coordinates[0][0];
50498           }
50499
50500           return result;
50501       }
50502
50503
50504       function nodeCount(feature) {
50505         if (feature.type === 'LineString') return feature.coordinates.length;
50506         if (feature.type === 'Polygon') return feature.coordinates[0].length - 1;
50507       }
50508
50509
50510       function redraw(selection$$1) {
50511           var resolver = context.graph();
50512           var selectedNoteID = context.selectedNoteID();
50513           var osm = services.osm;
50514
50515           var selected, center, entity, note, geometry;
50516
50517           if (selectedNoteID && osm) {       // selected 1 note
50518               selected = [ t('note.note') + ' ' + selectedNoteID ];
50519               note = osm.getNote(selectedNoteID);
50520               center = note.loc;
50521               geometry = 'note';
50522
50523           } else {                           // selected 1..n entities
50524               var extent = geoExtent$$1();
50525               selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); });
50526               if (selected.length) {
50527                   for (var i = 0; i < selected.length; i++) {
50528                       entity = context.entity(selected[i]);
50529                       extent._extend(entity.extent(resolver));
50530                   }
50531                   center = extent.center();
50532                   geometry = entity.geometry(resolver);
50533               }
50534           }
50535
50536           var singular = selected.length === 1 ? selected[0] : null;
50537
50538           selection$$1.html('');
50539
50540           selection$$1
50541               .append('h4')
50542               .attr('class', 'measurement-heading')
50543               .text(singular || t('info_panels.measurement.selected', { n: selected.length.toLocaleString(locale) }));
50544
50545           if (!selected.length) return;
50546
50547
50548           var list = selection$$1
50549               .append('ul');
50550           var coordItem;
50551
50552           // multiple selected features, just display extent center..
50553           if (!singular) {
50554               coordItem = list
50555                   .append('li')
50556                   .text(t('info_panels.measurement.center') + ':');
50557               coordItem.append('span')
50558                   .text(dmsCoordinatePair(center));
50559               coordItem.append('span')
50560                   .text(decimalCoordinatePair(center));
50561               return;
50562           }
50563
50564           // single selected feature, display details..
50565           if (geometry === 'line' || geometry === 'area') {
50566               var closed = (entity.type === 'relation') || (entity.isClosed() && !entity.isDegenerate());
50567               var feature = entity.asGeoJSON(resolver);
50568               var length = radiansToMeters(length$1(toLineString(feature)));
50569               var lengthLabel = t('info_panels.measurement.' + (closed ? 'perimeter' : 'length'));
50570               var centroid = d3_geoCentroid(feature);
50571
50572               list
50573                   .append('li')
50574                   .text(t('info_panels.measurement.geometry') + ':')
50575                   .append('span')
50576                   .text(
50577                       closed ? t('info_panels.measurement.closed_' + geometry) : t('geometry.' + geometry)
50578                   );
50579
50580               if (entity.type !== 'relation') {
50581                   list
50582                       .append('li')
50583                       .text(t('info_panels.measurement.node_count') + ':')
50584                       .append('span')
50585                       .text(nodeCount(feature).toLocaleString(locale));
50586               }
50587
50588               if (closed) {
50589                   var area = steradiansToSqmeters(entity.area(resolver));
50590                   list
50591                       .append('li')
50592                       .text(t('info_panels.measurement.area') + ':')
50593                       .append('span')
50594                       .text(displayArea(area, isImperial));
50595               }
50596
50597
50598               list
50599                   .append('li')
50600                   .text(lengthLabel + ':')
50601                   .append('span')
50602                   .text(displayLength(length, isImperial));
50603
50604               coordItem = list
50605                   .append('li')
50606                   .text(t('info_panels.measurement.centroid') + ':');
50607               coordItem.append('span')
50608                   .text(dmsCoordinatePair(centroid));
50609               coordItem.append('span')
50610                   .text(decimalCoordinatePair(centroid));
50611
50612               var toggle  = isImperial ? 'imperial' : 'metric';
50613
50614               selection$$1
50615                   .append('a')
50616                   .text(t('info_panels.measurement.' + toggle))
50617                   .attr('href', '#')
50618                   .attr('class', 'button button-toggle-units')
50619                   .on('click', function() {
50620                       event.preventDefault();
50621                       isImperial = !isImperial;
50622                       selection$$1.call(redraw);
50623                   });
50624
50625           } else {
50626               var centerLabel = t('info_panels.measurement.' +
50627                   (note || entity.type === 'node' ? 'location' : 'center'));
50628
50629               list
50630                   .append('li')
50631                   .text(t('info_panels.measurement.geometry') + ':')
50632                   .append('span')
50633                   .text(t('geometry.' + geometry));
50634
50635               coordItem = list
50636                   .append('li')
50637                   .text(centerLabel + ':');
50638               coordItem.append('span')
50639                   .text(dmsCoordinatePair(center));
50640               coordItem.append('span')
50641                   .text(decimalCoordinatePair(center));
50642           }
50643       }
50644
50645
50646       var panel = function(selection$$1) {
50647           selection$$1.call(redraw);
50648
50649           context.map()
50650               .on('drawn.info-measurement', function() {
50651                   selection$$1.call(redraw);
50652               });
50653
50654           context
50655               .on('enter.info-measurement', function() {
50656                   selection$$1.call(redraw);
50657               });
50658       };
50659
50660       panel.off = function() {
50661           context.map().on('drawn.info-measurement', null);
50662           context.on('enter.info-measurement', null);
50663       };
50664
50665       panel.id = 'measurement';
50666       panel.title = t('info_panels.measurement.title');
50667       panel.key = t('info_panels.measurement.key');
50668
50669
50670       return panel;
50671   }
50672
50673   var uiInfoPanels = {
50674       background: uiPanelBackground,
50675       history: uiPanelHistory,
50676       location: uiPanelLocation,
50677       measurement: uiPanelMeasurement,
50678   };
50679
50680   function uiInfo(context) {
50681       var ids = Object.keys(uiInfoPanels);
50682       var wasActive = ['measurement'];
50683       var panels = {};
50684       var active = {};
50685
50686       // create panels
50687       ids.forEach(function(k) {
50688           if (!panels[k]) {
50689               panels[k] = uiInfoPanels[k](context);
50690               active[k] = false;
50691           }
50692       });
50693
50694
50695       function info(selection$$1) {
50696
50697           function redraw() {
50698               var activeids = ids.filter(function(k) { return active[k]; }).sort();
50699
50700               var containers = infoPanels.selectAll('.panel-container')
50701                   .data(activeids, function(k) { return k; });
50702
50703               containers.exit()
50704                   .style('opacity', 1)
50705                   .transition()
50706                   .duration(200)
50707                   .style('opacity', 0)
50708                   .on('end', function(d) {
50709                       select(this)
50710                           .call(panels[d].off)
50711                           .remove();
50712                   });
50713
50714               var enter = containers.enter()
50715                   .append('div')
50716                   .attr('class', function(d) { return 'fillD2 panel-container panel-container-' + d; });
50717
50718               enter
50719                   .style('opacity', 0)
50720                   .transition()
50721                   .duration(200)
50722                   .style('opacity', 1);
50723
50724               var title = enter
50725                   .append('div')
50726                   .attr('class', 'panel-title fillD2');
50727
50728               title
50729                   .append('h3')
50730                   .text(function(d) { return panels[d].title; });
50731
50732               title
50733                   .append('button')
50734                   .attr('class', 'close')
50735                   .on('click', function (d) { toggle(d); })
50736                   .call(svgIcon('#iD-icon-close'));
50737
50738               enter
50739                   .append('div')
50740                   .attr('class', function(d) { return 'panel-content panel-content-' + d; });
50741
50742
50743               // redraw the panels
50744               infoPanels.selectAll('.panel-content')
50745                   .each(function(d) {
50746                       select(this).call(panels[d]);
50747                   });
50748           }
50749
50750
50751           function toggle(which) {
50752               if (event) {
50753                   event.stopImmediatePropagation();
50754                   event.preventDefault();
50755               }
50756
50757               var activeids = ids.filter(function(k) { return active[k]; });
50758
50759               if (which) {  // toggle one
50760                   active[which] = !active[which];
50761                   if (activeids.length === 1 && activeids[0] === which) {  // none active anymore
50762                       wasActive = [which];
50763                   }
50764               } else {      // toggle all
50765                   if (activeids.length) {
50766                       wasActive = activeids;
50767                       activeids.forEach(function(k) { active[k] = false; });
50768                   } else {
50769                       wasActive.forEach(function(k) { active[k] = true; });
50770                   }
50771               }
50772
50773               redraw();
50774           }
50775
50776
50777           var infoPanels = selection$$1.selectAll('.info-panels')
50778               .data([0]);
50779
50780           infoPanels = infoPanels.enter()
50781               .append('div')
50782               .attr('class', 'info-panels')
50783               .merge(infoPanels);
50784
50785           redraw();
50786
50787           context.keybinding()
50788               .on(uiCmd('⌘' + t('info_panels.key')), toggle);
50789
50790           ids.forEach(function(k) {
50791               var key = t('info_panels.' + k + '.key', { default: null });
50792               if (!key) return;
50793               context.keybinding()
50794                   .on(uiCmd('⌘⇧' + key), function() { toggle(k); });
50795           });
50796       }
50797
50798       return info;
50799   }
50800
50801   function uiModes(context) {
50802       var modes = [
50803           modeAddPoint$$1(context),
50804           modeAddLine$$1(context),
50805           modeAddArea$$1(context),
50806           modeAddNote$$1(context)
50807       ];
50808
50809
50810       function enabled(d) {
50811           if (d.id === 'add-note') {
50812               return notesEnabled() && notesEditable();
50813           } else {
50814               return osmEditable();
50815           }
50816       }
50817
50818       function osmEditable() {
50819           var mode = context.mode();
50820           return context.editable() && mode && mode.id !== 'save';
50821       }
50822
50823       function notesEnabled() {
50824           var noteLayer = context.layers().layer('notes');
50825           return noteLayer && noteLayer.enabled();
50826       }
50827
50828       function notesEditable() {
50829           var mode = context.mode();
50830           return context.map().notesEditable() && mode && mode.id !== 'save';
50831       }
50832
50833
50834       return function(selection$$1) {
50835           context
50836               .on('enter.editor', function(entered) {
50837                   selection$$1.selectAll('button.add-button')
50838                       .classed('active', function(mode) { return entered.button === mode.button; });
50839                   context.container()
50840                       .classed('mode-' + entered.id, true);
50841               });
50842
50843           context
50844               .on('exit.editor', function(exited) {
50845                   context.container()
50846                       .classed('mode-' + exited.id, false);
50847               });
50848
50849           modes.forEach(function(mode) {
50850               context.keybinding().on(mode.key, function() {
50851                   if (!enabled(mode)) return;
50852
50853                   if (mode.id === context.mode().id) {
50854                       context.enter(modeBrowse(context));
50855                   } else {
50856                       context.enter(mode);
50857                   }
50858               });
50859           });
50860
50861
50862           var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
50863
50864           context.map()
50865               .on('move.modes', debouncedUpdate)
50866               .on('drawn.modes', debouncedUpdate);
50867
50868           context
50869               .on('enter.modes', update);
50870
50871           update();
50872
50873
50874           function update() {
50875               var showNotes = notesEnabled();
50876               var data = showNotes ? modes : modes.slice(0, 3);
50877
50878               var buttons = selection$$1.selectAll('button.add-button')
50879                   .data(data, function(d) { return d.id; });
50880
50881               // exit
50882               buttons.exit()
50883                   .remove();
50884
50885               // enter
50886               var buttonsEnter = buttons.enter()
50887                   .append('button')
50888                   .attr('tabindex', -1)
50889                   .attr('class', function(d) { return d.id + ' add-button'; })
50890                   .on('click.mode-buttons', function(d) {
50891                       if (!enabled(d)) return;
50892
50893                       // When drawing, ignore accidental clicks on mode buttons - #4042
50894                       var currMode = context.mode().id;
50895                       if (/^draw/.test(currMode)) return;
50896
50897                       if (d.id === currMode) {
50898                           context.enter(modeBrowse(context));
50899                       } else {
50900                           context.enter(d);
50901                       }
50902                   })
50903                   .call(tooltip()
50904                       .placement('bottom')
50905                       .html(true)
50906                       .title(function(d) { return uiTooltipHtml(d.description, d.key); })
50907                   );
50908
50909               buttonsEnter
50910                   .each(function(d) {
50911                       select(this)
50912                           .call(svgIcon('#iD-icon-' + d.button));
50913                   });
50914
50915               buttonsEnter
50916                   .append('span')
50917                   .attr('class', 'label')
50918                   .text(function(mode) { return mode.title; });
50919
50920               // if we are adding/removing the buttons, check if toolbar has overflowed
50921               if (buttons.enter().size() || buttons.exit().size()) {
50922                   context.ui().checkOverflow('#bar', true);
50923               }
50924
50925               // update
50926               buttons = buttons
50927                   .merge(buttonsEnter)
50928                   .classed('disabled', function(d) { return !enabled(d); });
50929           }
50930       };
50931   }
50932
50933   function uiNotice(context) {
50934
50935       return function(selection$$1) {
50936           var div = selection$$1
50937               .append('div')
50938               .attr('class', 'notice');
50939
50940           var button = div
50941               .append('button')
50942               .attr('class', 'zoom-to notice fillD')
50943               .on('click', function() {
50944                   context.map().zoomEase(context.minEditableZoom());
50945               })
50946               .on('wheel', function() {   // let wheel events pass through #4482
50947                   var e2 = new WheelEvent(event.type, event);
50948                   context.surface().node().dispatchEvent(e2);
50949               });
50950
50951           button
50952               .call(svgIcon('#iD-icon-plus', 'pre-text'))
50953               .append('span')
50954               .attr('class', 'label')
50955               .text(t('zoom_in_edit'));
50956
50957
50958           function disableTooHigh() {
50959               var canEdit = context.map().zoom() >= context.minEditableZoom();
50960               div.style('display', canEdit ? 'none' : 'block');
50961           }
50962
50963           context.map()
50964               .on('move.notice', debounce(disableTooHigh, 500));
50965
50966           disableTooHigh();
50967       };
50968   }
50969
50970   function uiPhotoviewer(context) {
50971
50972       var dispatch$$1 = dispatch('resize');
50973
50974       function photoviewer(selection$$1) {
50975           selection$$1
50976               .append('button')
50977               .attr('class', 'thumb-hide')
50978               .on('click', function () {
50979                   if (services.streetside) { services.streetside.hideViewer(); }
50980                   if (services.mapillary) { services.mapillary.hideViewer(); }
50981                   if (services.openstreetcam) { services.openstreetcam.hideViewer(); }
50982               })
50983               .append('div')
50984               .call(svgIcon('#iD-icon-close'));
50985
50986           selection$$1
50987               .append('button')
50988               .attr('class', 'resize-handle-xy')
50989               .on(
50990                   'mousedown',
50991                   buildResizeListener(selection$$1, 'resize', dispatch$$1, { resizeOnX: true, resizeOnY: true })
50992               );
50993
50994           selection$$1
50995               .append('button')
50996               .attr('class', 'resize-handle-x')
50997               .on(
50998                   'mousedown',
50999                   buildResizeListener(selection$$1, 'resize', dispatch$$1, { resizeOnX: true })
51000               );
51001
51002           selection$$1
51003               .append('button')
51004               .attr('class', 'resize-handle-y')
51005               .on(
51006                   'mousedown',
51007                   buildResizeListener(selection$$1, 'resize', dispatch$$1, { resizeOnY: true })
51008               );
51009
51010
51011           function buildResizeListener(target, eventName, dispatch$$1, options) {
51012               var resizeOnX = !!options.resizeOnX;
51013               var resizeOnY = !!options.resizeOnY;
51014               var minHeight = options.minHeight || 240;
51015               var minWidth = options.minWidth || 320;
51016               var startX;
51017               var startY;
51018               var startWidth;
51019               var startHeight;
51020
51021               function startResize() {
51022                   var mapSize = context.map().dimensions();
51023
51024                   if (resizeOnX) {
51025                       var maxWidth = mapSize[0];
51026                       var newWidth = clamp((startWidth + event.clientX - startX), minWidth, maxWidth);
51027                       target.style('width', newWidth + 'px');
51028                   }
51029
51030                   if (resizeOnY) {
51031                       var maxHeight = mapSize[1] - 90;  // preserve space at top/bottom of map
51032                       var newHeight = clamp((startHeight + startY - event.clientY), minHeight, maxHeight);
51033                       target.style('height', newHeight + 'px');
51034                   }
51035
51036                   dispatch$$1.call(eventName, target, utilGetDimensions(target, true));
51037               }
51038
51039               function clamp(num, min, max) {
51040                   return Math.max(min, Math.min(num, max));
51041               }
51042
51043               function stopResize() {
51044                   select(window)
51045                       .on('.' + eventName, null);
51046               }
51047
51048               return function initResize() {
51049                   startX = event.clientX;
51050                   startY = event.clientY;
51051                   startWidth = target.node().getBoundingClientRect().width;
51052                   startHeight = target.node().getBoundingClientRect().height;
51053
51054                   select(window)
51055                       .on('mousemove.' + eventName, startResize, false)
51056                       .on('mouseup.' + eventName, stopResize, false);
51057               };
51058           }
51059       }
51060
51061       photoviewer.onMapResize = function() {
51062           var photoviewer = select('#photoviewer');
51063           var content = select('#content');
51064           var mapDimensions = utilGetDimensions(content, true);
51065           // shrink photo viewer if it is too big
51066           // (-90 preserves space at top and bottom of map used by menus)
51067           var photoDimensions = utilGetDimensions(photoviewer, true);
51068           if (photoDimensions[0] > mapDimensions[0] || photoDimensions[1] > (mapDimensions[1] - 90)) {
51069               var setPhotoDimensions = [
51070                   Math.min(photoDimensions[0], mapDimensions[0]),
51071                   Math.min(photoDimensions[1], mapDimensions[1] - 90),
51072               ];
51073
51074               photoviewer
51075                   .style('width', setPhotoDimensions[0] + 'px')
51076                   .style('height', setPhotoDimensions[1] + 'px');
51077
51078               dispatch$$1.call('resize', photoviewer, setPhotoDimensions);
51079           }
51080       };
51081
51082       return utilRebind(photoviewer, dispatch$$1, 'on');
51083   }
51084
51085   function uiRestore(context) {
51086
51087       return function(selection) {
51088           if (!context.history().lock() || !context.history().restorableChanges())
51089               return;
51090
51091           var modalSelection = uiModal(selection, true);
51092
51093           modalSelection.select('.modal')
51094               .attr('class', 'modal fillL col6');
51095
51096           var introModal = modalSelection.select('.content');
51097
51098           introModal
51099               .attr('class','cf');
51100
51101           introModal
51102               .append('div')
51103               .attr('class', 'modal-section')
51104               .append('h3')
51105               .text(t('restore.heading'));
51106
51107           introModal
51108               .append('div')
51109               .attr('class','modal-section')
51110               .append('p')
51111               .text(t('restore.description'));
51112
51113           var buttonWrap = introModal
51114               .append('div')
51115               .attr('class', 'modal-actions cf');
51116
51117           var restore = buttonWrap
51118               .append('button')
51119               .attr('class', 'restore col6')
51120               .on('click', function() {
51121                   context.history().restore();
51122                   modalSelection.remove();
51123               });
51124
51125           restore
51126               .append('svg')
51127               .attr('class', 'logo logo-restore')
51128               .append('use')
51129               .attr('xlink:href', '#iD-logo-restore');
51130
51131           restore
51132               .append('div')
51133               .text(t('restore.restore'));
51134
51135           var reset = buttonWrap
51136               .append('button')
51137               .attr('class', 'reset col6')
51138               .on('click', function() {
51139                   context.history().clearSaved();
51140                   modalSelection.remove();
51141               });
51142
51143           reset
51144               .append('svg')
51145               .attr('class', 'logo logo-reset')
51146               .append('use')
51147               .attr('xlink:href', '#iD-logo-reset');
51148
51149           reset
51150               .append('div')
51151               .text(t('restore.reset'));
51152
51153           restore.node().focus();
51154       };
51155   }
51156
51157   function uiSave(context) {
51158       var history = context.history();
51159       var key = uiCmd('⌘S');
51160       var _numChanges = 0;
51161
51162
51163       return function(selection$$1) {
51164
51165
51166           function isSaving() {
51167               var mode = context.mode();
51168               return mode && mode.id === 'save';
51169           }
51170
51171
51172           function isDisabled() {
51173               return _numChanges === 0 || isSaving();
51174           }
51175
51176
51177           function save() {
51178               event.preventDefault();
51179               if (!context.inIntro() && !isSaving() && history.hasChanges()) {
51180                   context.enter(modeSave$$1(context));
51181               }
51182           }
51183
51184
51185           function bgColor() {
51186               var step;
51187               if (_numChanges === 0) {
51188                   return null;
51189               } else if (_numChanges <= 50) {
51190                   step = _numChanges / 50;
51191                   return interpolateRgb('#fff', '#ff8')(step);  // white -> yellow
51192               } else {
51193                   step = Math.min((_numChanges - 50) / 50, 1.0);
51194                   return interpolateRgb('#ff8', '#f88')(step);  // yellow -> red
51195               }
51196           }
51197
51198
51199           function updateCount() {
51200               var val = history.difference().summary().length;
51201               if (val === _numChanges) return;
51202               _numChanges = val;
51203
51204               tooltipBehavior
51205                   .title(uiTooltipHtml(
51206                       t(_numChanges > 0 ? 'save.help' : 'save.no_changes'), key)
51207                   );
51208
51209               button
51210                   .classed('disabled', isDisabled())
51211                   .style('background', bgColor(_numChanges));
51212
51213               button.select('span.count')
51214                   .text(_numChanges);
51215           }
51216
51217
51218           var tooltipBehavior = tooltip()
51219               .placement('bottom')
51220               .html(true)
51221               .title(uiTooltipHtml(t('save.no_changes'), key));
51222
51223           var button = selection$$1
51224               .append('button')
51225               .attr('class', 'save disabled')
51226               .attr('tabindex', -1)
51227               .on('click', save)
51228               .call(tooltipBehavior);
51229
51230           button
51231               .call(svgIcon('#iD-icon-save'));
51232
51233           button
51234               .append('span')
51235               .attr('class', 'label')
51236               .text(t('save.title'));
51237
51238           button
51239               .append('span')
51240               .attr('class', 'count')
51241               .text('0');
51242
51243           updateCount();
51244
51245
51246           context.keybinding()
51247               .on(key, save, true);
51248
51249           context.history()
51250               .on('change.save', updateCount);
51251
51252           context
51253               .on('enter.save', function() {
51254                   button
51255                       .classed('disabled', isDisabled());
51256
51257                   if (isSaving()) {
51258                       button.call(tooltipBehavior.hide);
51259                   }
51260               });
51261       };
51262   }
51263
51264   function uiScale(context) {
51265       var projection = context.projection,
51266           isImperial = (utilDetect().locale.toLowerCase() === 'en-us'),
51267           maxLength = 180,
51268           tickHeight = 8;
51269
51270
51271       function scaleDefs(loc1, loc2) {
51272           var lat = (loc2[1] + loc1[1]) / 2,
51273               conversion = (isImperial ? 3.28084 : 1),
51274               dist = geoLonToMeters(loc2[0] - loc1[0], lat) * conversion,
51275               scale = { dist: 0, px: 0, text: '' },
51276               buckets, i, val, dLon;
51277
51278           if (isImperial) {
51279               buckets = [5280000, 528000, 52800, 5280, 500, 50, 5, 1];
51280           } else {
51281               buckets = [5000000, 500000, 50000, 5000, 500, 50, 5, 1];
51282           }
51283
51284           // determine a user-friendly endpoint for the scale
51285           for (i = 0; i < buckets.length; i++) {
51286               val = buckets[i];
51287               if (dist >= val) {
51288                   scale.dist = Math.floor(dist / val) * val;
51289                   break;
51290               } else {
51291                   scale.dist = +dist.toFixed(2);
51292               }
51293           }
51294
51295           dLon = geoMetersToLon(scale.dist / conversion, lat);
51296           scale.px = Math.round(projection([loc1[0] + dLon, loc1[1]])[0]);
51297
51298           scale.text = displayLength(scale.dist / conversion, isImperial);
51299
51300           return scale;
51301       }
51302
51303
51304       function update(selection) {
51305           // choose loc1, loc2 along bottom of viewport (near where the scale will be drawn)
51306           var dims = context.map().dimensions(),
51307               loc1 = projection.invert([0, dims[1]]),
51308               loc2 = projection.invert([maxLength, dims[1]]),
51309               scale = scaleDefs(loc1, loc2);
51310
51311           selection.select('#scale-path')
51312               .attr('d', 'M0.5,0.5v' + tickHeight + 'h' + scale.px + 'v-' + tickHeight);
51313
51314           selection.select('#scale-textgroup')
51315               .attr('transform', 'translate(' + (scale.px + 8) + ',' + tickHeight + ')');
51316
51317           selection.select('#scale-text')
51318               .text(scale.text);
51319       }
51320
51321
51322       return function(selection) {
51323           function switchUnits() {
51324               isImperial = !isImperial;
51325               selection.call(update);
51326           }
51327
51328           var scalegroup = selection.append('svg')
51329               .attr('id', 'scale')
51330               .on('click', switchUnits)
51331               .append('g')
51332               .attr('transform', 'translate(10,11)');
51333
51334           scalegroup
51335               .append('path')
51336               .attr('id', 'scale-path');
51337
51338           scalegroup
51339               .append('g')
51340               .attr('id', 'scale-textgroup')
51341               .append('text')
51342               .attr('id', 'scale-text');
51343
51344           selection.call(update);
51345
51346           context.map().on('move.scale', function() {
51347               update(selection);
51348           });
51349       };
51350   }
51351
51352   function uiSidebar$$1(context) {
51353       var inspector = uiInspector(context);
51354       var dataEditor = uiDataEditor$$1(context);
51355       var noteEditor = uiNoteEditor$$1(context);
51356       var keepRightEditor = uiKeepRightEditor$$1(context);
51357       var _current;
51358       var _wasData = false;
51359       var _wasNote = false;
51360       var _wasKRError = false;
51361
51362
51363       function sidebar(selection$$1) {
51364           var container = select('#id-container');
51365           var minWidth = 280;
51366           var sidebarWidth;
51367           var containerWidth;
51368           var dragOffset;
51369
51370           var resizer = selection$$1
51371               .append('div')
51372               .attr('id', 'sidebar-resizer');
51373
51374           // Set the initial width constraints
51375           selection$$1
51376               .style('min-width', minWidth + 'px')
51377               .style('max-width', '400px')
51378               .style('width', '33.3333%');
51379
51380           resizer.call(d3_drag()
51381               .container(container.node())
51382               .on('start', function() {
51383                   // offset from edge of sidebar-resizer
51384                   dragOffset = event.sourceEvent.offsetX - 1;
51385
51386                   sidebarWidth = selection$$1.node().getBoundingClientRect().width;
51387                   containerWidth = container.node().getBoundingClientRect().width;
51388                   var widthPct = (sidebarWidth / containerWidth) * 100;
51389                   selection$$1
51390                       .style('width', widthPct + '%')    // lock in current width
51391                       .style('max-width', '85%');        // but allow larger widths
51392
51393                   resizer.classed('dragging', true);
51394               })
51395               .on('drag', function() {
51396                   var isRTL = (textDirection === 'rtl');
51397                   var xMarginProperty = isRTL ? 'margin-right' : 'margin-left';
51398
51399                   var x = event.x - dragOffset;
51400                   sidebarWidth = isRTL ? containerWidth - x : x;
51401
51402                   var isCollapsed = selection$$1.classed('collapsed');
51403                   var shouldCollapse = sidebarWidth < minWidth;
51404
51405                   selection$$1.classed('collapsed', shouldCollapse);
51406
51407                   if (shouldCollapse) {
51408                       if (!isCollapsed) {
51409                           selection$$1
51410                               .style(xMarginProperty, '-400px')
51411                               .style('width', '400px');
51412
51413                           context.ui().onResize([sidebarWidth - event.dx, 0]);
51414                       }
51415
51416                   } else {
51417                       var widthPct = (sidebarWidth / containerWidth) * 100;
51418                       selection$$1
51419                           .style(xMarginProperty, null)
51420                           .style('width', widthPct + '%');
51421
51422                       if (isCollapsed) {
51423                           context.ui().onResize([-sidebarWidth, 0]);
51424                       } else {
51425                           context.ui().onResize([-event.dx, 0]);
51426                       }
51427                   }
51428               })
51429               .on('end', function() {
51430                   resizer.classed('dragging', false);
51431               })
51432           );
51433
51434           var featureListWrap = selection$$1
51435               .append('div')
51436               .attr('class', 'feature-list-pane')
51437               .call(uiFeatureList(context));
51438
51439           var inspectorWrap = selection$$1
51440               .append('div')
51441               .attr('class', 'inspector-hidden inspector-wrap fr');
51442
51443
51444           function hover(datum) {
51445               if (datum && datum.__featurehash__) {   // hovering on data
51446                   _wasData = true;
51447                   sidebar
51448                       .show(dataEditor.datum(datum));
51449
51450                   selection$$1.selectAll('.sidebar-component')
51451                       .classed('inspector-hover', true);
51452
51453               } else if (datum instanceof osmNote) {
51454                   if (context.mode().id === 'drag-note') return;
51455                   _wasNote = true;
51456
51457                   var osm = services.osm;
51458                   if (osm) {
51459                       datum = osm.getNote(datum.id);   // marker may contain stale data - get latest
51460                   }
51461
51462                   sidebar
51463                       .show(noteEditor.note(datum));
51464
51465                   selection$$1.selectAll('.sidebar-component')
51466                       .classed('inspector-hover', true);
51467
51468               } else if (datum instanceof krError) {
51469                   _wasKRError = true;
51470
51471                   var keepRight = services.keepRight;
51472                   if (keepRight) {
51473                       datum = keepRight.getError(datum.id);   // marker may contain stale data - get latest
51474                   }
51475
51476                   d3_selectAll('.kr_error')
51477                       .classed('hover', function(d) { return d.id === datum.id; });
51478
51479                   sidebar
51480                       .show(keepRightEditor.error(datum));
51481
51482                   selection$$1.selectAll('.sidebar-component')
51483                       .classed('inspector-hover', true);
51484
51485               } else if (!_current && (datum instanceof osmEntity$$1)) {
51486                   featureListWrap
51487                       .classed('inspector-hidden', true);
51488
51489                   inspectorWrap
51490                       .classed('inspector-hidden', false)
51491                       .classed('inspector-hover', true);
51492
51493                   if (inspector.entityID() !== datum.id || inspector.state() !== 'hover') {
51494                       inspector
51495                           .state('hover')
51496                           .entityID(datum.id);
51497
51498                       inspectorWrap
51499                           .call(inspector);
51500                   }
51501
51502               } else if (!_current) {
51503                   featureListWrap
51504                       .classed('inspector-hidden', false);
51505                   inspectorWrap
51506                       .classed('inspector-hidden', true);
51507                   inspector
51508                       .state('hide');
51509
51510               } else if (_wasData || _wasNote || _wasKRError) {
51511                   _wasNote = false;
51512                   _wasData = false;
51513                   _wasKRError = false;
51514                   d3_selectAll('.note').classed('hover', false);
51515                   d3_selectAll('.kr_error').classed('hover', false);
51516                   sidebar.hide();
51517               }
51518           }
51519
51520
51521           sidebar.hover = throttle(hover, 200);
51522
51523
51524           sidebar.intersects = function(extent) {
51525               var rect = selection$$1.node().getBoundingClientRect();
51526               return extent.intersects([
51527                   context.projection.invert([0, rect.height]),
51528                   context.projection.invert([rect.width, 0])
51529               ]);
51530           };
51531
51532
51533           sidebar.select = function(id, newFeature) {
51534               sidebar.hide();
51535
51536               if (id) {
51537                   // uncollapse the sidebar
51538                   if (selection$$1.classed('collapsed')) {
51539                       var entity = context.entity(id);
51540                       var extent = entity.extent(context.graph());
51541                       sidebar.expand(sidebar.intersects(extent));
51542                   }
51543
51544                   featureListWrap
51545                       .classed('inspector-hidden', true);
51546
51547                   inspectorWrap
51548                       .classed('inspector-hidden', false)
51549                       .classed('inspector-hover', false);
51550
51551                   if (inspector.entityID() !== id || inspector.state() !== 'select') {
51552                       inspector
51553                           .state('select')
51554                           .entityID(id)
51555                           .newFeature(newFeature);
51556
51557                       inspectorWrap
51558                           .call(inspector, newFeature);
51559                   }
51560
51561               } else {
51562                   inspector
51563                       .state('hide');
51564               }
51565           };
51566
51567
51568           sidebar.show = function(component, element) {
51569               featureListWrap
51570                   .classed('inspector-hidden', true);
51571               inspectorWrap
51572                   .classed('inspector-hidden', true);
51573
51574               if (_current) _current.remove();
51575               _current = selection$$1
51576                   .append('div')
51577                   .attr('class', 'sidebar-component')
51578                   .call(component, element);
51579           };
51580
51581
51582           sidebar.hide = function() {
51583               featureListWrap
51584                   .classed('inspector-hidden', false);
51585               inspectorWrap
51586                   .classed('inspector-hidden', true);
51587
51588               if (_current) _current.remove();
51589               _current = null;
51590           };
51591
51592
51593           sidebar.expand = function(moveMap) {
51594               if (selection$$1.classed('collapsed')) {
51595                   sidebar.toggle(moveMap);
51596               }
51597           };
51598
51599
51600           sidebar.collapse = function(moveMap) {
51601               if (!selection$$1.classed('collapsed')) {
51602                   sidebar.toggle(moveMap);
51603               }
51604           };
51605
51606
51607           sidebar.toggle = function(moveMap) {
51608               var e = event;
51609               if (e && e.sourceEvent) {
51610                   e.sourceEvent.preventDefault();
51611               } else if (e) {
51612                   e.preventDefault();
51613               }
51614
51615               // Don't allow sidebar to toggle when the user is in the walkthrough.
51616               if (context.inIntro()) return;
51617
51618               var isCollapsed = selection$$1.classed('collapsed');
51619               var isCollapsing = !isCollapsed;
51620               var xMarginProperty = textDirection === 'rtl' ? 'margin-right' : 'margin-left';
51621
51622               sidebarWidth = selection$$1.node().getBoundingClientRect().width;
51623
51624               // switch from % to px
51625               selection$$1.style('width', sidebarWidth + 'px');
51626
51627               var startMargin, endMargin, lastMargin;
51628               if (isCollapsing) {
51629                   startMargin = lastMargin = 0;
51630                   endMargin = -sidebarWidth;
51631               } else {
51632                   startMargin = lastMargin = -sidebarWidth;
51633                   endMargin = 0;
51634               }
51635
51636               selection$$1.transition()
51637                   .style(xMarginProperty, endMargin + 'px')
51638                   .tween('panner', function() {
51639                       var i = interpolateNumber(startMargin, endMargin);
51640                       return function(t$$1) {
51641                           var dx = lastMargin - Math.round(i(t$$1));
51642                           lastMargin = lastMargin - dx;
51643                           context.ui().onResize(moveMap ? undefined : [dx, 0]);
51644                       };
51645                   })
51646                   .on('end', function() {
51647                       selection$$1.classed('collapsed', isCollapsing);
51648
51649                       // switch back from px to %
51650                       if (!isCollapsing) {
51651                           var containerWidth = container.node().getBoundingClientRect().width;
51652                           var widthPct = (sidebarWidth / containerWidth) * 100;
51653                           selection$$1
51654                               .style(xMarginProperty, null)
51655                               .style('width', widthPct + '%');
51656                       }
51657                   });
51658           };
51659
51660           // toggle the sidebar collapse when double-clicking the resizer
51661           resizer.on('dblclick', sidebar.toggle);
51662       }
51663
51664
51665       sidebar.hover = function() {};
51666       sidebar.hover.cancel = function() {};
51667       sidebar.intersects = function() {};
51668       sidebar.select = function() {};
51669       sidebar.show = function() {};
51670       sidebar.hide = function() {};
51671       sidebar.expand = function() {};
51672       sidebar.collapse = function() {};
51673       sidebar.toggle = function() {};
51674
51675       return sidebar;
51676   }
51677
51678   function uiSpinner(context) {
51679       var osm = context.connection();
51680
51681
51682       return function(selection) {
51683           var img = selection
51684               .append('img')
51685               .attr('src', context.imagePath('loader-black.gif'))
51686               .style('opacity', 0);
51687
51688           if (osm) {
51689               osm
51690                   .on('loading.spinner', function() {
51691                       img.transition()
51692                           .style('opacity', 1);
51693                   })
51694                   .on('loaded.spinner', function() {
51695                       img.transition()
51696                           .style('opacity', 0);
51697                   });
51698           }
51699       };
51700   }
51701
51702   function uiSplash(context) {
51703
51704       return function(selection) {
51705           if (context.storage('sawSplash'))
51706                return;
51707
51708           context.storage('sawSplash', true);
51709
51710           var modalSelection = uiModal(selection);
51711
51712           modalSelection.select('.modal')
51713               .attr('class', 'modal-splash modal col6');
51714
51715           var introModal = modalSelection.select('.content')
51716               .append('div')
51717               .attr('class', 'fillL');
51718
51719           introModal
51720               .append('div')
51721               .attr('class','modal-section cf')
51722               .append('h3').text(t('splash.welcome'));
51723
51724           introModal
51725               .append('div')
51726               .attr('class','modal-section')
51727               .append('p')
51728               .html(t('splash.text', {
51729                   version: context.version,
51730                   website: '<a href="http://ideditor.com/">ideditor.com</a>',
51731                   github: '<a href="https://github.com/openstreetmap/iD">github.com</a>'
51732               }));
51733
51734           var buttonWrap = introModal
51735               .append('div')
51736               .attr('class', 'modal-actions cf');
51737
51738           var walkthrough = buttonWrap
51739               .append('button')
51740               .attr('class', 'walkthrough col6')
51741               .on('click', function() {
51742                   context.container().call(uiIntro(context));
51743                   modalSelection.close();
51744               });
51745
51746           walkthrough
51747               .append('svg')
51748               .attr('class', 'logo logo-walkthrough')
51749               .append('use')
51750               .attr('xlink:href', '#iD-logo-walkthrough');
51751
51752           walkthrough
51753               .append('div')
51754               .text(t('splash.walkthrough'));
51755
51756           var startEditing = buttonWrap
51757               .append('button')
51758               .attr('class', 'start-editing col6')
51759               .on('click', modalSelection.close);
51760
51761           startEditing
51762               .append('svg')
51763               .attr('class', 'logo logo-features')
51764               .append('use')
51765               .attr('xlink:href', '#iD-logo-features');
51766
51767           startEditing
51768               .append('div')
51769               .text(t('splash.start'));
51770
51771
51772           modalSelection.select('button.close')
51773               .attr('class','hide');
51774
51775       };
51776   }
51777
51778   function uiStatus(context) {
51779       var osm = context.connection();
51780
51781
51782       return function(selection$$1) {
51783           if (!osm) return;
51784
51785           function update() {
51786               osm.status(function(err, apiStatus) {
51787                   selection$$1.html('');
51788
51789                   if (err) {
51790                       if (apiStatus === 'connectionSwitched') {
51791                           // if the connection was just switched, we can't rely on
51792                           // the status (we're getting the status of the previous api)
51793                           return;
51794
51795                       } else if (apiStatus === 'rateLimited') {
51796                           selection$$1
51797                               .text(t('status.rateLimit'))
51798                               .append('a')
51799                               .attr('class', 'api-status-login')
51800                               .attr('target', '_blank')
51801                               .call(svgIcon('#iD-icon-out-link', 'inline'))
51802                               .append('span')
51803                               .text(t('login'))
51804                               .on('click.login', function() {
51805                                   event.preventDefault();
51806                                   osm.authenticate();
51807                               });
51808                       } else {
51809                           // eslint-disable-next-line no-warning-comments
51810                           // TODO: nice messages for different error types
51811                           selection$$1.text(t('status.error'));
51812                       }
51813
51814                   } else if (apiStatus === 'readonly') {
51815                       selection$$1.text(t('status.readonly'));
51816                   } else if (apiStatus === 'offline') {
51817                       selection$$1.text(t('status.offline'));
51818                   }
51819
51820                   selection$$1.attr('class', 'api-status ' + (err ? 'error' : apiStatus));
51821               });
51822           }
51823
51824           osm.on('change', function() { update(selection$$1); });
51825
51826           window.setInterval(update, 90000);
51827           update(selection$$1);
51828       };
51829   }
51830
51831   function uiUndoRedo(context) {
51832       var commands = [{
51833           id: 'undo',
51834           cmd: uiCmd('⌘Z'),
51835           action: function() { if (editable()) context.undo(); },
51836           annotation: function() { return context.history().undoAnnotation(); }
51837       }, {
51838           id: 'redo',
51839           cmd: uiCmd('⌘⇧Z'),
51840           action: function() { if (editable()) context.redo(); },
51841           annotation: function() { return context.history().redoAnnotation(); }
51842       }];
51843
51844
51845       function editable() {
51846           var mode = context.mode();
51847           return context.editable() && mode && mode.id !== 'save';
51848       }
51849
51850
51851       return function(selection$$1) {
51852           var tooltipBehavior = tooltip()
51853               .placement('bottom')
51854               .html(true)
51855               .title(function (d) {
51856                   return uiTooltipHtml(d.annotation() ?
51857                       t(d.id + '.tooltip', {action: d.annotation()}) :
51858                       t(d.id + '.nothing'), d.cmd);
51859               });
51860
51861           var buttons = selection$$1.selectAll('button')
51862               .data(commands)
51863               .enter()
51864               .append('button')
51865               .attr('class', function(d) { return 'disabled ' + d.id + '-button'; })
51866               .on('click', function(d) { return d.action(); })
51867               .call(tooltipBehavior);
51868
51869           buttons.each(function(d) {
51870               var iconName = d.id;
51871               if (textDirection === 'rtl') {
51872                   if (iconName === 'undo') {
51873                       iconName = 'redo';
51874                   } else if (iconName === 'redo') {
51875                       iconName = 'undo';
51876                   }
51877               }
51878               select(this)
51879                   .call(svgIcon('#iD-icon-' + iconName));
51880           });
51881
51882           context.keybinding()
51883               .on(commands[0].cmd, function() { event.preventDefault(); commands[0].action(); })
51884               .on(commands[1].cmd, function() { event.preventDefault(); commands[1].action(); });
51885
51886
51887           var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
51888
51889           context.map()
51890               .on('move.undo_redo', debouncedUpdate)
51891               .on('drawn.undo_redo', debouncedUpdate);
51892
51893           context.history()
51894               .on('change.undo_redo', update);
51895
51896           context
51897               .on('enter.undo_redo', update);
51898
51899
51900           function update() {
51901               buttons
51902                   .property('disabled', !editable())
51903                   .classed('disabled', function(d) { return !d.annotation(); })
51904                   .each(function() {
51905                       var selection$$1 = select(this);
51906                       if (selection$$1.property('tooltipVisible')) {
51907                           selection$$1.call(tooltipBehavior.show);
51908                       }
51909                   });
51910           }
51911       };
51912   }
51913
51914   // these are module variables so they are preserved through a ui.restart()
51915   var sawVersion = null;
51916   var isNewVersion = false;
51917   var isNewUser = false;
51918
51919
51920   function uiVersion(context) {
51921
51922       var currVersion = context.version;
51923       var matchedVersion = currVersion.match(/\d+\.\d+\.\d+.*/);
51924
51925       if (sawVersion === null && matchedVersion !== null) {
51926           isNewVersion = (context.storage('sawVersion') !== currVersion);
51927           isNewUser = !context.storage('sawSplash');
51928           context.storage('sawVersion', currVersion);
51929           sawVersion = currVersion;
51930       }
51931
51932       return function(selection) {
51933           selection
51934               .append('a')
51935               .attr('target', '_blank')
51936               .attr('tabindex', -1)
51937               .attr('href', 'https://github.com/openstreetmap/iD')
51938               .text(currVersion);
51939
51940           // only show new version indicator to users that have used iD before
51941           if (isNewVersion && !isNewUser) {
51942               selection
51943                   .append('div')
51944                   .attr('class', 'badge')
51945                   .append('a')
51946                   .attr('target', '_blank')
51947                   .attr('tabindex', -1)
51948                   .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CHANGELOG.md#whats-new')
51949                   .call(svgIcon('#maki-gift-11'))
51950                   .call(tooltip()
51951                       .title(t('version.whats_new', { version: currVersion }))
51952                       .placement('top')
51953                   );
51954           }
51955       };
51956   }
51957
51958   function uiZoom(context) {
51959       var zooms = [{
51960           id: 'zoom-in',
51961           icon: 'plus',
51962           title: t('zoom.in'),
51963           action: context.zoomIn,
51964           key: '+'
51965       }, {
51966           id: 'zoom-out',
51967           icon: 'minus',
51968           title: t('zoom.out'),
51969           action: context.zoomOut,
51970           key: '-'
51971       }];
51972
51973
51974       function zoomIn() {
51975           event.preventDefault();
51976           context.zoomIn();
51977       }
51978
51979
51980       function zoomOut() {
51981           event.preventDefault();
51982           context.zoomOut();
51983       }
51984
51985
51986       function zoomInFurther() {
51987           event.preventDefault();
51988           context.zoomInFurther();
51989       }
51990
51991
51992       function zoomOutFurther() {
51993           event.preventDefault();
51994           context.zoomOutFurther();
51995       }
51996
51997
51998       return function(selection$$1) {
51999           var button = selection$$1.selectAll('button')
52000               .data(zooms)
52001               .enter()
52002               .append('button')
52003               .attr('tabindex', -1)
52004               .attr('class', function(d) { return d.id; })
52005               .on('click.editor', function(d) { d.action(); })
52006               .call(tooltip()
52007                   .placement((textDirection === 'rtl') ? 'right' : 'left')
52008                   .html(true)
52009                   .title(function(d) {
52010                       return uiTooltipHtml(d.title, d.key);
52011                   })
52012               );
52013
52014           button.each(function(d) {
52015               select(this)
52016                   .call(svgIcon('#iD-icon-' + d.icon, 'light'));
52017           });
52018
52019           ['plus', 'ffplus', '=', 'ffequals'].forEach(function(key) {
52020               context.keybinding().on([key], zoomIn);
52021               context.keybinding().on([uiCmd('⌘' + key)], zoomInFurther);
52022           });
52023
52024           ['_', '-', 'ffminus', 'dash'].forEach(function(key) {
52025               context.keybinding().on([key], zoomOut);
52026               context.keybinding().on([uiCmd('⌘' + key)], zoomOutFurther);
52027           });
52028       };
52029   }
52030
52031   function uiInit(context) {
52032       var _initCounter = 0;
52033       var _initCallback;
52034       var _needWidth = {};
52035
52036
52037       function render(container) {
52038           container
52039               .attr('dir', textDirection);
52040
52041           var map = context.map();
52042
52043           container
52044               .append('svg')
52045               .attr('id', 'defs')
52046               .call(svgDefs(context));
52047
52048           container
52049               .append('div')
52050               .attr('id', 'sidebar')
52051               .call(ui.sidebar);
52052
52053           var content = container
52054               .append('div')
52055               .attr('id', 'content')
52056               .attr('class', 'active');
52057
52058           // Top toolbar
52059           var bar = content
52060               .append('div')
52061               .attr('id', 'bar')
52062               .attr('class', 'fillD');
52063
52064           content
52065               .append('div')
52066               .attr('id', 'map')
52067               .attr('dir', 'ltr')
52068               .call(map);
52069
52070           // Leading area button group (Sidebar toggle)
52071           var leadingArea = bar
52072               .append('div')
52073               .attr('class', 'tool-group leading-area');
52074
52075           var sidebarButton = leadingArea
52076               .append('div')
52077               .append('button')
52078               .attr('class', 'sidebar-toggle')
52079               .attr('tabindex', -1)
52080               .on('click', ui.sidebar.toggle)
52081               .call(tooltip()
52082                   .placement('bottom')
52083                   .html(true)
52084                   .title(uiTooltipHtml(t('sidebar.tooltip'), t('sidebar.key')))
52085               );
52086
52087           var iconSuffix = textDirection === 'rtl' ? 'right' : 'left';
52088           sidebarButton
52089               .call(svgIcon('#iD-icon-sidebar-' + iconSuffix));
52090
52091           leadingArea
52092               .append('div')
52093               .attr('class', 'full-screen bar-group')
52094               .call(uiFullScreen(context));
52095
52096
52097           // Center area button group (Point/Line/Area/Note mode buttons)
52098           bar
52099               .append('div')
52100               .attr('class', 'tool-group center-area')
52101               .append('div')
52102               .attr('class', 'modes joined')
52103               .call(uiModes(context), bar);
52104
52105
52106           // Trailing area button group (Undo/Redo save buttons)
52107           var trailingArea = bar
52108               .append('div')
52109               .attr('class', 'tool-group trailing-area');
52110
52111           trailingArea
52112               .append('div')
52113               .attr('class', 'joined')
52114               .call(uiUndoRedo(context));
52115
52116           trailingArea
52117               .append('div')
52118               .attr('class', 'save-wrap')
52119               .call(uiSave(context));
52120
52121
52122           // For now, just put spinner at the end of the #bar
52123           bar
52124               .append('div')
52125               .attr('class', 'spinner')
52126               .call(uiSpinner(context));
52127
52128
52129           // Map controls (appended to #bar, but absolutely positioned)
52130           var controls = bar
52131               .append('div')
52132               .attr('class', 'map-controls');
52133
52134           controls
52135               .append('div')
52136               .attr('class', 'map-control zoombuttons')
52137               .call(uiZoom(context));
52138
52139           controls
52140               .append('div')
52141               .attr('class', 'map-control geolocate-control')
52142               .call(uiGeolocate(context));
52143
52144           controls
52145               .append('div')
52146               .attr('class', 'map-control background-control')
52147               .call(uiBackground(context));
52148
52149           controls
52150               .append('div')
52151               .attr('class', 'map-control map-data-control')
52152               .call(uiMapData(context));
52153
52154           controls
52155               .append('div')
52156               .attr('class', 'map-control help-control')
52157               .call(uiHelp(context));
52158
52159
52160           // Add attribution and footer
52161           var about = content
52162               .append('div')
52163               .attr('id', 'about');
52164
52165           about
52166               .append('div')
52167               .attr('id', 'attrib')
52168               .attr('dir', 'ltr')
52169               .call(uiAttribution(context));
52170
52171           about
52172               .append('div')
52173               .attr('class', 'api-status')
52174               .call(uiStatus(context));
52175
52176
52177           var footer = about
52178               .append('div')
52179               .attr('id', 'footer')
52180               .attr('class', 'fillD');
52181
52182           footer
52183               .append('div')
52184               .attr('id', 'flash-wrap')
52185               .attr('class', 'footer-hide');
52186
52187           var footerWrap = footer
52188               .append('div')
52189               .attr('id', 'footer-wrap')
52190               .attr('class', 'footer-show');
52191
52192           footerWrap
52193               .append('div')
52194               .attr('id', 'scale-block')
52195               .call(uiScale(context));
52196
52197           var aboutList = footerWrap
52198               .append('div')
52199               .attr('id', 'info-block')
52200               .append('ul')
52201               .attr('id', 'about-list');
52202
52203           if (!context.embed()) {
52204               aboutList
52205                   .call(uiAccount(context));
52206           }
52207
52208           aboutList
52209               .append('li')
52210               .attr('class', 'version')
52211               .call(uiVersion(context));
52212
52213           var issueLinks = aboutList
52214               .append('li');
52215
52216           issueLinks
52217               .append('a')
52218               .attr('target', '_blank')
52219               .attr('tabindex', -1)
52220               .attr('href', 'https://github.com/openstreetmap/iD/issues')
52221               .call(svgIcon('#iD-icon-bug', 'light'))
52222               .call(tooltip().title(t('report_a_bug')).placement('top'));
52223
52224           issueLinks
52225               .append('a')
52226               .attr('target', '_blank')
52227               .attr('tabindex', -1)
52228               .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating')
52229               .call(svgIcon('#iD-icon-translate', 'light'))
52230               .call(tooltip().title(t('help_translate')).placement('top'));
52231
52232           aboutList
52233               .append('li')
52234               .attr('class', 'feature-warning')
52235               .attr('tabindex', -1)
52236               .call(uiFeatureInfo(context));
52237
52238           aboutList
52239               .append('li')
52240               .attr('class', 'user-list')
52241               .attr('tabindex', -1)
52242               .call(uiContributors(context));
52243
52244
52245           // Setup map dimensions and move map to initial center/zoom.
52246           // This should happen after #content and toolbars exist.
52247           ui.onResize();
52248
52249           var hash = behaviorHash(context);
52250           hash();
52251           if (!hash.hadHash) {
52252               map.centerZoom([0, 0], 2);
52253           }
52254
52255
52256           // Add absolutely-positioned elements that sit on top of the map
52257           // This should happen after the map is ready (center/zoom)
52258           content
52259               .call(uiMapInMap(context))
52260               .call(uiInfo(context))
52261               .call(uiNotice(context));
52262
52263           content
52264               .append('div')
52265               .attr('id', 'photoviewer')
52266               .classed('al', true)       // 'al'=left,  'ar'=right
52267               .classed('hide', true)
52268               .call(ui.photoviewer);
52269
52270
52271           // Bind events
52272           window.onbeforeunload = function() {
52273               return context.save();
52274           };
52275           window.onunload = function() {
52276               context.history().unlock();
52277           };
52278
52279           select(window)
52280               .on('gesturestart.editor', eventCancel)
52281               .on('gesturechange.editor', eventCancel)
52282               .on('gestureend.editor', eventCancel)
52283               .on('resize.editor', ui.onResize);
52284
52285
52286           var panPixels = 80;
52287           context.keybinding()
52288               .on('⌫', function() { event.preventDefault(); })
52289               .on([t('sidebar.key'), '`', '²'], ui.sidebar.toggle)   // #5663 - common QWERTY, AZERTY
52290               .on('←', pan([panPixels, 0]))
52291               .on('↑', pan([0, panPixels]))
52292               .on('→', pan([-panPixels, 0]))
52293               .on('↓', pan([0, -panPixels]))
52294               .on(['⇧←', uiCmd('⌘←')], pan([map.dimensions()[0], 0]))
52295               .on(['⇧↑', uiCmd('⌘↑')], pan([0, map.dimensions()[1]]))
52296               .on(['⇧→', uiCmd('⌘→')], pan([-map.dimensions()[0], 0]))
52297               .on(['⇧↓', uiCmd('⌘↓')], pan([0, -map.dimensions()[1]]));
52298
52299           context.enter(modeBrowse(context));
52300
52301           if (!_initCounter++) {
52302               if (!hash.startWalkthrough) {
52303                   context.container()
52304                       .call(uiSplash(context))
52305                       .call(uiRestore(context));
52306               }
52307
52308               context.container()
52309                   .call(uiShortcuts(context));
52310           }
52311
52312           var osm = context.connection();
52313           var auth = uiLoading(context).message(t('loading_auth')).blocking(true);
52314
52315           if (osm && auth) {
52316               osm
52317                   .on('authLoading.ui', function() {
52318                       context.container()
52319                           .call(auth);
52320                   })
52321                   .on('authDone.ui', function() {
52322                       auth.close();
52323                   });
52324           }
52325
52326           _initCounter++;
52327
52328           if (hash.startWalkthrough) {
52329               hash.startWalkthrough = false;
52330               context.container().call(uiIntro(context));
52331           }
52332
52333
52334           function pan(d) {
52335               return function() {
52336                   if (select('.combobox').size()) return;
52337                   event.preventDefault();
52338                   context.pan(d, 100);
52339               };
52340           }
52341
52342           function eventCancel() {
52343               event.preventDefault();
52344           }
52345       }
52346
52347
52348       function ui(node, callback) {
52349           _initCallback = callback;
52350           var container = select(node);
52351           context.container(container);
52352           context.loadLocale(function(err) {
52353               if (!err) {
52354                   render(container);
52355               }
52356               if (callback) {
52357                   callback(err);
52358               }
52359           });
52360       }
52361
52362
52363       ui.restart = function(arg) {
52364           context.keybinding().clear();
52365           context.locale(arg);
52366           context.loadLocale(function(err) {
52367               if (!err) {
52368                   context.container().selectAll('*').remove();
52369                   render(context.container());
52370                   if (_initCallback) _initCallback();
52371               }
52372           });
52373       };
52374
52375
52376       ui.sidebar = uiSidebar$$1(context);
52377
52378       ui.photoviewer = uiPhotoviewer(context);
52379
52380       ui.onResize = function(withPan) {
52381           var map = context.map();
52382
52383           // Recalc dimensions of map and sidebar.. (`true` = force recalc)
52384           // This will call `getBoundingClientRect` and trigger reflow,
52385           //  but the values will be cached for later use.
52386           var mapDimensions = utilGetDimensions(select('#content'), true);
52387           utilGetDimensions(select('#sidebar'), true);
52388
52389           if (withPan !== undefined) {
52390               map.redrawEnable(false);
52391               map.pan(withPan);
52392               map.redrawEnable(true);
52393           }
52394           map.dimensions(mapDimensions);
52395
52396           ui.photoviewer.onMapResize();
52397
52398           // check if header or footer have overflowed
52399           ui.checkOverflow('#bar');
52400           ui.checkOverflow('#footer');
52401
52402           // Use outdated code so it works on Explorer
52403           var resizeWindowEvent = document.createEvent('Event');
52404
52405           resizeWindowEvent.initEvent('resizeWindow', true, true);
52406
52407           document.dispatchEvent(resizeWindowEvent);
52408       };
52409
52410
52411       // Call checkOverflow when resizing or whenever the contents change.
52412       ui.checkOverflow = function(selector$$1, reset) {
52413           if (reset) {
52414               delete _needWidth[selector$$1];
52415           }
52416
52417           var element = select(selector$$1);
52418           var scrollWidth = element.property('scrollWidth');
52419           var clientWidth = element.property('clientWidth');
52420           var needed = _needWidth[selector$$1] || scrollWidth;
52421
52422           if (scrollWidth > clientWidth) {    // overflow happening
52423               element.classed('narrow', true);
52424               if (!_needWidth[selector$$1]) {
52425                   _needWidth[selector$$1] = scrollWidth;
52426               }
52427
52428           } else if (scrollWidth >= needed) {
52429               element.classed('narrow', false);
52430           }
52431       };
52432
52433
52434       return ui;
52435   }
52436
52437   /**
52438    * This method is like `_.uniq` except that it accepts `iteratee` which is
52439    * invoked for each element in `array` to generate the criterion by which
52440    * uniqueness is computed. The order of result values is determined by the
52441    * order they occur in the array. The iteratee is invoked with one argument:
52442    * (value).
52443    *
52444    * @static
52445    * @memberOf _
52446    * @since 4.0.0
52447    * @category Array
52448    * @param {Array} array The array to inspect.
52449    * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
52450    * @returns {Array} Returns the new duplicate free array.
52451    * @example
52452    *
52453    * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
52454    * // => [2.1, 1.2]
52455    *
52456    * // The `_.property` iteratee shorthand.
52457    * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
52458    * // => [{ 'x': 1 }, { 'x': 2 }]
52459    */
52460   function uniqBy(array, iteratee) {
52461     return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];
52462   }
52463
52464   function uiChangesetEditor$$1(context) {
52465       var dispatch$$1 = dispatch('change');
52466       var formFields = uiFormFields$$1(context);
52467       var commentCombo = uiCombobox(context, 'comment').caseSensitive(true);
52468       var _fieldsArr;
52469       var _tags;
52470       var _changesetID;
52471
52472
52473       function changesetEditor(selection) {
52474           render(selection);
52475       }
52476
52477
52478       function render(selection) {
52479           var initial = false;
52480
52481           if (!_fieldsArr) {
52482               initial = true;
52483               var presets = context.presets();
52484
52485               _fieldsArr = [
52486                   uiField(context, presets.field('comment'), null, { show: true, revert: false }),
52487                   uiField(context, presets.field('source'), null, { show: false, revert: false }),
52488                   uiField(context, presets.field('hashtags'), null, { show: false, revert: false }),
52489               ];
52490
52491               _fieldsArr.forEach(function(field) {
52492                   field
52493                       .on('change', function(t$$1, onInput) {
52494                           dispatch$$1.call('change', field, t$$1, onInput);
52495                       });
52496               });
52497           }
52498
52499           _fieldsArr.forEach(function(field) {
52500               field
52501                   .tags(_tags);
52502           });
52503
52504
52505           selection
52506               .call(formFields.fieldsArr(_fieldsArr));
52507
52508
52509           if (initial) {
52510               var commentField = selection.select('#preset-input-comment');
52511               var commentNode = commentField.node();
52512
52513               if (commentNode) {
52514                   commentNode.focus();
52515                   commentNode.select();
52516               }
52517
52518               // trigger a 'blur' event so that comment field can be cleaned
52519               // and checked for hashtags, even if retrieved from localstorage
52520               utilTriggerEvent(commentField, 'blur');
52521
52522               var osm = context.connection();
52523               if (osm) {
52524                   osm.userChangesets(function (err, changesets) {
52525                       if (err) return;
52526
52527                       var comments = changesets.map(function(changeset) {
52528                           return {
52529                               title: changeset.tags.comment,
52530                               value: changeset.tags.comment
52531                           };
52532                       });
52533
52534                       commentField
52535                           .call(commentCombo
52536                               .data(uniqBy(comments, 'title'))
52537                           );
52538                   });
52539               }
52540           }
52541
52542           // Add warning if comment mentions Google
52543           var hasGoogle = _tags.comment.match(/google/i);
52544           var commentWarning = selection.select('.form-field-comment').selectAll('.comment-warning')
52545               .data(hasGoogle ? [0] : []);
52546
52547           commentWarning.exit()
52548               .transition()
52549               .duration(200)
52550               .style('opacity', 0)
52551               .remove();
52552
52553           var commentEnter = commentWarning.enter()
52554               .insert('div', '.tag-reference-body')
52555               .attr('class', 'field-warning comment-warning')
52556               .style('opacity', 0);
52557
52558           commentEnter
52559               .append('a')
52560               .attr('target', '_blank')
52561               .attr('tabindex', -1)
52562               .call(svgIcon('#iD-icon-alert', 'inline'))
52563               .attr('href', t('commit.google_warning_link'))
52564               .append('span')
52565               .text(t('commit.google_warning'));
52566
52567           commentEnter
52568               .transition()
52569               .duration(200)
52570               .style('opacity', 1);
52571       }
52572
52573
52574       changesetEditor.tags = function(_) {
52575           if (!arguments.length) return _tags;
52576           _tags = _;
52577           // Don't reset _fieldsArr here.
52578           return changesetEditor;
52579       };
52580
52581
52582       changesetEditor.changesetID = function(_) {
52583           if (!arguments.length) return _changesetID;
52584           if (_changesetID === _) return changesetEditor;
52585           _changesetID = _;
52586           _fieldsArr = null;
52587           return changesetEditor;
52588       };
52589
52590
52591       return utilRebind(changesetEditor, dispatch$$1, 'on');
52592   }
52593
52594   // This code assumes that the combobox values will not have duplicate entries.
52595   // It is keyed on the `value` of the entry. Data should be an array of objects like:
52596   //   [{
52597   //       value:  'display text',  // required
52598   //       title:  'hover text'     // optional
52599   //   }, ...]
52600
52601   var _comboHideTimerID;
52602
52603   function uiCombobox(context, klass) {
52604       var dispatch$$1 = dispatch('accept', 'cancel');
52605       var container = context.container();
52606
52607       var _suggestions = [];
52608       var _data = [];
52609       var _fetched = {};
52610       var _selected = null;
52611       var _canAutocomplete = true;
52612       var _caseSensitive = false;
52613       var _cancelFetch = false;
52614       var _minItems = 2;
52615       var _tDown = 0;
52616
52617       var _fetcher = function(val, cb) {
52618           cb(_data.filter(function(d) {
52619               return d.value
52620                   .toString()
52621                   .toLowerCase()
52622                   .indexOf(val.toLowerCase()) !== -1;
52623           }));
52624       };
52625
52626       var combobox = function(input, attachTo) {
52627           if (!input || input.empty()) return;
52628
52629           input
52630               .classed('combobox-input', true)
52631               .on('focus.combo-input', focus)
52632               .on('blur.combo-input', blur)
52633               .on('keydown.combo-input', keydown)
52634               .on('keyup.combo-input', keyup)
52635               .on('input.combo-input', change)
52636               .on('mousedown.combo-input', mousedown)
52637               .each(function() {
52638                   var parent = this.parentNode;
52639                   var sibling = this.nextSibling;
52640
52641                   select(parent).selectAll('.combobox-caret')
52642                       .filter(function(d) { return d === input.node(); })
52643                       .data([input.node()])
52644                       .enter()
52645                       .insert('div', function() { return sibling; })
52646                       .attr('class', 'combobox-caret')
52647                       .on('mousedown.combo-caret mouseup.combo-caret', function() {
52648                           var e2 = new MouseEvent(event.type, event);
52649                           event.preventDefault();       // don't steal focus from input
52650                           input.node().dispatchEvent(e2);  // send events to the input instead
52651                       });
52652               });
52653
52654
52655           function mousedown() {
52656               if (event.button !== 0) return;    // left click only
52657               _tDown = +new Date();
52658
52659               // clear selection
52660               var start = input.property('selectionStart');
52661               var end = input.property('selectionEnd');
52662               if (start !== end) {
52663                   var val = utilGetSetValue(input);
52664                   input.node().setSelectionRange(val.length, val.length);
52665                   return;
52666               }
52667
52668               input.on('mouseup.combo-input', mouseup);
52669           }
52670
52671
52672           function mouseup() {
52673               input.on('mouseup.combo-input', null);
52674               if (event.button !== 0) return;    // left click only
52675
52676               var start = input.property('selectionStart');
52677               var end = input.property('selectionEnd');
52678               if (start !== end) return;  // exit if user is selecting
52679
52680               // not showing or showing for a different field - try to show it.
52681               var combo = container.selectAll('.combobox');
52682               if (combo.empty() || combo.datum() !== input) {
52683                   var tOrig = _tDown;
52684                   window.setTimeout(function() {
52685                       if (tOrig !== _tDown) return;   // exit if user double clicked
52686                       input.node().focus();
52687                       fetch('', function() {
52688                           show();
52689                           render();
52690                       });
52691                   }, 250);
52692
52693               } else {
52694                   hide();
52695               }
52696           }
52697
52698
52699           function focus() {
52700               fetch('');   // prefetch values (may warm taginfo cache)
52701           }
52702
52703
52704           function blur() {
52705               _comboHideTimerID = window.setTimeout(hide, 75);
52706           }
52707
52708
52709           function show() {
52710               hide();   // remove any existing
52711
52712               container
52713                   .insert('div', ':first-child')
52714                   .datum(input.node())
52715                   .attr('class', 'combobox' + (klass ? ' combobox-' + klass : ''))
52716                   .style('position', 'absolute')
52717                   .style('display', 'block')
52718                   .style('left', '0px')
52719                   .on('mousedown.combo-container', function () {
52720                       // prevent moving focus out of the input field
52721                       event.preventDefault();
52722                   });
52723
52724               select('body')
52725                   .on('scroll.combo-scroll', render, true);
52726           }
52727
52728
52729           function hide() {
52730               if (_comboHideTimerID) {
52731                   window.clearTimeout(_comboHideTimerID);
52732                   _comboHideTimerID = undefined;
52733               }
52734
52735               container.selectAll('.combobox')
52736                   .remove();
52737
52738               select('body')
52739                   .on('scroll.combo-scroll', null);
52740           }
52741
52742
52743           function keydown() {
52744               var shown = !container.selectAll('.combobox').empty();
52745               var tagName = input.node() ? input.node().tagName.toLowerCase() : '';
52746
52747               switch (event.keyCode) {
52748                   case 8:   // ⌫ Backspace
52749                   case 46:  // ⌦ Delete
52750                       event.stopPropagation();
52751                       _selected = null;
52752                       render();
52753                       input.on('input.combo-input', function() {
52754                           var start = input.property('selectionStart');
52755                           input.node().setSelectionRange(start, start);
52756                           input.on('input.combo-input', change);
52757                       });
52758                       break;
52759
52760                   case 9:   // ⇥ Tab
52761                       event.stopPropagation();
52762                       accept();
52763                       break;
52764
52765                   case 13:  // ↩ Return
52766                       event.preventDefault();
52767                       event.stopPropagation();
52768                       break;
52769
52770                   case 38:  // ↑ Up arrow
52771                       if (tagName === 'textarea' && !shown) return;
52772                       event.preventDefault();
52773                       if (tagName === 'input' && !shown) {
52774                           show();
52775                       }
52776                       nav(-1);
52777                       break;
52778
52779                   case 40:  // ↓ Down arrow
52780                       if (tagName === 'textarea' && !shown) return;
52781                       event.preventDefault();
52782                       if (tagName === 'input' && !shown) {
52783                           show();
52784                       }
52785                       nav(+1);
52786                       break;
52787               }
52788           }
52789
52790
52791           function keyup() {
52792               switch (event.keyCode) {
52793                   case 27:  // ⎋ Escape
52794                       cancel();
52795                       break;
52796
52797                   case 13:  // ↩ Return
52798                       accept();
52799                       break;
52800               }
52801           }
52802
52803
52804           // Called whenever the input value is changed (e.g. on typing)
52805           function change() {
52806               fetch(value(), function() {
52807                   _selected = null;
52808                   var val = input.property('value');
52809
52810                   if (_suggestions.length) {
52811                       if (input.property('selectionEnd') === val.length) {
52812                           _selected = tryAutocomplete();
52813                       }
52814
52815                       if (!_selected) {
52816                           _selected = val;
52817                       }
52818                   }
52819
52820                   if (val.length) {
52821                       var combo = container.selectAll('.combobox');
52822                       if (combo.empty()) {
52823                           show();
52824                       }
52825                   } else {
52826                       hide();
52827                   }
52828
52829                   render();
52830               });
52831           }
52832
52833
52834           // Called when the user presses up/down arrows to navigate the list
52835           function nav(dir) {
52836               if (_suggestions.length) {
52837                   // try to determine previously selected index..
52838                   var index = -1;
52839                   for (var i = 0; i < _suggestions.length; i++) {
52840                       if (_selected && _suggestions[i].value === _selected) {
52841                           index = i;
52842                           break;
52843                       }
52844                   }
52845
52846                   // pick new _selected
52847                   index = Math.max(Math.min(index + dir, _suggestions.length - 1), 0);
52848                   _selected = _suggestions[index].value;
52849                   input.property('value', _selected);
52850               }
52851
52852               render();
52853               ensureVisible();
52854           }
52855
52856
52857           function ensureVisible() {
52858               var combo = container.selectAll('.combobox');
52859               if (combo.empty()) return;
52860
52861               var containerRect = container.node().getBoundingClientRect();
52862               var comboRect = combo.node().getBoundingClientRect();
52863
52864               if (comboRect.bottom > containerRect.bottom) {
52865                   var node = attachTo ? attachTo.node() : input.node();
52866                   node.scrollIntoView({ behavior: 'instant', block: 'center' });
52867                   render();
52868               }
52869
52870               // https://stackoverflow.com/questions/11039885/scrollintoview-causing-the-whole-page-to-move
52871               var selected = combo.selectAll('.combobox-option.selected').node();
52872               if (selected) {
52873                   selected.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
52874               }
52875           }
52876
52877
52878           function value() {
52879               var value = input.property('value');
52880               var start = input.property('selectionStart');
52881               var end = input.property('selectionEnd');
52882
52883               if (start && end) {
52884                   value = value.substring(0, start);
52885               }
52886
52887               return value;
52888           }
52889
52890
52891           function fetch(v, cb) {
52892               _cancelFetch = false;
52893
52894               _fetcher.call(input, v, function(results) {
52895                   // already chose a value, don't overwrite or autocomplete it
52896                   if (_cancelFetch) return;
52897
52898                   _suggestions = results;
52899                   results.forEach(function(d) { _fetched[d.value] = d; });
52900
52901                   if (cb) {
52902                       cb();
52903                   }
52904               });
52905           }
52906
52907
52908           function tryAutocomplete() {
52909               if (!_canAutocomplete) return;
52910
52911               var val = _caseSensitive ? value() : value().toLowerCase();
52912               if (!val) return;
52913
52914               // Don't autocomplete if user is typing a number - #4935
52915               if (!isNaN(parseFloat(val)) && isFinite(val)) return;
52916
52917               var bestIndex = -1;
52918               for (var i = 0; i < _suggestions.length; i++) {
52919                   var suggestion = _suggestions[i].value;
52920                   var compare = _caseSensitive ? suggestion : suggestion.toLowerCase();
52921
52922                   // if search string matches suggestion exactly, pick it..
52923                   if (compare === val) {
52924                       bestIndex = i;
52925                       break;
52926
52927                   // otherwise lock in the first result that starts with the search string..
52928                   } else if (bestIndex === -1 && compare.indexOf(val) === 0) {
52929                       bestIndex = i;
52930                   }
52931               }
52932
52933               if (bestIndex !== -1) {
52934                   var bestVal = _suggestions[bestIndex].value;
52935                   input.property('value', bestVal);
52936                   input.node().setSelectionRange(val.length, bestVal.length);
52937                   return bestVal;
52938               }
52939           }
52940
52941
52942           function render() {
52943               if (_suggestions.length < _minItems || document.activeElement !== input.node()) {
52944                   hide();
52945                   return;
52946               }
52947
52948               var shown = !container.selectAll('.combobox').empty();
52949               if (!shown) return;
52950
52951               var combo = container.selectAll('.combobox');
52952               var options = combo.selectAll('.combobox-option')
52953                   .data(_suggestions, function(d) { return d.value; });
52954
52955               options.exit()
52956                   .remove();
52957
52958               // enter/update
52959               options.enter()
52960                   .append('a')
52961                   .attr('class', 'combobox-option')
52962                   .attr('title', function(d) { return d.title; })
52963                   .text(function(d) { return d.display || d.value; })
52964                   .merge(options)
52965                   .classed('selected', function(d) { return d.value === _selected; })
52966                   .on('click.combo-option', accept)
52967                   .order();
52968
52969               var node = attachTo ? attachTo.node() : input.node();
52970               var rect = node.getBoundingClientRect();
52971
52972               combo
52973                   .style('left', (rect.left + 5) + 'px')
52974                   .style('width', (rect.width - 10) + 'px')
52975                   .style('top', rect.height + rect.top + 'px');
52976           }
52977
52978
52979           // Dispatches an 'accept' event
52980           // Then hides the combobox.
52981           function accept(d) {
52982               _cancelFetch = true;
52983               var thiz = input.node();
52984
52985               if (d) {   // user clicked on a suggestion
52986                   utilGetSetValue(input, d.value);    // replace field contents
52987                   utilTriggerEvent(input, 'change');
52988               }
52989
52990               // clear (and keep) selection
52991               var val = utilGetSetValue(input);
52992               thiz.setSelectionRange(val.length, val.length);
52993
52994               d = _fetched[val];
52995               dispatch$$1.call('accept', thiz, d, val);
52996               hide();
52997           }
52998
52999
53000           // Dispatches an 'cancel' event
53001           // Then hides the combobox.
53002           function cancel() {
53003               _cancelFetch = true;
53004               var thiz = input.node();
53005
53006               // clear (and remove) selection, and replace field contents
53007               var val = utilGetSetValue(input);
53008               var start = input.property('selectionStart');
53009               var end = input.property('selectionEnd');
53010               val = val.slice(0, start) + val.slice(end);
53011               utilGetSetValue(input, val);
53012               thiz.setSelectionRange(val.length, val.length);
53013
53014               dispatch$$1.call('cancel', thiz);
53015               hide();
53016           }
53017
53018       };
53019
53020
53021       combobox.canAutocomplete = function(val) {
53022           if (!arguments.length) return _canAutocomplete;
53023           _canAutocomplete = val;
53024           return combobox;
53025       };
53026
53027       combobox.caseSensitive = function(val) {
53028           if (!arguments.length) return _caseSensitive;
53029           _caseSensitive = val;
53030           return combobox;
53031       };
53032
53033       combobox.data = function(val) {
53034           if (!arguments.length) return _data;
53035           _data = val;
53036           return combobox;
53037       };
53038
53039       combobox.fetcher = function(val) {
53040           if (!arguments.length) return _fetcher;
53041           _fetcher = val;
53042           return combobox;
53043       };
53044
53045       combobox.minItems = function(val) {
53046           if (!arguments.length) return _minItems;
53047           _minItems = val;
53048           return combobox;
53049       };
53050
53051
53052       return utilRebind(combobox, dispatch$$1, 'on');
53053   }
53054
53055
53056   uiCombobox.off = function(input) {
53057       input
53058           .on('focus.combo-input', null)
53059           .on('blur.combo-input', null)
53060           .on('keydown.combo-input', null)
53061           .on('keyup.combo-input', null)
53062           .on('input.combo-input', null)
53063           .on('mousedown.combo-input', null)
53064           .on('mouseup.combo-input', null);
53065
53066
53067       select('body')
53068           .on('scroll.combo-scroll', null);
53069   };
53070
53071   /**
53072    * This method is like `_.union` except that it accepts `iteratee` which is
53073    * invoked for each element of each `arrays` to generate the criterion by
53074    * which uniqueness is computed. Result values are chosen from the first
53075    * array in which the value occurs. The iteratee is invoked with one argument:
53076    * (value).
53077    *
53078    * @static
53079    * @memberOf _
53080    * @since 4.0.0
53081    * @category Array
53082    * @param {...Array} [arrays] The arrays to inspect.
53083    * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
53084    * @returns {Array} Returns the new array of combined values.
53085    * @example
53086    *
53087    * _.unionBy([2.1], [1.2, 2.3], Math.floor);
53088    * // => [2.1, 1.2]
53089    *
53090    * // The `_.property` iteratee shorthand.
53091    * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
53092    * // => [{ 'x': 1 }, { 'x': 2 }]
53093    */
53094   var unionBy = baseRest(function(arrays) {
53095     var iteratee = last(arrays);
53096     if (isArrayLikeObject(iteratee)) {
53097       iteratee = undefined;
53098     }
53099     return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), baseIteratee(iteratee, 2));
53100   });
53101
53102   var JXON = new (function () {
53103     var
53104       sValueProp = 'keyValue', sAttributesProp = 'keyAttributes', sAttrPref = '@', /* you can customize these values */
53105       aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i;
53106
53107     function parseText (sValue) {
53108       if (rIsNull.test(sValue)) { return null; }
53109       if (rIsBool.test(sValue)) { return sValue.toLowerCase() === 'true'; }
53110       if (isFinite(sValue)) { return parseFloat(sValue); }
53111       if (isFinite(Date.parse(sValue))) { return new Date(sValue); }
53112       return sValue;
53113     }
53114
53115     function EmptyTree () { }
53116     EmptyTree.prototype.toString = function () { return 'null'; };
53117     EmptyTree.prototype.valueOf = function () { return null; };
53118
53119     function objectify (vValue) {
53120       return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue);
53121     }
53122
53123     function createObjTree (oParentNode, nVerb, bFreeze, bNesteAttr) {
53124       var
53125         nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(),
53126         bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2);
53127
53128       var
53129         sProp, vContent, nLength = 0, sCollectedTxt = '',
53130         vResult = bHighVerb ? {} : /* put here the default value for empty nodes: */ true;
53131
53132       if (bChildren) {
53133         for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) {
53134           oNode = oParentNode.childNodes.item(nItem);
53135           if (oNode.nodeType === 4) { sCollectedTxt += oNode.nodeValue; } /* nodeType is 'CDATASection' (4) */
53136           else if (oNode.nodeType === 3) { sCollectedTxt += oNode.nodeValue.trim(); } /* nodeType is 'Text' (3) */
53137           else if (oNode.nodeType === 1 && !oNode.prefix) { aCache.push(oNode); } /* nodeType is 'Element' (1) */
53138         }
53139       }
53140
53141       var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt);
53142
53143       if (!bHighVerb && (bChildren || bAttributes)) { vResult = nVerb === 0 ? objectify(vBuiltVal) : {}; }
53144
53145       for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
53146         sProp = aCache[nElId].nodeName.toLowerCase();
53147         vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr);
53148         if (vResult.hasOwnProperty(sProp)) {
53149           if (vResult[sProp].constructor !== Array) { vResult[sProp] = [vResult[sProp]]; }
53150           vResult[sProp].push(vContent);
53151         } else {
53152           vResult[sProp] = vContent;
53153           nLength++;
53154         }
53155       }
53156
53157       if (bAttributes) {
53158         var
53159           nAttrLen = oParentNode.attributes.length,
53160           sAPrefix = bNesteAttr ? '' : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult;
53161
53162         for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) {
53163           oAttrib = oParentNode.attributes.item(nAttrib);
53164           oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
53165         }
53166
53167         if (bNesteAttr) {
53168           if (bFreeze) { Object.freeze(oAttrParent); }
53169           vResult[sAttributesProp] = oAttrParent;
53170           nLength -= nAttrLen - 1;
53171         }
53172       }
53173
53174       if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) {
53175         vResult[sValueProp] = vBuiltVal;
53176       } else if (!bHighVerb && nLength === 0 && sCollectedTxt) {
53177         vResult = vBuiltVal;
53178       }
53179
53180       if (bFreeze && (bHighVerb || nLength > 0)) { Object.freeze(vResult); }
53181
53182       aCache.length = nLevelStart;
53183
53184       return vResult;
53185     }
53186
53187     function loadObjTree (oXMLDoc, oParentEl, oParentObj) {
53188       var vValue, oChild;
53189
53190       if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) {
53191         oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString())); /* verbosity level is 0 */
53192       } else if (oParentObj.constructor === Date) {
53193         oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString()));    
53194       }
53195
53196       for (var sName in oParentObj) {
53197         vValue = oParentObj[sName];
53198         if (isFinite(sName) || vValue instanceof Function) { continue; } /* verbosity level is 0 */
53199         if (sName === sValueProp) {
53200           if (vValue !== null && vValue !== true) { oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue))); }
53201         } else if (sName === sAttributesProp) { /* verbosity level is 3 */
53202           for (var sAttrib in vValue) { oParentEl.setAttribute(sAttrib, vValue[sAttrib]); }
53203         } else if (sName.charAt(0) === sAttrPref) {
53204           oParentEl.setAttribute(sName.slice(1), vValue);
53205         } else if (vValue.constructor === Array) {
53206           for (var nItem = 0; nItem < vValue.length; nItem++) {
53207             oChild = oXMLDoc.createElement(sName);
53208             loadObjTree(oXMLDoc, oChild, vValue[nItem]);
53209             oParentEl.appendChild(oChild);
53210           }
53211         } else {
53212           oChild = oXMLDoc.createElement(sName);
53213           if (vValue instanceof Object) {
53214             loadObjTree(oXMLDoc, oChild, vValue);
53215           } else if (vValue !== null && vValue !== true) {
53216             oChild.appendChild(oXMLDoc.createTextNode(vValue.toString()));
53217           }
53218           oParentEl.appendChild(oChild);
53219        }
53220      }
53221     }
53222
53223     this.build = function (oXMLParent, nVerbosity /* optional */, bFreeze /* optional */, bNesteAttributes /* optional */) {
53224       var _nVerb = arguments.length > 1 && typeof nVerbosity === 'number' ? nVerbosity & 3 : /* put here the default verbosity level: */ 1;
53225       return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3);    
53226     };
53227
53228     this.unbuild = function (oObjTree) {    
53229       var oNewDoc = document.implementation.createDocument('', '', null);
53230       loadObjTree(oNewDoc, oNewDoc, oObjTree);
53231       return oNewDoc;
53232     };
53233
53234     this.stringify = function (oObjTree) {
53235       return (new XMLSerializer()).serializeToString(JXON.unbuild(oObjTree));
53236     };
53237   })();
53238
53239   // var myObject = JXON.build(doc);
53240   // we got our javascript object! try: alert(JSON.stringify(myObject));
53241
53242   // var newDoc = JXON.unbuild(myObject);
53243   // we got our Document instance! try: alert((new XMLSerializer()).serializeToString(newDoc));
53244
53245   function uiCommitChanges(context) {
53246       var detected = utilDetect();
53247       var _entityID;
53248
53249
53250       function commitChanges(selection$$1) {
53251           var history = context.history();
53252           var summary = history.difference().summary();
53253
53254           var container = selection$$1.selectAll('.modal-section.commit-section')
53255               .data([0]);
53256
53257           var containerEnter = container.enter()
53258               .append('div')
53259               .attr('class', 'commit-section modal-section fillL2');
53260
53261           containerEnter
53262               .append('h3')
53263               .text(t('commit.changes', { count: summary.length }));
53264
53265           containerEnter
53266               .append('ul')
53267               .attr('class', 'changeset-list');
53268
53269           container = containerEnter
53270               .merge(container);
53271
53272
53273           var items = container.select('ul').selectAll('li')
53274               .data(summary);
53275
53276           var itemsEnter = items.enter()
53277               .append('li')
53278               .attr('class', 'change-item');
53279
53280           itemsEnter
53281               .each(function(d) {
53282                   select(this)
53283                       .call(svgIcon('#iD-icon-' + d.entity.geometry(d.graph), 'pre-text ' + d.changeType));
53284               });
53285
53286           itemsEnter
53287               .append('span')
53288               .attr('class', 'change-type')
53289               .text(function(d) { return t('commit.' + d.changeType) + ' '; });
53290
53291           itemsEnter
53292               .append('strong')
53293               .attr('class', 'entity-type')
53294               .text(function(d) {
53295                   var matched = context.presets().match(d.entity, d.graph);
53296                   return (matched && matched.name()) || utilDisplayType(d.entity.id);
53297               });
53298
53299           itemsEnter
53300               .append('span')
53301               .attr('class', 'entity-name')
53302               .text(function(d) {
53303                   var name = utilDisplayName(d.entity) || '',
53304                       string = '';
53305                   if (name !== '') {
53306                       string += ':';
53307                   }
53308                   return string += ' ' + name;
53309               });
53310
53311           itemsEnter
53312               .style('opacity', 0)
53313               .transition()
53314               .style('opacity', 1);
53315
53316           items = itemsEnter
53317               .merge(items);
53318
53319           items
53320               .on('mouseover', mouseover)
53321               .on('mouseout', mouseout)
53322               .on('click', click);
53323
53324
53325           // Download changeset link
53326           var changeset = new osmChangeset().update({ id: undefined });
53327           var changes = history.changes(actionDiscardTags(history.difference()));
53328
53329           delete changeset.id;  // Export without chnageset_id
53330
53331           var data = JXON.stringify(changeset.osmChangeJXON(changes));
53332           var blob = new Blob([data], {type: 'text/xml;charset=utf-8;'});
53333           var fileName = 'changes.osc';
53334
53335           var linkEnter = container.selectAll('.download-changes')
53336               .data([0])
53337               .enter()
53338               .append('a')
53339               .attr('class', 'download-changes');
53340
53341           if (detected.download) {      // All except IE11 and Edge
53342               linkEnter                 // download the data as a file
53343                   .attr('href', window.URL.createObjectURL(blob))
53344                   .attr('download', fileName);
53345
53346           } else {                      // IE11 and Edge
53347               linkEnter                 // open data uri in a new tab
53348                   .attr('target', '_blank')
53349                   .on('click.download', function() {
53350                       navigator.msSaveBlob(blob, fileName);
53351                   });
53352           }
53353
53354           linkEnter
53355               .call(svgIcon('#iD-icon-load', 'inline'))
53356               .append('span')
53357               .text(t('commit.download_changes'));
53358
53359
53360           function mouseover(d) {
53361               if (d.entity) {
53362                   context.surface().selectAll(
53363                       utilEntityOrMemberSelector([d.entity.id], context.graph())
53364                   ).classed('hover', true);
53365               }
53366           }
53367
53368
53369           function mouseout() {
53370               context.surface().selectAll('.hover')
53371                   .classed('hover', false);
53372           }
53373
53374
53375           function click(change) {
53376               if (change.changeType === 'deleted') {
53377                   _entityID = null;
53378               } else {
53379                   var entity = change.entity;
53380                   _entityID = change.entity.id;
53381                   context.map().zoomToEase(entity);
53382                   context.surface().selectAll(utilEntityOrMemberSelector([_entityID], context.graph()))
53383                       .classed('hover', true);
53384               }
53385           }
53386       }
53387
53388
53389       commitChanges.entityID = function(_) {
53390           if (!arguments.length) return _entityID;
53391           _entityID = _;
53392           return commitChanges;
53393       };
53394
53395
53396       return commitChanges;
53397   }
53398
53399   function uiCommitWarnings(context) {
53400
53401       function commitWarnings(selection) {
53402
53403           var changes = context.history().changes();
53404           var validations = context.history().validate(changes);
53405
53406           validations = reduce(validations, function(validations, val) {
53407               var severity = val.severity;
53408               if (validations.hasOwnProperty(severity)) {
53409                   validations[severity].push(val);
53410               } else {
53411                   validations[severity] = [val];
53412               }
53413               return validations;
53414           }, {});
53415
53416           forEach(validations, function(instances, type) {
53417               instances = uniqBy(instances, function(val) {
53418                   return val.entity || (val.id + '_' + val.message.replace(/\s+/g,''));
53419               });
53420
53421               var section = type + '-section';
53422               var instanceItem = type + '-item';
53423
53424               var container = selection.selectAll('.' + section)
53425                   .data(instances.length ? [0] : []);
53426
53427               container.exit()
53428                   .remove();
53429
53430               var containerEnter = container.enter()
53431                   .append('div')
53432                   .attr('class', 'modal-section ' + section + ' fillL2');
53433
53434               containerEnter
53435                   .append('h3')
53436                   .text(type === 'warning' ? t('commit.warnings') : t('commit.errors'));
53437
53438               containerEnter
53439                   .append('ul')
53440                   .attr('class', 'changeset-list');
53441
53442               container = containerEnter
53443                   .merge(container);
53444
53445
53446               var items = container.select('ul').selectAll('li')
53447                   .data(instances);
53448
53449               items.exit()
53450                   .remove();
53451
53452               var itemsEnter = items.enter()
53453                   .append('li')
53454                   .attr('class', instanceItem);
53455
53456               itemsEnter
53457                   .call(svgIcon('#iD-icon-alert', 'pre-text'));
53458
53459               itemsEnter
53460                   .append('strong')
53461                   .text(function(d) { return d.message; });
53462
53463               itemsEnter.filter(function(d) { return d.tooltip; })
53464                   .call(tooltip()
53465                       .title(function(d) { return d.tooltip; })
53466                       .placement('top')
53467                   );
53468
53469               items = itemsEnter
53470                   .merge(items);
53471
53472               items
53473                   .on('mouseover', mouseover)
53474                   .on('mouseout', mouseout)
53475                   .on('click', warningClick);
53476
53477
53478               function mouseover(d) {
53479                   if (d.entity) {
53480                       context.surface().selectAll(
53481                           utilEntityOrMemberSelector([d.entity.id], context.graph())
53482                       ).classed('hover', true);
53483                   }
53484               }
53485
53486
53487               function mouseout() {
53488                   context.surface().selectAll('.hover')
53489                       .classed('hover', false);
53490               }
53491
53492
53493               function warningClick(d) {
53494                   if (d.entity) {
53495                       context.map().zoomTo(d.entity);
53496                       context.enter(modeSelect(context, [d.entity.id]));
53497                   }
53498               }
53499           });
53500       }
53501
53502
53503       return commitWarnings;
53504   }
53505
53506   function uiRawTagEditor$$1(context) {
53507       var taginfo = services.taginfo;
53508       var dispatch$$1 = dispatch('change');
53509       var _readOnlyTags = [];
53510       var _showBlank = false;
53511       var _updatePreference = true;
53512       var _expanded = false;
53513       var _newRow;
53514       var _state;
53515       var _preset;
53516       var _tags;
53517       var _entityID;
53518
53519
53520       function rawTagEditor(selection$$1) {
53521           var count = Object.keys(_tags).filter(function(d) { return d; }).length;
53522
53523           var disclosure = uiDisclosure(context, 'raw_tag_editor', false)
53524               .title(t('inspector.all_tags') + ' (' + count + ')')
53525               .on('toggled', toggled)
53526               .updatePreference(_updatePreference)
53527               .content(content);
53528
53529           // Sometimes we want to force the raw_tag_editor to be opened/closed..
53530           // When undefined, uiDisclosure will use the user's stored preference.
53531           if (_expanded !== undefined) {
53532               disclosure.expanded(_expanded);
53533           }
53534
53535           selection$$1.call(disclosure);
53536
53537           function toggled(expanded) {
53538               _expanded = expanded;
53539               if (expanded) {
53540                   selection$$1.node().parentNode.scrollTop += 200;
53541               }
53542           }
53543       }
53544
53545
53546       function content(wrap) {
53547           var entries = map$3(_tags, function(v, k) {
53548               return { key: k, value: v };
53549           });
53550
53551           if (!entries.length || _showBlank) {
53552               _showBlank = false;
53553               entries.push({key: '', value: ''});
53554               _newRow = '';
53555           }
53556
53557           // List of tags
53558           var list = wrap.selectAll('.tag-list')
53559               .data([0]);
53560
53561           list = list.enter()
53562               .append('ul')
53563               .attr('class', 'tag-list')
53564               .merge(list);
53565
53566
53567           // Container for the Add button
53568           var addRowEnter = wrap.selectAll('.add-row')
53569               .data([0])
53570               .enter()
53571               .append('div')
53572               .attr('class', 'add-row');
53573
53574           addRowEnter
53575               .append('button')
53576               .attr('class', 'add-tag')
53577               .call(svgIcon('#iD-icon-plus', 'light'))
53578               .on('click', addTag);
53579
53580           addRowEnter
53581               .append('div')
53582               .attr('class', 'space-value');   // preserve space
53583
53584           addRowEnter
53585               .append('div')
53586               .attr('class', 'space-buttons');  // preserve space
53587
53588
53589           // Tag list items
53590           var items = list.selectAll('.tag-row')
53591               .data(entries, function(d) { return d.key; });
53592
53593           items.exit()
53594               .each(unbind)
53595               .remove();
53596
53597
53598           // Enter
53599           var enter = items.enter()
53600               .append('li')
53601               .attr('class', 'tag-row')
53602               .classed('readonly', isReadOnly);
53603
53604           var innerWrap = enter.append('div')
53605               .attr('class', 'inner-wrap');
53606
53607           innerWrap
53608               .append('div')
53609               .attr('class', 'key-wrap')
53610               .append('input')
53611               .property('type', 'text')
53612               .attr('class', 'key')
53613               .attr('maxlength', 255)
53614               .call(utilNoAuto)
53615               .on('blur', keyChange)
53616               .on('change', keyChange);
53617
53618           innerWrap
53619               .append('div')
53620               .attr('class', 'value-wrap')
53621               .append('input')
53622               .property('type', 'text')
53623               .attr('class', 'value')
53624               .attr('maxlength', 255)
53625               .call(utilNoAuto)
53626               .on('blur', valueChange)
53627               .on('change', valueChange)
53628               .on('keydown.push-more', pushMore);
53629
53630           innerWrap
53631               .append('button')
53632               .attr('tabindex', -1)
53633               .attr('class', 'form-field-button remove')
53634               .call(svgIcon('#iD-operation-delete'));
53635
53636
53637           // Update
53638           items = items
53639               .merge(enter)
53640               .sort(function(a, b) {
53641                   return (a.key === _newRow && b.key !== _newRow) ? 1
53642                       : (a.key !== _newRow && b.key === _newRow) ? -1
53643                       : ascending(a.key, b.key);
53644               });
53645
53646           items
53647               .each(function(tag) {
53648                   var row = select(this);
53649                   var key = row.select('input.key');      // propagate bound data to child
53650                   var value = row.select('input.value');  // propagate bound data to child
53651
53652                   if (_entityID && taginfo && _state !== 'hover') {
53653                       bindTypeahead(key, value);
53654                   }
53655
53656                   var isRelation = (_entityID && context.entity(_entityID).type === 'relation');
53657                   var reference;
53658
53659                   if (isRelation && tag.key === 'type') {
53660                       reference = uiTagReference({ rtype: tag.value }, context);
53661                   } else {
53662                       reference = uiTagReference({ key: tag.key, value: tag.value }, context);
53663                   }
53664
53665                   if (_state === 'hover') {
53666                       reference.showing(false);
53667                   }
53668
53669                   row.select('.inner-wrap')
53670                       .call(reference.button);
53671
53672                   row.call(reference.body);
53673               });
53674
53675           items.selectAll('input.key')
53676               .attr('title', function(d) { return d.key; })
53677               .call(utilGetSetValue, function(d) { return d.key; })
53678               .property('disabled', isReadOnly);
53679
53680           items.selectAll('input.value')
53681               .attr('title', function(d) { return d.value; })
53682               .call(utilGetSetValue, function(d) { return d.value; })
53683               .property('disabled', isReadOnly);
53684
53685           items.selectAll('button.remove')
53686               .on('click', removeTag);
53687
53688
53689
53690           function isReadOnly(d) {
53691               for (var i = 0; i < _readOnlyTags.length; i++) {
53692                   if (d.key.match(_readOnlyTags[i]) !== null) {
53693                       return true;
53694                   }
53695               }
53696               return false;
53697           }
53698
53699
53700           function pushMore() {
53701               if (event.keyCode === 9 && !event.shiftKey &&
53702                   list.selectAll('li:last-child input.value').node() === this) {
53703                   addTag();
53704               }
53705           }
53706
53707
53708           function bindTypeahead(key, value) {
53709               if (isReadOnly(key.datum())) return;
53710
53711               var geometry = context.geometry(_entityID);
53712
53713               key.call(uiCombobox(context, 'tag-key')
53714                   .fetcher(function(value, callback) {
53715                       taginfo.keys({
53716                           debounce: true,
53717                           geometry: geometry,
53718                           query: value
53719                       }, function(err, data) {
53720                           if (!err) callback(sort(value, data));
53721                       });
53722                   }));
53723
53724               value.call(uiCombobox(context, 'tag-value')
53725                   .fetcher(function(value, callback) {
53726                       taginfo.values({
53727                           debounce: true,
53728                           key: utilGetSetValue(key),
53729                           geometry: geometry,
53730                           query: value
53731                       }, function(err, data) {
53732                           if (!err) callback(sort(value, data));
53733                       });
53734                   }));
53735
53736
53737               function sort(value, data) {
53738                   var sameletter = [];
53739                   var other = [];
53740                   for (var i = 0; i < data.length; i++) {
53741                       if (data[i].value.substring(0, value.length) === value) {
53742                           sameletter.push(data[i]);
53743                       } else {
53744                           other.push(data[i]);
53745                       }
53746                   }
53747                   return sameletter.concat(other);
53748               }
53749           }
53750
53751
53752           function unbind() {
53753               var row = select(this);
53754
53755               row.selectAll('input.key')
53756                   .call(uiCombobox.off);
53757
53758               row.selectAll('input.value')
53759                   .call(uiCombobox.off);
53760           }
53761
53762
53763           function keyChange(d) {
53764               var kOld = d.key;
53765               var kNew = this.value.trim();
53766               var tag = {};
53767
53768               if (isReadOnly({ key: kNew })) {
53769                   this.value = kOld;
53770                   return;
53771               }
53772
53773               if (kNew && kNew !== kOld) {
53774                   var match = kNew.match(/^(.*?)(?:_(\d+))?$/);
53775                   var base = match[1];
53776                   var suffix = +(match[2] || 1);
53777                   while (_tags[kNew]) {  // rename key if already in use
53778                       kNew = base + '_' + suffix++;
53779                   }
53780
53781                   if (includes(kNew, '=')) {
53782                       var splitStr = kNew.split('=').map(function(str) { return str.trim(); });
53783                       var key = splitStr[0];
53784                       var value = splitStr[1];
53785
53786                       kNew = key;
53787                       d.value = value;
53788                   }
53789               }
53790               tag[kOld] = undefined;
53791               tag[kNew] = d.value;
53792
53793               d.key = kNew;  // Maintain DOM identity through the subsequent update.
53794
53795               if (_newRow === kOld) {   // see if this row is still a new row
53796                   _newRow = ((d.value === '' || kNew === '') ? kNew : undefined);
53797               }
53798
53799               this.value = kNew;
53800               dispatch$$1.call('change', this, tag);
53801           }
53802
53803
53804           function valueChange(d) {
53805               if (isReadOnly(d)) return;
53806               var tag = {};
53807               tag[d.key] = this.value;
53808
53809               if (_newRow === d.key && d.key !== '' && d.value !== '') {   // not a new row anymore
53810                   _newRow = undefined;
53811               }
53812
53813               dispatch$$1.call('change', this, tag);
53814           }
53815
53816
53817           function removeTag(d) {
53818               if (isReadOnly(d)) return;
53819               var tag = {};
53820               tag[d.key] = undefined;
53821               dispatch$$1.call('change', this, tag);
53822               select(this.parentNode).remove();
53823           }
53824
53825
53826           function addTag() {
53827               // Wrapped in a setTimeout in case it's being called from a blur
53828               // handler. Without the setTimeout, the call to `content` would
53829               // wipe out the pending value change.
53830               window.setTimeout(function() {
53831                   _showBlank = true;
53832                   content(wrap);
53833                   list.selectAll('li:last-child input.key').node().focus();
53834               }, 1);
53835           }
53836       }
53837
53838
53839       rawTagEditor.state = function(val) {
53840           if (!arguments.length) return _state;
53841           _state = val;
53842           return rawTagEditor;
53843       };
53844
53845
53846       rawTagEditor.preset = function(val) {
53847           if (!arguments.length) return _preset;
53848           _preset = val;
53849           if (_preset.isFallback()) {
53850               _expanded = true;
53851               _updatePreference = false;
53852           } else {
53853               _expanded = undefined;
53854               _updatePreference = true;
53855           }
53856           return rawTagEditor;
53857       };
53858
53859
53860       rawTagEditor.tags = function(val) {
53861           if (!arguments.length) return _tags;
53862           _tags = val;
53863           return rawTagEditor;
53864       };
53865
53866
53867       rawTagEditor.entityID = function(val) {
53868           if (!arguments.length) return _entityID;
53869           _entityID = val;
53870           return rawTagEditor;
53871       };
53872
53873
53874       rawTagEditor.expanded = function(val) {
53875           if (!arguments.length) return _expanded;
53876           _expanded = val;
53877           _updatePreference = false;
53878           return rawTagEditor;
53879       };
53880
53881
53882       rawTagEditor.readOnlyTags = function(val) {
53883           if (!arguments.length) return _readOnlyTags;
53884           _readOnlyTags = val;
53885           return rawTagEditor;
53886       };
53887
53888
53889       return utilRebind(rawTagEditor, dispatch$$1, 'on');
53890   }
53891
53892   var _changeset;
53893   var readOnlyTags = [
53894       /^changesets_count$/,
53895       /^created_by$/,
53896       /^ideditor:/,
53897       /^imagery_used$/,
53898       /^host$/,
53899       /^locale$/
53900   ];
53901
53902   // treat most punctuation (except -, _, +, &) as hashtag delimiters - #4398
53903   // from https://stackoverflow.com/a/25575009
53904   var hashtagRegex = /(#[^\u2000-\u206F\u2E00-\u2E7F\s\\'!"#$%()*,.\/:;<=>?@\[\]^`{|}~]+)/g;
53905
53906
53907   function uiCommit(context) {
53908       var dispatch$$1 = dispatch('cancel', 'save');
53909       var _userDetails;
53910       var _selection;
53911
53912       var changesetEditor = uiChangesetEditor$$1(context)
53913           .on('change', changeTags);
53914       var rawTagEditor = uiRawTagEditor$$1(context)
53915           .on('change', changeTags);
53916       var commitChanges = uiCommitChanges(context);
53917       var commitWarnings = uiCommitWarnings(context);
53918
53919
53920       function commit(selection$$1) {
53921           _selection = selection$$1;
53922
53923           var osm = context.connection();
53924           if (!osm) return;
53925
53926           // expire stored comment, hashtags, source after cutoff datetime - #3947 #4899
53927           var commentDate = +context.storage('commentDate') || 0;
53928           var currDate = Date.now();
53929           var cutoff = 2 * 86400 * 1000;   // 2 days
53930           if (commentDate > currDate || currDate - commentDate > cutoff) {
53931               context.storage('comment', null);
53932               context.storage('hashtags', null);
53933               context.storage('source', null);
53934           }
53935
53936           var tags;
53937           // Initialize changeset if one does not exist yet.
53938           // Also pull values from local storage.
53939           if (!_changeset) {
53940               var detected = utilDetect();
53941               tags = {
53942                   comment: context.storage('comment') || '',
53943                   created_by: ('iD ' + context.version).substr(0, 255),
53944                   host: detected.host.substr(0, 255),
53945                   locale: detected.locale.substr(0, 255)
53946               };
53947
53948               // call findHashtags initially - this will remove stored
53949               // hashtags if any hashtags are found in the comment - #4304
53950               findHashtags(tags, true);
53951
53952               var hashtags = context.storage('hashtags');
53953               if (hashtags) {
53954                   tags.hashtags = hashtags;
53955               }
53956
53957               var source = context.storage('source');
53958               if (source) {
53959                   tags.source = source;
53960               }
53961
53962               _changeset = new osmChangeset({ tags: tags });
53963           }
53964
53965           tags = clone(_changeset.tags);
53966
53967           // assign tags for imagery used
53968           var imageryUsed = context.history().imageryUsed().join(';').substr(0, 255);
53969           tags.imagery_used = imageryUsed || 'None';
53970
53971           // assign tags for closed issues and notes
53972           var osmClosed = osm.getClosedIDs();
53973           if (osmClosed.length) {
53974               tags['closed:note'] = osmClosed.join(';').substr(0, 255);
53975           }
53976           if (services.keepRight) {
53977               var krClosed = services.keepRight.getClosedIDs();
53978               if (krClosed.length) {
53979                   tags['closed:keepright'] = krClosed.join(';').substr(0, 255);
53980               }
53981           }
53982
53983           _changeset = _changeset.update({ tags: tags });
53984
53985           var header = selection$$1.selectAll('.header')
53986               .data([0]);
53987
53988           var headerTitle = header.enter()
53989               .append('div')
53990               .attr('class', 'header fillL header-container');
53991
53992           headerTitle
53993               .append('div')
53994               .attr('class', 'header-block header-block-outer');
53995
53996           headerTitle
53997               .append('div')
53998               .attr('class', 'header-block')
53999               .append('h3')
54000               .text(t('commit.title'));
54001
54002           headerTitle
54003               .append('div')
54004               .attr('class', 'header-block header-block-outer header-block-close')
54005               .append('button')
54006               .attr('class', 'close')
54007               .on('click', function() { context.enter(modeBrowse(context)); })
54008               .call(svgIcon('#iD-icon-close'));
54009
54010           var body = selection$$1.selectAll('.body')
54011               .data([0]);
54012
54013           body = body.enter()
54014               .append('div')
54015               .attr('class', 'body')
54016               .merge(body);
54017
54018
54019           // Changeset Section
54020           var changesetSection = body.selectAll('.changeset-editor')
54021               .data([0]);
54022
54023           changesetSection = changesetSection.enter()
54024               .append('div')
54025               .attr('class', 'modal-section changeset-editor')
54026               .merge(changesetSection);
54027
54028           changesetSection
54029               .call(changesetEditor
54030                   .changesetID(_changeset.id)
54031                   .tags(tags)
54032               );
54033
54034
54035           // Warnings
54036           body.call(commitWarnings);
54037
54038
54039           // Upload Explanation
54040           var saveSection = body.selectAll('.save-section')
54041               .data([0]);
54042
54043           saveSection = saveSection.enter()
54044               .append('div')
54045               .attr('class','modal-section save-section fillL cf')
54046               .merge(saveSection);
54047
54048           var prose = saveSection.selectAll('.commit-info')
54049               .data([0]);
54050
54051           prose = prose.enter()
54052               .append('p')
54053               .attr('class', 'commit-info')
54054               .text(t('commit.upload_explanation'))
54055               .merge(prose);
54056
54057           osm.userDetails(function(err, user) {
54058               if (err) return;
54059
54060               var userLink = select(document.createElement('div'));
54061
54062               _userDetails = user;
54063
54064               if (user.image_url) {
54065                   userLink
54066                       .append('img')
54067                       .attr('src', user.image_url)
54068                       .attr('class', 'icon pre-text user-icon');
54069               }
54070
54071               userLink
54072                   .append('a')
54073                   .attr('class', 'user-info')
54074                   .text(user.display_name)
54075                   .attr('href', osm.userURL(user.display_name))
54076                   .attr('tabindex', -1)
54077                   .attr('target', '_blank');
54078
54079               prose
54080                   .html(t('commit.upload_explanation_with_user', { user: userLink.html() }));
54081           });
54082
54083
54084           // Request Review
54085           var requestReview = saveSection.selectAll('.request-review')
54086               .data([0]);
54087
54088           // Enter
54089           var requestReviewEnter = requestReview.enter()
54090               .append('div')
54091               .attr('class', 'request-review');
54092
54093           var labelEnter = requestReviewEnter
54094               .append('label')
54095               .attr('for', 'commit-input-request-review');
54096
54097           labelEnter
54098               .append('input')
54099               .attr('type', 'checkbox')
54100               .attr('id', 'commit-input-request-review');
54101
54102           labelEnter
54103               .append('span')
54104               .text(t('commit.request_review'));
54105
54106           // Update
54107           requestReview = requestReview
54108               .merge(requestReviewEnter);
54109
54110           var requestReviewInput = requestReview.selectAll('input')
54111               .property('checked', isReviewRequested(_changeset.tags))
54112               .on('change', toggleRequestReview);
54113
54114
54115           // Buttons
54116           var buttonSection = saveSection.selectAll('.buttons')
54117               .data([0]);
54118
54119           // enter
54120           var buttonEnter = buttonSection.enter()
54121               .append('div')
54122               .attr('class', 'buttons fillL cf');
54123
54124           buttonEnter
54125               .append('button')
54126               .attr('class', 'secondary-action button cancel-button')
54127               .append('span')
54128               .attr('class', 'label')
54129               .text(t('commit.cancel'));
54130
54131           buttonEnter
54132               .append('button')
54133               .attr('class', 'action button save-button')
54134               .append('span')
54135               .attr('class', 'label')
54136               .text(t('commit.save'));
54137
54138           // update
54139           buttonSection = buttonSection
54140               .merge(buttonEnter);
54141
54142           buttonSection.selectAll('.cancel-button')
54143               .on('click.cancel', function() {
54144                   var selectedID = commitChanges.entityID();
54145                   dispatch$$1.call('cancel', this, selectedID);
54146               });
54147
54148           buttonSection.selectAll('.save-button')
54149               .attr('disabled', function() {
54150                   var n = select('#preset-input-comment').node();
54151                   return (n && n.value.length) ? null : true;
54152               })
54153               .on('click.save', function() {
54154                   this.blur();    // avoid keeping focus on the button - #4641
54155                   dispatch$$1.call('save', this, _changeset);
54156               });
54157
54158
54159           // Raw Tag Editor
54160           var tagSection = body.selectAll('.tag-section.raw-tag-editor')
54161               .data([0]);
54162
54163           tagSection = tagSection.enter()
54164               .append('div')
54165               .attr('class', 'modal-section tag-section raw-tag-editor')
54166               .merge(tagSection);
54167
54168           var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
54169           tagSection
54170               .call(rawTagEditor
54171                   .expanded(expanded)
54172                   .readOnlyTags(readOnlyTags)
54173                   .tags(clone(_changeset.tags))
54174               );
54175
54176
54177           // Change summary
54178           body.call(commitChanges);
54179
54180
54181           function toggleRequestReview() {
54182               var rr = requestReviewInput.property('checked');
54183               updateChangeset({ review_requested: (rr ? 'yes' : undefined) });
54184
54185               var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
54186               tagSection
54187                   .call(rawTagEditor
54188                       .expanded(expanded)
54189                       .readOnlyTags(readOnlyTags)
54190                       .tags(clone(_changeset.tags))
54191                   );
54192           }
54193       }
54194
54195
54196       function changeTags(changed, onInput) {
54197           if (changed.hasOwnProperty('comment')) {
54198               if (changed.comment === undefined) {
54199                   changed.comment = '';
54200               }
54201               if (!onInput) {
54202                   context.storage('comment', changed.comment);
54203                   context.storage('commentDate', Date.now());
54204               }
54205           }
54206           if (changed.hasOwnProperty('source')) {
54207               if (changed.source === undefined) {
54208                   context.storage('source', null);
54209               } else if (!onInput) {
54210                   context.storage('source', changed.source);
54211                   context.storage('commentDate', Date.now());
54212               }
54213           }
54214
54215           updateChangeset(changed, onInput);
54216
54217           if (_selection) {
54218               _selection.call(commit);
54219           }
54220       }
54221
54222
54223       function findHashtags(tags, commentOnly) {
54224           var inComment = commentTags();
54225           var inHashTags = hashTags();
54226
54227           if (inComment !== null) {                    // when hashtags are detected in comment...
54228               context.storage('hashtags', null);       // always remove stored hashtags - #4304
54229               if (commentOnly) { inHashTags = null; }  // optionally override hashtags field
54230           }
54231           return unionBy(inComment, inHashTags, function (s) {
54232               return s.toLowerCase();
54233           });
54234
54235           // Extract hashtags from `comment`
54236           function commentTags() {
54237               return tags.comment
54238                   .replace(/http\S*/g, '')  // drop anything that looks like a URL - #4289
54239                   .match(hashtagRegex);
54240           }
54241
54242           // Extract and clean hashtags from `hashtags`
54243           function hashTags() {
54244               var t$$1 = tags.hashtags || '';
54245               return t$$1
54246                   .split(/[,;\s]+/)
54247                   .map(function (s) {
54248                       if (s[0] !== '#') { s = '#' + s; }    // prepend '#'
54249                       var matched = s.match(hashtagRegex);
54250                       return matched && matched[0];
54251                   }).filter(Boolean);                       // exclude falsey
54252           }
54253       }
54254
54255
54256       function isReviewRequested(tags) {
54257           var rr = tags.review_requested;
54258           if (rr === undefined) return false;
54259           rr = rr.trim().toLowerCase();
54260           return !(rr === '' || rr === 'no');
54261       }
54262
54263
54264       function updateChangeset(changed, onInput) {
54265           var tags = clone(_changeset.tags);
54266
54267           forEach(changed, function(v, k) {
54268               k = k.trim().substr(0, 255);
54269               if (readOnlyTags.indexOf(k) !== -1) return;
54270
54271               if (k !== '' && v !== undefined) {
54272                   if (onInput) {
54273                       tags[k] = v;
54274                   } else {
54275                       tags[k] = v.trim().substr(0, 255);
54276                   }
54277               } else {
54278                   delete tags[k];
54279               }
54280           });
54281
54282           if (!onInput) {
54283               // when changing the comment, override hashtags with any found in comment.
54284               var commentOnly = changed.hasOwnProperty('comment') && (changed.comment !== '');
54285               var arr = findHashtags(tags, commentOnly);
54286               if (arr.length) {
54287                   tags.hashtags = arr.join(';').substr(0, 255);
54288                   context.storage('hashtags', tags.hashtags);
54289               } else {
54290                   delete tags.hashtags;
54291                   context.storage('hashtags', null);
54292               }
54293           }
54294
54295           // always update userdetails, just in case user reauthenticates as someone else
54296           if (_userDetails && _userDetails.changesets_count !== undefined) {
54297               var changesetsCount = parseInt(_userDetails.changesets_count, 10) + 1;  // #4283
54298               tags.changesets_count = String(changesetsCount);
54299
54300               // first 100 edits - new user
54301               if (changesetsCount <= 100) {
54302                   var s;
54303                   s = context.storage('walkthrough_completed');
54304                   if (s) {
54305                       tags['ideditor:walkthrough_completed'] = s;
54306                   }
54307
54308                   s = context.storage('walkthrough_progress');
54309                   if (s) {
54310                       tags['ideditor:walkthrough_progress'] = s;
54311                   }
54312
54313                   s = context.storage('walkthrough_started');
54314                   if (s) {
54315                       tags['ideditor:walkthrough_started'] = s;
54316                   }
54317               }
54318           } else {
54319               delete tags.changesets_count;
54320           }
54321
54322           if (!isEqual(_changeset.tags, tags)) {
54323               _changeset = _changeset.update({ tags: tags });
54324           }
54325       }
54326
54327
54328       commit.reset = function() {
54329           _changeset = null;
54330       };
54331
54332
54333       return utilRebind(commit, dispatch$$1, 'on');
54334   }
54335
54336   function uiConflicts(context) {
54337       var dispatch$$1 = dispatch('cancel', 'save');
54338       var keybinding = utilKeybinding('conflicts');
54339       var _origChanges;
54340       var _conflictList;
54341
54342
54343       function keybindingOn() {
54344           select(document)
54345               .call(keybinding.on('⎋', cancel, true));
54346       }
54347
54348       function keybindingOff() {
54349           select(document)
54350               .call(keybinding.unbind);
54351       }
54352
54353       function tryAgain() {
54354           keybindingOff();
54355           dispatch$$1.call('save');
54356       }
54357
54358       function cancel() {
54359           keybindingOff();
54360           dispatch$$1.call('cancel');
54361       }
54362
54363
54364       function conflicts(selection$$1) {
54365           keybindingOn();
54366
54367           var headerEnter = selection$$1.selectAll('.header')
54368               .data([0])
54369               .enter()
54370               .append('div')
54371               .attr('class', 'header fillL');
54372
54373           headerEnter
54374               .append('button')
54375               .attr('class', 'fr')
54376               .on('click', cancel)
54377               .call(svgIcon('#iD-icon-close'));
54378
54379           headerEnter
54380               .append('h3')
54381               .text(t('save.conflict.header'));
54382
54383           var bodyEnter = selection$$1.selectAll('.body')
54384               .data([0])
54385               .enter()
54386               .append('div')
54387               .attr('class', 'body fillL');
54388
54389           var conflictsHelpEnter = bodyEnter
54390               .append('div')
54391               .attr('class', 'conflicts-help')
54392               .text(t('save.conflict.help'));
54393
54394
54395           // Download changes link
54396           var detected = utilDetect();
54397           var changeset = new osmChangeset();
54398
54399           delete changeset.id;  // Export without changeset_id
54400
54401           var data = JXON.stringify(changeset.osmChangeJXON(_origChanges));
54402           var blob = new Blob([data], { type: 'text/xml;charset=utf-8;' });
54403           var fileName = 'changes.osc';
54404
54405           var linkEnter = conflictsHelpEnter.selectAll('.download-changes')
54406               .append('a')
54407               .attr('class', 'download-changes');
54408
54409           if (detected.download) {      // All except IE11 and Edge
54410               linkEnter                 // download the data as a file
54411                   .attr('href', window.URL.createObjectURL(blob))
54412                   .attr('download', fileName);
54413
54414           } else {                      // IE11 and Edge
54415               linkEnter                 // open data uri in a new tab
54416                   .attr('target', '_blank')
54417                   .on('click.download', function() {
54418                       navigator.msSaveBlob(blob, fileName);
54419                   });
54420           }
54421
54422           linkEnter
54423               .call(svgIcon('#iD-icon-load', 'inline'))
54424               .append('span')
54425               .text(t('save.conflict.download_changes'));
54426
54427
54428           bodyEnter
54429               .append('div')
54430               .attr('class', 'conflict-container fillL3')
54431               .call(showConflict, 0);
54432
54433           bodyEnter
54434               .append('div')
54435               .attr('class', 'conflicts-done')
54436               .attr('opacity', 0)
54437               .style('display', 'none')
54438               .text(t('save.conflict.done'));
54439
54440           var buttonsEnter = bodyEnter
54441               .append('div')
54442               .attr('class','buttons col12 joined conflicts-buttons');
54443
54444           buttonsEnter
54445               .append('button')
54446               .attr('disabled', _conflictList.length > 1)
54447               .attr('class', 'action conflicts-button col6')
54448               .text(t('save.title'))
54449               .on('click.try_again', tryAgain);
54450
54451           buttonsEnter
54452               .append('button')
54453               .attr('class', 'secondary-action conflicts-button col6')
54454               .text(t('confirm.cancel'))
54455               .on('click.cancel', cancel);
54456       }
54457
54458
54459       function showConflict(selection$$1, index) {
54460           index = utilWrap(index, _conflictList.length);
54461
54462           var parent = select(selection$$1.node().parentNode);
54463
54464           // enable save button if this is the last conflict being reviewed..
54465           if (index === _conflictList.length - 1) {
54466               window.setTimeout(function() {
54467                   parent.select('.conflicts-button')
54468                       .attr('disabled', null);
54469
54470                   parent.select('.conflicts-done')
54471                       .transition()
54472                       .attr('opacity', 1)
54473                       .style('display', 'block');
54474               }, 250);
54475           }
54476
54477           var conflict = selection$$1
54478               .selectAll('.conflict')
54479               .data([_conflictList[index]]);
54480
54481           conflict.exit()
54482               .remove();
54483
54484           var conflictEnter = conflict.enter()
54485               .append('div')
54486               .attr('class', 'conflict');
54487
54488           conflictEnter
54489               .append('h4')
54490               .attr('class', 'conflict-count')
54491               .text(t('save.conflict.count', { num: index + 1, total: _conflictList.length }));
54492
54493           conflictEnter
54494               .append('a')
54495               .attr('class', 'conflict-description')
54496               .attr('href', '#')
54497               .text(function(d) { return d.name; })
54498               .on('click', function(d) {
54499                   event.preventDefault();
54500                   zoomToEntity(d.id);
54501               });
54502
54503           var details = conflictEnter
54504               .append('div')
54505               .attr('class', 'conflict-detail-container');
54506
54507           details
54508               .append('ul')
54509               .attr('class', 'conflict-detail-list')
54510               .selectAll('li')
54511               .data(function(d) { return d.details || []; })
54512               .enter()
54513               .append('li')
54514               .attr('class', 'conflict-detail-item')
54515               .html(function(d) { return d; });
54516
54517           details
54518               .append('div')
54519               .attr('class', 'conflict-choices')
54520               .call(addChoices);
54521
54522           details
54523               .append('div')
54524               .attr('class', 'conflict-nav-buttons joined cf')
54525               .selectAll('button')
54526               .data(['previous', 'next'])
54527               .enter()
54528               .append('button')
54529               .text(function(d) { return t('save.conflict.' + d); })
54530               .attr('class', 'conflict-nav-button action col6')
54531               .attr('disabled', function(d, i) {
54532                   return (i === 0 && index === 0) ||
54533                       (i === 1 && index === _conflictList.length - 1) || null;
54534               })
54535               .on('click', function(d, i) {
54536                   event.preventDefault();
54537
54538                   var container = parent.selectAll('.conflict-container');
54539                   var sign = (i === 0 ? -1 : 1);
54540
54541                   container
54542                       .selectAll('.conflict')
54543                       .remove();
54544
54545                   container
54546                       .call(showConflict, index + sign);
54547               });
54548
54549       }
54550
54551
54552       function addChoices(selection$$1) {
54553           var choices = selection$$1
54554               .append('ul')
54555               .attr('class', 'layer-list')
54556               .selectAll('li')
54557               .data(function(d) { return d.choices || []; });
54558
54559           // enter
54560           var choicesEnter = choices.enter()
54561               .append('li')
54562               .attr('class', 'layer');
54563
54564           var labelEnter = choicesEnter
54565               .append('label');
54566
54567           labelEnter
54568               .append('input')
54569               .attr('type', 'radio')
54570               .attr('name', function(d) { return d.id; })
54571               .on('change', function(d, i) {
54572                   var ul = this.parentNode.parentNode.parentNode;
54573                   ul.__data__.chosen = i;
54574                   choose(ul, d);
54575               });
54576
54577           labelEnter
54578               .append('span')
54579               .text(function(d) { return d.text; });
54580
54581           // update
54582           choicesEnter
54583               .merge(choices)
54584               .each(function(d, i) {
54585                   var ul = this.parentNode;
54586                   if (ul.__data__.chosen === i) {
54587                       choose(ul, d);
54588                   }
54589               });
54590       }
54591
54592
54593       function choose(ul, datum) {
54594           if (event) event.preventDefault();
54595
54596           select(ul)
54597               .selectAll('li')
54598               .classed('active', function(d) { return d === datum; })
54599               .selectAll('input')
54600               .property('checked', function(d) { return d === datum; });
54601
54602           var extent = geoExtent$$1();
54603           var entity;
54604
54605           entity = context.graph().hasEntity(datum.id);
54606           if (entity) extent._extend(entity.extent(context.graph()));
54607
54608           datum.action();
54609
54610           entity = context.graph().hasEntity(datum.id);
54611           if (entity) extent._extend(entity.extent(context.graph()));
54612
54613           zoomToEntity(datum.id, extent);
54614       }
54615
54616
54617       function zoomToEntity(id, extent) {
54618           context.surface().selectAll('.hover')
54619               .classed('hover', false);
54620
54621           var entity = context.graph().hasEntity(id);
54622           if (entity) {
54623               if (extent) {
54624                   context.map().trimmedExtent(extent);
54625               } else {
54626                   context.map().zoomToEase(entity);
54627               }
54628               context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph()))
54629                   .classed('hover', true);
54630           }
54631       }
54632
54633
54634       // The conflict list should be an array of objects like:
54635       // {
54636       //     id: id,
54637       //     name: entityName(local),
54638       //     details: merge.conflicts(),
54639       //     chosen: 1,
54640       //     choices: [
54641       //         choice(id, keepMine, forceLocal),
54642       //         choice(id, keepTheirs, forceRemote)
54643       //     ]
54644       // }
54645       conflicts.conflictList = function(_) {
54646           if (!arguments.length) return _conflictList;
54647           _conflictList = _;
54648           return conflicts;
54649       };
54650
54651
54652       conflicts.origChanges = function(_) {
54653           if (!arguments.length) return _origChanges;
54654           _origChanges = _;
54655           return conflicts;
54656       };
54657
54658
54659       return utilRebind(conflicts, dispatch$$1, 'on');
54660   }
54661
54662   function uiDataEditor$$1(context) {
54663       var dataHeader = uiDataHeader();
54664       var quickLinks = uiQuickLinks();
54665       var rawTagEditor = uiRawTagEditor$$1(context);
54666       var _datum;
54667
54668
54669       function dataEditor(selection) {
54670           // quick links
54671           var choices = [{
54672               id: 'zoom_to',
54673               label: 'inspector.zoom_to.title',
54674               tooltip: function() {
54675                   return uiTooltipHtml(t('inspector.zoom_to.tooltip_data'), t('inspector.zoom_to.key'));
54676               },
54677               click: function zoomTo() {
54678                   context.mode().zoomToSelected();
54679               }
54680           }];
54681
54682
54683           var header = selection.selectAll('.header')
54684               .data([0]);
54685
54686           var headerEnter = header.enter()
54687               .append('div')
54688               .attr('class', 'header fillL');
54689
54690           headerEnter
54691               .append('button')
54692               .attr('class', 'fr data-editor-close')
54693               .on('click', function() {
54694                   context.enter(modeBrowse(context));
54695               })
54696               .call(svgIcon('#iD-icon-close'));
54697
54698           headerEnter
54699               .append('h3')
54700               .text(t('map_data.title'));
54701
54702
54703           var body = selection.selectAll('.body')
54704               .data([0]);
54705
54706           body = body.enter()
54707               .append('div')
54708               .attr('class', 'body')
54709               .merge(body);
54710
54711           var editor = body.selectAll('.data-editor')
54712               .data([0]);
54713
54714           editor.enter()
54715               .append('div')
54716               .attr('class', 'modal-section data-editor')
54717               .merge(editor)
54718               .call(dataHeader.datum(_datum))
54719               .call(quickLinks.choices(choices));
54720
54721           var rte = body.selectAll('.raw-tag-editor')
54722               .data([0]);
54723
54724           rte.enter()
54725               .append('div')
54726               .attr('class', 'raw-tag-editor inspector-inner data-editor')
54727               .merge(rte)
54728               .call(rawTagEditor
54729                   .expanded(true)
54730                   .readOnlyTags([/./])
54731                   .tags((_datum && _datum.properties) || {})
54732                   .state('hover')
54733               );
54734       }
54735
54736
54737       dataEditor.datum = function(val) {
54738           if (!arguments.length) return _datum;
54739           _datum = val;
54740           return this;
54741       };
54742
54743
54744       return dataEditor;
54745   }
54746
54747   function uiDataHeader() {
54748       var _datum;
54749
54750
54751       function dataHeader(selection) {
54752           var header = selection.selectAll('.data-header')
54753               .data(
54754                   (_datum ? [_datum] : []),
54755                   function(d) { return d.__featurehash__; }
54756               );
54757
54758           header.exit()
54759               .remove();
54760
54761           var headerEnter = header.enter()
54762               .append('div')
54763               .attr('class', 'data-header');
54764
54765           var iconEnter = headerEnter
54766               .append('div')
54767               .attr('class', 'data-header-icon');
54768
54769           iconEnter
54770               .append('div')
54771               .attr('class', 'preset-icon-28')
54772               .call(svgIcon('#iD-icon-data', 'note-fill'));
54773
54774           headerEnter
54775               .append('div')
54776               .attr('class', 'data-header-label')
54777               .text(t('map_data.layers.custom.title'));
54778       }
54779
54780
54781       dataHeader.datum = function(val) {
54782           if (!arguments.length) return _datum;
54783           _datum = val;
54784           return this;
54785       };
54786
54787
54788       return dataHeader;
54789   }
54790
54791   function uiEditMenu(context, operations) {
54792       var menu;
54793       var center = [0, 0];
54794       var offset = [0, 0];
54795       var tooltip;
54796
54797       var p = 8;               // top padding
54798       var m = 4;               // top margin
54799       var h = 15;              // height of icon
54800       var vpBottomMargin = 45; // viewport bottom margin
54801       var vpSideMargin = 35;   // viewport side margin
54802       var buttonWidth = 44;
54803       var buttonHeight = (2 * p + h);
54804       var menuWidth = buttonWidth;
54805       var menuHeight = (2 * m) + operations.length * buttonHeight;
54806       var menuSideMargin = 10;
54807       var tooltipWidth = 200;
54808       var tooltipHeight = 200;  // a reasonable guess, real height depends on tooltip contents
54809
54810
54811       var editMenu = function (selection$$1) {
54812           if (!operations.length) return;
54813
54814           selection$$1.node().parentNode.focus();
54815
54816           var isRTL = textDirection === 'rtl';
54817           var viewport = context.surfaceRect();
54818
54819           if (!isRTL && (center[0] + menuSideMargin + menuWidth) > (viewport.width - vpSideMargin)) {
54820               // menu is going left-to-right and near right viewport edge, go left instead
54821               isRTL = true;
54822           } else if (isRTL && (center[0] - menuSideMargin - menuWidth) < vpSideMargin) {
54823               // menu is going right-to-left and near left viewport edge, go right instead
54824               isRTL = false;
54825           }
54826
54827           offset[0] = (isRTL ? -1 * (menuSideMargin + menuWidth) : menuSideMargin);
54828
54829           if (center[1] + menuHeight > (viewport.height - vpBottomMargin)) {
54830               // menu is near bottom viewport edge, shift upwards
54831               offset[1] = -1 * (center[1] + menuHeight - viewport.height + vpBottomMargin);
54832           }
54833
54834           var origin = [ center[0] + offset[0], center[1] + offset[1] ];
54835
54836           menu = selection$$1
54837               .append('g')
54838               .attr('class', 'edit-menu')
54839               .attr('transform', 'translate(' + origin + ')')
54840               .attr('opacity', 0);
54841
54842           menu
54843               .transition()
54844               .attr('opacity', 1);
54845
54846           menu
54847               .append('rect')
54848               .attr('class', 'edit-menu-background')
54849               .attr('x', 4)
54850               .attr('rx', 4)
54851               .attr('ry', 4)
54852               .attr('width', menuWidth)
54853               .attr('height', menuHeight)
54854               .attr('stroke-linecap', 'round');
54855
54856
54857           var button = menu.selectAll('.edit-menu-item')
54858               .data(operations)
54859               .enter()
54860               .append('g')
54861               .attr('class', function (d) { return 'edit-menu-item edit-menu-item-' + d.id; })
54862               .classed('disabled', function (d) { return d.disabled(); })
54863               .attr('transform', function (d, i) {
54864                   return 'translate(' + geoVecFloor([
54865                       0,
54866                       m + i * buttonHeight
54867                   ]).join(',') + ')';
54868               });
54869
54870           button
54871               .append('rect')
54872               .attr('x', 4)
54873               .attr('width', buttonWidth)
54874               .attr('height', buttonHeight)
54875               .on('click', click)
54876               .on('mousedown', mousedown)
54877               .on('mouseover', mouseover)
54878               .on('mouseout', mouseout);
54879
54880           button
54881               .append('use')
54882               .attr('width', '20')
54883               .attr('height', '20')
54884               .attr('transform', function () { return 'translate(' + [2 * p, 5] + ')'; })
54885               .attr('xlink:href', function (d) { return '#iD-operation-' + d.id; });
54886
54887           tooltip = select('#id-container')
54888               .append('div')
54889               .attr('class', 'tooltip-inner edit-menu-tooltip');
54890
54891
54892           function click(operation) {
54893               event.stopPropagation();
54894               if (operation.disabled()) return;
54895               operation();
54896               editMenu.close();
54897           }
54898
54899           function mousedown() {
54900               event.stopPropagation();  // https://github.com/openstreetmap/iD/issues/1869
54901           }
54902
54903           function mouseover(d, i) {
54904               var tipX, tipY;
54905
54906               if (!isRTL) {
54907                   tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
54908               } else {
54909                   tipX = viewport.left + origin[0] - 4 - tooltipWidth;
54910               }
54911
54912               if (tipX + tooltipWidth > viewport.right) {
54913                   // tip is going left-to-right and near right viewport edge, go left instead
54914                   tipX = viewport.left + origin[0] - 4 - tooltipWidth;
54915               } else if (tipX < viewport.left) {
54916                   // tip is going right-to-left and near left viewport edge, go right instead
54917                   tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
54918               }
54919
54920               tipY = viewport.top + origin[1] + (i * buttonHeight);
54921               if (tipY + tooltipHeight > viewport.bottom) {
54922                   // tip is near bottom viewport edge, shift upwards
54923                   tipY -= tipY + tooltipHeight - viewport.bottom;
54924               }
54925
54926               tooltip
54927                   .style('left', tipX + 'px')
54928                   .style('top', tipY + 'px')
54929                   .style('display', 'block')
54930                   .html(uiTooltipHtml(d.tooltip(), d.keys[0], d.title));
54931           }
54932
54933           function mouseout() {
54934               tooltip.style('display', 'none');
54935           }
54936       };
54937
54938
54939       editMenu.close = function () {
54940           if (menu) {
54941               menu
54942                   .style('pointer-events', 'none')
54943                   .transition()
54944                   .attr('opacity', 0)
54945                   .remove();
54946           }
54947
54948           if (tooltip) {
54949               tooltip.remove();
54950           }
54951       };
54952
54953
54954       editMenu.center = function (_) {
54955           if (!arguments.length) return center;
54956           center = _;
54957           return editMenu;
54958       };
54959
54960
54961       return editMenu;
54962   }
54963
54964   // This currently only works with the 'restrictions' field
54965   // It borrows some code from uiHelp
54966
54967   function uiFieldHelp(context, fieldName) {
54968       var fieldHelp = {};
54969       var _inspector = select(null);
54970       var _wrap = select(null);
54971       var _body = select(null);
54972
54973       var fieldHelpKeys = {
54974           restrictions: [
54975               ['about',[
54976                   'about',
54977                   'from_via_to',
54978                   'maxdist',
54979                   'maxvia'
54980               ]],
54981               ['inspecting',[
54982                   'about',
54983                   'from_shadow',
54984                   'allow_shadow',
54985                   'restrict_shadow',
54986                   'only_shadow',
54987                   'restricted',
54988                   'only'
54989               ]],
54990               ['modifying',[
54991                   'about',
54992                   'indicators',
54993                   'allow_turn',
54994                   'restrict_turn',
54995                   'only_turn'
54996               ]],
54997               ['tips',[
54998                   'simple',
54999                   'simple_example',
55000                   'indirect',
55001                   'indirect_example',
55002                   'indirect_noedit'
55003               ]]
55004           ]
55005       };
55006
55007       var fieldHelpHeadings = {};
55008
55009       var replacements = {
55010           distField: t('restriction.controls.distance'),
55011           viaField: t('restriction.controls.via'),
55012           fromShadow: icon('#iD-turn-shadow', 'pre-text shadow from'),
55013           allowShadow: icon('#iD-turn-shadow', 'pre-text shadow allow'),
55014           restrictShadow: icon('#iD-turn-shadow', 'pre-text shadow restrict'),
55015           onlyShadow: icon('#iD-turn-shadow', 'pre-text shadow only'),
55016           allowTurn: icon('#iD-turn-yes', 'pre-text turn'),
55017           restrictTurn: icon('#iD-turn-no', 'pre-text turn'),
55018           onlyTurn: icon('#iD-turn-only', 'pre-text turn')
55019       };
55020
55021
55022       // For each section, squash all the texts into a single markdown document
55023       var docs = fieldHelpKeys[fieldName].map(function(key) {
55024           var helpkey = 'help.field.' + fieldName + '.' + key[0];
55025           var text = key[1].reduce(function(all, part) {
55026               var subkey = helpkey + '.' + part;
55027               var depth = fieldHelpHeadings[subkey];                     // is this subkey a heading?
55028               var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
55029               return all + hhh + t(subkey, replacements) + '\n\n';
55030           }, '');
55031
55032           return {
55033               key: helpkey,
55034               title: t(helpkey + '.title'),
55035               html: marked(text.trim())
55036           };
55037       });
55038
55039
55040       function show() {
55041           updatePosition();
55042
55043           _body
55044               .classed('hide', false)
55045               .style('opacity', '0')
55046               .transition()
55047               .duration(200)
55048               .style('opacity', '1');
55049       }
55050
55051
55052       function hide() {
55053           _body
55054               .classed('hide', true)
55055               .transition()
55056               .duration(200)
55057               .style('opacity', '0')
55058               .on('end', function () {
55059                   _body.classed('hide', true);
55060               });
55061       }
55062
55063
55064       function clickHelp(index) {
55065           var d = docs[index];
55066           var tkeys = fieldHelpKeys[fieldName][index][1];
55067
55068           _body.selectAll('.field-help-nav-item')
55069               .classed('active', function(d, i) { return i === index; });
55070
55071           var content = _body.selectAll('.field-help-content')
55072               .html(d.html);
55073
55074           // class the paragraphs so we can find and style them
55075           content.selectAll('p')
55076               .attr('class', function(d, i) { return tkeys[i]; });
55077
55078           // insert special content for certain help sections
55079           if (d.key === 'help.field.restrictions.inspecting') {
55080               content
55081                   .insert('img', 'p.from_shadow')
55082                   .attr('class', 'field-help-image cf')
55083                   .attr('src', context.imagePath('tr_inspect.gif'));
55084
55085           } else if (d.key === 'help.field.restrictions.modifying') {
55086               content
55087                   .insert('img', 'p.allow_turn')
55088                   .attr('class', 'field-help-image cf')
55089                   .attr('src', context.imagePath('tr_modify.gif'));
55090           }
55091       }
55092
55093
55094       fieldHelp.button = function(selection$$1) {
55095           if (_body.empty()) return;
55096
55097           var button = selection$$1.selectAll('.field-help-button')
55098               .data([0]);
55099
55100           // enter/update
55101           button.enter()
55102               .append('button')
55103               .attr('class', 'field-help-button')
55104               .attr('tabindex', -1)
55105               .call(svgIcon('#iD-icon-help'))
55106               .merge(button)
55107               .on('click', function () {
55108                   event.stopPropagation();
55109                   event.preventDefault();
55110                   if (_body.classed('hide')) {
55111                       show();
55112                   } else {
55113                       hide();
55114                   }
55115               });
55116       };
55117
55118
55119       function updatePosition() {
55120           var wrap = _wrap.node();
55121           var inspector = _inspector.node();
55122           var wRect = wrap.getBoundingClientRect();
55123           var iRect = inspector.getBoundingClientRect();
55124
55125           _body
55126               .style('top', wRect.top + inspector.scrollTop - iRect.top + 'px');
55127       }
55128
55129
55130       fieldHelp.body = function(selection$$1) {
55131           // This control expects the field to have a form-field-input-wrap div
55132           _wrap = selection$$1.selectAll('.form-field-input-wrap');
55133           if (_wrap.empty()) return;
55134
55135           // absolute position relative to the inspector, so it "floats" above the fields
55136           _inspector = select('#sidebar .entity-editor-pane .inspector-body');
55137           if (_inspector.empty()) return;
55138
55139           _body = _inspector.selectAll('.field-help-body')
55140               .data([0]);
55141
55142           var enter = _body.enter()
55143               .append('div')
55144               .attr('class', 'field-help-body hide');   // initially hidden
55145
55146           var titleEnter = enter
55147               .append('div')
55148               .attr('class', 'field-help-title cf');
55149
55150           titleEnter
55151               .append('h2')
55152               .attr('class', ((textDirection === 'rtl') ? 'fr' : 'fl'))
55153               .text(t('help.field.' + fieldName + '.title'));
55154
55155           titleEnter
55156               .append('button')
55157               .attr('class', 'fr close')
55158               .on('click', function() {
55159                   event.stopPropagation();
55160                   event.preventDefault();
55161                   hide();
55162               })
55163               .call(svgIcon('#iD-icon-close'));
55164
55165           var navEnter = enter
55166               .append('div')
55167               .attr('class', 'field-help-nav cf');
55168
55169           var titles = docs.map(function(d) { return d.title; });
55170           navEnter.selectAll('.field-help-nav-item')
55171               .data(titles)
55172               .enter()
55173               .append('div')
55174               .attr('class', 'field-help-nav-item')
55175               .text(function(d) { return d; })
55176               .on('click', function(d, i) {
55177                   event.stopPropagation();
55178                   event.preventDefault();
55179                   clickHelp(i);
55180               });
55181
55182           enter
55183               .append('div')
55184               .attr('class', 'field-help-content');
55185
55186           _body = _body
55187               .merge(enter);
55188
55189           clickHelp(0);
55190       };
55191
55192
55193       return fieldHelp;
55194   }
55195
55196   function uiFieldCheck(field, context) {
55197       var dispatch$$1 = dispatch('change');
55198       var options = field.strings && field.strings.options;
55199       var values = [];
55200       var texts = [];
55201
55202       var input = select(null);
55203       var text = select(null);
55204       var label = select(null);
55205       var reverser = select(null);
55206
55207       var _impliedYes;
55208       var _entityID;
55209       var _value;
55210
55211
55212       if (options) {
55213           for (var k in options) {
55214               values.push(k === 'undefined' ? undefined : k);
55215               texts.push(field.t('options.' + k, { 'default': options[k] }));
55216           }
55217       } else {
55218           values = [undefined, 'yes'];
55219           texts = [t('inspector.unknown'), t('inspector.check.yes')];
55220           if (field.type !== 'defaultCheck') {
55221               values.push('no');
55222               texts.push(t('inspector.check.no'));
55223           }
55224       }
55225
55226
55227       // Checks tags to see whether an undefined value is "Assumed to be Yes"
55228       function checkImpliedYes() {
55229           _impliedYes = (field.id === 'oneway_yes');
55230
55231           // hack: pretend `oneway` field is a `oneway_yes` field
55232           // where implied oneway tag exists (e.g. `junction=roundabout`) #2220, #1841
55233           if (field.id === 'oneway') {
55234               var entity = context.entity(_entityID);
55235               for (var key in entity.tags) {
55236                   if (key in osmOneWayTags && (entity.tags[key] in osmOneWayTags[key])) {
55237                       _impliedYes = true;
55238                       texts[0] = t('presets.fields.oneway_yes.options.undefined');
55239                       break;
55240                   }
55241               }
55242           }
55243       }
55244
55245
55246       function reverserHidden() {
55247           if (!select('div.inspector-hover').empty()) return true;
55248           return !(_value === 'yes' || (_impliedYes && !_value));
55249       }
55250
55251
55252       function reverserSetText(selection$$1) {
55253           var entity = context.hasEntity(_entityID);
55254           if (reverserHidden() || !entity) return selection$$1;
55255
55256           var first = entity.first();
55257           var last = entity.isClosed() ? entity.nodes[entity.nodes.length - 2] : entity.last();
55258           var pseudoDirection = first < last;
55259           var icon = pseudoDirection ? '#iD-icon-forward' : '#iD-icon-backward';
55260
55261           selection$$1.selectAll('.reverser-span')
55262               .text(t('inspector.check.reverser'))
55263               .call(svgIcon(icon, 'inline'));
55264
55265           return selection$$1;
55266       }
55267
55268
55269       var check = function(selection$$1) {
55270           checkImpliedYes();
55271
55272           label = selection$$1.selectAll('.form-field-input-wrap')
55273               .data([0]);
55274
55275           var enter = label.enter()
55276               .append('label')
55277               .attr('class', 'form-field-input-wrap form-field-input-check');
55278
55279           enter
55280               .append('input')
55281               .property('indeterminate', field.type !== 'defaultCheck')
55282               .attr('type', 'checkbox')
55283               .attr('id', 'preset-input-' + field.safeid);
55284
55285           enter
55286               .append('span')
55287               .text(texts[0])
55288               .attr('class', 'value');
55289
55290           if (field.type === 'onewayCheck') {
55291               enter
55292                   .append('a')
55293                   .attr('id', 'preset-input-' + field.safeid + '-reverser')
55294                   .attr('class', 'reverser button' + (reverserHidden() ? ' hide' : ''))
55295                   .attr('href', '#')
55296                   .append('span')
55297                   .attr('class', 'reverser-span');
55298           }
55299
55300           label = label.merge(enter);
55301           input = label.selectAll('input');
55302           text = label.selectAll('span.value');
55303
55304           input
55305               .on('click', function() {
55306                   event.stopPropagation();
55307                   var t$$1 = {};
55308                   t$$1[field.key] = values[(values.indexOf(_value) + 1) % values.length];
55309
55310                   // Don't cycle through `alternating` or `reversible` states - #4970
55311                   // (They are supported as translated strings, but should not toggle with clicks)
55312                   if (t$$1[field.key] === 'reversible' || t$$1[field.key] === 'alternating') {
55313                       t$$1[field.key] = values[0];
55314                   }
55315
55316                   dispatch$$1.call('change', this, t$$1);
55317               });
55318
55319           if (field.type === 'onewayCheck') {
55320               reverser = label.selectAll('.reverser');
55321
55322               reverser
55323                   .call(reverserSetText)
55324                   .on('click', function() {
55325                       event.preventDefault();
55326                       event.stopPropagation();
55327                       context.perform(
55328                           actionReverse(_entityID),
55329                           t('operations.reverse.annotation')
55330                       );
55331                       select(this)
55332                           .call(reverserSetText);
55333                   });
55334           }
55335       };
55336
55337
55338       check.entity = function(_) {
55339           if (!arguments.length) return context.hasEntity(_entityID);
55340           _entityID = _.id;
55341           return check;
55342       };
55343
55344
55345       check.tags = function(tags) {
55346
55347           function isChecked(val) {
55348               return val !== 'no' && val !== '' && val !== undefined && val !== null;
55349           }
55350
55351           function textFor(val) {
55352               if (val === '') val = undefined;
55353               var index = values.indexOf(val);
55354               return (index !== -1 ? texts[index] : ('"' + val + '"'));
55355           }
55356
55357           checkImpliedYes();
55358           _value = tags[field.key] && tags[field.key].toLowerCase();
55359
55360           if (field.type === 'onewayCheck' && (_value === '1' || _value === '-1')) {
55361               _value = 'yes';
55362           }
55363
55364           input
55365               .property('indeterminate', field.type !== 'defaultCheck' && !_value)
55366               .property('checked', isChecked(_value));
55367
55368           text
55369               .text(textFor(_value));
55370
55371           label
55372               .classed('set', !!_value);
55373
55374           if (field.type === 'onewayCheck') {
55375               reverser
55376                   .classed('hide', reverserHidden())
55377                   .call(reverserSetText);
55378           }
55379       };
55380
55381
55382       check.focus = function() {
55383           input.node().focus();
55384       };
55385
55386       return utilRebind(check, dispatch$$1, 'on');
55387   }
55388
55389   /** Used for built-in method references. */
55390   var arrayProto$1 = Array.prototype;
55391
55392   /** Built-in value references. */
55393   var splice$1 = arrayProto$1.splice;
55394
55395   /**
55396    * The base implementation of `_.pullAt` without support for individual
55397    * indexes or capturing the removed elements.
55398    *
55399    * @private
55400    * @param {Array} array The array to modify.
55401    * @param {number[]} indexes The indexes of elements to remove.
55402    * @returns {Array} Returns `array`.
55403    */
55404   function basePullAt(array, indexes) {
55405     var length = array ? indexes.length : 0,
55406         lastIndex = length - 1;
55407
55408     while (length--) {
55409       var index = indexes[length];
55410       if (length == lastIndex || index !== previous) {
55411         var previous = index;
55412         if (isIndex(index)) {
55413           splice$1.call(array, index, 1);
55414         } else {
55415           baseUnset(array, index);
55416         }
55417       }
55418     }
55419     return array;
55420   }
55421
55422   /**
55423    * Removes all elements from `array` that `predicate` returns truthy for
55424    * and returns an array of the removed elements. The predicate is invoked
55425    * with three arguments: (value, index, array).
55426    *
55427    * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
55428    * to pull elements from an array by value.
55429    *
55430    * @static
55431    * @memberOf _
55432    * @since 2.0.0
55433    * @category Array
55434    * @param {Array} array The array to modify.
55435    * @param {Function} [predicate=_.identity] The function invoked per iteration.
55436    * @returns {Array} Returns the new array of removed elements.
55437    * @example
55438    *
55439    * var array = [1, 2, 3, 4];
55440    * var evens = _.remove(array, function(n) {
55441    *   return n % 2 == 0;
55442    * });
55443    *
55444    * console.log(array);
55445    * // => [1, 3]
55446    *
55447    * console.log(evens);
55448    * // => [2, 4]
55449    */
55450   function remove$2(array, predicate) {
55451     var result = [];
55452     if (!(array && array.length)) {
55453       return result;
55454     }
55455     var index = -1,
55456         indexes = [],
55457         length = array.length;
55458
55459     predicate = baseIteratee(predicate, 3);
55460     while (++index < length) {
55461       var value = array[index];
55462       if (predicate(value, index, array)) {
55463         result.push(value);
55464         indexes.push(index);
55465       }
55466     }
55467     basePullAt(array, indexes);
55468     return result;
55469   }
55470
55471   function uiFieldCombo(field, context) {
55472       var dispatch$$1 = dispatch('change');
55473       var nominatim = services.geocoder;
55474       var taginfo = services.taginfo;
55475       var isMulti = (field.type === 'multiCombo');
55476       var isNetwork = (field.type === 'networkCombo');
55477       var isSemi = (field.type === 'semiCombo');
55478       var optstrings = field.strings && field.strings.options;
55479       var optarray = field.options;
55480       var snake_case = (field.snake_case || (field.snake_case === undefined));
55481       var caseSensitive = field.caseSensitive;
55482       var combobox = uiCombobox(context, 'combo-' + field.safeid)
55483           .caseSensitive(caseSensitive)
55484           .minItems(isMulti || isSemi ? 1 : 2);
55485       var container = select(null);
55486       var inputWrap = select(null);
55487       var input = select(null);
55488       var _comboData = [];
55489       var _multiData = [];
55490       var _entity;
55491       var _country;
55492
55493       // ensure multiCombo field.key ends with a ':'
55494       if (isMulti && /[^:]$/.test(field.key)) {
55495           field.key += ':';
55496       }
55497
55498
55499       function snake(s) {
55500           return s.replace(/\s+/g, '_');
55501       }
55502
55503       function unsnake(s) {
55504           return s.replace(/_+/g, ' ');
55505       }
55506
55507       function clean(s) {
55508           return s.split(';')
55509               .map(function(s) { return s.trim(); })
55510               .join(';');
55511       }
55512
55513
55514       // returns the tag value for a display value
55515       // (for multiCombo, dval should be the key suffix, not the entire key)
55516       function tagValue(dval) {
55517           dval = clean(dval || '');
55518
55519           if (optstrings) {
55520               var found = find$1(_comboData, function(o) {
55521                   return o.key && clean(o.value) === dval;
55522               });
55523               if (found) {
55524                   return found.key;
55525               }
55526           }
55527
55528           if (field.type === 'typeCombo' && !dval) {
55529               return 'yes';
55530           }
55531
55532           return (snake_case ? snake(dval) : dval) || undefined;
55533       }
55534
55535
55536       // returns the display value for a tag value
55537       // (for multiCombo, tval should be the key suffix, not the entire key)
55538       function displayValue(tval) {
55539           tval = tval || '';
55540
55541           if (optstrings) {
55542               var found = find$1(_comboData, function(o) { return o.key === tval && o.value; });
55543               if (found) {
55544                   return found.value;
55545               }
55546           }
55547
55548           if (field.type === 'typeCombo' && tval.toLowerCase() === 'yes') {
55549               return '';
55550           }
55551
55552           return snake_case ? unsnake(tval) : tval;
55553       }
55554
55555
55556       function objectDifference(a, b) {
55557           return reject(a, function(d1) {
55558               return some(b, function(d2) { return d1.value === d2.value; });
55559           });
55560       }
55561
55562
55563       function initCombo(selection$$1, attachTo) {
55564           if (optstrings) {
55565               selection$$1.attr('readonly', 'readonly');
55566               selection$$1.call(combobox, attachTo);
55567               setStaticValues(setPlaceholder);
55568
55569           } else if (optarray) {
55570               selection$$1.call(combobox, attachTo);
55571               setStaticValues(setPlaceholder);
55572
55573           } else if (taginfo) {
55574               selection$$1.call(combobox.fetcher(setTaginfoValues), attachTo);
55575               setTaginfoValues('', setPlaceholder);
55576           }
55577       }
55578
55579
55580       function setStaticValues(callback) {
55581           if (!(optstrings || optarray)) return;
55582
55583           if (optstrings) {
55584               _comboData = Object.keys(optstrings).map(function(k) {
55585                   var v = field.t('options.' + k, { 'default': optstrings[k] });
55586                   return {
55587                       key: k,
55588                       value: v,
55589                       title: v
55590                   };
55591               });
55592
55593           } else if (optarray) {
55594               _comboData = optarray.map(function(k) {
55595                   var v = snake_case ? unsnake(k) : k;
55596                   return {
55597                       key: k,
55598                       value: v,
55599                       title: v
55600                   };
55601               });
55602           }
55603
55604           combobox.data(objectDifference(_comboData, _multiData));
55605           if (callback) callback(_comboData);
55606       }
55607
55608
55609       function setTaginfoValues(q, callback) {
55610           var fn = isMulti ? 'multikeys' : 'values';
55611           var query = (isMulti ? field.key : '') + q;
55612           var hasCountryPrefix = isNetwork && _country && _country.indexOf(q.toLowerCase()) === 0;
55613           if (hasCountryPrefix) {
55614               query = _country + ':';
55615           }
55616
55617           var params = {
55618               debounce: (q !== ''),
55619               key: field.key,
55620               query: query
55621           };
55622
55623           if (_entity) {
55624               params.geometry = context.geometry(_entity.id);
55625           }
55626
55627           taginfo[fn](params, function(err, data) {
55628               if (err) return;
55629               if (hasCountryPrefix) {
55630                   data = filter(data, function(d) {
55631                       return d.value.toLowerCase().indexOf(_country + ':') === 0;
55632                   });
55633               }
55634
55635               // hide the caret if there are no suggestions
55636               container.classed('empty-combobox', data.length === 0);
55637
55638               _comboData = map$3(data, function(d) {
55639                   var k = d.value;
55640                   if (isMulti) k = k.replace(field.key, '');
55641                   var v = snake_case ? unsnake(k) : k;
55642                   return {
55643                       key: k,
55644                       value: v,
55645                       title: isMulti ? v : d.title
55646                   };
55647               });
55648
55649               _comboData = objectDifference(_comboData, _multiData);
55650               if (callback) callback(_comboData);
55651           });
55652       }
55653
55654
55655       function setPlaceholder(d) {
55656           var ph;
55657
55658           if (isMulti || isSemi) {
55659               ph = field.placeholder() || t('inspector.add');
55660           } else {
55661               var vals = map$3(d, 'value').filter(function(s) { return s.length < 20; }),
55662                   placeholders = vals.length > 1 ? vals : map$3(d, 'key');
55663               ph = field.placeholder() || placeholders.slice(0, 3).join(', ');
55664           }
55665
55666           if (!/(…|\.\.\.)$/.test(ph)) {
55667               ph += '…';
55668           }
55669
55670           container.selectAll('input')
55671               .attr('placeholder', ph);
55672       }
55673
55674
55675       function change() {
55676           var val = tagValue(utilGetSetValue(input));
55677           var t$$1 = {};
55678
55679           if (isMulti || isSemi) {
55680               if (!val) return;
55681               container.classed('active', false);
55682               utilGetSetValue(input, '');
55683
55684               if (isMulti) {
55685                   var key = field.key + val;
55686                   if (_entity) {
55687                       // don't set a multicombo value to 'yes' if it already has a non-'no' value
55688                       // e.g. `language:de=main`
55689                       var old = _entity.tags[key] || '';
55690                       if (old && old.toLowerCase() !== 'no') return;
55691                   }
55692                   field.keys.push(key);
55693                   t$$1[key] = 'yes';
55694
55695               } else if (isSemi) {
55696                   var arr = _multiData.map(function(d) { return d.key; });
55697                   arr.push(val);
55698                   t$$1[field.key] = compact(uniq(arr)).join(';');
55699               }
55700
55701               window.setTimeout(function() { input.node().focus(); }, 10);
55702
55703           } else {
55704               t$$1[field.key] = val;
55705           }
55706
55707           dispatch$$1.call('change', this, t$$1);
55708       }
55709
55710
55711       function removeMultikey(d) {
55712           event.stopPropagation();
55713           var t$$1 = {};
55714           if (isMulti) {
55715               t$$1[d.key] = undefined;
55716           } else if (isSemi) {
55717               remove$2(_multiData, function(md) { return md.key === d.key; });
55718               var arr = _multiData.map(function(md) { return md.key; });
55719               arr = compact(uniq(arr));
55720               t$$1[field.key] = arr.length ? arr.join(';') : undefined;
55721           }
55722           dispatch$$1.call('change', this, t$$1);
55723       }
55724
55725
55726       function combo(selection$$1) {
55727           container = selection$$1.selectAll('.form-field-input-wrap')
55728               .data([0]);
55729
55730           var type = (isMulti || isSemi) ? 'multicombo': 'combo';
55731           container = container.enter()
55732               .append('div')
55733               .attr('class', 'form-field-input-wrap form-field-input-' + type)
55734               .merge(container);
55735
55736           if (isMulti || isSemi) {
55737               container = container.selectAll('.chiplist')
55738                   .data([0]);
55739
55740               var listClass = 'chiplist';
55741               
55742               // Use a separate line for each value in the Destinations field
55743               // to mimic highway exit signs
55744               if (field.id === 'destination_oneway') {
55745                   listClass += ' full-line-chips';
55746               }
55747
55748               container = container.enter()
55749                   .append('ul')
55750                   .attr('class', listClass)
55751                   .on('click', function() {
55752                       window.setTimeout(function() { input.node().focus(); }, 10);
55753                   })
55754                   .merge(container);
55755
55756
55757               inputWrap = container.selectAll('.input-wrap')
55758                   .data([0]);
55759
55760               inputWrap = inputWrap.enter()
55761                   .append('li')
55762                   .attr('class', 'input-wrap')
55763                   .merge(inputWrap);
55764
55765               input = inputWrap.selectAll('input')
55766                   .data([0]);
55767           } else {
55768               input = container.selectAll('input')
55769                   .data([0]);
55770           }
55771
55772           input = input.enter()
55773               .append('input')
55774               .attr('type', 'text')
55775               .attr('id', 'preset-input-' + field.safeid)
55776               .call(utilNoAuto)
55777               .call(initCombo, selection$$1)
55778               .merge(input);
55779
55780           if (isNetwork && nominatim && _entity) {
55781               var center = _entity.extent(context.graph()).center();
55782               nominatim.countryCode(center, function (err, code) {
55783                   _country = code;
55784               });
55785           }
55786
55787           input
55788               .on('change', change)
55789               .on('blur', change);
55790
55791           input
55792               .on('keydown.field', function() {
55793                   switch (event.keyCode) {
55794                       case 13: // ↩ Return
55795                           input.node().blur(); // blurring also enters the value
55796                           event.stopPropagation();
55797                           break;
55798                   }
55799               });
55800
55801           if (isMulti || isSemi) {
55802               combobox
55803                   .on('accept', function() {
55804                       input.node().blur();
55805                       input.node().focus();
55806                   });
55807
55808               input
55809                   .on('focus', function() { container.classed('active', true); });
55810           }
55811       }
55812
55813
55814       combo.tags = function(tags) {
55815           if (isMulti || isSemi) {
55816               _multiData = [];
55817
55818               if (isMulti) {
55819                   // Build _multiData array containing keys already set..
55820                   for (var k in tags) {
55821                       if (k.indexOf(field.key) !== 0) continue;
55822                       var v = (tags[k] || '').toLowerCase();
55823                       if (v === '' || v === 'no') continue;
55824
55825                       var suffix = k.substring(field.key.length);
55826                       _multiData.push({
55827                           key: k,
55828                           value: displayValue(suffix)
55829                       });
55830                   }
55831
55832                   // Set keys for form-field modified (needed for undo and reset buttons)..
55833                   field.keys = map$3(_multiData, 'key');
55834
55835               } else if (isSemi) {
55836                   var arr = compact(uniq((tags[field.key] || '').split(';')));
55837                   _multiData = arr.map(function(k) {
55838                       return {
55839                           key: k,
55840                           value: displayValue(k)
55841                       };
55842                   });
55843               }
55844
55845               // Exclude existing multikeys from combo options..
55846               var available = objectDifference(_comboData, _multiData);
55847               combobox.data(available);
55848
55849               // Hide 'Add' button if this field uses fixed set of
55850               // translateable optstrings and they're all currently used..
55851               container.selectAll('.combobox-input, .combobox-caret')
55852                   .classed('hide', optstrings && !available.length);
55853
55854
55855               // Render chips
55856               var chips = container.selectAll('.chips')
55857                   .data(_multiData);
55858
55859               chips.exit()
55860                   .remove();
55861
55862               var enter = chips.enter()
55863                   .insert('li', '.input-wrap')
55864                   .attr('class', 'chips');
55865
55866               enter.append('span');
55867               enter.append('a');
55868
55869               chips = chips.merge(enter);
55870
55871               chips.select('span')
55872                   .text(function(d) { return d.value; });
55873
55874               chips.select('a')
55875                   .on('click', removeMultikey)
55876                   .attr('class', 'remove')
55877                   .text('×');
55878
55879           } else {
55880               utilGetSetValue(input, displayValue(tags[field.key]));
55881           }
55882       };
55883
55884
55885       combo.focus = function() {
55886           input.node().focus();
55887       };
55888
55889
55890       combo.entity = function(val) {
55891           if (!arguments.length) return _entity;
55892           _entity = val;
55893           return combo;
55894       };
55895
55896
55897       return utilRebind(combo, dispatch$$1, 'on');
55898   }
55899
55900   function uiFieldText(field, context) {
55901       var dispatch$$1 = dispatch('change');
55902       var nominatim = services.geocoder;
55903       var input = select(null);
55904       var _entity;
55905       var _brandTip;
55906
55907       if (field.id === 'brand') {
55908           _brandTip = tooltip()
55909               .title(t('inspector.lock.suggestion', { label: field.label }))
55910               .placement('bottom');
55911       }
55912
55913
55914       function i(selection$$1) {
55915           var preset = _entity && context.presets().match(_entity, context.graph());
55916           var isSuggestion = preset && preset.suggestion && field.id === 'brand';
55917
55918           var wrap = selection$$1.selectAll('.form-field-input-wrap')
55919               .data([0]);
55920
55921           wrap = wrap.enter()
55922               .append('div')
55923               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
55924               .merge(wrap);
55925
55926           var fieldID = 'preset-input-' + field.safeid;
55927
55928           input = wrap.selectAll('input')
55929               .data([0]);
55930
55931           input = input.enter()
55932               .append('input')
55933               .attr('type', field.type)
55934               .attr('id', fieldID)
55935               .attr('placeholder', field.placeholder() || t('inspector.unknown'))
55936               .classed(field.type, true)
55937               .call(utilNoAuto)
55938               .merge(input);
55939
55940           input
55941               .classed('disabled', !!isSuggestion)
55942               .attr('readonly', isSuggestion || null)
55943               .on('input', change(true))
55944               .on('blur', change())
55945               .on('change', change());
55946
55947
55948           if (field.type === 'tel' && nominatim && _entity) {
55949               var center = _entity.extent(context.graph()).center();
55950               nominatim.countryCode(center, function (err, countryCode) {
55951                   if (err || !dataPhoneFormats[countryCode]) return;
55952                   wrap.selectAll('#' + fieldID)
55953                       .attr('placeholder', dataPhoneFormats[countryCode]);
55954               });
55955
55956           } else if (field.type === 'number') {
55957               var rtl = (textDirection === 'rtl');
55958
55959               input.attr('type', 'text');
55960
55961               var buttons = wrap.selectAll('.increment, .decrement')
55962                   .data(rtl ? [1, -1] : [-1, 1]);
55963
55964               buttons.enter()
55965                   .append('button')
55966                   .attr('tabindex', -1)
55967                   .attr('class', function(d) {
55968                       var which = (d === 1 ? 'increment' : 'decrement');
55969                       return 'form-field-button ' + which;
55970                   })
55971                   .merge(buttons)
55972                   .on('click', function(d) {
55973                       event.preventDefault();
55974                       var vals = input.node().value.split(';');
55975                       vals = vals.map(function(v) {
55976                           var num = parseFloat(v.trim(), 10);
55977                           return isFinite(num) ? clamped(num + d) : v.trim();
55978                       });
55979                       input.node().value = vals.join(';');
55980                       change()();
55981                   });
55982
55983           } else if (preset && field.id === 'brand') {
55984               var pTag = preset.id.split('/', 2);
55985               var pKey = pTag[0];
55986               if (isSuggestion) {
55987                   // A "suggestion" preset (brand name)
55988                   // Put suggestion keys in `field.keys` so delete button can remove them all.
55989                   field.keys = Object.keys(preset.removeTags)
55990                       .filter(function(k) { return k !== pKey && k !== 'name'; });
55991               }
55992
55993               wrap.call(isSuggestion ? _brandTip : _brandTip.destroy);
55994           }
55995       }
55996
55997
55998       // clamp number to min/max
55999       function clamped(num) {
56000           if (field.minValue !== undefined) {
56001               num = Math.max(num, field.minValue);
56002           }
56003           if (field.maxValue !== undefined) {
56004               num = Math.min(num, field.maxValue);
56005           }
56006           return num;
56007       }
56008
56009
56010       function change(onInput) {
56011           return function() {
56012               var t$$1 = {};
56013               var val = utilGetSetValue(input).trim() || undefined;
56014
56015               if (!onInput) {
56016                   if (field.type === 'number' && val !== undefined) {
56017                       var vals = val.split(';');
56018                       vals = vals.map(function(v) {
56019                           var num = parseFloat(v.trim(), 10);
56020                           return isFinite(num) ? clamped(num) : v.trim();
56021                       });
56022                       val = vals.join(';');
56023                   }
56024                   utilGetSetValue(input, val || '');
56025               }
56026               t$$1[field.key] = val;
56027               dispatch$$1.call('change', this, t$$1, onInput);
56028           };
56029       }
56030
56031
56032       i.entity = function(val) {
56033           if (!arguments.length) return _entity;
56034           _entity = val;
56035           return i;
56036       };
56037
56038
56039       i.tags = function(tags) {
56040           utilGetSetValue(input, tags[field.key] || '');
56041       };
56042
56043
56044       i.focus = function() {
56045           var node = input.node();
56046           if (node) node.focus();
56047       };
56048
56049       return utilRebind(i, dispatch$$1, 'on');
56050   }
56051
56052   function uiFieldAccess(field, context) {
56053       var dispatch$$1 = dispatch('change');
56054       var items = select(null);
56055
56056       function access(selection$$1) {
56057           var wrap = selection$$1.selectAll('.form-field-input-wrap')
56058               .data([0]);
56059
56060           wrap = wrap.enter()
56061               .append('div')
56062               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
56063               .merge(wrap);
56064
56065           var list = wrap.selectAll('ul')
56066               .data([0]);
56067
56068           list = list.enter()
56069               .append('ul')
56070               .attr('class', 'labeled-inputs')
56071               .merge(list);
56072
56073
56074           items = list.selectAll('li')
56075               .data(field.keys);
56076
56077           // Enter
56078           var enter = items.enter()
56079               .append('li')
56080               .attr('class', function(d) { return 'preset-access-' + d; });
56081
56082           enter
56083               .append('span')
56084               .attr('class', 'label preset-label-access')
56085               .attr('for', function(d) { return 'preset-input-access-' + d; })
56086               .text(function(d) { return field.t('types.' + d); });
56087
56088           enter
56089               .append('div')
56090               .attr('class', 'preset-input-access-wrap')
56091               .append('input')
56092               .attr('type', 'text')
56093               .attr('class', 'preset-input-access')
56094               .attr('id', function(d) { return 'preset-input-access-' + d; })
56095               .call(utilNoAuto)
56096               .each(function(d) {
56097                   select(this)
56098                       .call(uiCombobox(context, 'access-' + d)
56099                           .data(access.options(d))
56100                       );
56101               });
56102
56103
56104           // Update
56105           items = items.merge(enter);
56106
56107           wrap.selectAll('.preset-input-access')
56108               .on('change', change)
56109               .on('blur', change);
56110       }
56111
56112
56113       function change(d) {
56114           var tag = {};
56115           tag[d] = utilGetSetValue(select(this)) || undefined;
56116           dispatch$$1.call('change', this, tag);
56117       }
56118
56119
56120       access.options = function(type) {
56121           var options = ['no', 'permissive', 'private', 'permit', 'destination'];
56122
56123           if (type !== 'access') {
56124               options.unshift('yes');
56125               options.push('designated');
56126
56127               if (type === 'bicycle') {
56128                   options.push('dismount');
56129               }
56130           }
56131
56132           return options.map(function(option) {
56133               return {
56134                   title: field.t('options.' + option + '.description'),
56135                   value: option
56136               };
56137           });
56138       };
56139
56140
56141       var placeholders = {
56142           footway: {
56143               foot: 'designated',
56144               motor_vehicle: 'no'
56145           },
56146           steps: {
56147               foot: 'yes',
56148               motor_vehicle: 'no',
56149               bicycle: 'no',
56150               horse: 'no'
56151           },
56152           pedestrian: {
56153               foot: 'yes',
56154               motor_vehicle: 'no'
56155           },
56156           cycleway: {
56157               motor_vehicle: 'no',
56158               bicycle: 'designated'
56159           },
56160           bridleway: {
56161               motor_vehicle: 'no',
56162               horse: 'designated'
56163           },
56164           path: {
56165               foot: 'yes',
56166               motor_vehicle: 'no',
56167               bicycle: 'yes',
56168               horse: 'yes'
56169           },
56170           motorway: {
56171               foot: 'no',
56172               motor_vehicle: 'yes',
56173               bicycle: 'no',
56174               horse: 'no'
56175           },
56176           trunk: {
56177               motor_vehicle: 'yes'
56178           },
56179           primary: {
56180               foot: 'yes',
56181               motor_vehicle: 'yes',
56182               bicycle: 'yes',
56183               horse: 'yes'
56184           },
56185           secondary: {
56186               foot: 'yes',
56187               motor_vehicle: 'yes',
56188               bicycle: 'yes',
56189               horse: 'yes'
56190           },
56191           tertiary: {
56192               foot: 'yes',
56193               motor_vehicle: 'yes',
56194               bicycle: 'yes',
56195               horse: 'yes'
56196           },
56197           residential: {
56198               foot: 'yes',
56199               motor_vehicle: 'yes',
56200               bicycle: 'yes',
56201               horse: 'yes'
56202           },
56203           unclassified: {
56204               foot: 'yes',
56205               motor_vehicle: 'yes',
56206               bicycle: 'yes',
56207               horse: 'yes'
56208           },
56209           service: {
56210               foot: 'yes',
56211               motor_vehicle: 'yes',
56212               bicycle: 'yes',
56213               horse: 'yes'
56214           },
56215           motorway_link: {
56216               foot: 'no',
56217               motor_vehicle: 'yes',
56218               bicycle: 'no',
56219               horse: 'no'
56220           },
56221           trunk_link: {
56222               motor_vehicle: 'yes'
56223           },
56224           primary_link: {
56225               foot: 'yes',
56226               motor_vehicle: 'yes',
56227               bicycle: 'yes',
56228               horse: 'yes'
56229           },
56230           secondary_link: {
56231               foot: 'yes',
56232               motor_vehicle: 'yes',
56233               bicycle: 'yes',
56234               horse: 'yes'
56235           },
56236           tertiary_link: {
56237               foot: 'yes',
56238               motor_vehicle: 'yes',
56239               bicycle: 'yes',
56240               horse: 'yes'
56241           }
56242       };
56243
56244
56245       access.tags = function(tags) {
56246           utilGetSetValue(items.selectAll('.preset-input-access'),
56247               function(d) { return tags[d] || ''; })
56248               .attr('placeholder', function() {
56249                   return tags.access ? tags.access : field.placeholder();
56250               });
56251
56252           items.selectAll('#preset-input-access-access')
56253               .attr('placeholder', 'yes');
56254
56255           var which = tags.highway;
56256           if (!placeholders[which]) return;
56257
56258           var keys = Object.keys(placeholders[which]);
56259           keys.forEach(function(k) {
56260               var v = placeholders[which][k];
56261               items.selectAll('#preset-input-access-' + k)
56262                   .attr('placeholder', tags.access || v);
56263           });
56264       };
56265
56266
56267       access.focus = function() {
56268           items.selectAll('.preset-input-access')
56269               .node().focus();
56270       };
56271
56272
56273       return utilRebind(access, dispatch$$1, 'on');
56274   }
56275
56276   function uiFieldAddress(field, context) {
56277       var dispatch$$1 = dispatch('init', 'change');
56278       var nominatim = services.geocoder;
56279       var wrap = select(null);
56280       var _isInitialized = false;
56281       var _entity;
56282
56283       function getNearStreets() {
56284           var extent = _entity.extent(context.graph());
56285           var l = extent.center();
56286           var box = geoExtent$$1(l).padByMeters(200);
56287
56288           var streets = context.intersects(box)
56289               .filter(isAddressable)
56290               .map(function(d) {
56291                   var loc = context.projection([
56292                       (extent[0][0] + extent[1][0]) / 2,
56293                       (extent[0][1] + extent[1][1]) / 2
56294                   ]);
56295                   var choice = geoChooseEdge(context.childNodes(d), loc, context.projection);
56296
56297                   return {
56298                       title: d.tags.name,
56299                       value: d.tags.name,
56300                       dist: choice.distance
56301                   };
56302               })
56303               .sort(function(a, b) {
56304                   return a.dist - b.dist;
56305               });
56306
56307           return uniqBy(streets, 'value');
56308
56309           function isAddressable(d) {
56310               return d.tags.highway && d.tags.name && d.type === 'way';
56311           }
56312       }
56313
56314
56315       function getNearCities() {
56316           var extent = _entity.extent(context.graph());
56317           var l = extent.center();
56318           var box = geoExtent$$1(l).padByMeters(200);
56319
56320           var cities = context.intersects(box)
56321               .filter(isAddressable)
56322               .map(function(d) {
56323                   return {
56324                       title: d.tags['addr:city'] || d.tags.name,
56325                       value: d.tags['addr:city'] || d.tags.name,
56326                       dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
56327                   };
56328               })
56329               .sort(function(a, b) {
56330                   return a.dist - b.dist;
56331               });
56332
56333           return uniqBy(cities, 'value');
56334
56335
56336           function isAddressable(d) {
56337               if (d.tags.name) {
56338                   if (d.tags.admin_level === '8' && d.tags.boundary === 'administrative')
56339                       return true;
56340                   if (d.tags.border_type === 'city')
56341                       return true;
56342                   if (d.tags.place === 'city' || d.tags.place === 'town' || d.tags.place === 'village')
56343                       return true;
56344               }
56345
56346               if (d.tags['addr:city'])
56347                   return true;
56348
56349               return false;
56350           }
56351       }
56352
56353       function getNearValues(key) {
56354           var extent = _entity.extent(context.graph());
56355           var l = extent.center();
56356           var box = geoExtent$$1(l).padByMeters(200);
56357
56358           var results = context.intersects(box)
56359               .filter(function hasTag(d) { return d.tags[key]; })
56360               .map(function(d) {
56361                   return {
56362                       title: d.tags[key],
56363                       value: d.tags[key],
56364                       dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
56365                   };
56366               })
56367               .sort(function(a, b) {
56368                   return a.dist - b.dist;
56369               });
56370
56371           return uniqBy(results, 'value');
56372       }
56373
56374
56375       function countryCallback(err, countryCode) {
56376           if (err) return;
56377
56378           var addressFormat = find$1(dataAddressFormats, function (a) {
56379               return a && a.countryCodes && includes(a.countryCodes, countryCode.toLowerCase());
56380           }) || dataAddressFormats[0];
56381
56382           var dropdowns = addressFormat.dropdowns || [
56383               'city', 'county', 'country', 'district', 'hamlet',
56384               'neighbourhood', 'place', 'postcode', 'province',
56385               'quarter', 'state', 'street', 'subdistrict', 'suburb'
56386           ];
56387
56388           var widths = addressFormat.widths || {
56389               housenumber: 1/3, street: 2/3,
56390               city: 2/3, state: 1/4, postcode: 1/3
56391           };
56392
56393           function row(r) {
56394               // Normalize widths.
56395               var total = reduce(r, function(sum, key) {
56396                   return sum + (widths[key] || 0.5);
56397               }, 0);
56398
56399               return r.map(function(key) {
56400                   return {
56401                       id: key,
56402                       width: (widths[key] || 0.5) / total
56403                   };
56404               });
56405           }
56406
56407           wrap.selectAll('.addr-row')
56408               .data(addressFormat.format)
56409               .enter()
56410               .append('div')
56411               .attr('class', 'addr-row')
56412               .selectAll('input')
56413               .data(row)
56414               .enter()
56415               .append('input')
56416               .property('type', 'text')
56417               .attr('placeholder', function (d) {
56418                   var localkey = d.id + '!' + countryCode.toLowerCase();
56419                   var tkey = field.strings.placeholders[localkey] ? localkey : d.id;
56420                   return field.t('placeholders.' + tkey);
56421               })
56422               .attr('class', function (d) { return 'addr-' + d.id; })
56423               .call(utilNoAuto)
56424               .each(addDropdown)
56425               .style('width', function (d) { return d.width * 100 + '%'; });
56426
56427
56428           function addDropdown(d) {
56429               if (dropdowns.indexOf(d.id) === -1) return;  // not a dropdown
56430
56431               var nearValues = (d.id === 'street') ? getNearStreets
56432                   : (d.id === 'city') ? getNearCities
56433                   : getNearValues;
56434
56435               select(this)
56436                   .call(uiCombobox(context, 'address-' + d.id)
56437                       .minItems(1)
56438                       .fetcher(function(value, callback) {
56439                           callback(nearValues('addr:' + d.id));
56440                       })
56441                   );
56442           }
56443
56444           wrap.selectAll('input')
56445               .on('blur', change())
56446               .on('change', change());
56447
56448           wrap.selectAll('input:not(.combobox-input)')
56449               .on('input', change(true));
56450
56451           dispatch$$1.call('init');
56452           _isInitialized = true;
56453       }
56454
56455
56456       function address(selection$$1) {
56457           _isInitialized = false;
56458
56459           wrap = selection$$1.selectAll('.form-field-input-wrap')
56460               .data([0]);
56461
56462           wrap = wrap.enter()
56463               .append('div')
56464               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
56465               .merge(wrap);
56466
56467           if (nominatim && _entity) {
56468               var center = _entity.extent(context.graph()).center();
56469               nominatim.countryCode(center, countryCallback);
56470           }
56471       }
56472
56473
56474       function change(onInput) {
56475           return function() {
56476               var tags = {};
56477
56478               wrap.selectAll('input')
56479                   .each(function (field) {
56480                       tags['addr:' + field.id] = this.value || undefined;
56481                   });
56482
56483               dispatch$$1.call('change', this, tags, onInput);
56484           };
56485       }
56486
56487
56488       function updateTags(tags) {
56489           utilGetSetValue(wrap.selectAll('input'), function (field) {
56490               return tags['addr:' + field.id] || '';
56491           });
56492       }
56493
56494
56495       address.entity = function(val) {
56496           if (!arguments.length) return _entity;
56497           _entity = val;
56498           return address;
56499       };
56500
56501
56502       address.tags = function(tags) {
56503           if (_isInitialized) {
56504               updateTags(tags);
56505           } else {
56506               dispatch$$1.on('init', function () {
56507                   dispatch$$1.on('init', null);
56508                   updateTags(tags);
56509               });
56510           }
56511       };
56512
56513
56514       address.focus = function() {
56515           var node = wrap.selectAll('input').node();
56516           if (node) node.focus();
56517       };
56518
56519
56520       return utilRebind(address, dispatch$$1, 'on');
56521   }
56522
56523   function uiFieldCycleway(field, context) {
56524       var dispatch$$1 = dispatch('change');
56525       var items = select(null);
56526       var wrap = select(null);
56527
56528       function cycleway(selection$$1) {
56529
56530           function stripcolon(s) {
56531               return s.replace(':', '');
56532           }
56533
56534
56535           wrap = selection$$1.selectAll('.form-field-input-wrap')
56536               .data([0]);
56537
56538           wrap = wrap.enter()
56539               .append('div')
56540               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
56541               .merge(wrap);
56542
56543
56544           var div = wrap.selectAll('ul')
56545               .data([0]);
56546
56547           div = div.enter()
56548               .append('ul')
56549               .attr('class', 'labeled-inputs')
56550               .merge(div);
56551
56552           var keys = ['cycleway:left', 'cycleway:right'];
56553
56554           items = div.selectAll('li')
56555               .data(keys);
56556
56557           var enter = items.enter()
56558               .append('li')
56559               .attr('class', function(d) { return 'preset-cycleway-' + stripcolon(d); });
56560
56561           enter
56562               .append('span')
56563               .attr('class', 'label preset-label-cycleway')
56564               .attr('for', function(d) { return 'preset-input-cycleway-' + stripcolon(d); })
56565               .text(function(d) { return field.t('types.' + d); });
56566
56567           enter
56568               .append('div')
56569               .attr('class', 'preset-input-cycleway-wrap')
56570               .append('input')
56571               .attr('type', 'text')
56572               .attr('class', function(d) { return 'preset-input-cycleway preset-input-' + stripcolon(d); })
56573               .call(utilNoAuto)
56574               .each(function(d) {
56575                   select(this)
56576                       .call(uiCombobox(context, 'cycleway-' + stripcolon(d))
56577                           .data(cycleway.options(d))
56578                       );
56579               });
56580
56581
56582           // Update
56583           wrap.selectAll('.preset-input-cycleway')
56584               .on('change', change)
56585               .on('blur', change);
56586       }
56587
56588
56589       function change() {
56590           var left = utilGetSetValue(select('.preset-input-cyclewayleft'));
56591           var right = utilGetSetValue(select('.preset-input-cyclewayright'));
56592           var tag = {};
56593
56594           if (left === 'none' || left === '') { left = undefined; }
56595           if (right === 'none' || right === '') { right = undefined; }
56596
56597           // Always set both left and right as changing one can affect the other
56598           tag = {
56599               cycleway: undefined,
56600               'cycleway:left': left,
56601               'cycleway:right': right
56602           };
56603
56604           // If the left and right tags match, use the cycleway tag to tag both
56605           // sides the same way
56606           if (left === right) {
56607               tag = {
56608                   cycleway: left,
56609                   'cycleway:left': undefined,
56610                   'cycleway:right': undefined
56611               };
56612           }
56613
56614           dispatch$$1.call('change', this, tag);
56615       }
56616
56617
56618       cycleway.options = function() {
56619           return Object.keys(field.strings.options).map(function(option) {
56620               return {
56621                   title: field.t('options.' + option + '.description'),
56622                   value: option
56623               };
56624           });
56625       };
56626
56627
56628       cycleway.tags = function(tags) {
56629           utilGetSetValue(items.selectAll('.preset-input-cycleway'), function(d) {
56630                   // If cycleway is set, always return that
56631                   if (tags.cycleway) {
56632                       return tags.cycleway;
56633                   }
56634                   return tags[d] || '';
56635               })
56636               .attr('placeholder', field.placeholder());
56637       };
56638
56639
56640       cycleway.focus = function() {
56641           var node = wrap.selectAll('input').node();
56642           if (node) node.focus();
56643       };
56644
56645
56646       return utilRebind(cycleway, dispatch$$1, 'on');
56647   }
56648
56649   function uiFieldLanes(field, context) {
56650       var dispatch$$1 = dispatch('change');
56651       var LANE_WIDTH = 40;
56652       var LANE_HEIGHT = 200;
56653       var _entityID;
56654
56655       function lanes(selection$$1) {
56656           var lanesData = context.entity(_entityID).lanes();
56657
56658           if (!select('.inspector-wrap.inspector-hidden').empty() || !selection$$1.node().parentNode) {
56659               selection$$1.call(lanes.off);
56660               return;
56661           }
56662
56663           var wrap = selection$$1.selectAll('.form-field-input-wrap')
56664               .data([0]);
56665
56666           wrap = wrap.enter()
56667               .append('div')
56668               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
56669               .merge(wrap);
56670
56671           var surface =  wrap.selectAll('.surface')
56672               .data([0]);
56673
56674           var d = utilGetDimensions(wrap);
56675           var freeSpace = d[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5;
56676
56677           surface = surface.enter()
56678               .append('svg')
56679               .attr('width', d[0])
56680               .attr('height', 300)
56681               .attr('class', 'surface')
56682               .merge(surface);
56683
56684
56685           var lanesSelection = surface.selectAll('.lanes')
56686               .data([0]);
56687
56688           lanesSelection = lanesSelection.enter()
56689               .append('g')
56690               .attr('class', 'lanes')
56691               .merge(lanesSelection);
56692
56693           lanesSelection
56694               .attr('transform', function () {
56695                   return 'translate(' + (freeSpace / 2) + ', 0)';
56696               });
56697
56698
56699           var lane = lanesSelection.selectAll('.lane')
56700              .data(lanesData.lanes);
56701
56702           lane.exit()
56703               .remove();
56704
56705           var enter = lane.enter()
56706               .append('g')
56707               .attr('class', 'lane');
56708
56709           enter
56710               .append('g')
56711               .append('rect')
56712               .attr('y', 50)
56713               .attr('width', LANE_WIDTH)
56714               .attr('height', LANE_HEIGHT);
56715
56716           enter
56717               .append('g')
56718               .attr('class', 'forward')
56719               .append('text')
56720               .attr('y', 40)
56721               .attr('x', 14)
56722               .text('▲');
56723
56724           enter
56725               .append('g')
56726               .attr('class', 'bothways')
56727               .append('text')
56728               .attr('y', 40)
56729               .attr('x', 14)
56730               .text('▲▼');
56731
56732           enter
56733               .append('g')
56734               .attr('class', 'backward')
56735               .append('text')
56736               .attr('y', 40)
56737               .attr('x', 14)
56738               .text('▼');
56739
56740
56741           lane = lane
56742               .merge(enter);
56743
56744           lane
56745               .attr('transform', function(d) {
56746                   return 'translate(' + (LANE_WIDTH * d.index * 1.5) + ', 0)';
56747               });
56748
56749           lane.select('.forward')
56750               .style('visibility', function(d) {
56751                   return d.direction === 'forward' ? 'visible' : 'hidden';
56752               });
56753
56754           lane.select('.bothways')
56755               .style('visibility', function(d) {
56756                   return d.direction === 'bothways' ? 'visible' : 'hidden';
56757               });
56758
56759           lane.select('.backward')
56760               .style('visibility', function(d) {
56761                   return d.direction === 'backward' ? 'visible' : 'hidden';
56762               });
56763       }
56764
56765
56766       lanes.entity = function(val) {
56767           if (!_entityID || _entityID !== val.id) {
56768               _entityID = val.id;
56769           }
56770       };
56771
56772       lanes.tags = function() {};
56773       lanes.focus = function() {};
56774       lanes.off = function() {};
56775
56776       return utilRebind(lanes, dispatch$$1, 'on');
56777   }
56778
56779   function uiFieldLocalized(field, context) {
56780       var dispatch$$1 = dispatch('change', 'input');
56781       var wikipedia = services.wikipedia;
56782       var input = select(null);
56783       var localizedInputs = select(null);
56784
56785       var allSuggestions = context.presets().collection.filter(function(p) {
56786           return p.suggestion === true;
56787       });
56788
56789       // reuse these combos
56790       var langCombo = uiCombobox(context, 'localized-lang')
56791           .fetcher(fetchLanguages)
56792           .minItems(0);
56793
56794       var brandCombo = uiCombobox(context, 'localized-brand')
56795           .canAutocomplete(false)
56796           .minItems(1);
56797
56798       var _selection = select(null);
56799       var _multilingual = [];
56800       var _isLocked = false;
56801       var _brandTip = tooltip()
56802           .title(t('inspector.lock.suggestion', { label: field.label }))
56803           .placement('bottom');
56804       var _buttonTip = tooltip()
56805           .title(t('translate.translate'))
56806           .placement('left');
56807       var _wikiTitles;
56808       var _entity;
56809
56810
56811       function calcLocked() {
56812           if (!_entity) {    // the original entity
56813               _isLocked = false;
56814               return;
56815           }
56816
56817           var latest = context.hasEntity(_entity.id);
56818           if (!latest) {    // get current entity, possibly edited
56819               _isLocked = false;
56820               return;
56821           }
56822
56823           var hasOriginalName = (latest.tags.name && latest.tags.name === _entity.tags.name);
56824           var hasWikidata = latest.tags.wikidata;
56825           var preset = context.presets().match(latest, context.graph());
56826           var isSuggestion = preset && preset.suggestion;
56827           var showsBrand = preset && preset.fields
56828               .filter(function(d) { return d.id === 'brand'; }).length;
56829
56830           _isLocked = !!(field.id === 'name' && hasOriginalName &&
56831               (hasWikidata || (isSuggestion && !showsBrand)));
56832       }
56833
56834
56835       function calcMultilingual(tags) {
56836           _multilingual = [];
56837           for (var k in tags) {
56838               var m = k.match(/^(.*):([a-zA-Z_-]+)$/);
56839               if (m && m[1] === field.key && m[2]) {
56840                   _multilingual.push({ lang: m[2], value: tags[k] });
56841               }
56842           }
56843           _multilingual.reverse();
56844       }
56845
56846
56847       function localized(selection$$1) {
56848           _selection = selection$$1;
56849           calcLocked();
56850           var entity = _entity && context.hasEntity(_entity.id);  // get latest
56851           var preset = entity && context.presets().match(entity, context.graph());
56852
56853           var wrap = selection$$1.selectAll('.form-field-input-wrap')
56854               .data([0]);
56855
56856           // enter/update
56857           wrap = wrap.enter()
56858               .append('div')
56859               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
56860               .merge(wrap)
56861               .call(_isLocked ? _brandTip : _brandTip.destroy);
56862
56863
56864           input = wrap.selectAll('.localized-main')
56865               .data([0]);
56866
56867           // enter/update
56868           input = input.enter()
56869               .append('input')
56870               .attr('type', 'text')
56871               .attr('id', 'preset-input-' + field.safeid)
56872               .attr('class', 'localized-main')
56873               .attr('placeholder', field.placeholder())
56874               .call(utilNoAuto)
56875               .merge(input);
56876
56877           if (preset && field.id === 'name') {
56878               var pTag = preset.id.split('/', 2);
56879               var pKey = pTag[0];
56880               var pValue = pTag[1];
56881
56882               if (preset.suggestion) {
56883                   // A "suggestion" preset (brand name)
56884                   // Put suggestion keys in `field.keys` so delete button can remove them all.
56885                   field.keys = Object.keys(preset.removeTags)
56886                       .filter(function(k) { return k !== pKey; });
56887
56888               } else {
56889                   // Not a suggestion preset - Add a suggestions dropdown if it makes sense to.
56890                   // This code attempts to determine if the matched preset is the
56891                   // kind of preset that even can benefit from name suggestions..
56892                   // - true = shops, cafes, hotels, etc. (also generic and fallback presets)
56893                   // - false = churches, parks, hospitals, etc. (things not in the index)
56894                   var isFallback = preset.isFallback();
56895                   var goodSuggestions = allSuggestions.filter(function(s) {
56896                       if (isFallback) return true;
56897                       var sTag = s.id.split('/', 2);
56898                       var sKey = sTag[0];
56899                       var sValue = sTag[1];
56900                       return pKey === sKey && (!pValue || pValue === sValue);
56901                   });
56902
56903                   // Show the suggestions.. If the user picks one, change the tags..
56904                   if (allSuggestions.length && goodSuggestions.length) {
56905                       input
56906                           .on('blur.localized', checkBrandOnBlur)
56907                           .call(brandCombo
56908                               .fetcher(fetchBrandNames(preset, allSuggestions))
56909                               .on('accept', acceptBrand)
56910                               .on('cancel', cancelBrand)
56911                           );
56912                   }
56913               }
56914           }
56915
56916           input
56917               .classed('disabled', !!_isLocked)
56918               .attr('readonly', _isLocked || null)
56919               .on('input', change(true))
56920               .on('blur', change())
56921               .on('change', change());
56922
56923
56924           var translateButton = wrap.selectAll('.localized-add')
56925               .data([0]);
56926
56927           translateButton = translateButton.enter()
56928               .append('button')
56929               .attr('class', 'localized-add form-field-button')
56930               .attr('tabindex', -1)
56931               .call(svgIcon('#iD-icon-plus'))
56932               .merge(translateButton);
56933
56934           translateButton
56935               .classed('disabled', !!_isLocked)
56936               .call(_isLocked ? _buttonTip.destroy : _buttonTip)
56937               .on('click', addNew);
56938
56939
56940           if (entity && !_multilingual.length) {
56941               calcMultilingual(entity.tags);
56942           }
56943
56944           localizedInputs = selection$$1.selectAll('.localized-multilingual')
56945               .data([0]);
56946
56947           localizedInputs = localizedInputs.enter()
56948               .append('div')
56949               .attr('class', 'localized-multilingual')
56950               .merge(localizedInputs);
56951
56952           localizedInputs
56953               .call(renderMultilingual);
56954
56955           localizedInputs.selectAll('button, input')
56956               .classed('disabled', !!_isLocked)
56957               .attr('readonly', _isLocked || null);
56958
56959
56960           // We are not guaranteed to get an `accept` or `cancel` when blurring the field.
56961           // (This can happen if the user actives the combo, arrows down, and then clicks off to blur)
56962           // So compare the current field value against the suggestions one last time.
56963           function checkBrandOnBlur() {
56964               var latest = context.hasEntity(_entity.id);
56965               if (!latest) return;   // deleting the entity blurred the field?
56966
56967               var preset = context.presets().match(latest, context.graph());
56968               if (preset && preset.suggestion) return;   // already accepted
56969
56970               // note: here we are testing against "decorated" names, i.e. 'Starbucks – Cafe'
56971               var name = utilGetSetValue(input).trim();
56972               var matched = allSuggestions.filter(function(s) { return name === s.name(); });
56973
56974               if (matched.length === 1) {
56975                   acceptBrand({ suggestion: matched[0] });
56976               } else {
56977                   cancelBrand();
56978               }
56979           }
56980
56981
56982           function acceptBrand(d) {
56983               if (!d) {
56984                   cancelBrand();
56985                   return;
56986               }
56987
56988               var entity = context.entity(_entity.id);  // get latest
56989               var tags = entity.tags;
56990               var geometry = entity.geometry(context.graph());
56991               var removed = preset.unsetTags(tags, geometry);
56992               for (var k in tags) {
56993                   tags[k] = removed[k];  // set removed tags to `undefined`
56994               }
56995               tags = d.suggestion.setTags(tags, geometry);
56996               utilGetSetValue(input, tags.name);
56997               dispatch$$1.call('change', this, tags);
56998           }
56999
57000
57001           // user hit escape, clean whatever preset name appears after the last ' – '
57002           function cancelBrand() {
57003               var name = utilGetSetValue(input);
57004               var clean = cleanName(name);
57005               if (clean !== name) {
57006                   utilGetSetValue(input, clean);
57007                   dispatch$$1.call('change', this, { name: clean });
57008               }
57009           }
57010
57011           // Remove whatever is after the last ' – '
57012           // NOTE: split/join on en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
57013           function cleanName(name) {
57014               var parts = name.split(' – ');
57015               if (parts.length > 1) {
57016                   parts.pop();
57017                   name = parts.join(' – ');
57018               }
57019               return name;
57020           }
57021
57022
57023           function fetchBrandNames(preset, suggestions) {
57024               var pTag = preset.id.split('/', 2);
57025               var pKey = pTag[0];
57026               var pValue = pTag[1];
57027
57028               return function(value, callback) {
57029                   var results = [];
57030                   if (value && value.length > 2) {
57031                       for (var i = 0; i < suggestions.length; i++) {
57032                           var s = suggestions[i];
57033                           var sTag = s.id.split('/', 2);
57034                           var sKey = sTag[0];
57035                           var sValue = sTag[1];
57036                           var name = s.name();
57037                           var dist = utilEditDistance(value, name.substring(0, value.length));
57038                           var matchesPreset = (pKey === sKey && (!pValue || pValue === sValue));
57039
57040                           if (dist < 1 || (matchesPreset && dist < 3)) {
57041                               var obj = {
57042                                   title: name,
57043                                   value: name,
57044                                   suggestion: s,
57045                                   dist: dist + (matchesPreset ? 0 : 1)  // penalize if not matched preset
57046                               };
57047                               results.push(obj);
57048                           }
57049                       }
57050                       results.sort(function(a, b) { return a.dist - b.dist; });
57051                   }
57052                   results = results.slice(0, 10);
57053                   callback(results);
57054               };
57055           }
57056
57057
57058           function addNew() {
57059               event.preventDefault();
57060               if (_isLocked) return;
57061
57062               var defaultLang = utilDetect().locale.toLowerCase().split('-')[0];
57063               var langExists = find$1(_multilingual, function(datum) { return datum.lang === defaultLang;});
57064               var isLangEn = defaultLang.indexOf('en') > -1;
57065               if (isLangEn || langExists) {
57066                   defaultLang = '';
57067               }
57068               _multilingual.push({ lang: defaultLang, value: '' });
57069
57070               localizedInputs
57071                   .call(renderMultilingual);
57072           }
57073
57074
57075           function change(onInput) {
57076               return function() {
57077                   if (_isLocked) {
57078                       event.preventDefault();
57079                       return;
57080                   }
57081                   var t$$1 = {};
57082                   t$$1[field.key] = utilGetSetValue(select(this)) || undefined;
57083                   dispatch$$1.call('change', this, t$$1, onInput);
57084               };
57085           }
57086       }
57087
57088
57089       function key(lang) {
57090           return field.key + ':' + lang;
57091       }
57092
57093
57094       function changeLang(d) {
57095           var lang = utilGetSetValue(select(this));
57096           var t$$1 = {};
57097           var language = find$1(wikipedia$2, function(d) {
57098               return d[0].toLowerCase() === lang.toLowerCase() ||
57099                   d[1].toLowerCase() === lang.toLowerCase();
57100           });
57101
57102           if (language) lang = language[2];
57103
57104           if (d.lang && d.lang !== lang) {
57105               t$$1[key(d.lang)] = undefined;
57106           }
57107
57108           var value = utilGetSetValue(select(this.parentNode)
57109               .selectAll('.localized-value'));
57110
57111           if (lang && value) {
57112               t$$1[key(lang)] = value;
57113           } else if (lang && _wikiTitles && _wikiTitles[d.lang]) {
57114               t$$1[key(lang)] = _wikiTitles[d.lang];
57115           }
57116
57117           d.lang = lang;
57118           dispatch$$1.call('change', this, t$$1);
57119       }
57120
57121
57122       function changeValue(d) {
57123           if (!d.lang) return;
57124           var t$$1 = {};
57125           t$$1[key(d.lang)] = utilGetSetValue(select(this)) || undefined;
57126           dispatch$$1.call('change', this, t$$1);
57127       }
57128
57129
57130       function fetchLanguages(value, cb) {
57131           var v = value.toLowerCase();
57132
57133           cb(wikipedia$2.filter(function(d) {
57134               return d[0].toLowerCase().indexOf(v) >= 0 ||
57135               d[1].toLowerCase().indexOf(v) >= 0 ||
57136               d[2].toLowerCase().indexOf(v) >= 0;
57137           }).map(function(d) {
57138               return { value: d[1] };
57139           }));
57140       }
57141
57142
57143       function renderMultilingual(selection$$1) {
57144           var wraps = selection$$1.selectAll('div.entry')
57145               .data(_multilingual, function(d) { return d.lang; });
57146
57147           wraps.exit()
57148               .transition()
57149               .duration(200)
57150               .style('max-height', '0px')
57151               .style('opacity', '0')
57152               .style('top', '-10px')
57153               .remove();
57154
57155           var innerWrap = wraps.enter()
57156               .insert('div', ':first-child');
57157
57158           innerWrap
57159               .attr('class', 'entry')
57160               .each(function() {
57161                   var wrap = select(this);
57162
57163                   var label = wrap
57164                       .append('label')
57165                       .attr('class', 'form-field-label');
57166
57167                   label
57168                       .append('span')
57169                       .attr('class', 'label-text')
57170                       .text(t('translate.localized_translation_label'));
57171
57172                   label
57173                       .append('button')
57174                       .attr('class', 'remove-icon-multilingual')
57175                       .on('click', function(d){
57176                           if (_isLocked) return;
57177                           event.preventDefault();
57178                           var t$$1 = {};
57179                           t$$1[key(d.lang)] = undefined;
57180                           dispatch$$1.call('change', this, t$$1);
57181                           select(this.parentNode.parentNode.parentNode)
57182                               .style('top', '0')
57183                               .style('max-height', '240px')
57184                               .transition()
57185                               .style('opacity', '0')
57186                               .style('max-height', '0px')
57187                               .remove();
57188                       })
57189                       .call(svgIcon('#iD-operation-delete'));
57190
57191                   wrap
57192                       .append('input')
57193                       .attr('class', 'localized-lang')
57194                       .attr('type', 'text')
57195                       .attr('placeholder', t('translate.localized_translation_language'))
57196                       .on('blur', changeLang)
57197                       .on('change', changeLang)
57198                       .call(langCombo);
57199
57200                   wrap
57201                       .append('input')
57202                       .attr('type', 'text')
57203                       .attr('placeholder', t('translate.localized_translation_name'))
57204                       .attr('class', 'localized-value')
57205                       .on('blur', changeValue)
57206                       .on('change', changeValue);
57207               });
57208
57209           innerWrap
57210               .style('margin-top', '0px')
57211               .style('max-height', '0px')
57212               .style('opacity', '0')
57213               .transition()
57214               .duration(200)
57215               .style('margin-top', '10px')
57216               .style('max-height', '240px')
57217               .style('opacity', '1')
57218               .on('end', function() {
57219                   select(this)
57220                       .style('max-height', '')
57221                       .style('overflow', 'visible');
57222               });
57223
57224
57225           var entry = selection$$1.selectAll('.entry');
57226
57227           utilGetSetValue(entry.select('.localized-lang'), function(d) {
57228               var lang = find$1(wikipedia$2, function(lang) { return lang[2] === d.lang; });
57229               return lang ? lang[1] : d.lang;
57230           });
57231
57232           utilGetSetValue(entry.select('.localized-value'),
57233               function(d) { return d.value; });
57234       }
57235
57236
57237       localized.tags = function(tags) {
57238           // Fetch translations from wikipedia
57239           if (tags.wikipedia && !_wikiTitles) {
57240               _wikiTitles = {};
57241               var wm = tags.wikipedia.match(/([^:]+):(.+)/);
57242               if (wm && wm[0] && wm[1]) {
57243                   wikipedia.translations(wm[1], wm[2], function(d) { _wikiTitles = d; });
57244               }
57245           }
57246
57247           utilGetSetValue(input, tags[field.key] || '');
57248
57249           calcMultilingual(tags);
57250
57251           _selection
57252               .call(localized);
57253       };
57254
57255
57256       localized.focus = function() {
57257           input.node().focus();
57258       };
57259
57260
57261       localized.entity = function(val) {
57262           if (!arguments.length) return _entity;
57263           _entity = val;
57264           _multilingual = [];
57265           return localized;
57266       };
57267
57268       return utilRebind(localized, dispatch$$1, 'on');
57269   }
57270
57271   function uiFieldMaxspeed(field, context) {
57272       var dispatch$$1 = dispatch('change');
57273       var unitInput = select(null);
57274       var input = select(null);
57275       var _entity;
57276       var _isImperial;
57277
57278       var speedCombo = uiCombobox(context, 'maxspeed');
57279       var unitCombo = uiCombobox(context, 'maxspeed-unit')
57280               .data(['km/h', 'mph'].map(comboValues));
57281
57282       var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120];
57283       var imperialValues = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80];
57284
57285
57286       function maxspeed(selection$$1) {
57287
57288           var wrap = selection$$1.selectAll('.form-field-input-wrap')
57289               .data([0]);
57290
57291           wrap = wrap.enter()
57292               .append('div')
57293               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
57294               .merge(wrap);
57295
57296
57297           input = wrap.selectAll('#preset-input-' + field.safeid)
57298               .data([0]);
57299
57300           input = input.enter()
57301               .append('input')
57302               .attr('type', 'text')
57303               .attr('id', 'preset-input-' + field.safeid)
57304               .attr('placeholder', field.placeholder())
57305               .call(utilNoAuto)
57306               .call(speedCombo)
57307               .merge(input);
57308
57309           input
57310               .on('change', change)
57311               .on('blur', change);
57312
57313           var loc;
57314           if (_entity.type === 'node') {
57315               loc = _entity.loc;
57316           } else {
57317               var childNodes = context.graph().childNodes(context.entity(_entity.id));
57318               loc = childNodes[~~(childNodes.length/2)].loc;
57319           }
57320
57321           _isImperial = some(dataImperial.features, function(f) {
57322               return some(f.geometry.coordinates, function(d) {
57323                   return geoPointInPolygon(loc, d);
57324               });
57325           });
57326
57327           unitInput = wrap.selectAll('input.maxspeed-unit')
57328               .data([0]);
57329
57330           unitInput = unitInput.enter()
57331               .append('input')
57332               .attr('type', 'text')
57333               .attr('class', 'maxspeed-unit')
57334               .call(unitCombo)
57335               .merge(unitInput);
57336
57337           unitInput
57338               .on('blur', changeUnits)
57339               .on('change', changeUnits);
57340
57341
57342           function changeUnits() {
57343               _isImperial = utilGetSetValue(unitInput) === 'mph';
57344               utilGetSetValue(unitInput, _isImperial ? 'mph' : 'km/h');
57345               setSuggestions();
57346               change();
57347           }
57348       }
57349
57350
57351       function setSuggestions() {
57352           speedCombo.data((_isImperial ? imperialValues : metricValues).map(comboValues));
57353           utilGetSetValue(unitInput, _isImperial ? 'mph' : 'km/h');
57354       }
57355
57356
57357       function comboValues(d) {
57358           return {
57359               value: d.toString(),
57360               title: d.toString()
57361           };
57362       }
57363
57364
57365       function change() {
57366           var tag = {};
57367           var value = utilGetSetValue(input);
57368
57369           if (!value) {
57370               tag[field.key] = undefined;
57371           } else if (isNaN(value) || !_isImperial) {
57372               tag[field.key] = value;
57373           } else {
57374               tag[field.key] = value + ' mph';
57375           }
57376
57377           dispatch$$1.call('change', this, tag);
57378       }
57379
57380
57381       maxspeed.tags = function(tags) {
57382           var value = tags[field.key];
57383
57384           if (value && value.indexOf('mph') >= 0) {
57385               value = parseInt(value, 10);
57386               _isImperial = true;
57387           } else if (value) {
57388               _isImperial = false;
57389           }
57390
57391           setSuggestions();
57392           utilGetSetValue(input, value || '');
57393       };
57394
57395
57396       maxspeed.focus = function() {
57397           input.node().focus();
57398       };
57399
57400
57401       maxspeed.entity = function(val) {
57402           _entity = val;
57403       };
57404
57405
57406       return utilRebind(maxspeed, dispatch$$1, 'on');
57407   }
57408
57409   /**
57410    * This function is like `baseIndexOf` except that it accepts a comparator.
57411    *
57412    * @private
57413    * @param {Array} array The array to inspect.
57414    * @param {*} value The value to search for.
57415    * @param {number} fromIndex The index to search from.
57416    * @param {Function} comparator The comparator invoked per element.
57417    * @returns {number} Returns the index of the matched value, else `-1`.
57418    */
57419   function baseIndexOfWith(array, value, fromIndex, comparator) {
57420     var index = fromIndex - 1,
57421         length = array.length;
57422
57423     while (++index < length) {
57424       if (comparator(array[index], value)) {
57425         return index;
57426       }
57427     }
57428     return -1;
57429   }
57430
57431   /** Used for built-in method references. */
57432   var arrayProto$2 = Array.prototype;
57433
57434   /** Built-in value references. */
57435   var splice$2 = arrayProto$2.splice;
57436
57437   /**
57438    * The base implementation of `_.pullAllBy` without support for iteratee
57439    * shorthands.
57440    *
57441    * @private
57442    * @param {Array} array The array to modify.
57443    * @param {Array} values The values to remove.
57444    * @param {Function} [iteratee] The iteratee invoked per element.
57445    * @param {Function} [comparator] The comparator invoked per element.
57446    * @returns {Array} Returns `array`.
57447    */
57448   function basePullAll(array, values, iteratee, comparator) {
57449     var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
57450         index = -1,
57451         length = values.length,
57452         seen = array;
57453
57454     if (array === values) {
57455       values = copyArray(values);
57456     }
57457     if (iteratee) {
57458       seen = arrayMap(array, baseUnary(iteratee));
57459     }
57460     while (++index < length) {
57461       var fromIndex = 0,
57462           value = values[index],
57463           computed = iteratee ? iteratee(value) : value;
57464
57465       while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
57466         if (seen !== array) {
57467           splice$2.call(seen, fromIndex, 1);
57468         }
57469         splice$2.call(array, fromIndex, 1);
57470       }
57471     }
57472     return array;
57473   }
57474
57475   /**
57476    * This method is like `_.pull` except that it accepts an array of values to remove.
57477    *
57478    * **Note:** Unlike `_.difference`, this method mutates `array`.
57479    *
57480    * @static
57481    * @memberOf _
57482    * @since 4.0.0
57483    * @category Array
57484    * @param {Array} array The array to modify.
57485    * @param {Array} values The values to remove.
57486    * @returns {Array} Returns `array`.
57487    * @example
57488    *
57489    * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
57490    *
57491    * _.pullAll(array, ['a', 'c']);
57492    * console.log(array);
57493    * // => ['b', 'b']
57494    */
57495   function pullAll(array, values) {
57496     return (array && array.length && values && values.length)
57497       ? basePullAll(array, values)
57498       : array;
57499   }
57500
57501   /**
57502    * Removes all given values from `array` using
57503    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
57504    * for equality comparisons.
57505    *
57506    * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
57507    * to remove elements from an array by predicate.
57508    *
57509    * @static
57510    * @memberOf _
57511    * @since 2.0.0
57512    * @category Array
57513    * @param {Array} array The array to modify.
57514    * @param {...*} [values] The values to remove.
57515    * @returns {Array} Returns `array`.
57516    * @example
57517    *
57518    * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
57519    *
57520    * _.pull(array, 'a', 'c');
57521    * console.log(array);
57522    * // => ['b', 'b']
57523    */
57524   var pull = baseRest(pullAll);
57525
57526   function uiFieldRadio(field, context) {
57527       var dispatch$$1 = dispatch('change');
57528       var placeholder = select(null);
57529       var wrap = select(null);
57530       var labels = select(null);
57531       var radios = select(null);
57532       var radioData = clone(field.options || field.keys);
57533       var typeField;
57534       var layerField;
57535       var _oldType = {};
57536       var _entity;
57537
57538
57539       function selectedKey() {
57540           var node = wrap.selectAll('.form-field-input-radio label.active input');
57541           return !node.empty() && node.datum();
57542       }
57543
57544
57545       function radio(selection$$1) {
57546           selection$$1.classed('preset-radio', true);
57547
57548           wrap = selection$$1.selectAll('.form-field-input-wrap')
57549               .data([0]);
57550
57551           var enter = wrap.enter()
57552               .append('div')
57553               .attr('class', 'form-field-input-wrap form-field-input-radio');
57554
57555           enter
57556               .append('span')
57557               .attr('class', 'placeholder');
57558
57559           wrap = wrap
57560               .merge(enter);
57561
57562
57563           placeholder = wrap.selectAll('.placeholder');
57564
57565           labels = wrap.selectAll('label')
57566               .data(radioData);
57567
57568           enter = labels.enter()
57569               .append('label');
57570
57571           enter
57572               .append('input')
57573               .attr('type', 'radio')
57574               .attr('name', field.id)
57575               .attr('value', function(d) { return field.t('options.' + d, { 'default': d }); })
57576               .attr('checked', false);
57577
57578           enter
57579               .append('span')
57580               .text(function(d) { return field.t('options.' + d, { 'default': d }); });
57581
57582           labels = labels
57583               .merge(enter);
57584
57585           radios = labels.selectAll('input')
57586               .on('change', changeRadio);
57587
57588       }
57589
57590
57591       function structureExtras(selection$$1, tags) {
57592           var selected = selectedKey();
57593           var type = context.presets().field(selected);
57594           var layer = context.presets().field('layer');
57595           var showLayer = (selected === 'bridge' || selected === 'tunnel');
57596
57597
57598           var extrasWrap = selection$$1.selectAll('.structure-extras-wrap')
57599               .data(selected ? [0] : []);
57600
57601           extrasWrap.exit()
57602               .remove();
57603
57604           extrasWrap = extrasWrap.enter()
57605               .append('div')
57606               .attr('class', 'structure-extras-wrap')
57607               .merge(extrasWrap);
57608
57609           var list = extrasWrap.selectAll('ul')
57610               .data([0]);
57611
57612           list = list.enter()
57613               .append('ul')
57614               .attr('class', 'labeled-inputs')
57615               .merge(list);
57616
57617
57618           // Type
57619           if (type) {
57620               if (!typeField || typeField.id !== selected) {
57621                   typeField = uiField(context, type, _entity, { wrap: false })
57622                       .on('change', changeType);
57623               }
57624               typeField.tags(tags);
57625           } else {
57626               typeField = null;
57627           }
57628
57629           var typeItem = list.selectAll('.structure-type-item')
57630               .data(typeField ? [typeField] : [], function(d) { return d.id; });
57631
57632           // Exit
57633           typeItem.exit()
57634               .remove();
57635
57636           // Enter
57637           var typeEnter = typeItem.enter()
57638               .insert('li', ':first-child')
57639               .attr('class', 'structure-type-item');
57640
57641           typeEnter
57642               .append('span')
57643               .attr('class', 'label structure-label-type')
57644               .attr('for', 'preset-input-' + selected)
57645               .text(t('inspector.radio.structure.type'));
57646
57647           typeEnter
57648               .append('div')
57649               .attr('class', 'structure-input-type-wrap');
57650
57651           // Update
57652           typeItem = typeItem
57653               .merge(typeEnter);
57654
57655           if (typeField) {
57656               typeItem.selectAll('.structure-input-type-wrap')
57657                   .call(typeField.render);
57658           }
57659
57660
57661           // Layer
57662           if (layer && showLayer) {
57663               if (!layerField) {
57664                   layerField = uiField(context, layer, _entity, { wrap: false })
57665                       .on('change', changeLayer);
57666               }
57667               layerField.tags(tags);
57668               field.keys = union(field.keys, ['layer']);
57669           } else {
57670               layerField = null;
57671               pull(field.keys, 'layer');
57672           }
57673
57674           var layerItem = list.selectAll('.structure-layer-item')
57675               .data(layerField ? [layerField] : []);
57676
57677           // Exit
57678           layerItem.exit()
57679               .remove();
57680
57681           // Enter
57682           var layerEnter = layerItem.enter()
57683               .append('li')
57684               .attr('class', 'structure-layer-item');
57685
57686           layerEnter
57687               .append('span')
57688               .attr('class', 'label structure-label-layer')
57689               .attr('for', 'preset-input-layer')
57690               .text(t('inspector.radio.structure.layer'));
57691
57692           layerEnter
57693               .append('div')
57694               .attr('class', 'structure-input-layer-wrap');
57695
57696           // Update
57697           layerItem = layerItem
57698               .merge(layerEnter);
57699
57700           if (layerField) {
57701               layerItem.selectAll('.structure-input-layer-wrap')
57702                   .call(layerField.render);
57703           }
57704       }
57705
57706
57707       function changeType(t$$1, onInput) {
57708           var key = selectedKey();
57709           if (!key) return;
57710
57711           var val = t$$1[key];
57712           if (val !== 'no') {
57713               _oldType[key] = val;
57714           }
57715
57716           if (field.type === 'structureRadio') {
57717               // remove layer if it should not be set
57718               if (val === 'no' ||
57719                   (key !== 'bridge' && key !== 'tunnel') ||
57720                   (key === 'tunnel' && val === 'building_passage')) {
57721                   t$$1.layer = undefined;
57722               }
57723               // add layer if it should be set
57724               if (t$$1.layer === undefined) {
57725                   if (key === 'bridge' && val !== 'no') {
57726                       t$$1.layer = '1';
57727                   }
57728                   if (key === 'tunnel' && val !== 'no' && val !== 'building_passage') {
57729                       t$$1.layer = '-1';
57730                   }
57731               }
57732            }
57733
57734           dispatch$$1.call('change', this, t$$1, onInput);
57735       }
57736
57737
57738       function changeLayer(t$$1, onInput) {
57739           if (t$$1.layer === '0') {
57740               t$$1.layer = undefined;
57741           }
57742           dispatch$$1.call('change', this, t$$1, onInput);
57743       }
57744
57745
57746       function changeRadio() {
57747           var t$$1 = {};
57748           var activeKey;
57749
57750           if (field.key) {
57751               t$$1[field.key] = undefined;
57752           }
57753
57754           radios.each(function(d) {
57755               var active = select(this).property('checked');
57756               if (active) activeKey = d;
57757
57758               if (field.key) {
57759                   if (active) t$$1[field.key] = d;
57760               } else {
57761                   var val = _oldType[activeKey] || 'yes';
57762                   t$$1[d] = active ? val : undefined;
57763               }
57764           });
57765
57766           if (field.type === 'structureRadio') {
57767               if (activeKey === 'bridge') {
57768                   t$$1.layer = '1';
57769               } else if (activeKey === 'tunnel' && t$$1.tunnel !== 'building_passage') {
57770                   t$$1.layer = '-1';
57771               } else {
57772                   t$$1.layer = undefined;
57773               }
57774           }
57775
57776           dispatch$$1.call('change', this, t$$1);
57777       }
57778
57779
57780       radio.tags = function(tags) {
57781           function checked(d) {
57782               if (field.key) {
57783                   return tags[field.key] === d;
57784               } else {
57785                   return !!(tags[d] && tags[d].toLowerCase() !== 'no');
57786               }
57787           }
57788
57789           labels.classed('active', checked);
57790           radios.property('checked', checked);
57791
57792           var selection$$1 = radios.filter(function() { return this.checked; });
57793
57794           if (selection$$1.empty()) {
57795               placeholder.text(t('inspector.none'));
57796           } else {
57797               placeholder.text(selection$$1.attr('value'));
57798               _oldType[selection$$1.datum()] = tags[selection$$1.datum()];
57799           }
57800
57801           if (field.type === 'structureRadio') {
57802               // For waterways without a tunnel tag, set 'culvert' as
57803               // the _oldType to default to if the user picks 'tunnel'
57804               if (!!tags.waterway && !_oldType.tunnel) {
57805                   _oldType.tunnel = 'culvert';
57806               }
57807
57808               wrap.call(structureExtras, tags);
57809           }
57810       };
57811
57812
57813       radio.focus = function() {
57814           radios.node().focus();
57815       };
57816
57817
57818       radio.entity = function(val) {
57819           if (!arguments.length) return _entity;
57820           _entity = val;
57821           _oldType = {};
57822           return radio;
57823       };
57824
57825
57826       return utilRebind(radio, dispatch$$1, 'on');
57827   }
57828
57829   function uiFieldRestrictions(field, context) {
57830       var dispatch$$1 = dispatch('change');
57831       var breathe = behaviorBreathe(context);
57832       var storedViaWay = context.storage('turn-restriction-via-way');
57833       var storedDistance = context.storage('turn-restriction-distance');
57834
57835       var _maxViaWay = storedViaWay !== null ? (+storedViaWay) : 1;
57836       var _maxDistance = storedDistance ? (+storedDistance) : 30;
57837       var _initialized = false;
57838       var _parent = select(null);       // the entire field
57839       var _container = select(null);    // just the map
57840       var _oldTurns;
57841       var _graph;
57842       var _vertexID;
57843       var _intersection;
57844       var _fromWayID;
57845
57846       var _lastXPos;
57847
57848
57849       function restrictions(selection$$1) {
57850           _parent = selection$$1;
57851
57852           // try to reuse the intersection, but always rebuild it if the graph has changed
57853           if (_vertexID && (context.graph() !== _graph || !_intersection)) {
57854               _graph = context.graph();
57855               _intersection = osmIntersection(_graph, _vertexID, _maxDistance);
57856           }
57857
57858           // It's possible for there to be no actual intersection here.
57859           // for example, a vertex of two `highway=path`
57860           // In this case, hide the field.
57861           var isOK = (
57862               _intersection &&
57863               _intersection.vertices.length &&           // has vertices
57864               _intersection.vertices                     // has the vertex that the user selected
57865                   .filter(function(vertex) { return vertex.id === _vertexID; }).length &&
57866               _intersection.ways.length > 2 &&           // has more than 2 ways
57867               _intersection.ways                         // has more than 1 TO way
57868                   .filter(function(way) { return way.__to; }).length > 1
57869           );
57870
57871           // Also hide in the case where
57872           select(selection$$1.node().parentNode).classed('hide', !isOK);
57873
57874           // if form field is hidden or has detached from dom, clean up.
57875           if (!isOK ||
57876               !select('.inspector-wrap.inspector-hidden').empty() ||
57877               !selection$$1.node().parentNode ||
57878               !selection$$1.node().parentNode.parentNode) {
57879               selection$$1.call(restrictions.off);
57880               return;
57881           }
57882
57883
57884           var wrap = selection$$1.selectAll('.form-field-input-wrap')
57885               .data([0]);
57886
57887           wrap = wrap.enter()
57888               .append('div')
57889               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
57890               .merge(wrap);
57891
57892           var container = wrap.selectAll('.restriction-container')
57893               .data([0]);
57894
57895           // enter
57896           var containerEnter = container.enter()
57897               .append('div')
57898               .attr('class', 'restriction-container');
57899
57900           containerEnter
57901               .append('div')
57902               .attr('class', 'restriction-help');
57903
57904           // update
57905           _container = containerEnter
57906               .merge(container)
57907               .call(renderViewer);
57908
57909           var controls = wrap.selectAll('.restriction-controls')
57910               .data([0]);
57911
57912           // enter/update
57913           controls.enter()
57914               .append('div')
57915               .attr('class', 'restriction-controls-container')
57916               .append('div')
57917               .attr('class', 'restriction-controls')
57918               .merge(controls)
57919               .call(renderControls);
57920       }
57921
57922
57923       function renderControls(selection$$1) {
57924           var distControl = selection$$1.selectAll('.restriction-distance')
57925               .data([0]);
57926
57927           distControl.exit()
57928               .remove();
57929
57930           var distControlEnter = distControl.enter()
57931               .append('div')
57932               .attr('class', 'restriction-control restriction-distance');
57933
57934           distControlEnter
57935               .append('span')
57936               .attr('class', 'restriction-control-label restriction-distance-label')
57937               .text(t('restriction.controls.distance') + ':');
57938
57939           distControlEnter
57940               .append('input')
57941               .attr('class', 'restriction-distance-input')
57942               .attr('type', 'range')
57943               .attr('min', '20')
57944               .attr('max', '50')
57945               .attr('step', '5');
57946
57947           distControlEnter
57948               .append('span')
57949               .attr('class', 'restriction-distance-text');
57950
57951           // update
57952           selection$$1.selectAll('.restriction-distance-input')
57953               .property('value', _maxDistance)
57954               .on('input', function() {
57955                   var val = select(this).property('value');
57956                   _maxDistance = +val;
57957                   _intersection = null;
57958                   _container.selectAll('.layer-osm .layer-turns *').remove();
57959                   context.storage('turn-restriction-distance', _maxDistance);
57960                   _parent.call(restrictions);
57961               });
57962
57963           selection$$1.selectAll('.restriction-distance-text')
57964               .text(displayMaxDistance(_maxDistance));
57965
57966
57967           var viaControl = selection$$1.selectAll('.restriction-via-way')
57968               .data([0]);
57969
57970           viaControl.exit()
57971               .remove();
57972
57973           var viaControlEnter = viaControl.enter()
57974               .append('div')
57975               .attr('class', 'restriction-control restriction-via-way');
57976
57977           viaControlEnter
57978               .append('span')
57979               .attr('class', 'restriction-control-label restriction-via-way-label')
57980               .text(t('restriction.controls.via') + ':');
57981
57982           viaControlEnter
57983               .append('input')
57984               .attr('class', 'restriction-via-way-input')
57985               .attr('type', 'range')
57986               .attr('min', '0')
57987               .attr('max', '2')
57988               .attr('step', '1');
57989
57990           viaControlEnter
57991               .append('span')
57992               .attr('class', 'restriction-via-way-text');
57993
57994           // update
57995           selection$$1.selectAll('.restriction-via-way-input')
57996               .property('value', _maxViaWay)
57997               .on('input', function() {
57998                   var val = select(this).property('value');
57999                   _maxViaWay = +val;
58000                   _container.selectAll('.layer-osm .layer-turns *').remove();
58001                   context.storage('turn-restriction-via-way', _maxViaWay);
58002                   _parent.call(restrictions);
58003               });
58004
58005           selection$$1.selectAll('.restriction-via-way-text')
58006               .text(displayMaxVia(_maxViaWay));
58007       }
58008
58009
58010       function renderViewer(selection$$1) {
58011           if (!_intersection) return;
58012
58013           var vgraph = _intersection.graph;
58014           var filter = utilFunctor(true);
58015           var projection = geoRawMercator();
58016
58017           // Reflow warning: `utilGetDimensions` calls `getBoundingClientRect`
58018           // Instead of asking the restriction-container for its dimensions,
58019           //  we can ask the #sidebar, which can have its dimensions cached.
58020           // width: calc as sidebar - padding
58021           // height: hardcoded (from `80_app.css`)
58022           // var d = utilGetDimensions(selection);
58023           var sdims = utilGetDimensions(select('#sidebar'));
58024           var d = [ sdims[0] - 50, 370 ];
58025           var c = geoVecScale(d, 0.5);
58026           var z = 22;
58027
58028           projection.scale(geoZoomToScale(z));
58029
58030           // Calculate extent of all key vertices
58031           var extent = geoExtent$$1();
58032           for (var i = 0; i < _intersection.vertices.length; i++) {
58033               extent._extend(_intersection.vertices[i].extent());
58034           }
58035
58036           // If this is a large intersection, adjust zoom to fit extent
58037           if (_intersection.vertices.length > 1) {
58038               var padding = 180;   // in z22 pixels
58039               var tl = projection([extent[0][0], extent[1][1]]);
58040               var br = projection([extent[1][0], extent[0][1]]);
58041               var hFactor = (br[0] - tl[0]) / (d[0] - padding);
58042               var vFactor = (br[1] - tl[1]) / (d[1] - padding);
58043               var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
58044               var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
58045               z = z - Math.max(hZoomDiff, vZoomDiff);
58046               projection.scale(geoZoomToScale(z));
58047           }
58048
58049           var padTop = 35;   // reserve top space for hint text
58050           var extentCenter = projection(extent.center());
58051           extentCenter[1] = extentCenter[1] - padTop;
58052
58053           projection
58054               .translate(geoVecSubtract(c, extentCenter))
58055               .clipExtent([[0, 0], d]);
58056
58057           var drawLayers = svgLayers(projection, context).only(['osm','touch']).dimensions(d);
58058           var drawVertices = svgVertices$$1(projection, context);
58059           var drawLines = svgLines$$1(projection, context);
58060           var drawTurns = svgTurns(projection, context);
58061
58062           var firstTime = selection$$1.selectAll('.surface').empty();
58063
58064           selection$$1
58065               .call(drawLayers);
58066
58067           var surface = selection$$1.selectAll('.surface')
58068               .classed('tr', true);
58069
58070           if (firstTime) {
58071               _initialized = true;
58072
58073               surface
58074                   .call(breathe);
58075           }
58076
58077           // This can happen if we've lowered the detail while a FROM way
58078           // is selected, and that way is no longer part of the intersection.
58079           if (_fromWayID && !vgraph.hasEntity(_fromWayID)) {
58080               _fromWayID = null;
58081               _oldTurns = null;
58082           }
58083
58084           surface
58085               .call(utilSetDimensions, d)
58086               .call(drawVertices, vgraph, _intersection.vertices, filter, extent, z)
58087               .call(drawLines, vgraph, _intersection.ways, filter)
58088               .call(drawTurns, vgraph, _intersection.turns(_fromWayID, _maxViaWay));
58089
58090           surface
58091               .on('click.restrictions', click)
58092               .on('mouseover.restrictions', mouseover);
58093
58094           surface
58095               .selectAll('.selected')
58096               .classed('selected', false);
58097
58098           surface
58099               .selectAll('.related')
58100               .classed('related', false);
58101
58102           if (_fromWayID) {
58103               var way = vgraph.entity(_fromWayID);
58104               surface
58105                   .selectAll('.' + _fromWayID)
58106                   .classed('selected', true)
58107                   .classed('related', true);
58108           }
58109
58110           document.addEventListener('resizeWindow', function () {
58111               utilSetDimensions(_container, null);
58112               redraw(1);
58113           }, false);
58114
58115           updateHints(null);
58116
58117
58118           function click() {
58119               surface
58120                   .call(breathe.off)
58121                   .call(breathe);
58122
58123               var datum = event.target.__data__;
58124               var entity = datum && datum.properties && datum.properties.entity;
58125               if (entity) {
58126                   datum = entity;
58127               }
58128
58129               if (datum instanceof osmWay && (datum.__from || datum.__via)) {
58130                   _fromWayID = datum.id;
58131                   _oldTurns = null;
58132                   redraw();
58133
58134               } else if (datum instanceof osmTurn) {
58135                   var actions, extraActions, turns, i;
58136                   var restrictionType = osmInferRestriction(vgraph, datum, projection);
58137
58138                   if (datum.restrictionID && !datum.direct) {
58139                       return;
58140
58141                   } else if (datum.restrictionID && !datum.only) {    // NO -> ONLY
58142                       var seen = {};
58143                       var datumOnly = cloneDeep(datum);
58144                       datumOnly.only = true;
58145                       restrictionType = restrictionType.replace(/^no/, 'only');
58146
58147                       // Adding an ONLY restriction should destroy all other direct restrictions from the FROM towards the VIA.
58148                       // We will remember them in _oldTurns, and restore them if the user clicks again.
58149                       turns = _intersection.turns(_fromWayID, 2);
58150                       extraActions = [];
58151                       _oldTurns = [];
58152                       for (i = 0; i < turns.length; i++) {
58153                           var turn = turns[i];
58154                           if (seen[turn.restrictionID]) continue;  // avoid deleting the turn twice (#4968, #4928)
58155
58156                           if (turn.direct && turn.path[1] === datum.path[1]) {
58157                               seen[turns[i].restrictionID] = true;
58158                               turn.restrictionType = osmInferRestriction(vgraph, turn, projection);
58159                               _oldTurns.push(turn);
58160                               extraActions.push(actionUnrestrictTurn(turn));
58161                           }
58162                       }
58163
58164                       actions = _intersection.actions.concat(extraActions, [
58165                           actionRestrictTurn(datumOnly, restrictionType),
58166                           t('operations.restriction.annotation.create')
58167                       ]);
58168
58169                   } else if (datum.restrictionID) {   // ONLY -> Allowed
58170                       // Restore whatever restrictions we might have destroyed by cycling thru the ONLY state.
58171                       // This relies on the assumption that the intersection was already split up when we
58172                       // performed the previous action (NO -> ONLY), so the IDs in _oldTurns shouldn't have changed.
58173                       turns = _oldTurns || [];
58174                       extraActions = [];
58175                       for (i = 0; i < turns.length; i++) {
58176                           if (turns[i].key !== datum.key) {
58177                               extraActions.push(actionRestrictTurn(turns[i], turns[i].restrictionType));
58178                           }
58179                       }
58180                       _oldTurns = null;
58181
58182                       actions = _intersection.actions.concat(extraActions, [
58183                           actionUnrestrictTurn(datum),
58184                           t('operations.restriction.annotation.delete')
58185                       ]);
58186
58187                   } else {    // Allowed -> NO
58188                       actions = _intersection.actions.concat([
58189                           actionRestrictTurn(datum, restrictionType),
58190                           t('operations.restriction.annotation.create')
58191                       ]);
58192                   }
58193
58194                   context.perform.apply(context, actions);
58195
58196                   // At this point the datum will be changed, but will have same key..
58197                   // Refresh it and update the help..
58198                   var s = surface.selectAll('.' + datum.key);
58199                   datum = s.empty() ? null : s.datum();
58200                   updateHints(datum);
58201
58202               } else {
58203                   _fromWayID = null;
58204                   _oldTurns = null;
58205                   redraw();
58206               }
58207           }
58208
58209
58210           function mouseover() {
58211               var datum = event.target.__data__;
58212               updateHints(datum);
58213           }
58214
58215           _lastXPos = _lastXPos || sdims[0];
58216
58217           function redraw(minChange) {
58218               var xPos = -1;
58219
58220               if (minChange) {
58221                   xPos = utilGetDimensions(select('#sidebar'))[0];
58222               }
58223
58224               if (!minChange || (minChange && Math.abs(xPos - _lastXPos) >= minChange)) {
58225                   if (context.hasEntity(_vertexID)) {
58226                       _lastXPos = xPos;
58227                       _container.call(renderViewer);
58228                   }
58229               }
58230           }
58231
58232
58233           function highlightPathsFrom(wayID) {
58234               surface.selectAll('.related')
58235                   .classed('related', false)
58236                   .classed('allow', false)
58237                   .classed('restrict', false)
58238                   .classed('only', false);
58239
58240               surface.selectAll('.' + wayID)
58241                   .classed('related', true);
58242
58243               if (wayID) {
58244                   var turns = _intersection.turns(wayID, _maxViaWay);
58245                   for (var i = 0; i < turns.length; i++) {
58246                       var turn = turns[i];
58247                       var ids = [turn.to.way];
58248                       var klass = (turn.no ? 'restrict' : (turn.only ? 'only' : 'allow'));
58249
58250                       if (turn.only || turns.length === 1) {
58251                           if (turn.via.ways) {
58252                               ids = ids.concat(turn.via.ways);
58253                           }
58254                       } else if (turn.to.way === wayID) {
58255                           continue;
58256                       }
58257
58258                       surface.selectAll(utilEntitySelector(ids))
58259                           .classed('related', true)
58260                           .classed('allow', (klass === 'allow'))
58261                           .classed('restrict', (klass === 'restrict'))
58262                           .classed('only', (klass === 'only'));
58263                   }
58264               }
58265           }
58266
58267
58268           function updateHints(datum) {
58269               var help = _container.selectAll('.restriction-help').html('');
58270
58271               var placeholders = {};
58272               ['from', 'via', 'to'].forEach(function(k) {
58273                   placeholders[k] = '<span class="qualifier">' + t('restriction.help.' + k) + '</span>';
58274               });
58275
58276               var entity = datum && datum.properties && datum.properties.entity;
58277               if (entity) {
58278                   datum = entity;
58279               }
58280
58281               if (_fromWayID) {
58282                   way = vgraph.entity(_fromWayID);
58283                   surface
58284                       .selectAll('.' + _fromWayID)
58285                       .classed('selected', true)
58286                       .classed('related', true);
58287               }
58288
58289               // Hovering a way
58290               if (datum instanceof osmWay && datum.__from) {
58291                   way = datum;
58292
58293                   highlightPathsFrom(_fromWayID ? null : way.id);
58294                   surface.selectAll('.' + way.id)
58295                       .classed('related', true);
58296
58297                   var clickSelect = (!_fromWayID || _fromWayID !== way.id);
58298                   help
58299                       .append('div')      // "Click to select FROM {fromName}." / "FROM {fromName}"
58300                       .html(t('restriction.help.' + (clickSelect ? 'select_from_name' : 'from_name'), {
58301                           from: placeholders.from,
58302                           fromName: displayName(way.id, vgraph)
58303                       }));
58304
58305
58306               // Hovering a turn arrow
58307               } else if (datum instanceof osmTurn) {
58308                   var restrictionType = osmInferRestriction(vgraph, datum, projection);
58309                   var turnType = restrictionType.replace(/^(only|no)\_/, '');
58310                   var indirect = (datum.direct === false ? t('restriction.help.indirect') : '');
58311                   var klass, turnText, nextText;
58312
58313                   if (datum.no) {
58314                       klass = 'restrict';
58315                       turnText = t('restriction.help.turn.no_' + turnType, { indirect: indirect });
58316                       nextText = t('restriction.help.turn.only_' + turnType, { indirect: '' });
58317                   } else if (datum.only) {
58318                       klass = 'only';
58319                       turnText = t('restriction.help.turn.only_' + turnType, { indirect: indirect });
58320                       nextText = t('restriction.help.turn.allowed_' + turnType, { indirect: '' });
58321                   } else {
58322                       klass = 'allow';
58323                       turnText = t('restriction.help.turn.allowed_' + turnType, { indirect: indirect });
58324                       nextText = t('restriction.help.turn.no_' + turnType, { indirect: '' });
58325                   }
58326
58327                   help
58328                       .append('div')      // "NO Right Turn (indirect)"
58329                       .attr('class', 'qualifier ' + klass)
58330                       .text(turnText);
58331
58332                   help
58333                       .append('div')      // "FROM {fromName} TO {toName}"
58334                       .html(t('restriction.help.from_name_to_name', {
58335                           from: placeholders.from,
58336                           fromName: displayName(datum.from.way, vgraph),
58337                           to: placeholders.to,
58338                           toName: displayName(datum.to.way, vgraph)
58339                       }));
58340
58341                   if (datum.via.ways && datum.via.ways.length) {
58342                       var names = [];
58343                       for (var i = 0; i < datum.via.ways.length; i++) {
58344                           var prev = names[names.length - 1];
58345                           var curr = displayName(datum.via.ways[i], vgraph);
58346                           if (!prev || curr !== prev)   // collapse identical names
58347                               names.push(curr);
58348                       }
58349
58350                       help
58351                           .append('div')      // "VIA {viaNames}"
58352                           .html(t('restriction.help.via_names', {
58353                               via: placeholders.via,
58354                               viaNames: names.join(', ')
58355                           }));
58356                   }
58357
58358                   if (!indirect) {
58359                       help
58360                           .append('div')      // Click for "No Right Turn"
58361                           .text(t('restriction.help.toggle', { turn: nextText.trim() }));
58362                   }
58363
58364                   highlightPathsFrom(null);
58365                   var alongIDs = datum.path.slice();
58366                   surface.selectAll(utilEntitySelector(alongIDs))
58367                       .classed('related', true)
58368                       .classed('allow', (klass === 'allow'))
58369                       .classed('restrict', (klass === 'restrict'))
58370                       .classed('only', (klass === 'only'));
58371
58372
58373               // Hovering empty surface
58374               } else {
58375                   highlightPathsFrom(null);
58376                   if (_fromWayID) {
58377                       help
58378                           .append('div')      // "FROM {fromName}"
58379                           .html(t('restriction.help.from_name', {
58380                               from: placeholders.from,
58381                               fromName: displayName(_fromWayID, vgraph)
58382                           }));
58383
58384                   } else {
58385                       help
58386                           .append('div')      // "Click to select a FROM segment."
58387                           .html(t('restriction.help.select_from', {
58388                               from: placeholders.from
58389                           }));
58390                   }
58391               }
58392           }
58393       }
58394
58395
58396       function displayMaxDistance(maxDist) {
58397           var isImperial = (utilDetect().locale.toLowerCase() === 'en-us');
58398           var opts;
58399
58400           if (isImperial) {
58401               var distToFeet = {   // imprecise conversion for prettier display
58402                   20: 70, 25: 85, 30: 100, 35: 115, 40: 130, 45: 145, 50: 160
58403               }[maxDist];
58404               opts = { distance: t('units.feet', { quantity: distToFeet }) };
58405           } else {
58406               opts = { distance: t('units.meters', { quantity: maxDist }) };
58407           }
58408
58409           return t('restriction.controls.distance_up_to', opts);
58410       }
58411
58412
58413       function displayMaxVia(maxVia) {
58414           return maxVia === 0 ? t('restriction.controls.via_node_only')
58415               : maxVia === 1 ? t('restriction.controls.via_up_to_one')
58416               : t('restriction.controls.via_up_to_two');
58417       }
58418
58419
58420       function displayName(entityID, graph) {
58421           var entity = graph.entity(entityID);
58422           var name = utilDisplayName(entity) || '';
58423           var matched = context.presets().match(entity, graph);
58424           var type = (matched && matched.name()) || utilDisplayType(entity.id);
58425           return name || type;
58426       }
58427
58428
58429       restrictions.entity = function(_) {
58430           _intersection = null;
58431           _fromWayID = null;
58432           _oldTurns = null;
58433           _vertexID = _.id;
58434       };
58435
58436
58437       restrictions.tags = function() {};
58438       restrictions.focus = function() {};
58439
58440
58441       restrictions.off = function(selection$$1) {
58442           if (!_initialized) return;
58443
58444           selection$$1.selectAll('.surface')
58445               .call(breathe.off)
58446               .on('click.restrictions', null)
58447               .on('mouseover.restrictions', null);
58448
58449           select(window)
58450               .on('resize.restrictions', null);
58451       };
58452
58453
58454       return utilRebind(restrictions, dispatch$$1, 'on');
58455   }
58456
58457   function uiFieldTextarea(field) {
58458       var dispatch$$1 = dispatch('change');
58459       var input = select(null);
58460
58461
58462       function textarea(selection$$1) {
58463           var wrap = selection$$1.selectAll('.form-field-input-wrap')
58464               .data([0]);
58465
58466           wrap = wrap.enter()
58467               .append('div')
58468               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
58469               .merge(wrap);
58470
58471           input = wrap.selectAll('textarea')
58472               .data([0]);
58473
58474           input = input.enter()
58475               .append('textarea')
58476               .attr('id', 'preset-input-' + field.safeid)
58477               .attr('placeholder', field.placeholder() || t('inspector.unknown'))
58478               .attr('maxlength', 255)
58479               .call(utilNoAuto)
58480               .on('input', change(true))
58481               .on('blur', change())
58482               .on('change', change())
58483               .merge(input);
58484       }
58485
58486
58487       function change(onInput) {
58488           return function() {
58489               var t$$1 = {};
58490               t$$1[field.key] = utilGetSetValue(input) || undefined;
58491               dispatch$$1.call('change', this, t$$1, onInput);
58492           };
58493       }
58494
58495
58496       textarea.tags = function(tags) {
58497           utilGetSetValue(input, tags[field.key] || '');
58498       };
58499
58500
58501       textarea.focus = function() {
58502           input.node().focus();
58503       };
58504
58505
58506       return utilRebind(textarea, dispatch$$1, 'on');
58507   }
58508
58509   function uiFieldWikidata(field) {
58510       var wikidata = services.wikidata;
58511       var dispatch$$1 = dispatch('change');
58512       var link = select(null);
58513       var title = select(null);
58514       var _wikiURL = '';
58515
58516
58517       function wiki(selection$$1) {
58518
58519           var wrap = selection$$1.selectAll('.form-field-input-wrap')
58520               .data([0]);
58521
58522           wrap = wrap.enter()
58523               .append('div')
58524               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
58525               .merge(wrap);
58526
58527
58528           var list = wrap.selectAll('ul')
58529               .data([0]);
58530
58531           list = list.enter()
58532               .append('ul')
58533               .attr('class', 'labeled-inputs')
58534               .merge(list);
58535
58536           var wikidataProperties = ['identifier', 'label', 'description'];
58537
58538           var items = list.selectAll('li')
58539               .data(wikidataProperties);
58540
58541           // Enter
58542           var enter = items.enter()
58543               .append('li')
58544               .attr('class', function(d) { return 'preset-wikidata-' + d; });
58545
58546           enter
58547               .append('span')
58548               .attr('class', 'label')
58549               .attr('for', function(d) { return 'preset-input-wikidata-' + d; })
58550               .text(function(d) { return t('wikidata.' + d); });
58551
58552           var inputWrap = enter
58553               .append('div')
58554               .attr('class', 'input-wrap');
58555
58556           inputWrap
58557               .append('input')
58558               .attr('type', 'text')
58559               .attr('class', 'preset-input-wikidata')
58560               .attr('id', function(d) { return 'preset-input-wikidata-' + d; });
58561
58562
58563           title = wrap.select('.preset-wikidata-identifier input')
58564               .call(utilNoAuto)
58565               .merge(title);
58566
58567           title
58568               .on('blur', blur)
58569               .on('change', change);
58570
58571           var idItem = wrap.select('.preset-wikidata-identifier');
58572
58573           idItem.select('button')
58574               .remove();
58575
58576           link = idItem
58577               .append('button')
58578               .attr('class', 'form-field-button wiki-link')
58579               .attr('title', t('icons.open_wikidata'))
58580               .attr('tabindex', -1)
58581               .call(svgIcon('#iD-icon-out-link'))
58582               .merge(link);
58583
58584           link
58585               .on('click', function() {
58586                   event.preventDefault();
58587                   if (_wikiURL) window.open(_wikiURL, '_blank');
58588               });
58589
58590           var readOnlyItems = wrap.selectAll('li:not(.preset-wikidata-identifier)');
58591
58592           readOnlyItems.select('input')
58593               .classed('disabled', 'true')
58594               .attr('readonly', 'true');
58595
58596           readOnlyItems.select('button')
58597               .remove();
58598
58599           readOnlyItems.append('button')
58600               .attr('class', 'form-field-button wiki-link')
58601               .attr('title', t('icons.copy'))
58602               .attr('tabindex', -1)
58603               .call(svgIcon('#iD-operation-copy'))
58604               .on('click', function() {
58605                   event.preventDefault();
58606                   select(this.parentNode)
58607                       .select('input')
58608                       .node()
58609                       .select();
58610                   document.execCommand('copy');
58611               });
58612       }
58613
58614
58615       function blur() {
58616           change();
58617       }
58618
58619
58620       function change() {
58621           var syncTags = {
58622               wikidata: utilGetSetValue(title)
58623           };
58624           dispatch$$1.call('change', this, syncTags);
58625       }
58626
58627
58628       wiki.tags = function(tags) {
58629           var value = tags[field.key] || '';
58630           var matches = value.match(/^Q[0-9]*$/);
58631
58632           utilGetSetValue(title, value);
58633
58634           // value in correct format
58635           if (matches) {
58636               _wikiURL = 'https://wikidata.org/wiki/' + value;
58637               wikidata.entityByQID(value, function(qid, entity) {
58638                   var label = '';
58639                   var description = '';
58640
58641                   if (entity.labels && Object.keys(entity.labels).length > 0) {
58642                       label = entity.labels[Object.keys(entity.labels)[0]].value;
58643                   }
58644                   if (entity.descriptions && Object.keys(entity.descriptions).length > 0) {
58645                       description = entity.descriptions[Object.keys(entity.descriptions)[0]].value;
58646                   }
58647
58648                   select('.preset-wikidata-label')
58649                       .style('display', function(){
58650                           return label.length > 0 ? 'flex' : 'none';
58651                       })
58652                       .select('input')
58653                       .attr('value', label);
58654
58655                   select('.preset-wikidata-description')
58656                       .style('display', function(){
58657                           return description.length > 0 ? 'flex' : 'none';
58658                       })
58659                       .select('input')
58660                       .attr('value', description);
58661               });
58662
58663           // unrecognized value format
58664           } else {
58665               select('.preset-wikidata-label').style('display', 'none');
58666               select('.preset-wikidata-description').style('display', 'none');
58667               if (value && value !== '') {
58668                   _wikiURL = 'https://wikidata.org/wiki/Special:Search?search=' + value;
58669               } else {
58670                   _wikiURL = '';
58671               }
58672           }
58673       };
58674
58675
58676       wiki.focus = function() {
58677           title.node().focus();
58678       };
58679
58680
58681       return utilRebind(wiki, dispatch$$1, 'on');
58682   }
58683
58684   function uiFieldWikipedia(field, context) {
58685       var dispatch$$1 = dispatch('change');
58686       var wikipedia = services.wikipedia;
58687       var wikidata = services.wikidata;
58688       var lang = select(null);
58689       var title = select(null);
58690       var _wikiURL = '';
58691       var _entity;
58692
58693       var langCombo = uiCombobox(context, 'wikipedia-lang')
58694           .fetcher(function(value, cb) {
58695               var v = value.toLowerCase();
58696
58697               cb(wikipedia$2.filter(function(d) {
58698                   return d[0].toLowerCase().indexOf(v) >= 0 ||
58699                       d[1].toLowerCase().indexOf(v) >= 0 ||
58700                       d[2].toLowerCase().indexOf(v) >= 0;
58701               }).map(function(d) {
58702                   return { value: d[1] };
58703               }));
58704           });
58705
58706       var titleCombo = uiCombobox(context, 'wikipedia-title')
58707           .fetcher(function(value, cb) {
58708               if (!value && _entity) {
58709                   value = context.entity(_entity.id).tags.name || '';
58710               }
58711
58712               var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
58713               searchfn(language()[2], value, function(query, data$$1) {
58714                   cb(data$$1.map(function(d) {
58715                       return { value: d };
58716                   }));
58717               });
58718           });
58719
58720
58721       function wiki(selection$$1) {
58722           var wrap = selection$$1.selectAll('.form-field-input-wrap')
58723               .data([0]);
58724
58725           wrap = wrap.enter()
58726               .append('div')
58727               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
58728               .merge(wrap);
58729
58730
58731           var langRow = wrap.selectAll('.wiki-lang-container')
58732               .data([0]);
58733
58734           langRow = langRow.enter()
58735               .append('div')
58736               .attr('class', 'wiki-lang-container')
58737               .merge(langRow);
58738
58739
58740           lang = langRow.selectAll('input.wiki-lang')
58741               .data([0]);
58742
58743           lang = lang.enter()
58744               .append('input')
58745               .attr('type', 'text')
58746               .attr('class', 'wiki-lang')
58747               .attr('placeholder', t('translate.localized_translation_language'))
58748               .call(utilNoAuto)
58749               .call(langCombo)
58750               .merge(lang);
58751
58752           utilGetSetValue(lang, language()[1]);
58753
58754           lang
58755               .on('blur', changeLang)
58756               .on('change', changeLang);
58757
58758
58759           var titleRow = wrap.selectAll('.wiki-title-container')
58760               .data([0]);
58761
58762           titleRow = titleRow.enter()
58763               .append('div')
58764               .attr('class', 'wiki-title-container')
58765               .merge(titleRow);
58766
58767           title = titleRow.selectAll('input.wiki-title')
58768               .data([0]);
58769
58770           title = title.enter()
58771               .append('input')
58772               .attr('type', 'text')
58773               .attr('class', 'wiki-title')
58774               .attr('id', 'preset-input-' + field.safeid)
58775               .call(utilNoAuto)
58776               .call(titleCombo)
58777               .merge(title);
58778
58779           title
58780               .on('blur', blur)
58781               .on('change', change);
58782
58783
58784           var link = titleRow.selectAll('.wiki-link')
58785               .data([0]);
58786
58787           link = link.enter()
58788               .append('button')
58789               .attr('class', 'form-field-button wiki-link')
58790               .attr('tabindex', -1)
58791               .call(svgIcon('#iD-icon-out-link'))
58792               .merge(link);
58793
58794           link
58795               .on('click', function() {
58796                   event.preventDefault();
58797                   if (_wikiURL) window.open(_wikiURL, '_blank');
58798               });
58799       }
58800
58801
58802       function language() {
58803           var value = utilGetSetValue(lang).toLowerCase();
58804           var locale = utilDetect().locale.toLowerCase();
58805           var localeLanguage;
58806           return find$1(wikipedia$2, function(d) {
58807               if (d[2] === locale) localeLanguage = d;
58808               return d[0].toLowerCase() === value ||
58809                   d[1].toLowerCase() === value ||
58810                   d[2] === value;
58811           }) || localeLanguage || ['English', 'English', 'en'];
58812       }
58813
58814
58815       function changeLang() {
58816           utilGetSetValue(lang, language()[1]);
58817           change(true);
58818       }
58819
58820
58821       function blur() {
58822           change(true);
58823       }
58824
58825
58826       function change(skipWikidata) {
58827           var value = utilGetSetValue(title);
58828           var m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/);
58829           var l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; });
58830           var syncTags = {};
58831
58832           if (l) {
58833               // Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization
58834               value = decodeURIComponent(m[2]).replace(/_/g, ' ');
58835               if (m[3]) {
58836                   var anchor;
58837                   try {
58838                       // Best-effort `anchordecode:` implementation
58839                       anchor = decodeURIComponent(m[3].replace(/\.([0-9A-F]{2})/g, '%$1'));
58840                   } catch (e) {
58841                       anchor = decodeURIComponent(m[3]);
58842                   }
58843                   value += '#' + anchor.replace(/_/g, ' ');
58844               }
58845               value = value.slice(0, 1).toUpperCase() + value.slice(1);
58846               utilGetSetValue(lang, l[1]);
58847               utilGetSetValue(title, value);
58848           }
58849
58850           if (value) {
58851               syncTags.wikipedia = language()[2] + ':' + value;
58852           } else {
58853               syncTags.wikipedia = undefined;
58854               syncTags.wikidata = undefined;
58855           }
58856
58857           dispatch$$1.call('change', this, syncTags);
58858
58859
58860           if (skipWikidata || !value || !language()[2]) return;
58861
58862           // attempt asynchronous update of wikidata tag..
58863           var initGraph = context.graph();
58864           var initEntityID = _entity.id;
58865
58866           wikidata.itemsByTitle(language()[2], value, function(title, data$$1) {
58867               // If graph has changed, we can't apply this update.
58868               if (context.graph() !== initGraph) return;
58869
58870               if (!data$$1 || !Object.keys(data$$1).length) return;
58871
58872               var qids = Object.keys(data$$1);
58873               var value = qids && find$1(qids, function(id) { return id.match(/^Q\d+$/); });
58874               var currTags = clone(context.entity(initEntityID).tags);
58875
58876               currTags.wikidata = value;
58877
58878               // Coalesce the update of wikidata tag into the previous tag change
58879               context.overwrite(
58880                   actionChangeTags(initEntityID, currTags),
58881                   context.history().undoAnnotation()
58882               );
58883
58884               // do not dispatch.call('change') here, because entity_editor
58885               // changeTags() is not intended to be called asynchronously
58886           });
58887       }
58888
58889
58890       wiki.tags = function(tags) {
58891           var value = tags[field.key] || '';
58892           var m = value.match(/([^:]+):([^#]+)(?:#(.+))?/);
58893           var l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; });
58894           var anchor = m && m[3];
58895
58896           // value in correct format
58897           if (l) {
58898               utilGetSetValue(lang, l[1]);
58899               utilGetSetValue(title, m[2] + (anchor ? ('#' + anchor) : ''));
58900               if (anchor) {
58901                   try {
58902                       // Best-effort `anchorencode:` implementation
58903                       anchor = encodeURIComponent(anchor.replace(/ /g, '_')).replace(/%/g, '.');
58904                   } catch (e) {
58905                       anchor = anchor.replace(/ /g, '_');
58906                   }
58907               }
58908               _wikiURL = 'https://' + m[1] + '.wikipedia.org/wiki/' +
58909                   m[2].replace(/ /g, '_') + (anchor ? ('#' + anchor) : '');
58910
58911           // unrecognized value format
58912           } else {
58913               utilGetSetValue(title, value);
58914               if (value && value !== '') {
58915                   utilGetSetValue(lang, '');
58916                   _wikiURL = 'https://en.wikipedia.org/wiki/Special:Search?search=' + value;
58917               } else {
58918                   _wikiURL = '';
58919               }
58920           }
58921       };
58922
58923
58924       wiki.entity = function(val) {
58925           if (!arguments.length) return _entity;
58926           _entity = val;
58927           return wiki;
58928       };
58929
58930
58931       wiki.focus = function() {
58932           title.node().focus();
58933       };
58934
58935
58936       return utilRebind(wiki, dispatch$$1, 'on');
58937   }
58938
58939   var uiFields = {
58940       access: uiFieldAccess,
58941       address: uiFieldAddress,
58942       check: uiFieldCheck,
58943       combo: uiFieldCombo,
58944       cycleway: uiFieldCycleway,
58945       defaultCheck: uiFieldCheck,
58946       email: uiFieldText,
58947       lanes: uiFieldLanes,
58948       localized: uiFieldLocalized,
58949       maxspeed: uiFieldMaxspeed,
58950       multiCombo: uiFieldCombo,
58951       networkCombo: uiFieldCombo,
58952       number: uiFieldText,
58953       onewayCheck: uiFieldCheck,
58954       radio: uiFieldRadio,
58955       restrictions: uiFieldRestrictions,
58956       semiCombo: uiFieldCombo,
58957       structureRadio: uiFieldRadio,
58958       tel: uiFieldText,
58959       text: uiFieldText,
58960       textarea: uiFieldTextarea,
58961       typeCombo: uiFieldCombo,
58962       url: uiFieldText,
58963       wikidata: uiFieldWikidata,
58964       wikipedia: uiFieldWikipedia
58965   };
58966
58967   function uiTagReference(tag) {
58968       var wikibase = services.osmWikibase;
58969       var tagReference = {};
58970
58971       var _button = select(null);
58972       var _body = select(null);
58973       var _loaded;
58974       var _showing;
58975
58976       /**
58977        * @returns {{itemTitle: String, description: String, image: String|null}|null}
58978        **/
58979       function findLocal(data) {
58980           var entity = data.tag || data.key;
58981           if (!entity) return null;
58982
58983           var result = {
58984               title: entity.title,
58985               description: entity.description,
58986           };
58987
58988           if (entity.claims) {
58989               var langCode = utilDetect().locale.toLowerCase();
58990               var url;
58991               var image = wikibase.claimToValue(entity, 'P4', langCode);
58992               if (image) {
58993                   url = 'https://commons.wikimedia.org/w/index.php';
58994               } else {
58995                   image = wikibase.claimToValue(entity, 'P28', langCode);
58996                   if (image) {
58997                       url = 'https://wiki.openstreetmap.org/w/index.php';
58998                   }
58999               }
59000               if (image) {
59001                   result.image = {
59002                       url: url,
59003                       title: 'Special:Redirect/file/' + image
59004                   };
59005               }
59006           }
59007
59008           // Helper method to get wiki info if a given language exists
59009           function getWikiInfo(wiki, langCode, msg) {
59010               if (wiki && wiki[langCode]) {
59011                   return {title: wiki[langCode], text: t(msg)};
59012               }
59013           }
59014
59015           // Try to get a wiki page from tag data item first, followed by the corresponding key data item.
59016           // If neither tag nor key data item contain a wiki page in the needed language nor English,
59017           // get the first found wiki page from either the tag or the key item.
59018           var tagWiki = wikibase.monolingualClaimToValueObj(data.tag, 'P31');
59019           var keyWiki = wikibase.monolingualClaimToValueObj(data.key, 'P31');
59020
59021           // If exact language code does not exist, try to find the first part before the '-'
59022           // BUG: in some cases, a more elaborate fallback logic might be needed
59023           var langPrefix = langCode.split('-', 2)[0];
59024
59025           result.wiki =
59026             getWikiInfo(tagWiki, langCode, 'inspector.wiki_reference') ||
59027             getWikiInfo(tagWiki, langPrefix, 'inspector.wiki_reference') ||
59028             getWikiInfo(tagWiki, 'en', 'inspector.wiki_en_reference') ||
59029             getWikiInfo(keyWiki, langCode, 'inspector.wiki_reference') ||
59030             getWikiInfo(keyWiki, langPrefix, 'inspector.wiki_reference') ||
59031             getWikiInfo(keyWiki, 'en', 'inspector.wiki_en_reference');
59032
59033           return result;
59034       }
59035
59036
59037       function load(param) {
59038           if (!wikibase) return;
59039
59040           _button
59041               .classed('tag-reference-loading', true);
59042
59043           wikibase.getEntity(param, function show(err, data) {
59044               var docs;
59045               if (!err && data) {
59046                   docs = findLocal(data);
59047               }
59048
59049               _body.html('');
59050
59051               if (!docs || !docs.title) {
59052                   _body
59053                       .append('p')
59054                       .attr('class', 'tag-reference-description')
59055                       .text(t('inspector.no_documentation_key'));
59056                   done();
59057                   return;
59058               }
59059
59060               if (docs.image) {
59061                   var imageUrl = docs.image.url + '?' + utilQsString({
59062                       title: docs.image.title,
59063                       width: 100,
59064                       height: 100,
59065                   });
59066
59067                   _body
59068                       .append('img')
59069                       .attr('class', 'tag-reference-wiki-image')
59070                       .attr('src', imageUrl)
59071                       .on('load', function() { done(); })
59072                       .on('error', function() { select(this).remove(); done(); });
59073               } else {
59074                   done();
59075               }
59076
59077               _body
59078                   .append('p')
59079                   .attr('class', 'tag-reference-description')
59080                   .text(docs.description || t('inspector.no_documentation_key'));
59081
59082               _body
59083                   .append('a')
59084                   .attr('class', 'tag-reference-link')
59085                   .attr('target', '_blank')
59086                   .attr('tabindex', -1)
59087                   .attr('href', 'https://wiki.openstreetmap.org/wiki/' + docs.title)
59088                   .call(svgIcon('#iD-icon-out-link', 'inline'))
59089                   .append('span')
59090                   .text(t('inspector.edit_reference'));
59091
59092               if (docs.wiki) {
59093                   _body
59094                     .append('a')
59095                     .attr('class', 'tag-reference-link')
59096                     .attr('target', '_blank')
59097                     .attr('tabindex', -1)
59098                     .attr('href', 'https://wiki.openstreetmap.org/wiki/' + docs.wiki.title)
59099                     .call(svgIcon('#iD-icon-out-link', 'inline'))
59100                     .append('span')
59101                     .text(docs.wiki.text);
59102               }
59103
59104               // Add link to info about "good changeset comments" - #2923
59105               if (param.key === 'comment') {
59106                   _body
59107                       .append('a')
59108                       .attr('class', 'tag-reference-comment-link')
59109                       .attr('target', '_blank')
59110                       .attr('tabindex', -1)
59111                       .call(svgIcon('#iD-icon-out-link', 'inline'))
59112                       .attr('href', t('commit.about_changeset_comments_link'))
59113                       .append('span')
59114                       .text(t('commit.about_changeset_comments'));
59115               }
59116           });
59117       }
59118
59119
59120       function done() {
59121           _loaded = true;
59122
59123           _button
59124               .classed('tag-reference-loading', false);
59125
59126           _body
59127               .classed('expanded', true)
59128               .transition()
59129               .duration(200)
59130               .style('max-height', '200px')
59131               .style('opacity', '1');
59132
59133           _showing = true;
59134       }
59135
59136
59137       function hide() {
59138           _body
59139               .transition()
59140               .duration(200)
59141               .style('max-height', '0px')
59142               .style('opacity', '0')
59143               .on('end', function () {
59144                   _body.classed('expanded', false);
59145               });
59146
59147           _showing = false;
59148       }
59149
59150
59151       tagReference.button = function(selection$$1) {
59152           _button = selection$$1.selectAll('.tag-reference-button')
59153               .data([0]);
59154
59155           _button = _button.enter()
59156               .append('button')
59157               .attr('class', 'tag-reference-button')
59158               .attr('title', t('icons.information'))
59159               .attr('tabindex', -1)
59160               .call(svgIcon('#iD-icon-inspect'))
59161               .merge(_button);
59162
59163           _button
59164               .on('click', function () {
59165                   event.stopPropagation();
59166                   event.preventDefault();
59167                   if (_showing) {
59168                       hide();
59169                   } else if (_loaded) {
59170                       done();
59171                   } else {
59172                       tag.langCode = utilDetect().locale.toLowerCase();
59173                       load(tag);
59174                   }
59175               });
59176       };
59177
59178
59179       tagReference.body = function(selection$$1) {
59180           var tagid = tag.rtype || (tag.key + '-' + tag.value);
59181           _body = selection$$1.selectAll('.tag-reference-body')
59182               .data([tagid], function(d) { return d; });
59183
59184           _body.exit()
59185               .remove();
59186
59187           _body = _body.enter()
59188               .append('div')
59189               .attr('class', 'tag-reference-body')
59190               .style('max-height', '0')
59191               .style('opacity', '0')
59192               .merge(_body);
59193
59194           if (_showing === false) {
59195               hide();
59196           }
59197       };
59198
59199
59200       tagReference.showing = function(_) {
59201           if (!arguments.length) return _showing;
59202           _showing = _;
59203           return tagReference;
59204       };
59205
59206
59207       return tagReference;
59208   }
59209
59210   function uiField(context, presetField, entity, options) {
59211       options = assignIn({
59212           show: true,
59213           wrap: true,
59214           remove: true,
59215           revert: true,
59216           info: true
59217       }, options);
59218
59219       var dispatch$$1 = dispatch('change');
59220       var field = clone(presetField);
59221       var _show = options.show;
59222       var _state = '';
59223       var _tags = {};
59224
59225       field.keys = field.keys || [field.key];
59226
59227       // only create the fields that are actually being shown
59228       if (_show && !field.impl) {
59229           createField();
59230       }
59231
59232       // Creates the field.. This is done lazily,
59233       // once we know that the field will be shown.
59234       function createField() {
59235           field.impl = uiFields[field.type](field, context)
59236               .on('change', function(t$$1, onInput) {
59237                   dispatch$$1.call('change', field, t$$1, onInput);
59238               });
59239
59240           if (entity) {
59241               field.entityID = entity.id;
59242               // if this field cares about the entity, pass it along
59243               if (field.impl.entity) {
59244                   field.impl.entity(entity);
59245               }
59246           }
59247       }
59248
59249
59250       function isModified() {
59251           if (!entity) return false;
59252           var original = context.graph().base().entities[entity.id];
59253           return some(field.keys, function(key) {
59254               return original ? _tags[key] !== original.tags[key] : _tags[key];
59255           });
59256       }
59257
59258
59259       function isPresent() {
59260           return some(field.keys, function(key) {
59261               if (field.type === 'multiCombo') {
59262                   for (var tagKey in _tags) {
59263                       if (tagKey.indexOf(key) === 0) {
59264                           return true;
59265                       }
59266                   }
59267                   return false;
59268               }
59269               return _tags[key] !== undefined;
59270           });
59271       }
59272
59273
59274       function revert(d) {
59275           event.stopPropagation();
59276           event.preventDefault();
59277           if (!entity) return false;
59278
59279           var original = context.graph().base().entities[entity.id];
59280           var t$$1 = {};
59281           d.keys.forEach(function(key) {
59282               t$$1[key] = original ? original.tags[key] : undefined;
59283           });
59284
59285           dispatch$$1.call('change', d, t$$1);
59286       }
59287
59288
59289       function remove(d) {
59290           event.stopPropagation();
59291           event.preventDefault();
59292
59293           var t$$1 = {};
59294           d.keys.forEach(function(key) {
59295               t$$1[key] = undefined;
59296           });
59297
59298           dispatch$$1.call('change', d, t$$1);
59299       }
59300
59301
59302       field.render = function(selection$$1) {
59303           var container = selection$$1.selectAll('.form-field')
59304               .data([field]);
59305
59306           // Enter
59307           var enter = container.enter()
59308               .append('div')
59309               .attr('class', function(d) { return 'form-field form-field-' + d.safeid; })
59310               .classed('nowrap', !options.wrap);
59311
59312           if (options.wrap) {
59313               var label = enter
59314                   .append('label')
59315                   .attr('class', 'form-field-label')
59316                   .attr('for', function(d) { return 'preset-input-' + d.safeid; });
59317
59318               label
59319                   .append('span')
59320                   .attr('class', 'label-text')
59321                   .text(function(d) { return d.label(); });
59322
59323               if (options.remove) {
59324                   label
59325                       .append('button')
59326                       .attr('class', 'remove-icon')
59327                       .attr('title', t('icons.remove'))
59328                       .attr('tabindex', -1)
59329                       .call(svgIcon('#iD-operation-delete'));
59330               }
59331
59332               if (options.revert) {
59333                   label
59334                       .append('button')
59335                       .attr('class', 'modified-icon')
59336                       .attr('title', t('icons.undo'))
59337                       .attr('tabindex', -1)
59338                       .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-redo' : '#iD-icon-undo'));
59339               }
59340           }
59341
59342
59343           // Update
59344           container = container
59345               .merge(enter);
59346
59347           container.select('.form-field-label > .remove-icon')  // propagate bound data
59348               .on('click', remove);
59349
59350           container.select('.form-field-label > .modified-icon')  // propagate bound data
59351               .on('click', revert);
59352
59353           container
59354               .classed('modified', isModified())
59355               .classed('present', isPresent())
59356               .each(function(d) {
59357                   if (!d.impl) {
59358                       createField();
59359                   }
59360
59361                   var reference, help;
59362
59363                   // instantiate field help
59364                   if (options.wrap && field.type === 'restrictions') {
59365                       help = uiFieldHelp(context, 'restrictions');
59366                   }
59367
59368                   // instantiate tag reference
59369                   if (options.wrap && options.info) {
59370                       var referenceKey = d.key;
59371                       if (d.type === 'multiCombo') {   // lookup key without the trailing ':'
59372                           referenceKey = referenceKey.replace(/:$/, '');
59373                       }
59374
59375                       reference = uiTagReference(d.reference || { key: referenceKey }, context);
59376                       if (_state === 'hover') {
59377                           reference.showing(false);
59378                       }
59379                   }
59380
59381                   select(this)
59382                       .call(d.impl);
59383
59384                   // add field help components
59385                   if (help) {
59386                       select(this)
59387                           .call(help.body)
59388                           .select('.form-field-label')
59389                           .call(help.button);
59390                   }
59391
59392                   // add tag reference components
59393                   if (reference) {
59394                       select(this)
59395                           .call(reference.body)
59396                           .select('.form-field-label')
59397                           .call(reference.button);
59398                   }
59399
59400                   d.impl.tags(_tags);
59401               });
59402       };
59403
59404
59405       field.state = function(val) {
59406           if (!arguments.length) return _state;
59407           _state = val;
59408           return field;
59409       };
59410
59411
59412       field.tags = function(val) {
59413           if (!arguments.length) return _tags;
59414           _tags = val;
59415           return field;
59416       };
59417
59418
59419       field.show = function() {
59420           _show = true;
59421           if (!field.impl) {
59422               createField();
59423           }
59424           if (field.default && field.key && _tags[field.key] !== field.default) {
59425               var t$$1 = {};
59426               t$$1[field.key] = field.default;
59427               dispatch$$1.call('change', this, t$$1);
59428           }
59429       };
59430
59431
59432       // A shown field has a visible UI, a non-shown field is in the 'Add field' dropdown
59433       field.isShown = function() {
59434           return _show || isPresent();
59435       };
59436
59437
59438       // An allowed field can appear in the UI or in the 'Add field' dropdown.
59439       // A non-allowed field is hidden from the user altogether
59440       field.isAllowed = function() {
59441           if (!entity || isPresent()) return true;   // a field with a value should always display
59442
59443           var latest = context.hasEntity(entity.id);   // check the most current copy of the entity
59444           if (!latest) return true;
59445
59446           var require = field.prerequisiteTag;
59447           if (require && require.key) {
59448               var value = latest.tags[require.key];
59449               if (!value) return false;
59450
59451               if (require.valueNot) {
59452                   return require.valueNot !== value;
59453               }
59454               if (require.value) {
59455                   return require.value === value;
59456               }
59457               return true;
59458           }
59459           return true;
59460       };
59461
59462
59463       field.focus = function() {
59464           if (field.impl) {
59465               field.impl.focus();
59466           }
59467       };
59468
59469
59470       return utilRebind(field, dispatch$$1, 'on');
59471   }
59472
59473   function uiFormFields$$1(context) {
59474       var moreCombo = uiCombobox(context, 'more-fields').minItems(1);
59475       var _fieldsArr = [];
59476       var _state = '';
59477       var _klass = '';
59478
59479
59480       function formFields(selection$$1) {
59481           var allowedFields = _fieldsArr.filter(function(field) { return field.isAllowed(); });
59482           var shown = allowedFields.filter(function(field) { return field.isShown(); });
59483           var notShown = allowedFields.filter(function(field) { return !field.isShown(); });
59484
59485           var container = selection$$1.selectAll('.form-fields-container')
59486               .data([0]);
59487
59488           container = container.enter()
59489               .append('div')
59490               .attr('class', 'form-fields-container ' + (_klass || ''))
59491               .merge(container);
59492
59493
59494           var fields = container.selectAll('.wrap-form-field')
59495               .data(shown, function(d) { return d.id + (d.entityID || ''); });
59496
59497           fields.exit()
59498               .remove();
59499
59500           // Enter
59501           var enter = fields.enter()
59502               .append('div')
59503               .attr('class', function(d) { return 'wrap-form-field wrap-form-field-' + d.safeid; });
59504
59505           // Update
59506           fields = fields
59507               .merge(enter);
59508
59509           fields
59510               .order()
59511               .each(function(d) {
59512                   select(this)
59513                       .call(d.render);
59514               });
59515
59516
59517           notShown = notShown.map(function(field) {
59518               return {
59519                   title: field.label(),
59520                   value: field.label(),
59521                   field: field
59522               };
59523           });
59524
59525
59526           var more = selection$$1.selectAll('.more-fields')
59527               .data((_state === 'hover' || notShown.length === 0) ? [] : [0]);
59528
59529           more.exit()
59530               .remove();
59531
59532           more = more.enter()
59533               .append('div')
59534               .attr('class', 'more-fields')
59535               .append('label')
59536               .text(t('inspector.add_fields'))
59537               .merge(more);
59538
59539
59540           var input = more.selectAll('.value')
59541               .data([0]);
59542
59543           input.exit()
59544               .remove();
59545
59546           input = input.enter()
59547               .append('input')
59548               .attr('class', 'value')
59549               .attr('type', 'text')
59550               .call(utilNoAuto)
59551               .merge(input);
59552
59553           input
59554               .call(utilGetSetValue, '')
59555               .attr('placeholder', function() {
59556                   var placeholder = [];
59557                   for (var field in notShown) {
59558                       placeholder.push(notShown[field].title);
59559                   }
59560                   return placeholder.slice(0,3).join(', ') + ((placeholder.length > 3) ? '…' : '');
59561               })
59562               .call(moreCombo
59563                   .data(notShown)
59564                   .on('accept', function (d) {
59565                       if (!d) return;  // user entered something that was not matched
59566                       var field = d.field;
59567                       field.show();
59568                       selection$$1.call(formFields);  // rerender
59569                       if (field.type !== 'semiCombo' && field.type !== 'multiCombo') {
59570                           field.focus();
59571                       }
59572                   })
59573               );
59574       }
59575
59576
59577       formFields.fieldsArr = function(val) {
59578           if (!arguments.length) return _fieldsArr;
59579           _fieldsArr = val || [];
59580           return formFields;
59581       };
59582
59583       formFields.state = function(val) {
59584           if (!arguments.length) return _state;
59585           _state = val;
59586           return formFields;
59587       };
59588
59589       formFields.klass = function(val) {
59590           if (!arguments.length) return _klass;
59591           _klass = val;
59592           return formFields;
59593       };
59594
59595
59596       return formFields;
59597   }
59598
59599   function uiPresetEditor(context) {
59600       var dispatch$$1 = dispatch('change');
59601       var formFields = uiFormFields$$1(context);
59602       var _state;
59603       var _fieldsArr;
59604       var _preset;
59605       var _tags;
59606       var _entityID;
59607
59608
59609       function presetEditor(selection$$1) {
59610           selection$$1.call(uiDisclosure(context, 'preset_fields', true)
59611               .title(t('inspector.all_fields'))
59612               .content(render)
59613           );
59614       }
59615
59616
59617       function render(selection$$1) {
59618           if (!_fieldsArr) {
59619               var entity = context.entity(_entityID);
59620               var geometry = context.geometry(_entityID);
59621               var presets = context.presets();
59622
59623               _fieldsArr = [];
59624
59625               _preset.fields.forEach(function(field) {
59626                   if (field.matchGeometry(geometry)) {
59627                       _fieldsArr.push(
59628                           uiField(context, field, entity)
59629                       );
59630                   }
59631               });
59632
59633               if (entity.isHighwayIntersection(context.graph()) && presets.field('restrictions')) {
59634                   _fieldsArr.push(
59635                       uiField(context, presets.field('restrictions'), entity)
59636                   );
59637               }
59638
59639               var additionalFields = union(_preset.moreFields, presets.universal());
59640               additionalFields.sort(function(field1, field2) {
59641                   return field1.label() > field2.label();
59642               });
59643
59644               additionalFields.forEach(function(field) {
59645                   if (_preset.fields.indexOf(field) === -1) {
59646                       _fieldsArr.push(
59647                           uiField(context, field, entity, { show: false })
59648                       );
59649                   }
59650               });
59651
59652               _fieldsArr.forEach(function(field) {
59653                   field
59654                       .on('change', function(t$$1, onInput) {
59655                           dispatch$$1.call('change', field, t$$1, onInput);
59656                       });
59657               });
59658           }
59659
59660           _fieldsArr.forEach(function(field) {
59661               field
59662                   .state(_state)
59663                   .tags(_tags);
59664           });
59665
59666
59667           selection$$1
59668               .call(formFields
59669                   .fieldsArr(_fieldsArr)
59670                   .state(_state)
59671                   .klass('inspector-inner fillL3')
59672               );
59673
59674
59675           selection$$1.selectAll('.wrap-form-field input')
59676               .on('keydown', function() {
59677                   // if user presses enter, and combobox is not active, accept edits..
59678                   if (event.keyCode === 13 && select('.combobox').empty()) {
59679                       context.enter(modeBrowse(context));
59680                   }
59681               });
59682       }
59683
59684
59685       presetEditor.preset = function(val) {
59686           if (!arguments.length) return _preset;
59687           if (_preset && _preset.id === val.id) return presetEditor;
59688           _preset = val;
59689           _fieldsArr = null;
59690           return presetEditor;
59691       };
59692
59693
59694       presetEditor.state = function(val) {
59695           if (!arguments.length) return _state;
59696           _state = val;
59697           return presetEditor;
59698       };
59699
59700
59701       presetEditor.tags = function(val) {
59702           if (!arguments.length) return _tags;
59703           _tags = val;
59704           // Don't reset _fieldsArr here.
59705           return presetEditor;
59706       };
59707
59708
59709       presetEditor.entityID = function(val) {
59710           if (!arguments.length) return _entityID;
59711           if (_entityID === val) return presetEditor;
59712           _entityID = val;
59713           _fieldsArr = null;
59714           return presetEditor;
59715       };
59716
59717
59718       return utilRebind(presetEditor, dispatch$$1, 'on');
59719   }
59720
59721   function uiPresetIcon() {
59722       var preset, geometry;
59723
59724
59725       function presetIcon(selection$$1) {
59726           selection$$1.each(render);
59727       }
59728
59729
59730       function getIcon(p, geom) {
59731           if (p.icon)
59732               return p.icon;
59733           else if (geom === 'line')
59734               return 'iD-other-line';
59735           else if (geom === 'vertex')
59736               return p.isFallback() ? '' : 'temaki-vertex';
59737           else
59738               return 'maki-marker-stroked';
59739       }
59740
59741
59742       function render() {
59743           var selection$$1 = select(this);
59744           var p = preset.apply(this, arguments);
59745           var geom = geometry.apply(this, arguments);
59746           var picon = getIcon(p, geom);
59747           var isMaki = /^maki-/.test(picon);
59748           var isTemaki = /^temaki-/.test(picon);
59749           var isFa = /^fa[srb]-/.test(picon);
59750           var isPOI = isMaki || isTemaki || isFa;
59751           var isFramed = (geom === 'area' || geom === 'vertex');
59752
59753           var tagClasses = '';
59754           for (var k in p.tags) {
59755               var v = p.tags[k];
59756               tagClasses += ' tag-' + k;
59757               if (v !== '*') {
59758                   tagClasses += ' tag-' + k + '-' + v;
59759               }
59760           }
59761
59762           // if the preset includes a `building_area` field, class it as a building
59763           if (p.fields && p.fields.filter(function(d) { return d.id === 'building_area'; }).length) {
59764               tagClasses += ' tag-building';
59765           }
59766
59767
59768           var fill = selection$$1.selectAll('.preset-icon-fill')
59769               .data([0]);
59770
59771           fill = fill.enter()
59772               .append('div')
59773               .merge(fill);
59774
59775           fill
59776               .attr('class', function() {
59777                   return 'preset-icon-fill preset-icon-fill-' + geom + tagClasses;
59778               });
59779
59780
59781           var areaFrame = selection$$1.selectAll('.preset-icon-frame')
59782               .data((geom === 'area') ? [0] : []);
59783
59784           areaFrame.exit()
59785               .remove();
59786
59787           areaFrame = areaFrame.enter()
59788               .append('div')
59789               .attr('class', 'preset-icon-frame')
59790               .call(svgIcon('#iD-preset-icon-frame'));
59791
59792
59793           var icon = selection$$1.selectAll('.preset-icon')
59794               .data([0]);
59795
59796           icon = icon.enter()
59797               .append('div')
59798               .attr('class', 'preset-icon')
59799               .call(svgIcon(''))
59800               .merge(icon);
59801
59802           icon
59803               .attr('class', 'preset-icon preset-icon-' +
59804                   (isPOI ? (isFramed ? '24' : '28') : (isFramed ? '44' : '60'))
59805               );
59806
59807           icon.selectAll('svg')
59808               .attr('class', function() {
59809                   return 'icon ' + picon + (isPOI ? '' : tagClasses);
59810               });
59811
59812           icon.selectAll('use')
59813               .attr('href', '#' + picon + (isMaki ? '-15' : ''));
59814       }
59815
59816
59817       presetIcon.preset = function(val) {
59818           if (!arguments.length) return preset;
59819           preset = utilFunctor(val);
59820           return presetIcon;
59821       };
59822
59823
59824       presetIcon.geometry = function(val) {
59825           if (!arguments.length) return geometry;
59826           geometry = utilFunctor(val);
59827           return presetIcon;
59828       };
59829
59830       return presetIcon;
59831   }
59832
59833   function uiQuickLinks() {
59834       var _choices = [];
59835
59836
59837       function quickLinks(selection$$1) {
59838           var container = selection$$1.selectAll('.quick-links')
59839               .data([0]);
59840
59841           container = container.enter()
59842               .append('div')
59843               .attr('class', 'quick-links')
59844               .merge(container);
59845
59846           var items = container.selectAll('.quick-link')
59847               .data(_choices, function(d) { return d.id; });
59848
59849           items.exit()
59850               .remove();
59851
59852           items.enter()
59853               .append('a')
59854               .attr('class', function(d) { return 'quick-link quick-link-' + d.id; })
59855               .attr('href', '#')
59856               .text(function(d) { return t(d.label); })
59857               .each(function(d) {
59858                   if (typeof d.tooltip !== 'function') return;
59859                   select(this)
59860                       .call(tooltip().html(true).title(d.tooltip).placement('bottom'));
59861               })
59862               .on('click', function(d) {
59863                   if (typeof d.click !== 'function') return;
59864                   event.preventDefault();
59865                   d.click(d);
59866               });
59867       }
59868
59869
59870       //  val should be an array of choices like:
59871       //    [{
59872       //       id: 'link-id',
59873       //       label: 'translation.key',
59874       //       tooltip: function(d),
59875       //       click: function(d)
59876       //    }, ..]
59877       quickLinks.choices = function(val) {
59878           if (!arguments.length) return _choices;
59879           _choices = val;
59880           return quickLinks;
59881       };
59882
59883
59884       return quickLinks;
59885   }
59886
59887   function uiRawMemberEditor$$1(context) {
59888       var taginfo = services.taginfo;
59889       var _entityID;
59890
59891       function downloadMember(d) {
59892           event.preventDefault();
59893
59894           // display the loading indicator
59895           select(this.parentNode).classed('tag-reference-loading', true);
59896           context.loadEntity(d.id);
59897       }
59898
59899       function zoomToMember(d) {
59900           event.preventDefault();
59901
59902           var entity = context.entity(d.id);
59903           context.map().zoomTo(entity);
59904
59905           // highlight the feature in case it wasn't previously on-screen
59906           utilHighlightEntity(d.id, true, context);
59907       }
59908
59909
59910       function selectMember(d) {
59911           event.preventDefault();
59912
59913           // remove the hover-highlight styling
59914           utilHighlightEntity(d.id, false, context);
59915
59916           var entity = context.entity(d.id);
59917           var mapExtent = context.map().extent();
59918           if (!entity.intersects(mapExtent, context.graph())) {
59919               // zoom to the entity if its extent is not visible now
59920               context.map().zoomToEase(entity);
59921           }
59922
59923           context.enter(modeSelect(context, [d.id]));
59924       }
59925
59926
59927       function changeRole(d) {
59928           var oldRole = d.role;
59929           var newRole = select(this).property('value');
59930
59931           if (oldRole !== newRole) {
59932               var member = { id: d.id, type: d.type, role: newRole };
59933               context.perform(
59934                   actionChangeMember(d.relation.id, member, d.index),
59935                   t('operations.change_role.annotation')
59936               );
59937           }
59938       }
59939
59940
59941       function deleteMember(d) {
59942           context.perform(
59943               actionDeleteMember(d.relation.id, d.index),
59944               t('operations.delete_member.annotation')
59945           );
59946
59947           if (!context.hasEntity(d.relation.id)) {
59948               context.enter(modeBrowse(context));
59949           }
59950
59951           utilHighlightEntity(d.id, false, context);
59952       }
59953
59954
59955       function rawMemberEditor(selection$$1) {
59956           var entity = context.entity(_entityID);
59957           var memberships = [];
59958
59959           entity.members.slice(0, 1000).forEach(function(member, index) {
59960               memberships.push({
59961                   index: index,
59962                   id: member.id,
59963                   type: member.type,
59964                   role: member.role,
59965                   relation: entity,
59966                   member: context.hasEntity(member.id)
59967               });
59968           });
59969
59970           var gt = entity.members.length > 1000 ? '>' : '';
59971           selection$$1.call(uiDisclosure(context, 'raw_member_editor', true)
59972               .title(t('inspector.all_members') + ' (' + gt + memberships.length + ')')
59973               .expanded(true)
59974               .updatePreference(false)
59975               .on('toggled', function(expanded) {
59976                   if (expanded) {
59977                       selection$$1.node().parentNode.scrollTop += 200;
59978                   }
59979               })
59980               .content(content)
59981           );
59982
59983
59984           function content(selection$$1) {
59985               var list = selection$$1.selectAll('.member-list')
59986                   .data([0]);
59987
59988               list = list.enter()
59989                   .append('ul')
59990                   .attr('class', 'member-list')
59991                   .merge(list);
59992
59993
59994               var items = list.selectAll('li')
59995                   .data(memberships, function(d) {
59996                       return osmEntity$$1.key(d.relation) + ',' + d.index + ',' +
59997                           (d.member ? osmEntity$$1.key(d.member) : 'incomplete');
59998                   });
59999
60000               items.exit()
60001                   .each(unbind)
60002                   .remove();
60003
60004               var itemsEnter = items.enter()
60005                   .append('li')
60006                   .attr('class', 'member-row form-field')
60007                   .classed('member-incomplete', function(d) { return !d.member; });
60008
60009               itemsEnter
60010                   .each(function(d) {
60011                       var item = select(this);
60012
60013                       var label = item
60014                           .append('label')
60015                           .attr('class', 'form-field-label');
60016
60017                       if (d.member) {
60018                           // highlight the member feature in the map while hovering on the list item
60019                           item
60020                               .on('mouseover', function() {
60021                                   utilHighlightEntity(d.id, true, context);
60022                               })
60023                               .on('mouseout', function() {
60024                                   utilHighlightEntity(d.id, false, context);
60025                               });
60026
60027                           var labelLink = label
60028                               .append('span')
60029                               .attr('class', 'label-text')
60030                               .append('a')
60031                               .attr('href', '#')
60032                               .on('click', selectMember);
60033
60034                           labelLink
60035                               .append('span')
60036                               .attr('class', 'member-entity-type')
60037                               .text(function(d) {
60038                                   var matched = context.presets().match(d.member, context.graph());
60039                                   return (matched && matched.name()) || utilDisplayType(d.member.id);
60040                               });
60041
60042                           labelLink
60043                               .append('span')
60044                               .attr('class', 'member-entity-name')
60045                               .text(function(d) { return utilDisplayName(d.member); });
60046
60047                           label
60048                               .append('button')
60049                               .attr('class', 'member-zoom')
60050                               .attr('title', t('icons.zoom_to'))
60051                               .attr('tabindex', -1)
60052                               .call(svgIcon('#iD-icon-geolocate'))
60053                               .on('click', zoomToMember);
60054
60055                       } else {
60056                           var labelText = label
60057                               .append('span')
60058                               .attr('class', 'label-text');
60059
60060                           labelText
60061                               .append('span')
60062                               .attr('class', 'member-entity-type')
60063                               .text(t('inspector.' + d.type, { id: d.id }));
60064
60065                           labelText
60066                               .append('span')
60067                               .attr('class', 'member-entity-name')
60068                               .text(t('inspector.incomplete', { id: d.id }));
60069
60070                           label
60071                               .append('button')
60072                               .attr('class', 'member-download')
60073                               .attr('title', t('icons.download'))
60074                               .attr('tabindex', -1)
60075                               .call(svgIcon('#iD-icon-load'))
60076                               .on('click', downloadMember);
60077                       }
60078                   });
60079
60080               var wrapEnter = itemsEnter
60081                   .append('div')
60082                   .attr('class', 'form-field-input-wrap form-field-input-member');
60083
60084               wrapEnter
60085                   .append('input')
60086                   .attr('class', 'member-role')
60087                   .property('type', 'text')
60088                   .attr('maxlength', 255)
60089                   .attr('placeholder', t('inspector.role'))
60090                   .call(utilNoAuto);
60091
60092               wrapEnter
60093                   .append('button')
60094                   .attr('tabindex', -1)
60095                   .attr('title', t('icons.remove'))
60096                   .attr('class', 'remove form-field-button member-delete')
60097                   .call(svgIcon('#iD-operation-delete'));
60098
60099               if (taginfo) {
60100                   wrapEnter.each(bindTypeahead);
60101               }
60102
60103
60104               // update
60105               items = items
60106                   .merge(itemsEnter);
60107
60108               items.select('input.member-role')
60109                   .property('value', function(d) { return d.role; })
60110                   .on('blur', changeRole)
60111                   .on('change', changeRole);
60112
60113               items.select('button.member-delete')
60114                   .on('click', deleteMember);
60115
60116
60117
60118               function bindTypeahead(d) {
60119                   var row = select(this);
60120                   var role = row.selectAll('input.member-role');
60121                   var origValue = role.property('value');
60122
60123                   function sort(value, data) {
60124                       var sameletter = [];
60125                       var other = [];
60126                       for (var i = 0; i < data.length; i++) {
60127                           if (data[i].value.substring(0, value.length) === value) {
60128                               sameletter.push(data[i]);
60129                           } else {
60130                               other.push(data[i]);
60131                           }
60132                       }
60133                       return sameletter.concat(other);
60134                   }
60135
60136                   role.call(uiCombobox(context, 'member-role')
60137                       .fetcher(function(role, callback) {
60138                           // The `geometry` param is used in the `taginfo.js` interface for
60139                           // filtering results, as a key into the `tag_members_fractions`
60140                           // object.  If we don't know the geometry because the member is
60141                           // not yet downloaded, it's ok to guess based on type.
60142                           var geometry;
60143                           if (d.member) {
60144                               geometry = context.geometry(d.member.id);
60145                           } else if (d.type === 'relation') {
60146                               geometry = 'relation';
60147                           } else if (d.type === 'way') {
60148                               geometry = 'line';
60149                           } else {
60150                               geometry = 'point';
60151                           }
60152
60153                           var rtype = entity.tags.type;
60154                           taginfo.roles({
60155                               debounce: true,
60156                               rtype: rtype || '',
60157                               geometry: geometry,
60158                               query: role
60159                           }, function(err, data) {
60160                               if (!err) callback(sort(role, data));
60161                           });
60162                       })
60163                       .on('cancel', function() {
60164                           role.property('value', origValue);
60165                       })
60166                   );
60167               }
60168
60169
60170               function unbind() {
60171                   var row = select(this);
60172
60173                   row.selectAll('input.member-role')
60174                       .call(uiCombobox.off);
60175               }
60176           }
60177       }
60178
60179
60180       rawMemberEditor.entityID = function(val) {
60181           if (!arguments.length) return _entityID;
60182           _entityID = val;
60183           return rawMemberEditor;
60184       };
60185
60186
60187       return rawMemberEditor;
60188   }
60189
60190   function uiRawMembershipEditor$$1(context) {
60191       var taginfo = services.taginfo;
60192       var nearbyCombo = uiCombobox(context, 'parent-relation')
60193           .minItems(1)
60194           .fetcher(fetchNearbyRelations);
60195       var _inChange = false;
60196       var _entityID;
60197       var _showBlank;
60198
60199
60200       function selectRelation(d) {
60201           event.preventDefault();
60202
60203           // remove the hover-highlight styling
60204           utilHighlightEntity(d.relation.id, false, context);
60205
60206           context.enter(modeSelect(context, [d.relation.id]));
60207       }
60208
60209
60210       function changeRole(d) {
60211           if (d === 0) return;    // called on newrow (shoudn't happen)
60212           if (_inChange) return;  // avoid accidental recursive call #5731
60213
60214           var oldRole = d.member.role;
60215           var newRole = select(this).property('value');
60216
60217           if (oldRole !== newRole) {
60218               _inChange = true;
60219               context.perform(
60220                   actionChangeMember(d.relation.id, assignIn({}, d.member, { role: newRole }), d.index),
60221                   t('operations.change_role.annotation')
60222               );
60223           }
60224           _inChange = false;
60225       }
60226
60227
60228       function addMembership(d, role) {
60229           this.blur();           // avoid keeping focus on the button
60230           _showBlank = false;
60231
60232           var member = { id: _entityID, type: context.entity(_entityID).type, role: role };
60233
60234           if (d.relation) {
60235               context.perform(
60236                   actionAddMember(d.relation.id, member),
60237                   t('operations.add_member.annotation')
60238               );
60239
60240           } else {
60241               var relation = osmRelation();
60242               context.perform(
60243                   actionAddEntity(relation),
60244                   actionAddMember(relation.id, member),
60245                   t('operations.add.annotation.relation')
60246               );
60247
60248               context.enter(modeSelect(context, [relation.id]).newFeature(true));
60249           }
60250       }
60251
60252
60253       function deleteMembership(d) {
60254           this.blur();           // avoid keeping focus on the button
60255           if (d === 0) return;   // called on newrow (shoudn't happen)
60256
60257           context.perform(
60258               actionDeleteMember(d.relation.id, d.index),
60259               t('operations.delete_member.annotation')
60260           );
60261       }
60262
60263
60264       function fetchNearbyRelations(q, callback) {
60265           var newRelation = { relation: null, value: t('inspector.new_relation') };
60266           var result = [];
60267           var graph = context.graph();
60268
60269           context.intersects(context.extent()).forEach(function(entity) {
60270               if (entity.type !== 'relation' || entity.id === _entityID) return;
60271
60272               var matched = context.presets().match(entity, graph);
60273               var presetName = (matched && matched.name()) || t('inspector.relation');
60274               var entityName = utilDisplayName(entity) || '';
60275
60276               var value = presetName + ' ' + entityName;
60277               if (q && value.toLowerCase().indexOf(q.toLowerCase()) === -1) return;
60278
60279               result.push({ relation: entity, value: value });
60280           });
60281
60282           result.sort(function(a, b) {
60283               return osmRelation.creationOrder(a.relation, b.relation);
60284           });
60285
60286           // Dedupe identical names by appending relation id - see #2891
60287           var dupeGroups = filter(
60288               groupBy(result, 'value'),
60289               function(v) { return v.length > 1; }
60290           );
60291
60292           dupeGroups.forEach(function(group) {
60293               group.forEach(function(obj) {
60294                   obj.value += ' ' + obj.relation.id;
60295               });
60296           });
60297
60298           result.forEach(function(obj) {
60299               obj.title = obj.value;
60300           });
60301
60302           result.unshift(newRelation);
60303           callback(result);
60304       }
60305
60306
60307       function rawMembershipEditor(selection$$1) {
60308           var entity = context.entity(_entityID);
60309           var parents = context.graph().parentRelations(entity);
60310           var memberships = [];
60311
60312           parents.slice(0, 1000).forEach(function(relation) {
60313               relation.members.forEach(function(member, index) {
60314                   if (member.id === entity.id) {
60315                       memberships.push({ relation: relation, member: member, index: index });
60316                   }
60317               });
60318           });
60319
60320           var gt = parents.length > 1000 ? '>' : '';
60321           selection$$1.call(uiDisclosure(context, 'raw_membership_editor', true)
60322               .title(t('inspector.all_relations') + ' (' + gt + memberships.length + ')')
60323               .expanded(true)
60324               .updatePreference(false)
60325               .on('toggled', function(expanded) {
60326                   if (expanded) { selection$$1.node().parentNode.scrollTop += 200; }
60327               })
60328               .content(content)
60329           );
60330
60331
60332           function content(selection$$1) {
60333               var list = selection$$1.selectAll('.member-list')
60334                   .data([0]);
60335
60336               list = list.enter()
60337                   .append('ul')
60338                   .attr('class', 'member-list')
60339                   .merge(list);
60340
60341
60342               var items = list.selectAll('li.member-row-normal')
60343                   .data(memberships, function(d) {
60344                       return osmEntity$$1.key(d.relation) + ',' + d.index;
60345                   });
60346
60347               items.exit()
60348                   .each(unbind)
60349                   .remove();
60350
60351               // Enter
60352               var itemsEnter = items.enter()
60353                   .append('li')
60354                   .attr('class', 'member-row member-row-normal form-field');
60355
60356               itemsEnter.each(function(d){
60357                   // highlight the relation in the map while hovering on the list item
60358                   select(this)
60359                       .on('mouseover', function() {
60360                           utilHighlightEntity(d.relation.id, true, context);
60361                       })
60362                       .on('mouseout', function() {
60363                           utilHighlightEntity(d.relation.id, false, context);
60364                       });
60365               });
60366
60367               var labelEnter = itemsEnter
60368                   .append('label')
60369                   .attr('class', 'form-field-label')
60370                   .append('span')
60371                   .attr('class', 'label-text')
60372                   .append('a')
60373                   .attr('href', '#')
60374                   .on('click', selectRelation);
60375
60376               labelEnter
60377                   .append('span')
60378                   .attr('class', 'member-entity-type')
60379                   .text(function(d) {
60380                       var matched = context.presets().match(d.relation, context.graph());
60381                       return (matched && matched.name()) || t('inspector.relation');
60382                   });
60383
60384               labelEnter
60385                   .append('span')
60386                   .attr('class', 'member-entity-name')
60387                   .text(function(d) { return utilDisplayName(d.relation); });
60388
60389               var wrapEnter = itemsEnter
60390                   .append('div')
60391                   .attr('class', 'form-field-input-wrap form-field-input-member');
60392
60393               wrapEnter
60394                   .append('input')
60395                   .attr('class', 'member-role')
60396                   .property('type', 'text')
60397                   .attr('maxlength', 255)
60398                   .attr('placeholder', t('inspector.role'))
60399                   .call(utilNoAuto)
60400                   .property('value', function(d) { return d.member.role; })
60401                   .on('blur', changeRole)
60402                   .on('change', changeRole);
60403
60404               wrapEnter
60405                   .append('button')
60406                   .attr('tabindex', -1)
60407                   .attr('class', 'remove form-field-button member-delete')
60408                   .call(svgIcon('#iD-operation-delete'))
60409                   .on('click', deleteMembership);
60410
60411               if (taginfo) {
60412                   wrapEnter.each(bindTypeahead);
60413               }
60414
60415
60416               var newMembership = list.selectAll('.member-row-new')
60417                   .data(_showBlank ? [0] : []);
60418
60419               // Exit
60420               newMembership.exit()
60421                   .remove();
60422
60423               // Enter
60424               var newMembershipEnter = newMembership.enter()
60425                   .append('li')
60426                   .attr('class', 'member-row member-row-new form-field');
60427
60428               newMembershipEnter
60429                   .append('label')
60430                   .attr('class', 'form-field-label')
60431                   .append('input')
60432                   .attr('placeholder', t('inspector.choose_relation'))
60433                   .attr('type', 'text')
60434                   .attr('class', 'member-entity-input')
60435                   .call(utilNoAuto);
60436
60437               var newWrapEnter = newMembershipEnter
60438                   .append('div')
60439                   .attr('class', 'form-field-input-wrap form-field-input-member');
60440
60441               newWrapEnter
60442                   .append('input')
60443                   .attr('class', 'member-role')
60444                   .property('type', 'text')
60445                   .attr('maxlength', 255)
60446                   .attr('placeholder', t('inspector.role'))
60447                   .call(utilNoAuto);
60448
60449               newWrapEnter
60450                   .append('button')
60451                   .attr('tabindex', -1)
60452                   .attr('class', 'remove form-field-button member-delete')
60453                   .call(svgIcon('#iD-operation-delete'))
60454                   .on('click', function() {
60455                       list.selectAll('.member-row-new')
60456                           .remove();
60457                   });
60458
60459               // Update
60460               newMembership = newMembership
60461                   .merge(newMembershipEnter);
60462
60463               newMembership.selectAll('.member-entity-input')
60464                   .on('blur', cancelEntity)   // if it wasn't accepted normally, cancel it
60465                   .call(nearbyCombo
60466                       .on('accept', acceptEntity)
60467                       .on('cancel', cancelEntity)
60468                   );
60469
60470
60471               // Container for the Add button
60472               var addRow = selection$$1.selectAll('.add-row')
60473                   .data([0]);
60474
60475               // enter
60476               var addRowEnter = addRow.enter()
60477                   .append('div')
60478                   .attr('class', 'add-row');
60479
60480               addRowEnter
60481                   .append('button')
60482                   .attr('class', 'add-relation')
60483                   .call(svgIcon('#iD-icon-plus', 'light'));
60484
60485               addRowEnter
60486                   .append('div')
60487                   .attr('class', 'space-value');   // preserve space
60488
60489               addRowEnter
60490                   .append('div')
60491                   .attr('class', 'space-buttons');  // preserve space
60492
60493               // update
60494               addRow = addRow
60495                   .merge(addRowEnter);
60496
60497               addRow.select('.add-relation')
60498                   .on('click', function() {
60499                       _showBlank = true;
60500                       content(selection$$1);
60501                       list.selectAll('.member-entity-input').node().focus();
60502                   });
60503
60504
60505               function acceptEntity(d) {
60506                   if (!d) {
60507                       cancelEntity();
60508                       return;
60509                   }
60510                   var role = list.selectAll('.member-row-new .member-role').property('value');
60511                   addMembership(d, role);
60512               }
60513
60514
60515               function cancelEntity() {
60516                   var input = newMembership.selectAll('.member-entity-input');
60517                   input.property('value', '');
60518               }
60519
60520
60521               function bindTypeahead(d) {
60522                   var row = select(this);
60523                   var role = row.selectAll('input.member-role');
60524                   var origValue = role.property('value');
60525
60526                   function sort(value, data) {
60527                       var sameletter = [];
60528                       var other = [];
60529                       for (var i = 0; i < data.length; i++) {
60530                           if (data[i].value.substring(0, value.length) === value) {
60531                               sameletter.push(data[i]);
60532                           } else {
60533                               other.push(data[i]);
60534                           }
60535                       }
60536                       return sameletter.concat(other);
60537                   }
60538
60539                   role.call(uiCombobox(context, 'member-role')
60540                       .fetcher(function(role, callback) {
60541                           var rtype = d.relation.tags.type;
60542                           taginfo.roles({
60543                               debounce: true,
60544                               rtype: rtype || '',
60545                               geometry: context.geometry(_entityID),
60546                               query: role
60547                           }, function(err, data) {
60548                               if (!err) callback(sort(role, data));
60549                           });
60550                       })
60551                       .on('cancel', function() {
60552                           role.property('value', origValue);
60553                       })
60554                   );
60555               }
60556
60557
60558               function unbind() {
60559                   var row = select(this);
60560
60561                   row.selectAll('input.member-role')
60562                       .call(uiCombobox.off);
60563               }
60564           }
60565       }
60566
60567
60568       rawMembershipEditor.entityID = function(val) {
60569           if (!arguments.length) return _entityID;
60570           _entityID = val;
60571           _showBlank = false;
60572           return rawMembershipEditor;
60573       };
60574
60575
60576       return rawMembershipEditor;
60577   }
60578
60579   function uiEntityEditor(context) {
60580       var dispatch$$1 = dispatch('choose');
60581       var _state = 'select';
60582       var _coalesceChanges = false;
60583       var _modified = false;
60584       var _base;
60585       var _entityID;
60586       var _activePreset;
60587       var _tagReference;
60588
60589       var quickLinks = uiQuickLinks();
60590       var presetEditor = uiPresetEditor(context).on('change', changeTags);
60591       var rawTagEditor = uiRawTagEditor$$1(context).on('change', changeTags);
60592       var rawMemberEditor = uiRawMemberEditor$$1(context);
60593       var rawMembershipEditor = uiRawMembershipEditor$$1(context);
60594
60595       function entityEditor(selection$$1) {
60596           var entity = context.entity(_entityID);
60597           var tags = clone(entity.tags);
60598
60599           // Header
60600           var header = selection$$1.selectAll('.header')
60601               .data([0]);
60602
60603           // Enter
60604           var headerEnter = header.enter()
60605               .append('div')
60606               .attr('class', 'header fillL cf');
60607
60608           headerEnter
60609               .append('button')
60610               .attr('class', 'fl preset-reset preset-choose')
60611               .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-forward' : '#iD-icon-backward'));
60612
60613           headerEnter
60614               .append('button')
60615               .attr('class', 'fr preset-close')
60616               .on('click', function() { context.enter(modeBrowse(context)); })
60617               .call(svgIcon(_modified ? '#iD-icon-apply' : '#iD-icon-close'));
60618
60619           headerEnter
60620               .append('h3')
60621               .text(t('inspector.edit'));
60622
60623           // Update
60624           header = header
60625               .merge(headerEnter);
60626
60627           header.selectAll('.preset-reset')
60628               .on('click', function() {
60629                   dispatch$$1.call('choose', this, _activePreset);
60630               });
60631
60632
60633           // Body
60634           var body = selection$$1.selectAll('.inspector-body')
60635               .data([0]);
60636
60637           // Enter
60638           var bodyEnter = body.enter()
60639               .append('div')
60640               .attr('class', 'inspector-body');
60641
60642           bodyEnter
60643               .append('div')
60644               .attr('class', 'preset-list-item inspector-inner')
60645               .append('div')
60646               .attr('class', 'preset-list-button-wrap')
60647               .append('button')
60648               .attr('class', 'preset-list-button preset-reset')
60649               .call(tooltip().title(t('inspector.back_tooltip')).placement('bottom'))
60650               .append('div')
60651               .attr('class', 'label')
60652               .append('div')
60653               .attr('class', 'label-inner');
60654
60655           bodyEnter
60656               .append('div')
60657               .attr('class', 'preset-quick-links');
60658
60659           bodyEnter
60660               .append('div')
60661               .attr('class', 'preset-editor');
60662
60663           bodyEnter
60664               .append('div')
60665               .attr('class', 'raw-tag-editor inspector-inner');
60666
60667           bodyEnter
60668               .append('div')
60669               .attr('class', 'raw-member-editor inspector-inner');
60670
60671           bodyEnter
60672               .append('div')
60673               .attr('class', 'raw-membership-editor inspector-inner');
60674
60675           bodyEnter
60676               .append('input')
60677               .attr('type', 'text')
60678               .attr('class', 'key-trap');
60679
60680
60681           // Update
60682           body = body
60683               .merge(bodyEnter);
60684
60685           // update header
60686           if (_tagReference) {
60687               body.selectAll('.preset-list-button-wrap')
60688                   .call(_tagReference.button);
60689
60690               body.selectAll('.preset-list-item')
60691                   .call(_tagReference.body);
60692           }
60693
60694           body.selectAll('.preset-reset')
60695               .on('click', function() {
60696                   dispatch$$1.call('choose', this, _activePreset);
60697               });
60698
60699           body.select('.preset-list-item button')
60700               .call(uiPresetIcon()
60701                   .geometry(context.geometry(_entityID))
60702                   .preset(_activePreset)
60703               );
60704
60705           // NOTE: split on en-dash, not a hypen (to avoid conflict with hyphenated names)
60706           var label = body.select('.label-inner');
60707           var nameparts = label.selectAll('.namepart')
60708               .data(_activePreset.name().split(' – '), function(d) { return d; });
60709
60710           nameparts.exit()
60711               .remove();
60712
60713           nameparts
60714               .enter()
60715               .append('div')
60716               .attr('class', 'namepart')
60717               .text(function(d) { return d; });
60718
60719
60720           // update quick links
60721           var choices = [{
60722               id: 'zoom_to',
60723               label: 'inspector.zoom_to.title',
60724               tooltip: function() {
60725                   return uiTooltipHtml(t('inspector.zoom_to.tooltip_feature'), t('inspector.zoom_to.key'));
60726               },
60727               click: function zoomTo() {
60728                   context.mode().zoomToSelected();
60729               }
60730           }];
60731
60732           body.select('.preset-quick-links')
60733               .call(quickLinks.choices(choices));
60734
60735
60736           // update editor sections
60737           body.select('.preset-editor')
60738               .call(presetEditor
60739                   .preset(_activePreset)
60740                   .entityID(_entityID)
60741                   .tags(tags)
60742                   .state(_state)
60743               );
60744
60745           body.select('.raw-tag-editor')
60746               .call(rawTagEditor
60747                   .preset(_activePreset)
60748                   .entityID(_entityID)
60749                   .tags(tags)
60750                   .state(_state)
60751               );
60752
60753           if (entity.type === 'relation') {
60754               body.select('.raw-member-editor')
60755                   .style('display', 'block')
60756                   .call(rawMemberEditor
60757                       .entityID(_entityID)
60758                   );
60759           } else {
60760               body.select('.raw-member-editor')
60761                   .style('display', 'none');
60762           }
60763
60764           body.select('.raw-membership-editor')
60765               .call(rawMembershipEditor
60766                   .entityID(_entityID)
60767               );
60768
60769           body.select('.key-trap')
60770               .on('keydown.key-trap', function() {
60771                   // On tabbing, send focus back to the first field on the inspector-body
60772                   // (probably the `name` field) #4159
60773                   if (event.keyCode === 9 && !event.shiftKey) {
60774                       event.preventDefault();
60775                       body.select('input').node().focus();
60776                   }
60777               });
60778
60779           context.history()
60780               .on('change.entity-editor', historyChanged);
60781
60782
60783           function historyChanged() {
60784               if (_state === 'hide') return;
60785
60786               var entity = context.hasEntity(_entityID);
60787               var graph = context.graph();
60788               if (!entity) return;
60789
60790               var match = context.presets().match(entity, graph);
60791               var activePreset = entityEditor.preset();
60792               var weakPreset = activePreset && isEmpty(activePreset.addTags);
60793
60794               // A "weak" preset doesn't set any tags. (e.g. "Address")
60795               // Don't replace a weak preset with a fallback preset (e.g. "Point")
60796               if (!(weakPreset && match.isFallback())) {
60797                   entityEditor.preset(match);
60798               }
60799               entityEditor.modified(_base !== graph);
60800               entityEditor(selection$$1);
60801           }
60802       }
60803
60804
60805       // Tag changes that fire on input can all get coalesced into a single
60806       // history operation when the user leaves the field.  #2342
60807       function changeTags(changed, onInput) {
60808           var entity = context.entity(_entityID);
60809           var annotation = t('operations.change_tags.annotation');
60810           var tags = clone(entity.tags);
60811
60812           for (var k in changed) {
60813               if (!k) continue;
60814               var v = changed[k];
60815               if (v !== undefined || tags.hasOwnProperty(k)) {
60816                   tags[k] = v;
60817               }
60818           }
60819
60820           if (!onInput) {
60821               tags = utilCleanTags(tags);
60822           }
60823
60824           if (!isEqual(entity.tags, tags)) {
60825               if (_coalesceChanges) {
60826                   context.overwrite(actionChangeTags(_entityID, tags), annotation);
60827               } else {
60828                   context.perform(actionChangeTags(_entityID, tags), annotation);
60829                   _coalesceChanges = !!onInput;
60830               }
60831           }
60832       }
60833
60834
60835       entityEditor.modified = function(val) {
60836           if (!arguments.length) return _modified;
60837           _modified = val;
60838           d3_selectAll('button.preset-close use')
60839               .attr('xlink:href', (_modified ? '#iD-icon-apply' : '#iD-icon-close'));
60840           return entityEditor;
60841       };
60842
60843
60844       entityEditor.state = function(val) {
60845           if (!arguments.length) return _state;
60846           _state = val;
60847           return entityEditor;
60848       };
60849
60850
60851       entityEditor.entityID = function(val) {
60852           if (!arguments.length) return _entityID;
60853           _entityID = val;
60854           _base = context.graph();
60855           _coalesceChanges = false;
60856
60857           // reset the scroll to the top of the inspector
60858           var body = d3_selectAll('.entity-editor-pane .inspector-body');
60859           if (!body.empty()) {
60860               body.node().scrollTop = 0;
60861           }
60862
60863           var presetMatch = context.presets().match(context.entity(_entityID), _base);
60864
60865           return entityEditor
60866               .preset(presetMatch)
60867               .modified(false);
60868       };
60869
60870
60871       entityEditor.preset = function(val) {
60872           if (!arguments.length) return _activePreset;
60873           if (val !== _activePreset) {
60874               _activePreset = val;
60875               _tagReference = uiTagReference(_activePreset.reference(context.geometry(_entityID)), context)
60876                   .showing(false);
60877           }
60878           return entityEditor;
60879       };
60880
60881
60882       return utilRebind(entityEditor, dispatch$$1, 'on');
60883   }
60884
60885   var pair_1 = pair$1;
60886
60887   function search(x, dims, r) {
60888     if (!dims) dims = 'NSEW';
60889     if (typeof x !== 'string') return { val: null, regex: r };
60890
60891     r = r || /[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)°?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/gi;
60892
60893     var m = r.exec(x);
60894     if (!m) return { val: null, regex: r };
60895
60896     var dim = m[1] || m[5];
60897     if (dim && dims.indexOf(dim) === -1) return { val: null, regex: r };
60898
60899     return {
60900       val: (((m[2]) ? parseFloat(m[2]) : 0) +
60901             ((m[3] ? parseFloat(m[3]) / 60 : 0)) +
60902             ((m[4] ? parseFloat(m[4]) / 3600 : 0))) *
60903             ((dim === 'S' || dim === 'W') ? -1 : 1),
60904       regex: r,
60905       raw: m[0],
60906       dim: dim
60907     };
60908   }
60909
60910   function pair$1(x, dims) {
60911     x = x.trim();
60912     var one = search(x, dims);
60913     if (one.val === null) return null;
60914     var two = search(x, dims, one.regex);
60915     if (two.val === null) return null;
60916     // null if one/two are not contiguous.
60917     if (one.raw + two.raw !== x) return null;
60918     if (one.dim) {
60919       return swapdim(one.val, two.val, one.dim);
60920     } else {
60921       return [one.val, two.val];
60922     }
60923   }
60924
60925   function swapdim(a, b, dim) {
60926     if (dim === 'N' || dim === 'S') return [a, b];
60927     if (dim === 'W' || dim === 'E') return [b, a];
60928   }
60929
60930   /*
60931       iD.Difference represents the difference between two graphs.
60932       It knows how to calculate the set of entities that were
60933       created, modified, or deleted, and also contains the logic
60934       for recursively extending a difference to the complete set
60935       of entities that will require a redraw, taking into account
60936       child and parent relationships.
60937    */
60938   function coreDifference(base, head) {
60939       var _changes = {};
60940       var _diff = {};
60941       var _length = 0;
60942       var i, k, h, b, keys;
60943
60944       function changed(h, b) {
60945           if (h === b) return false;
60946           if (!h || !b) return true;
60947
60948           if (h.loc || b.loc) {
60949               if (!h.loc && b.loc || h.loc && !b.loc ||
60950                   h.loc[0] !== b.loc[0] || h.loc[1] !== b.loc[1]) return true;
60951           }
60952           if (h.nodes || b.nodes) {
60953               if (!isEqual(h.nodes, b.nodes)) return true;
60954           }
60955           if (h.members || b.members) {
60956               if (!isEqual(h.members, b.members)) return true;
60957           }
60958           return !isEqual(h.tags, b.tags);
60959       }
60960
60961
60962       keys = Object.keys(head.entities);
60963       for (i = 0; i < keys.length; i++) {
60964           k = keys[i];
60965           h = head.entities[k];
60966           b = base.entities[k];
60967           if (changed(h, b)) {
60968               _changes[k] = {base: b, head: h};
60969               _length++;
60970           }
60971       }
60972
60973       keys = Object.keys(base.entities);
60974       for (i = 0; i < keys.length; i++) {
60975           k = keys[i];
60976           h = head.entities[k];
60977           b = base.entities[k];
60978           if (!_changes[k] && changed(h, b)) {
60979               _changes[k] = {base: b, head: h};
60980               _length++;
60981           }
60982       }
60983
60984
60985       function addParents(parents, result) {
60986           for (var i = 0; i < parents.length; i++) {
60987               var parent = parents[i];
60988
60989               if (parent.id in result)
60990                   continue;
60991
60992               result[parent.id] = parent;
60993               addParents(head.parentRelations(parent), result);
60994           }
60995       }
60996
60997
60998       _diff.length = function length() {
60999           return _length;
61000       };
61001
61002
61003       _diff.changes = function changes() {
61004           return _changes;
61005       };
61006
61007
61008       _diff.extantIDs = function extantIDs() {
61009           var result = [];
61010           forEach(_changes, function(change, id) {
61011               if (change.head) result.push(id);
61012           });
61013           return result;
61014       };
61015
61016
61017       _diff.modified = function modified() {
61018           var result = [];
61019           forEach(_changes, function(change) {
61020               if (change.base && change.head) result.push(change.head);
61021           });
61022           return result;
61023       };
61024
61025
61026       _diff.created = function created() {
61027           var result = [];
61028           forEach(_changes, function(change) {
61029               if (!change.base && change.head) result.push(change.head);
61030           });
61031           return result;
61032       };
61033
61034
61035       _diff.deleted = function deleted() {
61036           var result = [];
61037           forEach(_changes, function(change) {
61038               if (change.base && !change.head) result.push(change.base);
61039           });
61040           return result;
61041       };
61042
61043
61044       _diff.summary = function summary() {
61045           var relevant = {};
61046
61047           function addEntity(entity, graph, changeType) {
61048               relevant[entity.id] = {
61049                   entity: entity,
61050                   graph: graph,
61051                   changeType: changeType
61052               };
61053           }
61054
61055           function addParents(entity) {
61056               var parents = head.parentWays(entity);
61057               for (var j = parents.length - 1; j >= 0; j--) {
61058                   var parent = parents[j];
61059                   if (!(parent.id in relevant)) addEntity(parent, head, 'modified');
61060               }
61061           }
61062
61063           var keys = Object.keys(_changes);
61064           for (var i = 0; i < keys.length; i++) {
61065               var change = _changes[keys[i]];
61066
61067               if (change.head && change.head.geometry(head) !== 'vertex') {
61068                   addEntity(change.head, head, change.base ? 'modified' : 'created');
61069
61070               } else if (change.base && change.base.geometry(base) !== 'vertex') {
61071                   addEntity(change.base, base, 'deleted');
61072
61073               } else if (change.base && change.head) { // modified vertex
61074                   var moved    = !isEqual(change.base.loc,  change.head.loc);
61075                   var retagged = !isEqual(change.base.tags, change.head.tags);
61076
61077                   if (moved) {
61078                       addParents(change.head);
61079                   }
61080
61081                   if (retagged || (moved && change.head.hasInterestingTags())) {
61082                       addEntity(change.head, head, 'modified');
61083                   }
61084
61085               } else if (change.head && change.head.hasInterestingTags()) { // created vertex
61086                   addEntity(change.head, head, 'created');
61087
61088               } else if (change.base && change.base.hasInterestingTags()) { // deleted vertex
61089                   addEntity(change.base, base, 'deleted');
61090               }
61091           }
61092
61093           return values$1(relevant);
61094       };
61095
61096
61097       _diff.complete = function complete(extent) {
61098           var result = {};
61099           var id, change;
61100
61101           for (id in _changes) {
61102               change = _changes[id];
61103
61104               var h = change.head;
61105               var b = change.base;
61106               var entity = h || b;
61107
61108               if (extent &&
61109                   (!h || !h.intersects(extent, head)) &&
61110                   (!b || !b.intersects(extent, base)))
61111                   continue;
61112
61113               result[id] = h;
61114
61115               if (entity.type === 'way') {
61116                   var nh = h ? h.nodes : [];
61117                   var nb = b ? b.nodes : [];
61118                   var diff, i;
61119
61120                   diff = difference(nh, nb);
61121                   for (i = 0; i < diff.length; i++) {
61122                       result[diff[i]] = head.hasEntity(diff[i]);
61123                   }
61124
61125                   diff = difference(nb, nh);
61126                   for (i = 0; i < diff.length; i++) {
61127                       result[diff[i]] = head.hasEntity(diff[i]);
61128                   }
61129               }
61130
61131               addParents(head.parentWays(entity), result);
61132               addParents(head.parentRelations(entity), result);
61133           }
61134
61135           return result;
61136       };
61137
61138
61139       return _diff;
61140   }
61141
61142   function coreTree(head) {
61143       var rtree = rbush_1(),
61144           bboxes = {},
61145           tree = {};
61146
61147
61148       function entityBBox(entity) {
61149           var bbox = entity.extent(head).bbox();
61150           bbox.id = entity.id;
61151           bboxes[entity.id] = bbox;
61152           return bbox;
61153       }
61154
61155
61156       function updateParents(entity, insertions, memo) {
61157           head.parentWays(entity).forEach(function(way) {
61158               if (bboxes[way.id]) {
61159                   rtree.remove(bboxes[way.id]);
61160                   insertions[way.id] = way;
61161               }
61162               updateParents(way, insertions, memo);
61163           });
61164
61165           head.parentRelations(entity).forEach(function(relation) {
61166               if (memo[entity.id]) return;
61167               memo[entity.id] = true;
61168               if (bboxes[relation.id]) {
61169                   rtree.remove(bboxes[relation.id]);
61170                   insertions[relation.id] = relation;
61171               }
61172               updateParents(relation, insertions, memo);
61173           });
61174       }
61175
61176
61177       tree.rebase = function(entities, force) {
61178           var insertions = {};
61179
61180           for (var i = 0; i < entities.length; i++) {
61181               var entity = entities[i];
61182
61183               if (!entity.visible)
61184                   continue;
61185
61186               if (head.entities.hasOwnProperty(entity.id) || bboxes[entity.id]) {
61187                   if (!force) {
61188                       continue;
61189                   } else if (bboxes[entity.id]) {
61190                       rtree.remove(bboxes[entity.id]);
61191                   }
61192               }
61193
61194               insertions[entity.id] = entity;
61195               updateParents(entity, insertions, {});
61196           }
61197
61198           rtree.load(map$3(insertions, entityBBox));
61199
61200           return tree;
61201       };
61202
61203
61204       tree.intersects = function(extent, graph) {
61205           if (graph !== head) {
61206               var diff = coreDifference(head, graph),
61207                   insertions = {};
61208
61209               head = graph;
61210
61211               diff.deleted().forEach(function(entity) {
61212                   rtree.remove(bboxes[entity.id]);
61213                   delete bboxes[entity.id];
61214               });
61215
61216               diff.modified().forEach(function(entity) {
61217                   rtree.remove(bboxes[entity.id]);
61218                   insertions[entity.id] = entity;
61219                   updateParents(entity, insertions, {});
61220               });
61221
61222               diff.created().forEach(function(entity) {
61223                   insertions[entity.id] = entity;
61224               });
61225
61226               rtree.load(map$3(insertions, entityBBox));
61227           }
61228
61229           return rtree.search(extent.bbox()).map(function(bbox) {
61230               return head.entity(bbox.id);
61231           });
61232       };
61233
61234
61235       return tree;
61236   }
61237
61238   function uiFeatureList(context) {
61239       var _geocodeResults;
61240
61241
61242       function featureList(selection$$1) {
61243           var header = selection$$1
61244               .append('div')
61245               .attr('class', 'header fillL cf');
61246
61247           header
61248               .append('h3')
61249               .text(t('inspector.feature_list'));
61250
61251           var searchWrap = selection$$1
61252               .append('div')
61253               .attr('class', 'search-header');
61254
61255           var search = searchWrap
61256               .append('input')
61257               .attr('placeholder', t('inspector.search'))
61258               .attr('type', 'search')
61259               .call(utilNoAuto)
61260               .on('keypress', keypress)
61261               .on('keydown', keydown)
61262               .on('input', inputevent);
61263
61264           searchWrap
61265               .call(svgIcon('#iD-icon-search', 'pre-text'));
61266
61267           var listWrap = selection$$1
61268               .append('div')
61269               .attr('class', 'inspector-body');
61270
61271           var list = listWrap
61272               .append('div')
61273               .attr('class', 'feature-list cf');
61274
61275           context
61276               .on('exit.feature-list', clearSearch);
61277           context.map()
61278               .on('drawn.feature-list', mapDrawn);
61279
61280           context.keybinding()
61281               .on(uiCmd('⌘F'), focusSearch);
61282
61283
61284           function focusSearch() {
61285               var mode = context.mode() && context.mode().id;
61286               if (mode !== 'browse') return;
61287
61288               event.preventDefault();
61289               search.node().focus();
61290           }
61291
61292
61293           function keydown() {
61294               if (event.keyCode === 27) {  // escape
61295                   search.node().blur();
61296               }
61297           }
61298
61299
61300           function keypress() {
61301               var q = search.property('value'),
61302                   items = list.selectAll('.feature-list-item');
61303               if (event.keyCode === 13 && q.length && items.size()) {  // return
61304                   click(items.datum());
61305               }
61306           }
61307
61308
61309           function inputevent() {
61310               _geocodeResults = undefined;
61311               drawList();
61312           }
61313
61314
61315           function clearSearch() {
61316               search.property('value', '');
61317               drawList();
61318           }
61319
61320
61321           function mapDrawn(e) {
61322               if (e.full) {
61323                   drawList();
61324               }
61325           }
61326
61327
61328           function features() {
61329               var entities = {};
61330               var result = [];
61331               var graph = context.graph();
61332               var q = search.property('value').toLowerCase();
61333
61334               if (!q) return result;
61335
61336               var idMatch = q.match(/^([nwr])([0-9]+)$/);
61337
61338               if (idMatch) {
61339                   result.push({
61340                       id: idMatch[0],
61341                       geometry: idMatch[1] === 'n' ? 'point' : idMatch[1] === 'w' ? 'line' : 'relation',
61342                       type: idMatch[1] === 'n' ? t('inspector.node') : idMatch[1] === 'w' ? t('inspector.way') : t('inspector.relation'),
61343                       name: idMatch[2]
61344                   });
61345               }
61346
61347               var locationMatch = pair_1(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/);
61348
61349               if (locationMatch) {
61350                   var loc = [parseFloat(locationMatch[0]), parseFloat(locationMatch[1])];
61351                   result.push({
61352                       id: -1,
61353                       geometry: 'point',
61354                       type: t('inspector.location'),
61355                       name: dmsCoordinatePair([loc[1], loc[0]]),
61356                       location: loc
61357                   });
61358               }
61359
61360               function addEntity(entity) {
61361                   if (entity.id in entities || result.length > 200)
61362                       return;
61363
61364                   entities[entity.id] = true;
61365
61366                   var name = utilDisplayName(entity) || '';
61367                   if (name.toLowerCase().indexOf(q) >= 0) {
61368                       var matched = context.presets().match(entity, graph);
61369                       var type = (matched && matched.name()) || utilDisplayType(entity.id);
61370
61371                       result.push({
61372                           id: entity.id,
61373                           entity: entity,
61374                           geometry: context.geometry(entity.id),
61375                           type: type,
61376                           name: name
61377                       });
61378                   }
61379
61380                   graph.parentRelations(entity).forEach(function(parent) {
61381                       addEntity(parent);
61382                   });
61383               }
61384
61385               var visible = context.surface().selectAll('.point, .line, .area').nodes();
61386               for (var i = 0; i < visible.length && result.length <= 200; i++) {
61387                   var datum = visible[i].__data__;
61388                   var entity = datum && datum.properties && datum.properties.entity;
61389                   if (entity) { addEntity(entity); }
61390               }
61391
61392               (_geocodeResults || []).forEach(function(d) {
61393                   if (d.osm_type && d.osm_id) {    // some results may be missing these - #1890
61394
61395                       // Make a temporary osmEntity so we can preset match
61396                       // and better localize the search result - #4725
61397                       var id = osmEntity$$1.id.fromOSM(d.osm_type, d.osm_id);
61398                       var tags = {};
61399                       tags[d.class] = d.type;
61400
61401                       var attrs = { id: id, type: d.osm_type, tags: tags };
61402                       if (d.osm_type === 'way') {   // for ways, add some fake closed nodes
61403                           attrs.nodes = ['a','a'];  // so that geometry area is possible
61404                       }
61405
61406                       var tempEntity = osmEntity$$1(attrs);
61407                       var tempGraph = coreGraph$$1([tempEntity]);
61408                       var matched = context.presets().match(tempEntity, tempGraph);
61409                       var type = (matched && matched.name()) || utilDisplayType(id);
61410
61411                       result.push({
61412                           id: tempEntity.id,
61413                           geometry: tempEntity.geometry(tempGraph),
61414                           type: type,
61415                           name: d.display_name,
61416                           extent: new geoExtent$$1(
61417                               [parseFloat(d.boundingbox[3]), parseFloat(d.boundingbox[0])],
61418                               [parseFloat(d.boundingbox[2]), parseFloat(d.boundingbox[1])])
61419                       });
61420                   }
61421               });
61422
61423               return result;
61424           }
61425
61426
61427           function drawList() {
61428               var value = search.property('value');
61429               var results = features();
61430
61431               list.classed('filtered', value.length);
61432
61433               var noResultsWorldwide = _geocodeResults && _geocodeResults.length === 0;
61434
61435               var resultsIndicator = list.selectAll('.no-results-item')
61436                   .data([0])
61437                   .enter()
61438                   .append('button')
61439                   .property('disabled', true)
61440                   .attr('class', 'no-results-item')
61441                   .call(svgIcon('#iD-icon-alert', 'pre-text'));
61442
61443               resultsIndicator.append('span')
61444                   .attr('class', 'entity-name');
61445
61446               list.selectAll('.no-results-item .entity-name')
61447                   .text(noResultsWorldwide ? t('geocoder.no_results_worldwide') : t('geocoder.no_results_visible'));
61448
61449               if (services.geocoder) {
61450                 list.selectAll('.geocode-item')
61451                     .data([0])
61452                     .enter()
61453                     .append('button')
61454                     .attr('class', 'geocode-item')
61455                     .on('click', geocoderSearch)
61456                     .append('div')
61457                     .attr('class', 'label')
61458                     .append('span')
61459                     .attr('class', 'entity-name')
61460                     .text(t('geocoder.search'));
61461               }
61462
61463               list.selectAll('.no-results-item')
61464                   .style('display', (value.length && !results.length) ? 'block' : 'none');
61465
61466               list.selectAll('.geocode-item')
61467                   .style('display', (value && _geocodeResults === undefined) ? 'block' : 'none');
61468
61469               list.selectAll('.feature-list-item')
61470                   .data([-1])
61471                   .remove();
61472
61473               var items = list.selectAll('.feature-list-item')
61474                   .data(results, function(d) { return d.id; });
61475
61476               var enter = items.enter()
61477                   .insert('button', '.geocode-item')
61478                   .attr('class', 'feature-list-item')
61479                   .on('mouseover', mouseover)
61480                   .on('mouseout', mouseout)
61481                   .on('click', click);
61482
61483               var label = enter
61484                   .append('div')
61485                   .attr('class', 'label');
61486
61487               label
61488                   .each(function(d) {
61489                       select(this)
61490                           .call(svgIcon('#iD-icon-' + d.geometry, 'pre-text'));
61491                   });
61492
61493               label
61494                   .append('span')
61495                   .attr('class', 'entity-type')
61496                   .text(function(d) { return d.type; });
61497
61498               label
61499                   .append('span')
61500                   .attr('class', 'entity-name')
61501                   .text(function(d) { return d.name; });
61502
61503               enter
61504                   .style('opacity', 0)
61505                   .transition()
61506                   .style('opacity', 1);
61507
61508               items.order();
61509
61510               items.exit()
61511                   .remove();
61512           }
61513
61514
61515           function mouseover(d) {
61516               if (d.id === -1) return;
61517
61518               context.surface().selectAll(utilEntityOrMemberSelector([d.id], context.graph()))
61519                   .classed('hover', true);
61520           }
61521
61522
61523           function mouseout() {
61524               context.surface().selectAll('.hover')
61525                   .classed('hover', false);
61526           }
61527
61528
61529           function click(d) {
61530               event.preventDefault();
61531               if (d.location) {
61532                   context.map().centerZoomEase([d.location[1], d.location[0]], 19);
61533               }
61534               else if (d.entity) {
61535                   if (d.entity.type === 'node') {
61536                       context.map().center(d.entity.loc);
61537                   } else if (d.entity.type === 'way') {
61538                       var center = context.projection(context.map().center());
61539                       var edge = geoChooseEdge(context.childNodes(d.entity), center, context.projection);
61540                       context.map().center(edge.loc);
61541                   }
61542                   context.enter(modeSelect(context, [d.entity.id]));
61543               } else {
61544                   context.zoomToEntity(d.id);
61545               }
61546           }
61547
61548
61549           function geocoderSearch() {
61550               services.geocoder.search(search.property('value'), function (err, resp) {
61551                   _geocodeResults = resp || [];
61552                   drawList();
61553               });
61554           }
61555       }
61556
61557
61558       return featureList;
61559   }
61560
61561   var _flashTimer;
61562
61563
61564   function uiFlash() {
61565       var _duration = 2000;
61566       var _iconName = '#iD-icon-no';
61567       var _iconClass = 'disabled';
61568       var _text = '';
61569       var _textClass;
61570
61571
61572       function flash() {
61573           if (_flashTimer) {
61574               _flashTimer.stop();
61575           }
61576
61577           select('#footer-wrap')
61578               .attr('class', 'footer-hide');
61579           select('#flash-wrap')
61580               .attr('class', 'footer-show');
61581
61582           var content = select('#flash-wrap').selectAll('.flash-content')
61583               .data([0]);
61584
61585           // Enter
61586           var contentEnter = content.enter()
61587               .append('div')
61588               .attr('class', 'flash-content');
61589
61590           var iconEnter = contentEnter
61591               .append('svg')
61592               .attr('class', 'flash-icon')
61593               .append('g')
61594               .attr('transform', 'translate(10,10)');
61595
61596           iconEnter
61597               .append('circle')
61598               .attr('r', 9);
61599
61600           iconEnter
61601               .append('use')
61602               .attr('transform', 'translate(-7,-7)')
61603               .attr('width', '14')
61604               .attr('height', '14');
61605
61606           contentEnter
61607               .append('div')
61608               .attr('class', 'flash-text');
61609
61610
61611           // Update
61612           content = content
61613               .merge(contentEnter);
61614
61615           content
61616               .selectAll('.flash-icon')
61617               .attr('class', 'flash-icon ' + (_iconClass || ''));
61618
61619           content
61620               .selectAll('.flash-icon use')
61621               .attr('xlink:href', _iconName);
61622
61623           content
61624               .selectAll('.flash-text')
61625               .attr('class', 'flash-text ' + (_textClass || ''))
61626               .text(_text);
61627
61628
61629           _flashTimer = timeout$1(function() {
61630               _flashTimer = null;
61631               select('#footer-wrap')
61632                   .attr('class', 'footer-show');
61633               select('#flash-wrap')
61634                   .attr('class', 'footer-hide');
61635           }, _duration);
61636
61637           return content;
61638       }
61639
61640
61641       flash.duration = function(_) {
61642           if (!arguments.length) return _duration;
61643           _duration = _;
61644           return flash;
61645       };
61646
61647       flash.text = function(_) {
61648           if (!arguments.length) return _text;
61649           _text = _;
61650           return flash;
61651       };
61652
61653       flash.textClass = function(_) {
61654           if (!arguments.length) return _textClass;
61655           _textClass = _;
61656           return flash;
61657       };
61658
61659       flash.iconName = function(_) {
61660           if (!arguments.length) return _iconName;
61661           _iconName = _;
61662           return flash;
61663       };
61664
61665       flash.iconClass = function(_) {
61666           if (!arguments.length) return _iconClass;
61667           _iconClass = _;
61668           return flash;
61669       };
61670
61671       return flash;
61672   }
61673
61674   function operationCircularize(selectedIDs, context) {
61675       var entityId = selectedIDs[0],
61676           entity = context.entity(entityId),
61677           extent = entity.extent(context.graph()),
61678           geometry = context.geometry(entityId),
61679           action = actionCircularize(entityId, context.projection);
61680
61681
61682       var operation = function() {
61683           context.perform(action, operation.annotation());
61684       };
61685
61686
61687       operation.available = function() {
61688           return selectedIDs.length === 1 &&
61689               entity.type === 'way' &&
61690               uniq(entity.nodes).length > 1;
61691       };
61692
61693
61694       operation.disabled = function() {
61695           var reason;
61696           if (extent.percentContainedIn(context.extent()) < 0.8) {
61697               reason = 'too_large';
61698           } else if (context.hasHiddenConnections(entityId)) {
61699               reason = 'connected_to_hidden';
61700           }
61701           return action.disabled(context.graph()) || reason;
61702       };
61703
61704
61705       operation.tooltip = function() {
61706           var disable = operation.disabled();
61707           return disable ?
61708               t('operations.circularize.' + disable) :
61709               t('operations.circularize.description.' + geometry);
61710       };
61711
61712
61713       operation.annotation = function() {
61714           return t('operations.circularize.annotation.' + geometry);
61715       };
61716
61717
61718       operation.id = 'circularize';
61719       operation.keys = [t('operations.circularize.key')];
61720       operation.title = t('operations.circularize.title');
61721       operation.behavior = behaviorOperation(context).which(operation);
61722
61723       return operation;
61724   }
61725
61726   function operationContinue(selectedIDs, context) {
61727       var graph = context.graph(),
61728           entities = selectedIDs.map(function(id) { return graph.entity(id); }),
61729           geometries = assignIn({ line: [], vertex: [] },
61730               groupBy(entities, function(entity) { return entity.geometry(graph); })),
61731           vertex = geometries.vertex[0];
61732
61733
61734       function candidateWays() {
61735           return graph.parentWays(vertex).filter(function(parent) {
61736               return parent.geometry(graph) === 'line' &&
61737                   !parent.isClosed() &&
61738                   parent.affix(vertex.id) &&
61739                   (geometries.line.length === 0 || geometries.line[0] === parent);
61740           });
61741       }
61742
61743
61744       var operation = function() {
61745           var candidate = candidateWays()[0];
61746           context.enter(
61747               modeDrawLine(context, candidate.id, context.graph(), candidate.affix(vertex.id), true)
61748           );
61749       };
61750
61751
61752       operation.available = function() {
61753           return geometries.vertex.length === 1 && geometries.line.length <= 1 &&
61754               !context.features().hasHiddenConnections(vertex, context.graph());
61755       };
61756
61757
61758       operation.disabled = function() {
61759           var candidates = candidateWays();
61760           if (candidates.length === 0)
61761               return 'not_eligible';
61762           if (candidates.length > 1)
61763               return 'multiple';
61764       };
61765
61766
61767       operation.tooltip = function() {
61768           var disable = operation.disabled();
61769           return disable ?
61770               t('operations.continue.' + disable) :
61771               t('operations.continue.description');
61772       };
61773
61774
61775       operation.annotation = function() {
61776           return t('operations.continue.annotation.line');
61777       };
61778
61779
61780       operation.id = 'continue';
61781       operation.keys = [t('operations.continue.key')];
61782       operation.title = t('operations.continue.title');
61783       operation.behavior = behaviorOperation(context).which(operation);
61784
61785       return operation;
61786   }
61787
61788   function operationDelete(selectedIDs, context) {
61789       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
61790           action = actionDeleteMultiple(selectedIDs),
61791           extent = selectedIDs.reduce(function(extent, id) {
61792                   return extent.extend(context.entity(id).extent(context.graph()));
61793               }, geoExtent$$1());
61794
61795
61796       var operation = function() {
61797           var nextSelectedID;
61798           var nextSelectedLoc;
61799
61800           if (selectedIDs.length === 1) {
61801               var id = selectedIDs[0],
61802                   entity = context.entity(id),
61803                   geometry = context.geometry(id),
61804                   parents = context.graph().parentWays(entity),
61805                   parent = parents[0];
61806
61807               // Select the next closest node in the way.
61808               if (geometry === 'vertex') {
61809                   var nodes = parent.nodes,
61810                       i = nodes.indexOf(id);
61811
61812                   if (i === 0) {
61813                       i++;
61814                   } else if (i === nodes.length - 1) {
61815                       i--;
61816                   } else {
61817                       var a = geoSphericalDistance(entity.loc, context.entity(nodes[i - 1]).loc),
61818                           b = geoSphericalDistance(entity.loc, context.entity(nodes[i + 1]).loc);
61819                       i = a < b ? i - 1 : i + 1;
61820                   }
61821
61822                   nextSelectedID = nodes[i];
61823                   nextSelectedLoc = context.entity(nextSelectedID).loc;
61824               }
61825           }
61826
61827           context.perform(action, operation.annotation());
61828
61829           if (nextSelectedID && nextSelectedLoc) {
61830               if (context.hasEntity(nextSelectedID)) {
61831                   context.enter(modeSelect(context, [nextSelectedID]).follow(true));
61832               } else {
61833                   context.map().centerEase(nextSelectedLoc);
61834                   context.enter(modeBrowse(context));
61835               }
61836           } else {
61837               context.enter(modeBrowse(context));
61838           }
61839
61840       };
61841
61842
61843       operation.available = function() {
61844           return true;
61845       };
61846
61847
61848       operation.disabled = function() {
61849           var reason;
61850           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
61851               reason = 'too_large';
61852           } else if (some(selectedIDs, context.hasHiddenConnections)) {
61853               reason = 'connected_to_hidden';
61854           } else if (some(selectedIDs, protectedMember)) {
61855               reason = 'part_of_relation';
61856           } else if (some(selectedIDs, incompleteRelation)) {
61857               reason = 'incomplete_relation';
61858           }
61859           return reason;
61860
61861           function incompleteRelation(id) {
61862               var entity = context.entity(id);
61863               return entity.type === 'relation' && !entity.isComplete(context.graph());
61864           }
61865
61866           function protectedMember(id) {
61867               var entity = context.entity(id);
61868               if (entity.type !== 'way') return false;
61869
61870               var parents = context.graph().parentRelations(entity);
61871               for (var i = 0; i < parents.length; i++) {
61872                   var parent = parents[i],
61873                       type = parent.tags.type,
61874                       role = parent.memberById(id).role || 'outer';
61875                   if (type === 'route' || type === 'boundary' || (type === 'multipolygon' && role === 'outer')) {
61876                       return true;
61877                   }
61878               }
61879               return false;
61880           }
61881
61882       };
61883
61884
61885       operation.tooltip = function() {
61886           var disable = operation.disabled();
61887           return disable ?
61888               t('operations.delete.' + disable + '.' + multi) :
61889               t('operations.delete.description' + '.' + multi);
61890       };
61891
61892
61893       operation.annotation = function() {
61894           return selectedIDs.length === 1 ?
61895               t('operations.delete.annotation.' + context.geometry(selectedIDs[0])) :
61896               t('operations.delete.annotation.multiple', { n: selectedIDs.length });
61897       };
61898
61899
61900       operation.id = 'delete';
61901       operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
61902       operation.title = t('operations.delete.title');
61903       operation.behavior = behaviorOperation(context).which(operation);
61904
61905       return operation;
61906   }
61907
61908   function operationDisconnect(selectedIDs, context) {
61909       var vertices = filter(selectedIDs, function(entityId) {
61910           return context.geometry(entityId) === 'vertex';
61911       });
61912
61913       var entityId = vertices[0],
61914           action = actionDisconnect(entityId);
61915
61916       if (selectedIDs.length > 1) {
61917           action.limitWays(without(selectedIDs, entityId));
61918       }
61919
61920
61921       var operation = function() {
61922           context.perform(action, operation.annotation());
61923       };
61924
61925
61926       operation.available = function() {
61927           return vertices.length === 1;
61928       };
61929
61930
61931       operation.disabled = function() {
61932           var reason;
61933           if (some(selectedIDs, context.hasHiddenConnections)) {
61934               reason = 'connected_to_hidden';
61935           }
61936           return action.disabled(context.graph()) || reason;
61937       };
61938
61939
61940       operation.tooltip = function() {
61941           var disable = operation.disabled();
61942           return disable ?
61943               t('operations.disconnect.' + disable) :
61944               t('operations.disconnect.description');
61945       };
61946
61947
61948       operation.annotation = function() {
61949           return t('operations.disconnect.annotation');
61950       };
61951
61952
61953       operation.id = 'disconnect';
61954       operation.keys = [t('operations.disconnect.key')];
61955       operation.title = t('operations.disconnect.title');
61956       operation.behavior = behaviorOperation(context).which(operation);
61957
61958       return operation;
61959   }
61960
61961   function operationMerge(selectedIDs, context) {
61962
61963       function updatePresetTags(newGraph, ids) {
61964           var id = ids[0];
61965           var newEntity = newGraph.hasEntity(id);
61966
61967           if (!newEntity) return;
61968           var newPreset = context.presets().match(newEntity, newGraph);
61969           context.replace(actionChangePreset(id, null, newPreset), operation.annotation());
61970       }
61971
61972
61973       var join = actionJoin(selectedIDs);
61974       var merge = actionMerge(selectedIDs);
61975       var mergePolygon = actionMergePolygon(selectedIDs);
61976       var mergeNodes = actionMergeNodes(selectedIDs);
61977
61978
61979       var operation = function() {
61980           var doUpdateTags;
61981           var action;
61982
61983           if (!join.disabled(context.graph())) {
61984               doUpdateTags = false;
61985               action = join;
61986           } else if (!merge.disabled(context.graph())) {
61987               doUpdateTags = true;
61988               action = merge;
61989           } else if (!mergePolygon.disabled(context.graph())) {
61990               doUpdateTags = false;
61991               action = mergePolygon;
61992           } else {
61993               doUpdateTags = true;
61994               action = mergeNodes;
61995           }
61996
61997           context.perform(action, operation.annotation());
61998
61999           var ids = selectedIDs.filter(function(id) {
62000               var entity = context.hasEntity(id);
62001               return entity && entity.type !== 'node';
62002           });
62003
62004           // if we merged tags, rematch preset to update tags if necessary (#3851)
62005           if (doUpdateTags) {
62006               updatePresetTags(context.graph(), ids);
62007           }
62008
62009           context.enter(modeSelect(context, ids));
62010       };
62011
62012
62013       operation.available = function() {
62014           return selectedIDs.length >= 2;
62015       };
62016
62017
62018       operation.disabled = function() {
62019           return join.disabled(context.graph()) &&
62020               merge.disabled(context.graph()) &&
62021               mergePolygon.disabled(context.graph()) &&
62022               mergeNodes.disabled(context.graph());
62023       };
62024
62025
62026       operation.tooltip = function() {
62027           var j = join.disabled(context.graph());          // 'not_eligible', 'not_adjacent', 'restriction', 'conflicting_tags'
62028           var m = merge.disabled(context.graph());         // 'not_eligible'
62029           var p = mergePolygon.disabled(context.graph());  // 'not_eligible', 'incomplete_relation'
62030           var n = mergeNodes.disabled(context.graph());    // 'not_eligible', 'relation', 'restriction'
62031
62032           // disabled for one of various reasons
62033           if (j && m && p && n) {
62034               if (j === 'restriction' || n === 'restriction') {
62035                   return t('operations.merge.restriction',
62036                       { relation: context.presets().item('type/restriction').name() });
62037
62038               } else if (p === 'incomplete_relation') {
62039                   return t('operations.merge.incomplete_relation');
62040
62041               } else if (n === 'relation') {
62042                   return t('operations.merge.relation');
62043
62044               } else {
62045                   return t('operations.merge.' + j);
62046               }
62047
62048           } else {
62049               return t('operations.merge.description');
62050           }
62051       };
62052
62053
62054       operation.annotation = function() {
62055           return t('operations.merge.annotation', { n: selectedIDs.length });
62056       };
62057
62058
62059       operation.id = 'merge';
62060       operation.keys = [t('operations.merge.key')];
62061       operation.title = t('operations.merge.title');
62062       operation.behavior = behaviorOperation(context).which(operation);
62063
62064       return operation;
62065   }
62066
62067   function operationMove(selectedIDs, context) {
62068       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
62069       var extent = selectedIDs.reduce(function(extent, id) {
62070           return extent.extend(context.entity(id).extent(context.graph()));
62071       }, geoExtent$$1());
62072
62073
62074       var operation = function() {
62075           context.enter(modeMove$$1(context, selectedIDs));
62076       };
62077
62078
62079       operation.available = function() {
62080           return selectedIDs.length > 1 ||
62081               context.entity(selectedIDs[0]).type !== 'node';
62082       };
62083
62084
62085       operation.disabled = function() {
62086           var reason;
62087           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
62088               reason = 'too_large';
62089           } else if (some(selectedIDs, context.hasHiddenConnections)) {
62090               reason = 'connected_to_hidden';
62091           } else if (some(selectedIDs, incompleteRelation)) {
62092               reason = 'incomplete_relation';
62093           }
62094           return reason;
62095
62096           function incompleteRelation(id) {
62097               var entity = context.entity(id);
62098               return entity.type === 'relation' && !entity.isComplete(context.graph());
62099           }
62100       };
62101
62102
62103       operation.tooltip = function() {
62104           var disable = operation.disabled();
62105           return disable ?
62106               t('operations.move.' + disable + '.' + multi) :
62107               t('operations.move.description.' + multi);
62108       };
62109
62110
62111       operation.annotation = function() {
62112           return selectedIDs.length === 1 ?
62113               t('operations.move.annotation.' + context.geometry(selectedIDs[0])) :
62114               t('operations.move.annotation.multiple');
62115       };
62116
62117
62118       operation.id = 'move';
62119       operation.keys = [t('operations.move.key')];
62120       operation.title = t('operations.move.title');
62121       operation.behavior = behaviorOperation(context).which(operation);
62122
62123       return operation;
62124   }
62125
62126   function operationOrthogonalize(selectedIDs, context) {
62127       var entityId = selectedIDs[0],
62128           entity = context.entity(entityId),
62129           extent = entity.extent(context.graph()),
62130           geometry = context.geometry(entityId),
62131           action = actionOrthogonalize(entityId, context.projection);
62132
62133
62134       var operation = function() {
62135           context.perform(action, operation.annotation());
62136       };
62137
62138
62139       operation.available = function() {
62140           return selectedIDs.length === 1 &&
62141               entity.type === 'way' &&
62142               entity.isClosed() &&
62143               uniq(entity.nodes).length > 2;
62144       };
62145
62146
62147       operation.disabled = function() {
62148           var reason;
62149           if (extent.percentContainedIn(context.extent()) < 0.8) {
62150               reason = 'too_large';
62151           } else if (context.hasHiddenConnections(entityId)) {
62152               reason = 'connected_to_hidden';
62153           }
62154           return action.disabled(context.graph()) || reason;
62155       };
62156
62157
62158       operation.tooltip = function() {
62159           var disable = operation.disabled();
62160           return disable ?
62161               t('operations.orthogonalize.' + disable) :
62162               t('operations.orthogonalize.description.' + geometry);
62163       };
62164
62165
62166       operation.annotation = function() {
62167           return t('operations.orthogonalize.annotation.' + geometry);
62168       };
62169
62170
62171       operation.id = 'orthogonalize';
62172       operation.keys = [t('operations.orthogonalize.key')];
62173       operation.title = t('operations.orthogonalize.title');
62174       operation.behavior = behaviorOperation(context).which(operation);
62175
62176       return operation;
62177   }
62178
62179   function operationReflectShort(selectedIDs, context) {
62180       return operationReflect(selectedIDs, context, 'short');
62181   }
62182
62183
62184   function operationReflectLong(selectedIDs, context) {
62185       return operationReflect(selectedIDs, context, 'long');
62186   }
62187
62188
62189   function operationReflect(selectedIDs, context, axis) {
62190       axis = axis || 'long';
62191       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
62192           extent = selectedIDs.reduce(function(extent, id) {
62193               return extent.extend(context.entity(id).extent(context.graph()));
62194           }, geoExtent$$1());
62195
62196
62197       var operation = function() {
62198           var action = actionReflect(selectedIDs, context.projection)
62199               .useLongAxis(Boolean(axis === 'long'));
62200           context.perform(action, operation.annotation());
62201       };
62202
62203
62204       operation.available = function() {
62205           var nodes = utilGetAllNodes(selectedIDs, context.graph());
62206           return uniqBy(nodes, function(n) { return n.loc; }).length >= 3;
62207       };
62208
62209
62210       operation.disabled = function() {
62211           var reason;
62212           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
62213               reason = 'too_large';
62214           } else if (some(selectedIDs, context.hasHiddenConnections)) {
62215               reason = 'connected_to_hidden';
62216           } else if (some(selectedIDs, incompleteRelation)) {
62217               reason = 'incomplete_relation';
62218           }
62219           return reason;
62220
62221           function incompleteRelation(id) {
62222               var entity = context.entity(id);
62223               return entity.type === 'relation' && !entity.isComplete(context.graph());
62224           }
62225       };
62226
62227
62228       operation.tooltip = function() {
62229           var disable = operation.disabled();
62230           return disable ?
62231               t('operations.reflect.' + disable + '.' + multi) :
62232               t('operations.reflect.description.' + axis + '.' + multi);
62233       };
62234
62235
62236       operation.annotation = function() {
62237           return t('operations.reflect.annotation.' + axis + '.' + multi);
62238       };
62239
62240
62241       operation.id = 'reflect-' + axis;
62242       operation.keys = [t('operations.reflect.key.' + axis)];
62243       operation.title = t('operations.reflect.title.' + axis);
62244       operation.behavior = behaviorOperation(context).which(operation);
62245
62246       return operation;
62247   }
62248
62249   function operationReverse(selectedIDs, context) {
62250       var entityId = selectedIDs[0];
62251
62252       var operation = function() {
62253           context.perform(actionReverse(entityId), operation.annotation());
62254       };
62255
62256
62257       operation.available = function() {
62258           return selectedIDs.length === 1 && context.geometry(entityId) === 'line';
62259       };
62260
62261
62262       operation.disabled = function() {
62263           return false;
62264       };
62265
62266
62267       operation.tooltip = function() {
62268           return t('operations.reverse.description');
62269       };
62270
62271
62272       operation.annotation = function() {
62273           return t('operations.reverse.annotation');
62274       };
62275
62276
62277       operation.id = 'reverse';
62278       operation.keys = [t('operations.reverse.key')];
62279       operation.title = t('operations.reverse.title');
62280       operation.behavior = behaviorOperation(context).which(operation);
62281
62282       return operation;
62283   }
62284
62285   function operationRotate(selectedIDs, context) {
62286       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
62287           extent = selectedIDs.reduce(function(extent, id) {
62288               return extent.extend(context.entity(id).extent(context.graph()));
62289           }, geoExtent$$1());
62290
62291
62292       var operation = function() {
62293           context.enter(modeRotate$$1(context, selectedIDs));
62294       };
62295
62296
62297       operation.available = function() {
62298           var nodes = utilGetAllNodes(selectedIDs, context.graph());
62299           return uniqBy(nodes, function(n) { return n.loc; }).length >= 2;
62300       };
62301
62302
62303       operation.disabled = function() {
62304           var reason;
62305           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
62306               reason = 'too_large';
62307           } else if (some(selectedIDs, context.hasHiddenConnections)) {
62308               reason = 'connected_to_hidden';
62309           } else if (some(selectedIDs, incompleteRelation)) {
62310               reason = 'incomplete_relation';
62311           }
62312           return reason;
62313
62314           function incompleteRelation(id) {
62315               var entity = context.entity(id);
62316               return entity.type === 'relation' && !entity.isComplete(context.graph());
62317           }
62318       };
62319
62320
62321       operation.tooltip = function() {
62322           var disable = operation.disabled();
62323           return disable ?
62324               t('operations.rotate.' + disable + '.' + multi) :
62325               t('operations.rotate.description.' + multi);
62326       };
62327
62328
62329       operation.annotation = function() {
62330           return selectedIDs.length === 1 ?
62331               t('operations.rotate.annotation.' + context.geometry(selectedIDs[0])) :
62332               t('operations.rotate.annotation.multiple');
62333       };
62334
62335
62336       operation.id = 'rotate';
62337       operation.keys = [t('operations.rotate.key')];
62338       operation.title = t('operations.rotate.title');
62339       operation.behavior = behaviorOperation(context).which(operation);
62340
62341       return operation;
62342   }
62343
62344   function operationSplit(selectedIDs, context) {
62345       var vertices = filter(selectedIDs, function(entityId) {
62346           return context.geometry(entityId) === 'vertex';
62347       });
62348
62349       var entityId = vertices[0],
62350           action = actionSplit(entityId),
62351           ways = [];
62352
62353       if (vertices.length === 1) {
62354           if (selectedIDs.length > 1) {
62355               action.limitWays(without(selectedIDs, entityId));
62356           }
62357           ways = action.ways(context.graph());
62358       }
62359
62360
62361       var operation = function() {
62362           var difference = context.perform(action, operation.annotation());
62363           context.enter(modeSelect(context, difference.extantIDs()));
62364       };
62365
62366
62367       operation.available = function() {
62368           return vertices.length === 1;
62369       };
62370
62371
62372       operation.disabled = function() {
62373           var reason;
62374           if (some(selectedIDs, context.hasHiddenConnections)) {
62375               reason = 'connected_to_hidden';
62376           }
62377           return action.disabled(context.graph()) || reason;
62378       };
62379
62380
62381       operation.tooltip = function() {
62382           var disable = operation.disabled();
62383           if (disable) {
62384               return t('operations.split.' + disable);
62385           }
62386           if (ways.length === 1) {
62387               return t('operations.split.description.' + context.geometry(ways[0].id));
62388           } else {
62389               return t('operations.split.description.multiple');
62390           }
62391       };
62392
62393
62394       operation.annotation = function() {
62395           return ways.length === 1 ?
62396               t('operations.split.annotation.' + context.geometry(ways[0].id)) :
62397               t('operations.split.annotation.multiple', { n: ways.length });
62398       };
62399
62400
62401       operation.id = 'split';
62402       operation.keys = [t('operations.split.key')];
62403       operation.title = t('operations.split.title');
62404       operation.behavior = behaviorOperation(context).which(operation);
62405
62406       return operation;
62407   }
62408
62409   function operationStraighten(selectedIDs, context) {
62410       var entityId = selectedIDs[0],
62411           action = actionStraighten(entityId, context.projection);
62412
62413
62414       function operation() {
62415           context.perform(action, operation.annotation());
62416       }
62417
62418
62419       operation.available = function() {
62420           var entity = context.entity(entityId);
62421           return selectedIDs.length === 1 &&
62422               entity.type === 'way' &&
62423               !entity.isClosed() &&
62424               uniq(entity.nodes).length > 2;
62425       };
62426
62427
62428       operation.disabled = function() {
62429           var reason;
62430           if (context.hasHiddenConnections(entityId)) {
62431               reason = 'connected_to_hidden';
62432           }
62433           return action.disabled(context.graph()) || reason;
62434       };
62435
62436
62437       operation.tooltip = function() {
62438           var disable = operation.disabled();
62439           return disable ?
62440               t('operations.straighten.' + disable) :
62441               t('operations.straighten.description');
62442       };
62443
62444
62445       operation.annotation = function() {
62446           return t('operations.straighten.annotation');
62447       };
62448
62449
62450       operation.id = 'straighten';
62451       operation.keys = [t('operations.straighten.key')];
62452       operation.title = t('operations.straighten.title');
62453       operation.behavior = behaviorOperation(context).which(operation);
62454
62455       return operation;
62456   }
62457
62458   function operationDetachNode(selectedIDs, context) {
62459       var nodeID = selectedIDs.length && selectedIDs[0];
62460       var action = actionDetachNode(nodeID);
62461
62462       var operation = function () {
62463           context.perform(action);  // do the detach
62464
62465           var mouse = context.map().mouseCoordinates();
62466           if (mouse.some(isNaN)) {
62467               enterMoveMode();
62468
62469           } else {
62470               // move detached node to the mouse location (transitioned)
62471               context.perform(actionMoveNode(nodeID, mouse));
62472
62473               // after transition completes, put at final mouse location and enter move mode.
62474               window.setTimeout(function() {
62475                   mouse = context.map().mouseCoordinates();
62476                   context.replace(actionMoveNode(nodeID, mouse));
62477                   enterMoveMode();
62478               }, 150);
62479           }
62480
62481           function enterMoveMode() {
62482               var baseGraph = context.graph();
62483               context.enter(modeMove$$1(context, [nodeID], baseGraph));
62484           }
62485       };
62486
62487
62488       operation.available = function () {
62489           if (selectedIDs.length !== 1) return false;
62490
62491           var graph = context.graph();
62492           var entity = graph.hasEntity(nodeID);
62493           if (!entity) return false;
62494
62495           return entity.type === 'node' &&
62496               entity.hasInterestingTags() &&
62497               graph.parentWays(entity).length > 0;
62498       };
62499
62500
62501       operation.disabled = function () {
62502           var reason;
62503           if (some(selectedIDs, context.hasHiddenConnections)) {
62504               reason = 'connected_to_hidden';
62505           }
62506           return action.disabled(context.graph()) || reason;
62507       };
62508
62509
62510       operation.tooltip = function () {
62511           var disableReason = operation.disabled();
62512           if (disableReason) {
62513               return t('operations.detach_node.' + disableReason,
62514                   { relation: context.presets().item('type/restriction').name() });
62515           } else {
62516               return t('operations.detach_node.description');
62517           }
62518       };
62519
62520
62521       operation.annotation = function () {
62522           return t('operations.detach_node.annotation');
62523       };
62524
62525
62526       operation.id = 'detach-node';
62527       operation.keys = [t('operations.detach_node.key')];
62528       operation.title = t('operations.detach_node.title');
62529       operation.behavior = behaviorOperation(context).which(operation);
62530
62531
62532       return operation;
62533   }
62534
62535
62536
62537   var Operations = /*#__PURE__*/Object.freeze({
62538     operationCircularize: operationCircularize,
62539     operationContinue: operationContinue,
62540     operationDelete: operationDelete,
62541     operationDisconnect: operationDisconnect,
62542     operationMerge: operationMerge,
62543     operationMove: operationMove,
62544     operationOrthogonalize: operationOrthogonalize,
62545     operationReflectShort: operationReflectShort,
62546     operationReflectLong: operationReflectLong,
62547     operationReverse: operationReverse,
62548     operationRotate: operationRotate,
62549     operationSplit: operationSplit,
62550     operationStraighten: operationStraighten,
62551     operationDetachNode: operationDetachNode
62552   });
62553
62554   function uiPresetList(context) {
62555       var dispatch$$1 = dispatch('choose');
62556       var _entityID;
62557       var _currentPreset;
62558       var _autofocus = false;
62559
62560
62561       function presetList(selection$$1) {
62562           var entity = context.entity(_entityID);
62563           var geometry = context.geometry(_entityID);
62564
62565           // Treat entities on addr:interpolation lines as points, not vertices (#3241)
62566           if (geometry === 'vertex' && entity.isOnAddressLine(context.graph())) {
62567               geometry = 'point';
62568           }
62569
62570           var presets = context.presets().matchGeometry(geometry);
62571
62572           selection$$1.html('');
62573
62574           var messagewrap = selection$$1
62575               .append('div')
62576               .attr('class', 'header fillL cf');
62577
62578           var message = messagewrap
62579               .append('h3')
62580               .text(t('inspector.choose'));
62581
62582           messagewrap
62583               .append('button')
62584               .attr('class', 'preset-choose')
62585               .on('click', function() { dispatch$$1.call('choose', this, _currentPreset); })
62586               .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'));
62587
62588           function initialKeydown() {
62589               // hack to let delete shortcut work when search is autofocused
62590               if (search.property('value').length === 0 &&
62591                   (event.keyCode === utilKeybinding.keyCodes['⌫'] ||
62592                    event.keyCode === utilKeybinding.keyCodes['⌦'])) {
62593                   event.preventDefault();
62594                   event.stopPropagation();
62595                   operationDelete([_entityID], context)();
62596
62597               // hack to let undo work when search is autofocused
62598               } else if (search.property('value').length === 0 &&
62599                   (event.ctrlKey || event.metaKey) &&
62600                   event.keyCode === utilKeybinding.keyCodes.z) {
62601                   event.preventDefault();
62602                   event.stopPropagation();
62603                   context.undo();
62604               } else if (!event.ctrlKey && !event.metaKey) {
62605                   // don't check for delete/undo hack on future keydown events
62606                   select(this).on('keydown', keydown);
62607                   keydown.call(this);
62608               }
62609           }
62610
62611           function keydown() {
62612               // down arrow
62613               if (event.keyCode === utilKeybinding.keyCodes['↓'] &&
62614                   // if insertion point is at the end of the string
62615                   search.node().selectionStart === search.property('value').length) {
62616                   event.preventDefault();
62617                   event.stopPropagation();
62618                   // move focus to the first item in the preset list
62619                   list.select('.preset-list-button').node().focus();
62620               }
62621           }
62622
62623           function keypress() {
62624               // enter
62625               var value = search.property('value');
62626               if (event.keyCode === 13 && value.length) {
62627                   list.selectAll('.preset-list-item:first-child').datum().choose();
62628               }
62629           }
62630
62631           function inputevent() {
62632               var value = search.property('value');
62633               list.classed('filtered', value.length);
62634               if (value.length) {
62635                   var results = presets.search(value, geometry);
62636                   message.text(t('inspector.results', {
62637                       n: results.collection.length,
62638                       search: value
62639                   }));
62640                   list.call(drawList, results);
62641               } else {
62642                   list.call(drawList, context.presets().defaults(geometry, 36));
62643                   message.text(t('inspector.choose'));
62644               }
62645           }
62646
62647           var searchWrap = selection$$1
62648               .append('div')
62649               .attr('class', 'search-header');
62650
62651           var search = searchWrap
62652               .append('input')
62653               .attr('class', 'preset-search-input')
62654               .attr('placeholder', t('inspector.search'))
62655               .attr('type', 'search')
62656               .call(utilNoAuto)
62657               .on('keydown', initialKeydown)
62658               .on('keypress', keypress)
62659               .on('input', inputevent);
62660
62661           searchWrap
62662               .call(svgIcon('#iD-icon-search', 'pre-text'));
62663
62664           if (_autofocus) {
62665               search.node().focus();
62666           }
62667
62668           var listWrap = selection$$1
62669               .append('div')
62670               .attr('class', 'inspector-body');
62671
62672           var list = listWrap
62673               .append('div')
62674               .attr('class', 'preset-list fillL cf')
62675               .call(drawList, context.presets().defaults(geometry, 36));
62676       }
62677
62678
62679       function drawList(list, presets) {
62680           var collection = presets.collection.reduce(function(collection, preset) {
62681               if (preset.members) {
62682                   collection.push(CategoryItem(preset));
62683               } else if (preset.visible()) {
62684                   collection.push(PresetItem(preset));
62685               }
62686               return collection;
62687           }, []);
62688
62689           var items = list.selectAll('.preset-list-item')
62690               .data(collection, function(d) { return d.preset.id; });
62691
62692           items.order();
62693
62694           items.exit()
62695               .remove();
62696
62697           items.enter()
62698               .append('div')
62699               .attr('class', function(item) { return 'preset-list-item preset-' + item.preset.id.replace('/', '-'); })
62700               .classed('current', function(item) { return item.preset === _currentPreset; })
62701               .each(function(item) { select(this).call(item); })
62702               .style('opacity', 0)
62703               .transition()
62704               .style('opacity', 1);
62705       }
62706
62707       function itemKeydown(){
62708           // the actively focused item
62709           var item = select(this.closest('.preset-list-item'));
62710           var parentItem = select(item.node().parentElement.closest('.preset-list-item'));
62711
62712           // arrow down, move focus to the next, lower item
62713           if (event.keyCode === utilKeybinding.keyCodes['↓']) {
62714               event.preventDefault();
62715               event.stopPropagation();
62716               // the next item in the list at the same level
62717               var nextItem = select(item.node().nextElementSibling);
62718               // if there is no next item in this list
62719               if (nextItem.empty()) {
62720                   // if there is a parent item
62721                   if (!parentItem.empty()) {
62722                       // the item is the last item of a sublist,
62723                       // select the next item at the parent level
62724                       nextItem = select(parentItem.node().nextElementSibling);
62725                   }
62726               // if the focused item is expanded
62727               } else if (select(this).classed('expanded')) {
62728                   // select the first subitem instead
62729                   nextItem = item.select('.subgrid .preset-list-item:first-child');
62730               }
62731               if (!nextItem.empty()) {
62732                   // focus on the next item
62733                   nextItem.select('.preset-list-button').node().focus();
62734               }
62735
62736           // arrow up, move focus to the previous, higher item
62737           } else if (event.keyCode === utilKeybinding.keyCodes['↑']) {
62738               event.preventDefault();
62739               event.stopPropagation();
62740               // the previous item in the list at the same level
62741               var previousItem = select(item.node().previousElementSibling);
62742
62743               // if there is no previous item in this list
62744               if (previousItem.empty()) {
62745                   // if there is a parent item
62746                   if (!parentItem.empty()) {
62747                       // the item is the first subitem of a sublist select the parent item
62748                       previousItem = parentItem;
62749                   }
62750               // if the previous item is expanded
62751               } else if (previousItem.select('.preset-list-button').classed('expanded')) {
62752                   // select the last subitem of the sublist of the previous item
62753                   previousItem = previousItem.select('.subgrid .preset-list-item:last-child');
62754               }
62755
62756               if (!previousItem.empty()) {
62757                   // focus on the previous item
62758                   previousItem.select('.preset-list-button').node().focus();
62759               } else {
62760                   // the focus is at the top of the list, move focus back to the search field
62761                   var search = select(this.closest('.preset-list-pane')).select('.preset-search-input');
62762                   search.node().focus();
62763               }
62764
62765           // arrow left, move focus to the parent item if there is one
62766           } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '→' : '←']) {
62767               event.preventDefault();
62768               event.stopPropagation();
62769               // if there is a parent item, focus on the parent item
62770               if (!parentItem.empty()) {
62771                   parentItem.select('.preset-list-button').node().focus();
62772               }
62773
62774           // arrow right, choose this item
62775           } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '←' : '→']) {
62776               event.preventDefault();
62777               event.stopPropagation();
62778               item.datum().choose();
62779           }
62780       }
62781
62782
62783       function CategoryItem(preset) {
62784           var box, sublist, shown = false;
62785
62786           function item(selection$$1) {
62787               var wrap = selection$$1.append('div')
62788                   .attr('class', 'preset-list-button-wrap category col12');
62789
62790               function click() {
62791                   var isExpanded = select(this).classed('expanded');
62792                   var iconName = isExpanded ?
62793                       (textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward') : '#iD-icon-down';
62794                   select(this)
62795                       .classed('expanded', !isExpanded);
62796                   select(this).selectAll('div.label-inner svg.icon use')
62797                       .attr('href', iconName);
62798                   item.choose();
62799               }
62800
62801               var button = wrap
62802                   .append('button')
62803                   .attr('class', 'preset-list-button')
62804                   .classed('expanded', false)
62805                   .call(uiPresetIcon()
62806                       .geometry(context.geometry(_entityID))
62807                       .preset(preset))
62808                   .on('click', click)
62809                   .on('keydown', function() {
62810                       // right arrow, expand the focused item
62811                       if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '←' : '→']) {
62812                           event.preventDefault();
62813                           event.stopPropagation();
62814                           // if the item isn't expanded
62815                           if (!select(this).classed('expanded')) {
62816                               // toggle expansion (expand the item)
62817                               click.call(this);
62818                           }
62819                       // left arrow, collapse the focused item
62820                       } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '→' : '←']) {
62821                           event.preventDefault();
62822                           event.stopPropagation();
62823                           // if the item is expanded
62824                           if (select(this).classed('expanded')) {
62825                               // toggle expansion (collapse the item)
62826                               click.call(this);
62827                           }
62828                       } else {
62829                           itemKeydown.call(this);
62830                       }
62831                   });
62832
62833               var label = button
62834                   .append('div')
62835                   .attr('class', 'label')
62836                   .append('div')
62837                   .attr('class', 'label-inner');
62838
62839               label
62840                   .append('div')
62841                   .attr('class', 'namepart')
62842                   .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'))
62843                   .append('span')
62844                   .html(function() { return preset.name() + '&hellip;'; });
62845
62846               box = selection$$1.append('div')
62847                   .attr('class', 'subgrid col12')
62848                   .style('max-height', '0px')
62849                   .style('opacity', 0);
62850
62851               box.append('div')
62852                   .attr('class', 'arrow');
62853
62854               sublist = box.append('div')
62855                   .attr('class', 'preset-list fillL3 cf fl');
62856           }
62857
62858
62859           item.choose = function() {
62860               if (!box || !sublist) return;
62861
62862               if (shown) {
62863                   shown = false;
62864                   box.transition()
62865                       .duration(200)
62866                       .style('opacity', '0')
62867                       .style('max-height', '0px')
62868                       .style('padding-bottom', '0px');
62869               } else {
62870                   shown = true;
62871                   sublist.call(drawList, preset.members);
62872                   box.transition()
62873                       .duration(200)
62874                       .style('opacity', '1')
62875                       .style('max-height', 200 + preset.members.collection.length * 190 + 'px')
62876                       .style('padding-bottom', '20px');
62877               }
62878           };
62879
62880           item.preset = preset;
62881           return item;
62882       }
62883
62884
62885       function PresetItem(preset) {
62886           function item(selection$$1) {
62887               var wrap = selection$$1.append('div')
62888                   .attr('class', 'preset-list-button-wrap col12');
62889
62890               var button = wrap.append('button')
62891                   .attr('class', 'preset-list-button')
62892                   .call(uiPresetIcon()
62893                       .geometry(context.geometry(_entityID))
62894                       .preset(preset))
62895                   .on('click', item.choose)
62896                   .on('keydown', itemKeydown);
62897
62898               var label = button
62899                   .append('div')
62900                   .attr('class', 'label')
62901                   .append('div')
62902                   .attr('class', 'label-inner');
62903
62904               // NOTE: split/join on en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
62905               label.selectAll('.namepart')
62906                   .data(preset.name().split(' – '))
62907                   .enter()
62908                   .append('div')
62909                   .attr('class', 'namepart')
62910                   .text(function(d) { return d; });
62911
62912               wrap.call(item.reference.button);
62913               selection$$1.call(item.reference.body);
62914           }
62915
62916           item.choose = function() {
62917               context.presets().choose(preset);
62918               context.perform(
62919                   actionChangePreset(_entityID, _currentPreset, preset),
62920                   t('operations.change_tags.annotation')
62921               );
62922
62923               dispatch$$1.call('choose', this, preset);
62924           };
62925
62926           item.help = function() {
62927               event.stopPropagation();
62928               item.reference.toggle();
62929           };
62930
62931           item.preset = preset;
62932           item.reference = uiTagReference(preset.reference(context.geometry(_entityID)), context);
62933
62934           return item;
62935       }
62936
62937
62938       presetList.autofocus = function(val) {
62939           if (!arguments.length) return _autofocus;
62940           _autofocus = val;
62941           return presetList;
62942       };
62943
62944
62945       presetList.entityID = function(val) {
62946           if (!arguments.length) return _entityID;
62947           _entityID = val;
62948           presetList.preset(context.presets().match(context.entity(_entityID), context.graph()));
62949           return presetList;
62950       };
62951
62952
62953       presetList.preset = function(val) {
62954           if (!arguments.length) return _currentPreset;
62955           _currentPreset = val;
62956           return presetList;
62957       };
62958
62959
62960       return utilRebind(presetList, dispatch$$1, 'on');
62961   }
62962
62963   function uiViewOnOSM(context) {
62964       var _what;   // an osmEntity or osmNote
62965
62966
62967       function viewOnOSM(selection) {
62968           var url;
62969           if (_what instanceof osmEntity$$1) {
62970               url = context.connection().entityURL(_what);
62971           } else if (_what instanceof osmNote) {
62972               url = context.connection().noteURL(_what);
62973           }
62974
62975           var data = ((!_what || _what.isNew()) ? [] : [_what]);
62976           var link = selection.selectAll('.view-on-osm')
62977               .data(data, function(d) { return d.id; });
62978
62979           // exit
62980           link.exit()
62981               .remove();
62982
62983           // enter
62984           var linkEnter = link.enter()
62985               .append('a')
62986               .attr('class', 'view-on-osm')
62987               .attr('target', '_blank')
62988               .attr('href', url)
62989               .call(svgIcon('#iD-icon-out-link', 'inline'));
62990
62991           linkEnter
62992               .append('span')
62993               .text(t('inspector.view_on_osm'));
62994       }
62995
62996
62997       viewOnOSM.what = function(_) {
62998           if (!arguments.length) return _what;
62999           _what = _;
63000           return viewOnOSM;
63001       };
63002
63003       return viewOnOSM;
63004   }
63005
63006   function uiInspector(context) {
63007       var presetList = uiPresetList(context);
63008       var entityEditor = uiEntityEditor(context);
63009       var _state = 'select';
63010       var _entityID;
63011       var _newFeature = false;
63012
63013
63014       function inspector(selection$$1, newFeature) {
63015           presetList
63016               .entityID(_entityID)
63017               .autofocus(_newFeature)
63018               .on('choose', setPreset);
63019
63020           entityEditor
63021               .state(_state)
63022               .entityID(_entityID)
63023               .on('choose', showList);
63024
63025           var wrap = selection$$1.selectAll('.panewrap')
63026               .data([0]);
63027
63028           var enter = wrap.enter()
63029               .append('div')
63030               .attr('class', 'panewrap');
63031
63032           enter
63033               .append('div')
63034               .attr('class', 'preset-list-pane pane');
63035
63036           enter
63037               .append('div')
63038               .attr('class', 'entity-editor-pane pane');
63039
63040           wrap = wrap.merge(enter);
63041           var presetPane = wrap.selectAll('.preset-list-pane');
63042           var editorPane = wrap.selectAll('.entity-editor-pane');
63043
63044           var entity = context.entity(_entityID);
63045
63046           var isTaglessOrIntersectionVertex = entity.geometry(context.graph()) === 'vertex' &&
63047               (!entity.hasNonGeometryTags() && !entity.isHighwayIntersection(context.graph()));
63048           // start with the preset list if the feature is new or is an uninteresting vertex
63049           var showPresetList = newFeature || isTaglessOrIntersectionVertex;
63050
63051           if (showPresetList) {
63052               wrap.style('right', '-100%');
63053               presetPane.call(presetList);
63054           } else {
63055               wrap.style('right', '0%');
63056               editorPane.call(entityEditor);
63057           }
63058
63059           var footer = selection$$1.selectAll('.footer')
63060               .data([0]);
63061
63062           footer = footer.enter()
63063               .append('div')
63064               .attr('class', 'footer')
63065               .merge(footer);
63066
63067           footer
63068               .call(uiViewOnOSM(context)
63069                   .what(context.hasEntity(_entityID))
63070               );
63071
63072
63073           function showList(preset) {
63074               wrap.transition()
63075                   .styleTween('right', function() { return interpolate('0%', '-100%'); });
63076
63077               presetPane
63078                   .call(presetList.preset(preset).autofocus(true));
63079           }
63080
63081
63082           function setPreset(preset) {
63083               wrap.transition()
63084                   .styleTween('right', function() { return interpolate('-100%', '0%'); });
63085
63086               editorPane
63087                   .call(entityEditor.preset(preset));
63088           }
63089       }
63090
63091
63092       inspector.state = function(val) {
63093           if (!arguments.length) return _state;
63094           _state = val;
63095           entityEditor.state(_state);
63096
63097           // remove any old field help overlay that might have gotten attached to the inspector
63098           d3_selectAll('.field-help-body').remove();
63099
63100           return inspector;
63101       };
63102
63103
63104       inspector.entityID = function(val) {
63105           if (!arguments.length) return _entityID;
63106           _entityID = val;
63107           return inspector;
63108       };
63109
63110
63111       inspector.newFeature = function(val) {
63112           if (!arguments.length) return _newFeature;
63113           _newFeature = val;
63114           return inspector;
63115       };
63116
63117
63118       return inspector;
63119   }
63120
63121   function uiKeepRightDetails(context) {
63122       var _error;
63123
63124
63125       function errorDetail(d) {
63126           var unknown = t('inspector.unknown');
63127
63128           if (!d) return unknown;
63129           var errorType = d.error_type;
63130           var parentErrorType = d.parent_error_type;
63131
63132           var et = en.QA.keepRight.errorTypes[errorType];
63133           var pt = en.QA.keepRight.errorTypes[parentErrorType];
63134
63135           var detail;
63136           if (et && et.description) {
63137               detail = t('QA.keepRight.errorTypes.' + errorType + '.description', d.replacements);
63138           } else if (pt && pt.description) {
63139               detail = t('QA.keepRight.errorTypes.' + parentErrorType + '.description', d.replacements);
63140           } else {
63141               detail = unknown;
63142           }
63143
63144           return detail;
63145       }
63146
63147
63148       function keepRightDetails(selection$$1) {
63149           var details = selection$$1.selectAll('.kr_error-details')
63150               .data(
63151                   (_error ? [_error] : []),
63152                   function(d) { return d.id + '-' + (d.status || 0); }
63153               );
63154
63155           details.exit()
63156               .remove();
63157
63158           var detailsEnter = details.enter()
63159               .append('div')
63160               .attr('class', 'kr_error-details kr_error-details-container');
63161
63162
63163           // description
63164           var descriptionEnter = detailsEnter
63165               .append('div')
63166               .attr('class', 'kr_error-details-description');
63167
63168           descriptionEnter
63169               .append('h4')
63170               .text(function() { return t('QA.keepRight.detail_description'); });
63171
63172           descriptionEnter
63173               .append('div')
63174               .attr('class', 'kr_error-details-description-text')
63175               .html(errorDetail);
63176
63177           // If there are entity links in the error message..
63178           descriptionEnter.selectAll('.kr_error_entity_link, .kr_error_object_link')
63179               .each(function() {
63180                   var link = select(this);
63181                   var isObjectLink = link.classed('kr_error_object_link');
63182                   var entityID = isObjectLink ?
63183                       (utilEntityRoot(_error.object_type) + _error.object_id)
63184                       : this.textContent;
63185                   var entity = context.hasEntity(entityID);
63186
63187                   // Add click handler
63188                   link
63189                       .on('mouseover', function() {
63190                           context.surface().selectAll(utilEntityOrMemberSelector([entityID], context.graph()))
63191                               .classed('hover', true);
63192                       })
63193                       .on('mouseout', function() {
63194                           context.surface().selectAll('.hover')
63195                               .classed('hover', false);
63196                       })
63197                       .on('click', function() {
63198                           event.preventDefault();
63199                           var osmlayer = context.layers().layer('osm');
63200                           if (!osmlayer.enabled()) {
63201                               osmlayer.enabled(true);
63202                           }
63203
63204                           context.map().centerZoomEase(_error.loc, 20);
63205
63206                           if (entity) {
63207                               context.enter(modeSelect(context, [entityID]));
63208                           } else {
63209                               context.loadEntity(entityID, function() {
63210                                   context.enter(modeSelect(context, [entityID]));
63211                               });
63212                           }
63213                       });
63214
63215                   // Replace with friendly name if possible
63216                   // (The entity may not yet be loaded into the graph)
63217                   if (entity) {
63218                       var name = utilDisplayName(entity);  // try to use common name
63219
63220                       if (!name && !isObjectLink) {
63221                           var preset = context.presets().match(entity, context.graph());
63222                           name = preset && !preset.isFallback() && preset.name();  // fallback to preset name
63223                       }
63224
63225                       if (name) {
63226                           this.innerText = name;
63227                       }
63228                   }
63229               });
63230       }
63231
63232
63233       keepRightDetails.error = function(val) {
63234           if (!arguments.length) return _error;
63235           _error = val;
63236           return keepRightDetails;
63237       };
63238
63239
63240       return keepRightDetails;
63241   }
63242
63243   function uiKeepRightEditor$$1(context) {
63244       var dispatch$$1 = dispatch('change');
63245       var keepRightDetails = uiKeepRightDetails(context);
63246       var keepRightHeader = uiKeepRightHeader(context);
63247       var quickLinks = uiQuickLinks();
63248
63249       var _error;
63250
63251
63252       function keepRightEditor(selection$$1) {
63253           // quick links
63254           var choices = [{
63255               id: 'zoom_to',
63256               label: 'inspector.zoom_to.title',
63257               tooltip: function() {
63258                   return uiTooltipHtml(t('inspector.zoom_to.tooltip_issue'), t('inspector.zoom_to.key'));
63259               },
63260               click: function zoomTo() {
63261                   context.mode().zoomToSelected();
63262               }
63263           }];
63264
63265
63266           var header = selection$$1.selectAll('.header')
63267               .data([0]);
63268
63269           var headerEnter = header.enter()
63270               .append('div')
63271               .attr('class', 'header fillL');
63272
63273           headerEnter
63274               .append('button')
63275               .attr('class', 'fr keepRight-editor-close')
63276               .on('click', function() {
63277                   context.enter(modeBrowse(context));
63278               })
63279               .call(svgIcon('#iD-icon-close'));
63280
63281           headerEnter
63282               .append('h3')
63283               .text(t('QA.keepRight.title'));
63284
63285
63286           var body = selection$$1.selectAll('.body')
63287               .data([0]);
63288
63289           body = body.enter()
63290               .append('div')
63291               .attr('class', 'body')
63292               .merge(body);
63293
63294           var editor = body.selectAll('.keepRight-editor')
63295               .data([0]);
63296
63297           editor.enter()
63298               .append('div')
63299               .attr('class', 'modal-section keepRight-editor')
63300               .merge(editor)
63301               .call(keepRightHeader.error(_error))
63302               .call(quickLinks.choices(choices))
63303               .call(keepRightDetails.error(_error))
63304               .call(keepRightSaveSection);
63305
63306
63307           var footer = selection$$1.selectAll('.footer')
63308               .data([0]);
63309
63310           footer.enter()
63311               .append('div')
63312               .attr('class', 'footer')
63313               .merge(footer)
63314               .call(uiViewOnKeepRight(context).what(_error));
63315       }
63316
63317
63318       function keepRightSaveSection(selection$$1) {
63319           var isSelected = (_error && _error.id === context.selectedErrorID());
63320           var isShown = (_error && (isSelected || _error.newComment || _error.comment));
63321           var saveSection = selection$$1.selectAll('.error-save')
63322               .data(
63323                   (isShown ? [_error] : []),
63324                   function(d) { return d.id + '-' + (d.status || 0); }
63325               );
63326
63327           // exit
63328           saveSection.exit()
63329               .remove();
63330
63331           // enter
63332           var saveSectionEnter = saveSection.enter()
63333               .append('div')
63334               .attr('class', 'keepRight-save save-section cf');
63335
63336           saveSectionEnter
63337               .append('h4')
63338               .attr('class', '.error-save-header')
63339               .text(t('QA.keepRight.comment'));
63340
63341           saveSectionEnter
63342               .append('textarea')
63343               .attr('class', 'new-comment-input')
63344               .attr('placeholder', t('QA.keepRight.comment_placeholder'))
63345               .attr('maxlength', 1000)
63346               .property('value', function(d) { return d.newComment || d.comment; })
63347               .call(utilNoAuto)
63348               .on('input', changeInput)
63349               .on('blur', changeInput);
63350
63351           // update
63352           saveSection = saveSectionEnter
63353               .merge(saveSection)
63354               .call(keepRightSaveButtons);
63355
63356
63357           function changeInput() {
63358               var input = select(this);
63359               var val = input.property('value').trim();
63360
63361               if (val === _error.comment) {
63362                   val = undefined;
63363               }
63364
63365               // store the unsaved comment with the error itself
63366               _error = _error.update({ newComment: val });
63367
63368               var keepRight = services.keepRight;
63369               if (keepRight) {
63370                   keepRight.replaceError(_error);  // update keepright cache
63371               }
63372
63373               saveSection
63374                   .call(keepRightSaveButtons);
63375           }
63376       }
63377
63378
63379       function keepRightSaveButtons(selection$$1) {
63380           var isSelected = (_error && _error.id === context.selectedErrorID());
63381           var buttonSection = selection$$1.selectAll('.buttons')
63382               .data((isSelected ? [_error] : []), function(d) { return d.status + d.id; });
63383
63384           // exit
63385           buttonSection.exit()
63386               .remove();
63387
63388           // enter
63389           var buttonEnter = buttonSection.enter()
63390               .append('div')
63391               .attr('class', 'buttons');
63392
63393           buttonEnter
63394               .append('button')
63395               .attr('class', 'button comment-button action')
63396               .text(t('QA.keepRight.save_comment'));
63397
63398           buttonEnter
63399               .append('button')
63400               .attr('class', 'button close-button action');
63401
63402           buttonEnter
63403               .append('button')
63404               .attr('class', 'button ignore-button action');
63405
63406
63407           // update
63408           buttonSection = buttonSection
63409               .merge(buttonEnter);
63410
63411           buttonSection.select('.comment-button')   // select and propagate data
63412               .attr('disabled', function(d) {
63413                   return d.newComment === undefined ? true : null;
63414               })
63415               .on('click.comment', function(d) {
63416                   this.blur();    // avoid keeping focus on the button - #4641
63417                   var keepRight = services.keepRight;
63418                   if (keepRight) {
63419                       keepRight.postKeepRightUpdate(d, function(err, error) {
63420                           dispatch$$1.call('change', error);
63421                       });
63422                   }
63423               });
63424
63425           buttonSection.select('.close-button')   // select and propagate data
63426               .text(function(d) {
63427                   var andComment = (d.newComment !== undefined ? '_comment' : '');
63428                   return t('QA.keepRight.close' + andComment);
63429               })
63430               .on('click.close', function(d) {
63431                   this.blur();    // avoid keeping focus on the button - #4641
63432                   var keepRight = services.keepRight;
63433                   if (keepRight) {
63434                       d.state = 'ignore_t';   // ignore temporarily (error fixed)
63435                       keepRight.postKeepRightUpdate(d, function(err, error) {
63436                           dispatch$$1.call('change', error);
63437                       });
63438                   }
63439               });
63440
63441           buttonSection.select('.ignore-button')   // select and propagate data
63442               .text(function(d) {
63443                   var andComment = (d.newComment !== undefined ? '_comment' : '');
63444                   return t('QA.keepRight.ignore' + andComment);
63445               })
63446               .on('click.ignore', function(d) {
63447                   this.blur();    // avoid keeping focus on the button - #4641
63448                   var keepRight = services.keepRight;
63449                   if (keepRight) {
63450                       d.state = 'ignore';   // ignore permanently (false positive)
63451                       keepRight.postKeepRightUpdate(d, function(err, error) {
63452                           dispatch$$1.call('change', error);
63453                       });
63454                   }
63455               });
63456       }
63457
63458
63459       keepRightEditor.error = function(val) {
63460           if (!arguments.length) return _error;
63461           _error = val;
63462           return keepRightEditor;
63463       };
63464
63465
63466       return utilRebind(keepRightEditor, dispatch$$1, 'on');
63467   }
63468
63469   function uiKeepRightHeader() {
63470       var _error;
63471
63472
63473       function errorTitle(d) {
63474           var unknown = t('inspector.unknown');
63475
63476           if (!d) return unknown;
63477           var errorType = d.error_type;
63478           var parentErrorType = d.parent_error_type;
63479
63480           var et = en.QA.keepRight.errorTypes[errorType];
63481           var pt = en.QA.keepRight.errorTypes[parentErrorType];
63482
63483           if (et && et.title) {
63484               return t('QA.keepRight.errorTypes.' + errorType + '.title');
63485           } else if (pt && pt.title) {
63486               return t('QA.keepRight.errorTypes.' + parentErrorType + '.title');
63487           } else {
63488               return unknown;
63489           }
63490       }
63491
63492
63493       function keepRightHeader(selection) {
63494           var header = selection.selectAll('.kr_error-header')
63495               .data(
63496                   (_error ? [_error] : []),
63497                   function(d) { return d.id + '-' + (d.status || 0); }
63498               );
63499
63500           header.exit()
63501               .remove();
63502
63503           var headerEnter = header.enter()
63504               .append('div')
63505               .attr('class', 'kr_error-header');
63506
63507           var iconEnter = headerEnter
63508               .append('div')
63509               .attr('class', 'kr_error-header-icon')
63510               .classed('new', function(d) { return d.id < 0; });
63511
63512           iconEnter
63513               .append('div')
63514               .attr('class', function(d) {
63515                   return 'preset-icon-28 kr_error kr_error-' + d.id + ' kr_error_type_' + d.parent_error_type;
63516               })
63517               .call(svgIcon('#iD-icon-bolt', 'kr_error-fill'));
63518
63519           headerEnter
63520               .append('div')
63521               .attr('class', 'kr_error-header-label')
63522               .text(errorTitle);
63523       }
63524
63525
63526       keepRightHeader.error = function(val) {
63527           if (!arguments.length) return _error;
63528           _error = val;
63529           return keepRightHeader;
63530       };
63531
63532
63533       return keepRightHeader;
63534   }
63535
63536   function uiLasso(context) {
63537       var group, polygon;
63538
63539       lasso.coordinates = [];
63540
63541       function lasso(selection$$1) {
63542           context.container()
63543               .classed('lasso', true);
63544
63545           group = selection$$1
63546               .append('g')
63547               .attr('class', 'lasso hide');
63548
63549           polygon = group
63550               .append('path')
63551               .attr('class', 'lasso-path');
63552
63553           group
63554               .call(uiToggle(true));
63555       }
63556
63557
63558       function draw() {
63559           if (polygon) {
63560               polygon.data([lasso.coordinates])
63561                   .attr('d', function(d) { return 'M' + d.join(' L') + ' Z'; });
63562           }
63563       }
63564
63565
63566       lasso.extent = function () {
63567           return lasso.coordinates.reduce(function(extent, point$$1) {
63568               return extent.extend(geoExtent$$1(point$$1));
63569           }, geoExtent$$1());
63570       };
63571
63572
63573       lasso.p = function(_) {
63574           if (!arguments.length) return lasso;
63575           lasso.coordinates.push(_);
63576           draw();
63577           return lasso;
63578       };
63579
63580
63581       lasso.close = function() {
63582           if (group) {
63583               group.call(uiToggle(false, function() {
63584                   select(this).remove();
63585               }));
63586           }
63587           context.container().classed('lasso', false);
63588       };
63589
63590
63591       return lasso;
63592   }
63593
63594   function uiNoteComments() {
63595       var _note;
63596
63597
63598       function noteComments(selection$$1) {
63599           if (_note.isNew()) return; // don't draw .comments-container
63600
63601           var comments = selection$$1.selectAll('.comments-container')
63602               .data([0]);
63603
63604           comments = comments.enter()
63605               .append('div')
63606               .attr('class', 'comments-container')
63607               .merge(comments);
63608
63609           var commentEnter = comments.selectAll('.comment')
63610               .data(_note.comments)
63611               .enter()
63612               .append('div')
63613               .attr('class', 'comment');
63614
63615           commentEnter
63616               .append('div')
63617               .attr('class', function(d) { return 'comment-avatar user-' + d.uid; })
63618               .call(svgIcon('#iD-icon-avatar', 'comment-avatar-icon'));
63619
63620           var mainEnter = commentEnter
63621               .append('div')
63622               .attr('class', 'comment-main');
63623
63624           var metadataEnter = mainEnter
63625               .append('div')
63626               .attr('class', 'comment-metadata');
63627
63628           metadataEnter
63629               .append('div')
63630               .attr('class', 'comment-author')
63631               .each(function(d) {
63632                   var selection$$1 = select(this);
63633                   var osm = services.osm;
63634                   if (osm && d.user) {
63635                       selection$$1 = selection$$1
63636                           .append('a')
63637                           .attr('class', 'comment-author-link')
63638                           .attr('href', osm.userURL(d.user))
63639                           .attr('tabindex', -1)
63640                           .attr('target', '_blank');
63641                   }
63642                   selection$$1
63643                       .text(function(d) { return d.user || t('note.anonymous'); });
63644               });
63645
63646           metadataEnter
63647               .append('div')
63648               .attr('class', 'comment-date')
63649               .text(function(d) {
63650                   return t('note.status.' + d.action, { when: localeDateString(d.date) });
63651               });
63652
63653           mainEnter
63654               .append('div')
63655               .attr('class', 'comment-text')
63656               .html(function(d) { return d.html; });
63657
63658           comments
63659               .call(replaceAvatars);
63660       }
63661
63662
63663       function replaceAvatars(selection$$1) {
63664           var osm = services.osm;
63665           if (!osm) return;
63666
63667           var uids = {};  // gather uids in the comment thread
63668           _note.comments.forEach(function(d) {
63669               if (d.uid) uids[d.uid] = true;
63670           });
63671
63672           Object.keys(uids).forEach(function(uid) {
63673               osm.loadUser(uid, function(err, user) {
63674                   if (!user || !user.image_url) return;
63675
63676                   selection$$1.selectAll('.comment-avatar.user-' + uid)
63677                       .html('')
63678                       .append('img')
63679                       .attr('class', 'icon comment-avatar-icon')
63680                       .attr('src', user.image_url)
63681                       .attr('alt', user.display_name);
63682               });
63683           });
63684       }
63685
63686
63687       function localeDateString(s) {
63688           if (!s) return null;
63689           var detected = utilDetect();
63690           var options = { day: 'numeric', month: 'short', year: 'numeric' };
63691           s = s.replace(/-/g, '/'); // fix browser-specific Date() issues
63692           var d = new Date(s);
63693           if (isNaN(d.getTime())) return null;
63694           return d.toLocaleDateString(detected.locale, options);
63695       }
63696
63697
63698       noteComments.note = function(val) {
63699           if (!arguments.length) return _note;
63700           _note = val;
63701           return noteComments;
63702       };
63703
63704
63705       return noteComments;
63706   }
63707
63708   function uiNoteEditor$$1(context) {
63709       var dispatch$$1 = dispatch('change');
63710       var quickLinks = uiQuickLinks();
63711       var noteComments = uiNoteComments();
63712       var noteHeader = uiNoteHeader();
63713
63714       // var formFields = uiFormFields(context);
63715
63716       var _note;
63717       // var _fieldsArr;
63718
63719
63720       function noteEditor(selection$$1) {
63721           // quick links
63722           var choices = [{
63723               id: 'zoom_to',
63724               label: 'inspector.zoom_to.title',
63725               tooltip: function() {
63726                   return uiTooltipHtml(t('inspector.zoom_to.tooltip_note'), t('inspector.zoom_to.key'));
63727               },
63728               click: function zoomTo() {
63729                   context.mode().zoomToSelected();
63730               }
63731           }];
63732
63733
63734           var header = selection$$1.selectAll('.header')
63735               .data([0]);
63736
63737           var headerEnter = header.enter()
63738               .append('div')
63739               .attr('class', 'header fillL');
63740
63741           headerEnter
63742               .append('button')
63743               .attr('class', 'fr note-editor-close')
63744               .on('click', function() {
63745                   context.enter(modeBrowse(context));
63746               })
63747               .call(svgIcon('#iD-icon-close'));
63748
63749           headerEnter
63750               .append('h3')
63751               .text(t('note.title'));
63752
63753
63754           var body = selection$$1.selectAll('.body')
63755               .data([0]);
63756
63757           body = body.enter()
63758               .append('div')
63759               .attr('class', 'body')
63760               .merge(body);
63761
63762           var editor = body.selectAll('.note-editor')
63763               .data([0]);
63764
63765           editor.enter()
63766               .append('div')
63767               .attr('class', 'modal-section note-editor')
63768               .merge(editor)
63769               .call(noteHeader.note(_note))
63770               .call(quickLinks.choices(choices))
63771               .call(noteComments.note(_note))
63772               .call(noteSaveSection);
63773
63774
63775           var footer = selection$$1.selectAll('.footer')
63776               .data([0]);
63777
63778           footer.enter()
63779               .append('div')
63780               .attr('class', 'footer')
63781               .merge(footer)
63782               .call(uiViewOnOSM(context).what(_note))
63783               .call(uiNoteReport(context).note(_note));
63784
63785
63786           // rerender the note editor on any auth change
63787           var osm = services.osm;
63788           if (osm) {
63789               osm.on('change.note-save', function() {
63790                   selection$$1.call(noteEditor);
63791               });
63792           }
63793       }
63794
63795
63796       function noteSaveSection(selection$$1) {
63797           var isSelected = (_note && _note.id === context.selectedNoteID());
63798           var noteSave = selection$$1.selectAll('.note-save')
63799               .data((isSelected ? [_note] : []), function(d) { return d.status + d.id; });
63800
63801           // exit
63802           noteSave.exit()
63803               .remove();
63804
63805           // enter
63806           var noteSaveEnter = noteSave.enter()
63807               .append('div')
63808               .attr('class', 'note-save save-section cf');
63809
63810           // // if new note, show categories to pick from
63811           // if (_note.isNew()) {
63812           //     var presets = context.presets();
63813
63814           //     // NOTE: this key isn't a age and therefore there is no documentation (yet)
63815           //     _fieldsArr = [
63816           //         uiField(context, presets.field('category'), null, { show: true, revert: false }),
63817           //     ];
63818
63819           //     _fieldsArr.forEach(function(field) {
63820           //         field
63821           //             .on('change', changeCategory);
63822           //     });
63823
63824           //     noteSaveEnter
63825           //         .append('div')
63826           //         .attr('class', 'note-category')
63827           //         .call(formFields.fieldsArr(_fieldsArr));
63828           // }
63829
63830           // function changeCategory() {
63831           //     // NOTE: perhaps there is a better way to get value
63832           //     var val = d3_select('input[name=\'category\']:checked').property('__data__') || undefined;
63833
63834           //     // store the unsaved category with the note itself
63835           //     _note = _note.update({ newCategory: val });
63836           //     var osm = services.osm;
63837           //     if (osm) {
63838           //         osm.replaceNote(_note);  // update note cache
63839           //     }
63840           //     noteSave
63841           //         .call(noteSaveButtons);
63842           // }
63843
63844           noteSaveEnter
63845               .append('h4')
63846               .attr('class', '.note-save-header')
63847               .text(function() {
63848                   return _note.isNew() ? t('note.newDescription') : t('note.newComment');
63849               });
63850
63851           noteSaveEnter
63852               .append('textarea')
63853               .attr('class', 'new-comment-input')
63854               .attr('placeholder', t('note.inputPlaceholder'))
63855               .attr('maxlength', 1000)
63856               .property('value', function(d) { return d.newComment; })
63857               .call(utilNoAuto)
63858               .on('keydown.note-input', keydown)
63859               .on('input.note-input', changeInput)
63860               .on('blur.note-input', changeInput);
63861
63862           // update
63863           noteSave = noteSaveEnter
63864               .merge(noteSave)
63865               .call(userDetails)
63866               .call(noteSaveButtons);
63867
63868
63869           // fast submit if user presses cmd+enter
63870           function keydown() {
63871               if (!(event.keyCode === 13 && event.metaKey)) return;
63872
63873               var osm = services.osm;
63874               if (!osm) return;
63875
63876               var hasAuth = osm.authenticated();
63877               if (!hasAuth) return;
63878
63879               if (!_note.newComment) return;
63880
63881               event.preventDefault();
63882
63883               select(this)
63884                   .on('keydown.note-input', null);
63885
63886               // focus on button and submit
63887               window.setTimeout(function() {
63888                   if (_note.isNew()) {
63889                       noteSave.selectAll('.save-button').node().focus();
63890                       clickSave(_note);
63891                   } else  {
63892                       noteSave.selectAll('.comment-button').node().focus();
63893                       clickComment(_note);
63894                   }
63895               }, 10);
63896           }
63897
63898
63899           function changeInput() {
63900               var input = select(this);
63901               var val = input.property('value').trim() || undefined;
63902
63903               // store the unsaved comment with the note itself
63904               _note = _note.update({ newComment: val });
63905
63906               var osm = services.osm;
63907               if (osm) {
63908                   osm.replaceNote(_note);  // update note cache
63909               }
63910
63911               noteSave
63912                   .call(noteSaveButtons);
63913           }
63914       }
63915
63916
63917       function userDetails(selection$$1) {
63918           var detailSection = selection$$1.selectAll('.detail-section')
63919               .data([0]);
63920
63921           detailSection = detailSection.enter()
63922               .append('div')
63923               .attr('class', 'detail-section')
63924               .merge(detailSection);
63925
63926           var osm = services.osm;
63927           if (!osm) return;
63928
63929           // Add warning if user is not logged in
63930           var hasAuth = osm.authenticated();
63931           var authWarning = detailSection.selectAll('.auth-warning')
63932               .data(hasAuth ? [] : [0]);
63933
63934           authWarning.exit()
63935               .transition()
63936               .duration(200)
63937               .style('opacity', 0)
63938               .remove();
63939
63940           var authEnter = authWarning.enter()
63941               .insert('div', '.tag-reference-body')
63942               .attr('class', 'field-warning auth-warning')
63943               .style('opacity', 0);
63944
63945           authEnter
63946               .call(svgIcon('#iD-icon-alert', 'inline'));
63947
63948           authEnter
63949               .append('span')
63950               .text(t('note.login'));
63951
63952           authEnter
63953               .append('a')
63954               .attr('target', '_blank')
63955               .call(svgIcon('#iD-icon-out-link', 'inline'))
63956               .append('span')
63957               .text(t('login'))
63958               .on('click.note-login', function() {
63959                   event.preventDefault();
63960                   osm.authenticate();
63961               });
63962
63963           authEnter
63964               .transition()
63965               .duration(200)
63966               .style('opacity', 1);
63967
63968
63969           var prose = detailSection.selectAll('.note-save-prose')
63970               .data(hasAuth ? [0] : []);
63971
63972           prose.exit()
63973               .remove();
63974
63975           prose = prose.enter()
63976               .append('p')
63977               .attr('class', 'note-save-prose')
63978               .text(t('note.upload_explanation'))
63979               .merge(prose);
63980
63981           osm.userDetails(function(err, user) {
63982               if (err) return;
63983
63984               var userLink = select(document.createElement('div'));
63985
63986               if (user.image_url) {
63987                   userLink
63988                       .append('img')
63989                       .attr('src', user.image_url)
63990                       .attr('class', 'icon pre-text user-icon');
63991               }
63992
63993               userLink
63994                   .append('a')
63995                   .attr('class', 'user-info')
63996                   .text(user.display_name)
63997                   .attr('href', osm.userURL(user.display_name))
63998                   .attr('tabindex', -1)
63999                   .attr('target', '_blank');
64000
64001               prose
64002                   .html(t('note.upload_explanation_with_user', { user: userLink.html() }));
64003           });
64004       }
64005
64006
64007       function noteSaveButtons(selection$$1) {
64008           var osm = services.osm;
64009           var hasAuth = osm && osm.authenticated();
64010
64011           var isSelected = (_note && _note.id === context.selectedNoteID());
64012           var buttonSection = selection$$1.selectAll('.buttons')
64013               .data((isSelected ? [_note] : []), function(d) { return d.status + d.id; });
64014
64015           // exit
64016           buttonSection.exit()
64017               .remove();
64018
64019           // enter
64020           var buttonEnter = buttonSection.enter()
64021               .append('div')
64022               .attr('class', 'buttons');
64023
64024           if (_note.isNew()) {
64025               buttonEnter
64026                   .append('button')
64027                   .attr('class', 'button cancel-button secondary-action')
64028                   .text(t('confirm.cancel'));
64029
64030               buttonEnter
64031                   .append('button')
64032                   .attr('class', 'button save-button action')
64033                   .text(t('note.save'));
64034
64035           } else {
64036               buttonEnter
64037                   .append('button')
64038                   .attr('class', 'button status-button action');
64039
64040               buttonEnter
64041                   .append('button')
64042                   .attr('class', 'button comment-button action')
64043                   .text(t('note.comment'));
64044           }
64045
64046
64047           // update
64048           buttonSection = buttonSection
64049               .merge(buttonEnter);
64050
64051           buttonSection.select('.cancel-button')   // select and propagate data
64052               .on('click.cancel', clickCancel);
64053
64054           buttonSection.select('.save-button')     // select and propagate data
64055               .attr('disabled', isSaveDisabled)
64056               .on('click.save', clickSave);
64057
64058           buttonSection.select('.status-button')   // select and propagate data
64059               .attr('disabled', (hasAuth ? null : true))
64060               .text(function(d) {
64061                   var action = (d.status === 'open' ? 'close' : 'open');
64062                   var andComment = (d.newComment ? '_comment' : '');
64063                   return t('note.' + action + andComment);
64064               })
64065               .on('click.status', clickStatus);
64066
64067           buttonSection.select('.comment-button')   // select and propagate data
64068               .attr('disabled', isSaveDisabled)
64069               .on('click.comment', clickComment);
64070
64071
64072           function isSaveDisabled(d) {
64073               return (hasAuth && d.status === 'open' && d.newComment) ? null : true;
64074           }
64075       }
64076
64077
64078
64079       function clickCancel(d) {
64080           this.blur();    // avoid keeping focus on the button - #4641
64081           var osm = services.osm;
64082           if (osm) {
64083               osm.removeNote(d);
64084           }
64085           context.enter(modeBrowse(context));
64086           dispatch$$1.call('change');
64087       }
64088
64089
64090       function clickSave(d) {
64091           this.blur();    // avoid keeping focus on the button - #4641
64092           var osm = services.osm;
64093           if (osm) {
64094               osm.postNoteCreate(d, function(err, note) {
64095                   dispatch$$1.call('change', note);
64096               });
64097           }
64098       }
64099
64100
64101       function clickStatus(d) {
64102           this.blur();    // avoid keeping focus on the button - #4641
64103           var osm = services.osm;
64104           if (osm) {
64105               var setStatus = (d.status === 'open' ? 'closed' : 'open');
64106               osm.postNoteUpdate(d, setStatus, function(err, note) {
64107                   dispatch$$1.call('change', note);
64108               });
64109           }
64110       }
64111
64112       function clickComment(d) {
64113           this.blur();    // avoid keeping focus on the button - #4641
64114           var osm = services.osm;
64115           if (osm) {
64116               osm.postNoteUpdate(d, d.status, function(err, note) {
64117                   dispatch$$1.call('change', note);
64118               });
64119           }
64120       }
64121
64122
64123       noteEditor.note = function(val) {
64124           if (!arguments.length) return _note;
64125           _note = val;
64126           return noteEditor;
64127       };
64128
64129
64130       return utilRebind(noteEditor, dispatch$$1, 'on');
64131   }
64132
64133   function uiNoteHeader() {
64134       var _note;
64135
64136
64137       function noteHeader(selection) {
64138           var header = selection.selectAll('.note-header')
64139               .data(
64140                   (_note ? [_note] : []),
64141                   function(d) { return d.status + d.id; }
64142               );
64143
64144           header.exit()
64145               .remove();
64146
64147           var headerEnter = header.enter()
64148               .append('div')
64149               .attr('class', 'note-header');
64150
64151           var iconEnter = headerEnter
64152               .append('div')
64153               .attr('class', function(d) { return 'note-header-icon ' + d.status; })
64154               .classed('new', function(d) { return d.id < 0; });
64155
64156           iconEnter
64157               .append('div')
64158               .attr('class', 'preset-icon-28')
64159               .call(svgIcon('#iD-icon-note', 'note-fill'));
64160
64161           iconEnter.each(function(d) {
64162               var statusIcon = '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply'));
64163               iconEnter
64164                   .append('div')
64165                   .attr('class', 'note-icon-annotation')
64166                   .call(svgIcon(statusIcon, 'note-annotation'));
64167           });
64168
64169           headerEnter
64170               .append('div')
64171               .attr('class', 'note-header-label')
64172               .text(function(d) {
64173                   if (_note.isNew()) { return t('note.new'); }
64174                   return t('note.note') + ' ' + d.id + ' ' +
64175                       (d.status === 'closed' ? t('note.closed') : '');
64176               });
64177       }
64178
64179
64180       noteHeader.note = function(val) {
64181           if (!arguments.length) return _note;
64182           _note = val;
64183           return noteHeader;
64184       };
64185
64186
64187       return noteHeader;
64188   }
64189
64190   function uiNoteReport() {
64191       var _note;
64192
64193       function noteReport(selection) {
64194           var url;
64195           if (services.osm && (_note instanceof osmNote) && (!_note.isNew())) {
64196               url = services.osm.noteReportURL(_note);
64197           }
64198
64199           var link = selection.selectAll('.note-report')
64200               .data(url ? [url] : []);
64201
64202           // exit
64203           link.exit()
64204               .remove();
64205
64206           // enter
64207           var linkEnter = link.enter()
64208               .append('a')
64209               .attr('class', 'note-report')
64210               .attr('target', '_blank')
64211               .attr('href', function(d) { return d; })
64212               .call(svgIcon('#iD-icon-out-link', 'inline'));
64213
64214           linkEnter
64215               .append('span')
64216               .text(t('note.report'));
64217       }
64218
64219
64220       noteReport.note = function(val) {
64221           if (!arguments.length) return _note;
64222           _note = val;
64223           return noteReport;
64224       };
64225
64226       return noteReport;
64227   }
64228
64229   function uiRadialMenu(context, operations) {
64230       var menu;
64231       var center = [0, 0];
64232       var tooltip;
64233
64234
64235       var radialMenu = function(selection$$1) {
64236           if (!operations.length) return;
64237
64238           selection$$1.node().parentNode.focus();
64239
64240           function click(operation) {
64241               event.stopPropagation();
64242               if (operation.disabled()) return;
64243               operation();
64244               radialMenu.close();
64245           }
64246
64247           menu = selection$$1
64248               .append('g')
64249               .attr('class', 'radial-menu')
64250               .attr('transform', 'translate(' + center + ')')
64251               .attr('opacity', 0);
64252
64253           menu
64254               .transition()
64255               .attr('opacity', 1);
64256
64257           var r = 50;
64258           var a = Math.PI / 4;
64259           var a0 = -Math.PI / 4;
64260           var a1 = a0 + (operations.length - 1) * a;
64261
64262           menu
64263               .append('path')
64264               .attr('class', 'radial-menu-background')
64265               .attr('d', 'M' + r * Math.sin(a0) + ',' +
64266                                r * Math.cos(a0) +
64267                         ' A' + r + ',' + r + ' 0 ' + (operations.length > 5 ? '1' : '0') + ',0 ' +
64268                                (r * Math.sin(a1) + 1e-3) + ',' +
64269                                (r * Math.cos(a1) + 1e-3)) // Force positive-length path (#1305)
64270               .attr('stroke-width', 50)
64271               .attr('stroke-linecap', 'round');
64272
64273           var button = menu.selectAll()
64274               .data(operations)
64275               .enter()
64276               .append('g')
64277               .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
64278               .classed('disabled', function(d) { return d.disabled(); })
64279               .attr('transform', function(d, i) {
64280                   return 'translate(' + geoVecFloor([
64281                           r * Math.sin(a0 + i * a),
64282                           r * Math.cos(a0 + i * a)]).join(',') + ')';
64283               });
64284
64285           button
64286               .append('circle')
64287               .attr('r', 15)
64288               .on('click', click)
64289               .on('mousedown', mousedown)
64290               .on('mouseover', mouseover)
64291               .on('mouseout', mouseout);
64292
64293           button
64294               .append('use')
64295               .attr('transform', 'translate(-10,-10)')
64296               .attr('width', '20')
64297               .attr('height', '20')
64298               .attr('xlink:href', function(d) { return '#iD-operation-' + d.id; });
64299
64300           tooltip = select(document.body)
64301               .append('div')
64302               .attr('class', 'tooltip-inner radial-menu-tooltip');
64303
64304           function mousedown() {
64305               event.stopPropagation(); // https://github.com/openstreetmap/iD/issues/1869
64306           }
64307
64308           function mouseover(d, i) {
64309               var rect = context.surfaceRect();
64310               var angle = a0 + i * a;
64311               var top = rect.top + (r + 25) * Math.cos(angle) + center[1] + 'px';
64312               var left = rect.left + (r + 25) * Math.sin(angle) + center[0] + 'px';
64313               var bottom = rect.height - (r + 25) * Math.cos(angle) - center[1] + 'px';
64314               var right = rect.width - (r + 25) * Math.sin(angle) - center[0] + 'px';
64315
64316               tooltip
64317                   .style('top', null)
64318                   .style('left', null)
64319                   .style('bottom', null)
64320                   .style('right', null)
64321                   .style('display', 'block')
64322                   .html(uiTooltipHtml(d.tooltip(), d.keys[0]));
64323
64324               if (i === 0) {
64325                   tooltip
64326                       .style('right', right)
64327                       .style('top', top);
64328               } else if (i >= 4) {
64329                   tooltip
64330                       .style('left', left)
64331                       .style('bottom', bottom);
64332               } else {
64333                   tooltip
64334                       .style('left', left)
64335                       .style('top', top);
64336               }
64337           }
64338
64339           function mouseout() {
64340               tooltip.style('display', 'none');
64341           }
64342       };
64343
64344
64345       radialMenu.close = function() {
64346           if (menu) {
64347               menu
64348                   .style('pointer-events', 'none')
64349                   .transition()
64350                   .attr('opacity', 0)
64351                   .remove();
64352           }
64353
64354           if (tooltip) {
64355               tooltip.remove();
64356           }
64357       };
64358
64359
64360       radialMenu.center = function(_) {
64361           if (!arguments.length) return center;
64362           center = _;
64363           return radialMenu;
64364       };
64365
64366
64367       return radialMenu;
64368   }
64369
64370   function uiSelectionList(context, selectedIDs) {
64371
64372       function selectEntity(entity) {
64373           context.enter(modeSelect(context, [entity.id]));
64374       }
64375
64376
64377       function deselectEntity(entity) {
64378           event.stopPropagation();
64379           var index = selectedIDs.indexOf(entity.id);
64380           if (index > -1) {
64381               selectedIDs.splice(index, 1);
64382           }
64383           context.enter(modeSelect(context, selectedIDs));
64384       }
64385
64386
64387       function selectionList(selection$$1) {
64388           selection$$1.classed('selection-list-pane', true);
64389
64390           var header = selection$$1
64391               .append('div')
64392               .attr('class', 'header fillL cf');
64393
64394           header
64395               .append('h3')
64396               .text(t('inspector.multiselect'));
64397
64398           var listWrap = selection$$1
64399               .append('div')
64400               .attr('class', 'inspector-body');
64401
64402           var list = listWrap
64403               .append('div')
64404               .attr('class', 'feature-list cf');
64405
64406           context.history().on('change.selection-list', drawList);
64407           drawList();
64408
64409
64410           function drawList() {
64411               var entities = selectedIDs
64412                   .map(function(id) { return context.hasEntity(id); })
64413                   .filter(function(entity) { return entity; });
64414
64415               var items = list.selectAll('.feature-list-item')
64416                   .data(entities, osmEntity$$1.key);
64417
64418               items.exit()
64419                   .remove();
64420
64421               // Enter
64422               var enter = items.enter()
64423                   .append('div')
64424                   .attr('class', 'feature-list-item')
64425                   .on('click', selectEntity);
64426
64427               enter
64428                   .each(function(d) {
64429                   // highlight the feature in the map while hovering on the list item
64430                   select(this).on('mouseover', function() {
64431                       utilHighlightEntity(d.id, true, context);
64432                   });
64433                   select(this).on('mouseout', function() {
64434                       utilHighlightEntity(d.id, false, context);
64435                   });
64436               });
64437
64438               var label = enter
64439                   .append('button')
64440                   .attr('class', 'label');
64441
64442               enter
64443                   .append('button')
64444                   .attr('class', 'close')
64445                   .on('click', deselectEntity)
64446                   .call(svgIcon('#iD-icon-close'));
64447
64448               label
64449                   .append('span')
64450                   .attr('class', 'entity-geom-icon')
64451                   .call(svgIcon('', 'pre-text'));
64452
64453               label
64454                   .append('span')
64455                   .attr('class', 'entity-type');
64456
64457               label
64458                   .append('span')
64459                   .attr('class', 'entity-name');
64460
64461               // Update
64462               items = items.merge(enter);
64463
64464               items.selectAll('.entity-geom-icon use')
64465                   .attr('href', function() {
64466                       var entity = this.parentNode.parentNode.__data__;
64467                       return '#iD-icon-' + context.geometry(entity.id);
64468                   });
64469
64470               items.selectAll('.entity-type')
64471                   .text(function(entity) { return context.presets().match(entity, context.graph()).name(); });
64472
64473               items.selectAll('.entity-name')
64474                   .text(function(entity) { return utilDisplayName(entity); });
64475           }
64476       }
64477
64478       return selectionList;
64479   }
64480
64481   function uiSourceSwitch(context) {
64482       var keys;
64483
64484
64485       function click() {
64486           event.preventDefault();
64487
64488           var osm = context.connection();
64489           if (!osm) return;
64490
64491           if (context.inIntro()) return;
64492
64493           if (context.history().hasChanges() &&
64494               !window.confirm(t('source_switch.lose_changes'))) return;
64495
64496           var isLive = select(this)
64497               .classed('live');
64498
64499           isLive = !isLive;
64500           context.enter(modeBrowse(context));
64501           context.history().clearSaved();          // remove saved history
64502           context.flush();                         // remove stored data
64503
64504           select(this)
64505               .text(isLive ? t('source_switch.live') : t('source_switch.dev'))
64506               .classed('live', isLive);
64507
64508           osm.switch(isLive ? keys[0] : keys[1]);  // switch connection (warning: dispatches 'change' event)
64509       }
64510
64511       var sourceSwitch = function(selection$$1) {
64512           selection$$1
64513               .append('a')
64514               .attr('href', '#')
64515               .text(t('source_switch.live'))
64516               .classed('live', true)
64517               .attr('tabindex', -1)
64518               .on('click', click);
64519       };
64520
64521
64522       sourceSwitch.keys = function(_) {
64523           if (!arguments.length) return keys;
64524           keys = _;
64525           return sourceSwitch;
64526       };
64527
64528
64529       return sourceSwitch;
64530   }
64531
64532   function uiSuccess$$1(context) {
64533       var MAXEVENTS = 2;
64534
64535       // All else being equal, rank more "social" communities higher
64536       // (anything not in this list receives no adjustment)
64537       var COMMUNITYRANK = {
64538           'meetup': +5,
64539           'slack': +4,
64540           'facebook': +3,
64541           'reddit': +2,
64542           'forum': -2,
64543           'mailinglist': -3,
64544           'irc': -4
64545       };
64546
64547       var detected = utilDetect();
64548       var dispatch$$1 = dispatch('cancel');
64549       var _changeset;
64550       var _location;
64551
64552
64553       // string-to-date parsing in JavaScript is weird
64554       function parseEventDate(when) {
64555           if (!when) return;
64556
64557           var raw = when.trim();
64558           if (!raw) return;
64559
64560           if (!/Z$/.test(raw)) {    // if no trailing 'Z', add one
64561               raw += 'Z';           // this forces date to be parsed as a UTC date
64562           }
64563
64564           var parsed = new Date(raw);
64565           return new Date(parsed.toUTCString().substr(0, 25));  // convert to local timezone
64566       }
64567
64568
64569       function success(selection$$1) {
64570           var header = selection$$1
64571               .append('div')
64572               .attr('class', 'header fillL');
64573
64574           header
64575               .append('button')
64576               .attr('class', 'fr')
64577               .on('click', function() { dispatch$$1.call('cancel'); })
64578               .call(svgIcon('#iD-icon-close'));
64579
64580           header
64581               .append('h3')
64582               .text(t('success.just_edited'));
64583
64584           var body = selection$$1
64585               .append('div')
64586               .attr('class', 'body save-success fillL');
64587
64588           var summary = body
64589               .append('div')
64590               .attr('class', 'save-summary');
64591
64592           summary
64593               .append('h3')
64594               .text(t('success.thank_you' + (_location ? '_location' : ''), { where: _location }));
64595
64596           summary
64597               .append('p')
64598               .text(t('success.help_html'))
64599               .append('a')
64600               .attr('class', 'link-out')
64601               .attr('target', '_blank')
64602               .attr('tabindex', -1)
64603               .attr('href', t('success.help_link_url'))
64604               .call(svgIcon('#iD-icon-out-link', 'inline'))
64605               .append('span')
64606               .text(t('success.help_link_text'));
64607
64608           var osm = context.connection();
64609           if (!osm) return;
64610
64611           var changesetURL = osm.changesetURL(_changeset.id);
64612
64613           var table = summary
64614               .append('table')
64615               .attr('class', 'summary-table');
64616
64617           var row = table
64618               .append('tr')
64619               .attr('class', 'summary-row');
64620
64621           row
64622               .append('td')
64623               .attr('class', 'cell-icon summary-icon')
64624               .append('a')
64625               .attr('target', '_blank')
64626               .attr('href', changesetURL)
64627               .append('svg')
64628               .attr('class', 'logo-small')
64629               .append('use')
64630               .attr('xlink:href', '#iD-logo-osm');
64631
64632           var summaryDetail = row
64633               .append('td')
64634               .attr('class', 'cell-detail summary-detail');
64635
64636           summaryDetail
64637               .append('a')
64638               .attr('class', 'cell-detail summary-view-on-osm')
64639               .attr('target', '_blank')
64640               .attr('href', changesetURL)
64641               .text(t('success.view_on_osm'));
64642
64643           summaryDetail
64644               .append('div')
64645               .text(t('success.changeset_id', { changeset_id: _changeset.id }));
64646
64647
64648           // Gather community polygon IDs intersecting the map..
64649           var matchFeatures = data.community.query(context.map().center(), true) || [];
64650           var matchIDs = matchFeatures.map(function(feature) { return feature.id; });
64651
64652           // Gather community resources that are either global or match a polygon.
64653           var matchResources = filter(data.community.resources, function(v) {
64654               return !v.featureId || matchIDs.indexOf(v.featureId) !== -1;
64655           });
64656
64657           if (matchResources.length) {
64658               // sort by size ascending, then by community rank
64659               matchResources.sort(function(a, b) {
64660                   var aSize = Infinity;
64661                   var bSize = Infinity;
64662                   var aRank = COMMUNITYRANK[a.type] || 0;
64663                   var bRank = COMMUNITYRANK[b.type] || 0;
64664
64665                   if (a.featureId) {
64666                       aSize = data.community.features[a.featureId].properties.area;
64667                   }
64668                   if (b.featureId) {
64669                       bSize = data.community.features[b.featureId].properties.area;
64670                   }
64671
64672                   return aSize < bSize ? -1 : aSize > bSize ? 1 : bRank - aRank;
64673               });
64674
64675               body
64676                   .call(showCommunityLinks, matchResources);
64677           }
64678       }
64679
64680
64681       function showCommunityLinks(selection$$1, matchResources) {
64682           var communityLinks = selection$$1
64683               .append('div')
64684               .attr('class', 'save-communityLinks');
64685
64686           communityLinks
64687               .append('h3')
64688               .text(t('success.like_osm'));
64689
64690           var table = communityLinks
64691               .append('table')
64692               .attr('class', 'community-table');
64693
64694           var row = table.selectAll('.community-row')
64695               .data(matchResources);
64696
64697           var rowEnter = row.enter()
64698               .append('tr')
64699               .attr('class', 'community-row');
64700
64701           rowEnter
64702               .append('td')
64703               .attr('class', 'cell-icon community-icon')
64704               .append('a')
64705               .attr('target', '_blank')
64706               .attr('href', function(d) { return d.url; })
64707               .append('svg')
64708               .attr('class', 'logo-small')
64709               .append('use')
64710               .attr('xlink:href', function(d) { return '#community-' + d.type; });
64711
64712           var communityDetail = rowEnter
64713               .append('td')
64714               .attr('class', 'cell-detail community-detail');
64715
64716           communityDetail
64717               .each(showCommunityDetails);
64718
64719           communityLinks
64720               .append('div')
64721               .attr('class', 'community-missing')
64722               .text(t('success.missing'))
64723               .append('a')
64724               .attr('class', 'link-out')
64725               .attr('target', '_blank')
64726               .attr('tabindex', -1)
64727               .call(svgIcon('#iD-icon-out-link', 'inline'))
64728               .attr('href', 'https://github.com/osmlab/osm-community-index/issues')
64729               .append('span')
64730               .text(t('success.tell_us'));
64731       }
64732
64733
64734       function showCommunityDetails(d) {
64735           var selection$$1 = select(this);
64736           var communityID = d.id;
64737           var replacements = {
64738               url: linkify(d.url),
64739               signupUrl: linkify(d.signupUrl || d.url)
64740           };
64741
64742           selection$$1
64743               .append('div')
64744               .attr('class', 'community-name')
64745               .append('a')
64746               .attr('target', '_blank')
64747               .attr('href', d.url)
64748               .text(t('community.' + d.id + '.name'));
64749
64750           var descriptionHTML = t('community.' + d.id + '.description', replacements);
64751
64752           if (d.type === 'reddit') {   // linkify subreddits  #4997
64753               descriptionHTML = descriptionHTML
64754                   .replace(/(\/r\/\w*\/*)/i, function(match) { return linkify(d.url, match); });
64755           }
64756
64757           selection$$1
64758               .append('div')
64759               .attr('class', 'community-description')
64760               .html(descriptionHTML);
64761
64762           if (d.extendedDescription || (d.languageCodes && d.languageCodes.length)) {
64763               selection$$1
64764                   .append('div')
64765                   .call(uiDisclosure(context, 'community-more-' + d.id, false)
64766                       .expanded(false)
64767                       .updatePreference(false)
64768                       .title(t('success.more'))
64769                       .content(showMore)
64770                   );
64771           }
64772
64773           var nextEvents = (d.events || [])
64774               .map(function(event$$1) {
64775                   event$$1.date = parseEventDate(event$$1.when);
64776                   return event$$1;
64777               })
64778               .filter(function(event$$1) {               // date is valid and future (or today)
64779                   var t$$1 = event$$1.date.getTime();
64780                   var now = (new Date()).setHours(0,0,0,0);
64781                   return !isNaN(t$$1) && t$$1 >= now;
64782               })
64783               .sort(function(a, b) {                  // sort by date ascending
64784                   return a.date < b.date ? -1 : a.date > b.date ? 1 : 0;
64785               })
64786               .slice(0, MAXEVENTS);                   // limit number of events shown
64787
64788           if (nextEvents.length) {
64789               selection$$1
64790                   .append('div')
64791                   .call(uiDisclosure(context, 'community-events-' + d.id, false)
64792                       .expanded(false)
64793                       .updatePreference(false)
64794                       .title(t('success.events'))
64795                       .content(showNextEvents)
64796                   )
64797                   .select('.hide-toggle')
64798                   .append('span')
64799                   .attr('class', 'badge-text')
64800                   .text(nextEvents.length);
64801           }
64802
64803
64804           function showMore(selection$$1) {
64805               var more = selection$$1
64806                   .append('div')
64807                   .attr('class', 'community-more');
64808
64809               if (d.extendedDescription) {
64810                   more
64811                       .append('div')
64812                       .attr('class', 'community-extended-description')
64813                       .html(t('community.' + d.id + '.extendedDescription', replacements));
64814               }
64815
64816               if (d.languageCodes && d.languageCodes.length) {
64817                   more
64818                       .append('div')
64819                       .attr('class', 'community-languages')
64820                       .text(t('success.languages', { languages: d.languageCodes.join(', ') }));
64821               }
64822           }
64823
64824
64825           function showNextEvents(selection$$1) {
64826               var events = selection$$1
64827                   .append('div')
64828                   .attr('class', 'community-events');
64829
64830               var item = events.selectAll('.community-event')
64831                   .data(nextEvents);
64832
64833               var itemEnter = item.enter()
64834                   .append('div')
64835                   .attr('class', 'community-event');
64836
64837               itemEnter
64838                   .append('div')
64839                   .attr('class', 'community-event-name')
64840                   .append('a')
64841                   .attr('target', '_blank')
64842                   .attr('href', function(d) { return d.url; })
64843                   .text(function(d) {
64844                       var name = d.name;
64845                       if (d.i18n && d.id) {
64846                           name = t('community.' + communityID + '.events.' + d.id + '.name', { default: name });
64847                       }
64848                       return name;
64849                   });
64850
64851               itemEnter
64852                   .append('div')
64853                   .attr('class', 'community-event-when')
64854                   .text(function(d) {
64855                       var options = {
64856                           weekday: 'short', day: 'numeric', month: 'short', year: 'numeric'
64857                       };
64858                       if (d.date.getHours() || d.date.getMinutes()) {   // include time if it has one
64859                           options.hour = 'numeric';
64860                           options.minute = 'numeric';
64861                       }
64862                       return d.date.toLocaleString(detected.locale, options);
64863                   });
64864
64865               itemEnter
64866                   .append('div')
64867                   .attr('class', 'community-event-where')
64868                   .text(function(d) {
64869                       var where = d.where;
64870                       if (d.i18n && d.id) {
64871                           where = t('community.' + communityID + '.events.' + d.id + '.where', { default: where });
64872                       }
64873                       return where;
64874                   });
64875
64876               itemEnter
64877                   .append('div')
64878                   .attr('class', 'community-event-description')
64879                   .text(function(d) {
64880                       var description = d.description;
64881                       if (d.i18n && d.id) {
64882                           description = t('community.' + communityID + '.events.' + d.id + '.description', { default: description });
64883                       }
64884                       return description;
64885                   });
64886           }
64887
64888
64889           function linkify(url, text) {
64890               text = text || url;
64891               return '<a target="_blank" href="' + url + '">' + text + '</a>';
64892           }
64893       }
64894
64895
64896       success.changeset = function(_) {
64897           if (!arguments.length) return _changeset;
64898           _changeset = _;
64899           return success;
64900       };
64901
64902
64903       success.location = function(_) {
64904           if (!arguments.length) return _location;
64905           _location = _;
64906           return success;
64907       };
64908
64909
64910       return utilRebind(success, dispatch$$1, 'on');
64911   }
64912
64913   function uiViewOnKeepRight() {
64914       var _error;   // a keepright error
64915
64916
64917       function viewOnKeepRight(selection) {
64918           var url;
64919           if (services.keepRight && (_error instanceof krError)) {
64920               url = services.keepRight.errorURL(_error);
64921           }
64922
64923           var link = selection.selectAll('.view-on-keepRight')
64924               .data(url ? [url] : []);
64925
64926           // exit
64927           link.exit()
64928               .remove();
64929
64930           // enter
64931           var linkEnter = link.enter()
64932               .append('a')
64933               .attr('class', 'view-on-keepRight')
64934               .attr('target', '_blank')
64935               .attr('href', function(d) { return d; })
64936               .call(svgIcon('#iD-icon-out-link', 'inline'));
64937
64938           linkEnter
64939               .append('span')
64940               .text(t('inspector.view_on_keepRight'));
64941       }
64942
64943
64944       viewOnKeepRight.what = function(val) {
64945           if (!arguments.length) return _error;
64946           _error = val;
64947           return viewOnKeepRight;
64948       };
64949
64950       return viewOnKeepRight;
64951   }
64952
64953   function behaviorCopy(context) {
64954
64955       function groupEntities(ids, graph) {
64956           var entities = ids.map(function (id) { return graph.entity(id); });
64957           return assignIn({relation: [], way: [], node: []},
64958               groupBy(entities, function(entity) { return entity.type; }));
64959       }
64960
64961
64962       function getDescendants(id, graph, descendants) {
64963           var entity = graph.entity(id);
64964           var children;
64965
64966           descendants = descendants || {};
64967
64968           if (entity.type === 'relation') {
64969               children = map$3(entity.members, 'id');
64970           } else if (entity.type === 'way') {
64971               children = entity.nodes;
64972           } else {
64973               children = [];
64974           }
64975
64976           for (var i = 0; i < children.length; i++) {
64977               if (!descendants[children[i]]) {
64978                   descendants[children[i]] = true;
64979                   descendants = getDescendants(children[i], graph, descendants);
64980               }
64981           }
64982
64983           return descendants;
64984       }
64985
64986
64987       function getSelectionText() {
64988           return window.getSelection().toString();
64989       }
64990
64991
64992       function doCopy() {
64993           if (!getSelectionText()) {
64994               event.preventDefault();
64995           }
64996
64997           var graph = context.graph();
64998           var selected = groupEntities(context.selectedIDs(), graph);
64999           var canCopy = [];
65000           var skip = {};
65001           var entity;
65002           var i;
65003
65004           for (i = 0; i < selected.relation.length; i++) {
65005               entity = selected.relation[i];
65006               if (!skip[entity.id] && entity.isComplete(graph)) {
65007                   canCopy.push(entity.id);
65008                   skip = getDescendants(entity.id, graph, skip);
65009               }
65010           }
65011           for (i = 0; i < selected.way.length; i++) {
65012               entity = selected.way[i];
65013               if (!skip[entity.id]) {
65014                   canCopy.push(entity.id);
65015                   skip = getDescendants(entity.id, graph, skip);
65016               }
65017           }
65018           for (i = 0; i < selected.node.length; i++) {
65019               entity = selected.node[i];
65020               if (!skip[entity.id]) {
65021                   canCopy.push(entity.id);
65022               }
65023           }
65024
65025           context.copyIDs(canCopy);
65026       }
65027
65028
65029       function behavior() {
65030           context.keybinding().on(uiCmd('⌘C'), doCopy);
65031           return behavior;
65032       }
65033
65034       behavior.off = function() {
65035           context.keybinding().off(uiCmd('⌘C'));
65036       };
65037
65038
65039       return behavior;
65040   }
65041
65042   /*
65043       `behaviorDrag` is like `d3_behavior.drag`, with the following differences:
65044
65045       * The `origin` function is expected to return an [x, y] tuple rather than an
65046         {x, y} object.
65047       * The events are `start`, `move`, and `end`.
65048         (https://github.com/mbostock/d3/issues/563)
65049       * The `start` event is not dispatched until the first cursor movement occurs.
65050         (https://github.com/mbostock/d3/pull/368)
65051       * The `move` event has a `point` and `delta` [x, y] tuple properties rather
65052         than `x`, `y`, `dx`, and `dy` properties.
65053       * The `end` event is not dispatched if no movement occurs.
65054       * An `off` function is available that unbinds the drag's internal event handlers.
65055    */
65056
65057   function behaviorDrag() {
65058       var dispatch$$1 = dispatch('start', 'move', 'end');
65059       var _origin = null;
65060       var _selector = '';
65061       var _event;
65062       var _target;
65063       var _surface;
65064
65065
65066       var d3_event_userSelectProperty = utilPrefixCSSProperty('UserSelect');
65067       var d3_event_userSelectSuppress = function() {
65068               var selection$$1 = selection();
65069               var select$$1 = selection$$1.style(d3_event_userSelectProperty);
65070               selection$$1.style(d3_event_userSelectProperty, 'none');
65071               return function() {
65072                   selection$$1.style(d3_event_userSelectProperty, select$$1);
65073               };
65074           };
65075
65076
65077       function d3_eventCancel() {
65078           event.stopPropagation();
65079           event.preventDefault();
65080       }
65081
65082
65083       function eventOf(thiz, argumentz) {
65084           return function(e1) {
65085               e1.target = behavior;
65086               customEvent(e1, dispatch$$1.apply, dispatch$$1, [e1.type, thiz, argumentz]);
65087           };
65088       }
65089
65090
65091       function dragstart() {
65092           _target = this;
65093           _event = eventOf(_target, arguments);
65094
65095           var eventTarget = event.target;
65096           var touchId = event.touches ? event.changedTouches[0].identifier : null;
65097           var offset;
65098           var startOrigin = point$$1();
65099           var started = false;
65100           var selectEnable = d3_event_userSelectSuppress(touchId !== null ? 'drag-' + touchId : 'drag');
65101
65102           select(window)
65103               .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', dragmove)
65104               .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', dragend, true);
65105
65106           if (_origin) {
65107               offset = _origin.apply(_target, arguments);
65108               offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]];
65109           } else {
65110               offset = [0, 0];
65111           }
65112
65113           if (touchId === null) {
65114               event.stopPropagation();
65115           }
65116
65117
65118           function point$$1() {
65119               var p = _surface || _target.parentNode;
65120               return touchId !== null ? d3_touches(p).filter(function(p) {
65121                   return p.identifier === touchId;
65122               })[0] : mouse(p);
65123           }
65124
65125
65126           function dragmove() {
65127               var p = point$$1();
65128               var dx = p[0] - startOrigin[0];
65129               var dy = p[1] - startOrigin[1];
65130
65131               if (dx === 0 && dy === 0)
65132                   return;
65133
65134               startOrigin = p;
65135               d3_eventCancel();
65136
65137               if (!started) {
65138                   started = true;
65139                   _event({ type: 'start' });
65140               } else {
65141                   _event({
65142                       type: 'move',
65143                       point: [p[0] + offset[0],  p[1] + offset[1]],
65144                       delta: [dx, dy]
65145                   });
65146               }
65147           }
65148
65149
65150           function dragend() {
65151               if (started) {
65152                   _event({ type: 'end' });
65153
65154                   d3_eventCancel();
65155                   if (event.target === eventTarget) {
65156                       select(window)
65157                           .on('click.drag', click, true);
65158                   }
65159               }
65160
65161               select(window)
65162                   .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', null)
65163                   .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', null);
65164
65165               selectEnable();
65166           }
65167
65168
65169           function click() {
65170               d3_eventCancel();
65171               select(window)
65172                   .on('click.drag', null);
65173           }
65174       }
65175
65176
65177       function behavior(selection$$1) {
65178           var matchesSelector = utilPrefixDOMProperty('matchesSelector');
65179           var delegate = dragstart;
65180
65181           if (_selector) {
65182               delegate = function() {
65183                   var root = this;
65184                   var target = event.target;
65185                   for (; target && target !== root; target = target.parentNode) {
65186                       var datum = target.__data__;
65187
65188                       var entity = datum instanceof osmNote ? datum
65189                           : datum && datum.properties && datum.properties.entity;
65190
65191                       if (entity && target[matchesSelector](_selector)) {
65192                           return dragstart.call(target, entity);
65193                       }
65194                   }
65195               };
65196           }
65197
65198           selection$$1
65199               .on('mousedown.drag' + _selector, delegate)
65200               .on('touchstart.drag' + _selector, delegate);
65201       }
65202
65203
65204       behavior.off = function(selection$$1) {
65205           selection$$1
65206               .on('mousedown.drag' + _selector, null)
65207               .on('touchstart.drag' + _selector, null);
65208       };
65209
65210
65211       behavior.selector = function(_) {
65212           if (!arguments.length) return _selector;
65213           _selector = _;
65214           return behavior;
65215       };
65216
65217
65218       behavior.origin = function(_) {
65219           if (!arguments.length) return _origin;
65220           _origin = _;
65221           return behavior;
65222       };
65223
65224
65225       behavior.cancel = function() {
65226           select(window)
65227               .on('mousemove.drag', null)
65228               .on('mouseup.drag', null);
65229           return behavior;
65230       };
65231
65232
65233       behavior.target = function() {
65234           if (!arguments.length) return _target;
65235           _target = arguments[0];
65236           _event = eventOf(_target, Array.prototype.slice.call(arguments, 1));
65237           return behavior;
65238       };
65239
65240
65241       behavior.surface = function() {
65242           if (!arguments.length) return _surface;
65243           _surface = arguments[0];
65244           return behavior;
65245       };
65246
65247
65248       return utilRebind(behavior, dispatch$$1, 'on');
65249   }
65250
65251   function behaviorDrawWay(context, wayId, index, mode, startGraph) {
65252       var origWay = context.entity(wayId);
65253       var annotation = t((origWay.isDegenerate() ?
65254           'operations.start.annotation.' :
65255           'operations.continue.annotation.') + context.geometry(wayId)
65256       );
65257       var behavior = behaviorDraw(context);
65258       var _tempEdits = 0;
65259
65260       var end = osmNode({ loc: context.map().mouseCoordinates() });
65261
65262       // Push an annotated state for undo to return back to.
65263       // We must make sure to remove this edit later.
65264       context.perform(actionNoop(), annotation);
65265       _tempEdits++;
65266
65267       // Add the drawing node to the graph.
65268       // We must make sure to remove this edit later.
65269       context.perform(_actionAddDrawNode());
65270       _tempEdits++;
65271
65272
65273       function keydown() {
65274           if (event.keyCode === utilKeybinding.modifierCodes.alt) {
65275               if (context.surface().classed('nope')) {
65276                   context.surface()
65277                       .classed('nope-suppressed', true);
65278               }
65279               context.surface()
65280                   .classed('nope', false)
65281                   .classed('nope-disabled', true);
65282           }
65283       }
65284
65285
65286       function keyup() {
65287           if (event.keyCode === utilKeybinding.modifierCodes.alt) {
65288               if (context.surface().classed('nope-suppressed')) {
65289                   context.surface()
65290                       .classed('nope', true);
65291               }
65292               context.surface()
65293                   .classed('nope-suppressed', false)
65294                   .classed('nope-disabled', false);
65295           }
65296       }
65297
65298
65299       // related code
65300       // - `mode/drag_node.js`     `doMode()`
65301       // - `behavior/draw.js`      `click()`
65302       // - `behavior/draw_way.js`  `move()`
65303       function move(datum) {
65304           context.surface().classed('nope-disabled', event.altKey);
65305
65306           var targetLoc = datum && datum.properties && datum.properties.entity && datum.properties.entity.loc;
65307           var targetNodes = datum && datum.properties && datum.properties.nodes;
65308           var loc = context.map().mouseCoordinates();
65309
65310           if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
65311               loc = targetLoc;
65312
65313           } else if (targetNodes) {   // snap to way - a line target with `.nodes`
65314               var choice = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
65315               if (choice) {
65316                   loc = choice.loc;
65317               }
65318           }
65319
65320           context.replace(actionMoveNode(end.id, loc));
65321           end = context.entity(end.id);
65322           checkGeometry(false);
65323       }
65324
65325
65326       // Check whether this edit causes the geometry to break.
65327       // If so, class the surface with a nope cursor.
65328       // `finishDraw` - Only checks the relevant line segments if finishing drawing
65329       function checkGeometry(finishDraw) {
65330           var nopeDisabled = context.surface().classed('nope-disabled');
65331           var isInvalid = isInvalidGeometry(end, context.graph(), finishDraw);
65332
65333           if (nopeDisabled) {
65334               context.surface()
65335                   .classed('nope', false)
65336                   .classed('nope-suppressed', isInvalid);
65337           } else {
65338               context.surface()
65339                   .classed('nope', isInvalid)
65340                   .classed('nope-suppressed', false);
65341           }
65342       }
65343
65344
65345       function isInvalidGeometry(entity, graph, finishDraw) {
65346           var parents = graph.parentWays(entity);
65347
65348           for (var i = 0; i < parents.length; i++) {
65349               var parent = parents[i];
65350               var nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
65351
65352               if (origWay.isClosed()) { // Check if Area
65353                   if (finishDraw) {
65354                       nodes.splice(-2, 1);
65355                       entity = nodes[nodes.length-2];
65356                   } else {
65357                       nodes.pop();
65358                   }
65359               } else { // Line
65360                   if (finishDraw) {
65361                       nodes.pop();
65362                   }
65363               }
65364
65365               if (geoHasSelfIntersections(nodes, entity.id)) {
65366                   return true;
65367               }
65368           }
65369
65370           return false;
65371       }
65372
65373
65374       function undone() {
65375           // Undo popped the history back to the initial annotated no-op edit.
65376           // Remove initial no-op edit and whatever edit happened immediately before it.
65377           context.pop(2);
65378           _tempEdits = 0;
65379
65380           if (context.hasEntity(wayId)) {
65381               context.enter(mode);
65382           } else {
65383               context.enter(modeBrowse(context));
65384           }
65385       }
65386
65387
65388       function setActiveElements() {
65389           context.surface().selectAll('.' + end.id)
65390               .classed('active', true);
65391       }
65392
65393
65394       var drawWay = function(surface) {
65395           behavior
65396               .on('move', move)
65397               .on('click', drawWay.add)
65398               .on('clickWay', drawWay.addWay)
65399               .on('clickNode', drawWay.addNode)
65400               .on('undo', context.undo)
65401               .on('cancel', drawWay.cancel)
65402               .on('finish', drawWay.finish);
65403
65404           select(window)
65405               .on('keydown.drawWay', keydown)
65406               .on('keyup.drawWay', keyup);
65407
65408           context.map()
65409               .dblclickEnable(false)
65410               .on('drawn.draw', setActiveElements);
65411
65412           setActiveElements();
65413
65414           surface.call(behavior);
65415
65416           context.history()
65417               .on('undone.draw', undone);
65418       };
65419
65420
65421       drawWay.off = function(surface) {
65422           // Drawing was interrupted unexpectedly.
65423           // This can happen if the user changes modes,
65424           // clicks geolocate button, a hashchange event occurs, etc.
65425           if (_tempEdits) {
65426               context.pop(_tempEdits);
65427               while (context.graph() !== startGraph) {
65428                   context.pop();
65429               }
65430           }
65431
65432           context.map()
65433               .on('drawn.draw', null);
65434
65435           surface.call(behavior.off)
65436               .selectAll('.active')
65437               .classed('active', false);
65438
65439           surface
65440               .classed('nope', false)
65441               .classed('nope-suppressed', false)
65442               .classed('nope-disabled', false);
65443
65444           select(window)
65445               .on('keydown.hover', null)
65446               .on('keyup.hover', null);
65447
65448           context.history()
65449               .on('undone.draw', null);
65450       };
65451
65452
65453       function _actionAddDrawNode() {
65454           return function(graph) {
65455               return graph
65456                   .replace(end)
65457                   .replace(origWay.addNode(end.id, index));
65458           };
65459       }
65460
65461
65462       function _actionReplaceDrawNode(newNode) {
65463           return function(graph) {
65464               return graph
65465                   .replace(origWay.addNode(newNode.id, index))
65466                   .remove(end);
65467           };
65468       }
65469
65470
65471       // Accept the current position of the drawing node and continue drawing.
65472       drawWay.add = function(loc, d) {
65473           if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
65474               return;   // can't click here
65475           }
65476
65477           context.pop(_tempEdits);
65478           _tempEdits = 0;
65479
65480           context.perform(
65481               _actionAddDrawNode(),
65482               annotation
65483           );
65484
65485           checkGeometry(false);   // finishDraw = false
65486           context.enter(mode);
65487       };
65488
65489
65490       // Connect the way to an existing way.
65491       drawWay.addWay = function(loc, edge, d) {
65492           if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
65493               return;   // can't click here
65494           }
65495
65496           context.pop(_tempEdits);
65497           _tempEdits = 0;
65498
65499           context.perform(
65500               _actionAddDrawNode(),
65501               actionAddMidpoint({ loc: loc, edge: edge }, end),
65502               annotation
65503           );
65504
65505           checkGeometry(false);   // finishDraw = false
65506           context.enter(mode);
65507       };
65508
65509
65510       // Connect the way to an existing node and continue drawing.
65511       drawWay.addNode = function(node, d) {
65512           if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
65513               return;   // can't click here
65514           }
65515
65516           context.pop(_tempEdits);
65517           _tempEdits = 0;
65518
65519           context.perform(
65520               _actionReplaceDrawNode(node),
65521               annotation
65522           );
65523
65524           checkGeometry(false);   // finishDraw = false
65525           context.enter(mode);
65526       };
65527
65528
65529       // Finish the draw operation, removing the temporary edits.
65530       // If the way has enough nodes to be valid, it's selected.
65531       // Otherwise, delete everything and return to browse mode.
65532       drawWay.finish = function() {
65533           checkGeometry(true);   // finishDraw = true
65534           if (context.surface().classed('nope')) {
65535               return;   // can't click here
65536           }
65537
65538           context.pop(_tempEdits);
65539           _tempEdits = 0;
65540
65541           var way = context.hasEntity(wayId);
65542           if (!way || way.isDegenerate()) {
65543               drawWay.cancel();
65544               return;
65545           }
65546
65547           window.setTimeout(function() {
65548               context.map().dblclickEnable(true);
65549           }, 1000);
65550           var isNewFeature = !mode.isContinuing;
65551           context.enter(modeSelect(context, [wayId]).newFeature(isNewFeature));
65552       };
65553
65554
65555       // Cancel the draw operation, delete everything, and return to browse mode.
65556       drawWay.cancel = function() {
65557           context.pop(_tempEdits);
65558           _tempEdits = 0;
65559
65560           while (context.graph() !== startGraph) {
65561               context.pop();
65562           }
65563
65564           window.setTimeout(function() {
65565               context.map().dblclickEnable(true);
65566           }, 1000);
65567
65568           context.surface()
65569               .classed('nope', false)
65570               .classed('nope-disabled', false)
65571               .classed('nope-suppressed', false);
65572
65573           context.enter(modeBrowse(context));
65574       };
65575
65576
65577       drawWay.activeID = function() {
65578           if (!arguments.length) return end.id;
65579           // no assign
65580           return drawWay;
65581       };
65582
65583
65584       drawWay.tail = function(text) {
65585           behavior.tail(text);
65586           return drawWay;
65587       };
65588
65589
65590       return drawWay;
65591   }
65592
65593   function behaviorHash(context) {
65594       var s0 = null; // cached window.location.hash
65595       var lat = 90 - 1e-8; // allowable latitude range
65596
65597
65598       var parser = function(map, s) {
65599           var q = utilStringQs(s);
65600           var args = (q.map || '').split('/').map(Number);
65601
65602           if (args.length < 3 || args.some(isNaN)) {
65603               return true; // replace bogus hash
65604
65605           } else if (s !== formatter(map).slice(1)) {   // hash has changed
65606               var mode = context.mode(),
65607                   dist = geoSphericalDistance(map.center(), [args[2], args[1]]),
65608                   maxdist = 500;
65609
65610               // Don't allow the hash location to change too much while drawing
65611               // This can happen if the user accidently hit the back button.  #3996
65612               if (mode && mode.id.match(/^draw/) !== null && dist > maxdist) {
65613                   context.enter(modeBrowse(context));
65614               }
65615
65616               map.centerZoom([args[2], Math.min(lat, Math.max(-lat, args[1]))], args[0]);
65617           }
65618       };
65619
65620
65621       var formatter = function(map) {
65622           var center = map.center();
65623           var zoom = map.zoom();
65624           var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
65625           var q = omit(utilStringQs(window.location.hash.substring(1)),
65626               ['comment', 'source', 'hashtags', 'walkthrough']
65627           );
65628           var newParams = {};
65629
65630           delete q.id;
65631           var selected = context.selectedIDs().filter(function(id) {
65632               return !context.entity(id).isNew();
65633           });
65634           if (selected.length) {
65635               newParams.id = selected.join(',');
65636           }
65637
65638           newParams.map = zoom.toFixed(2) +
65639               '/' + center[1].toFixed(precision) +
65640               '/' + center[0].toFixed(precision);
65641
65642           return '#' + utilQsString(assign(q, newParams), true);
65643       };
65644
65645
65646       function update() {
65647           if (context.inIntro()) return;
65648           var s1 = formatter(context.map());
65649           if (s0 !== s1) {
65650               window.location.replace(s0 = s1);  // don't recenter the map!
65651           }
65652       }
65653
65654
65655       var throttledUpdate = throttle(update, 500);
65656
65657
65658       function hashchange() {
65659           if (window.location.hash === s0) return;  // ignore spurious hashchange events
65660           if (parser(context.map(), (s0 = window.location.hash).substring(1))) {
65661               update(); // replace bogus hash
65662           }
65663       }
65664
65665
65666       function behavior() {
65667           context.map()
65668               .on('move.hash', throttledUpdate);
65669
65670           context
65671               .on('enter.hash', throttledUpdate);
65672
65673           select(window)
65674               .on('hashchange.hash', hashchange);
65675
65676           if (window.location.hash) {
65677               var q = utilStringQs(window.location.hash.substring(1));
65678
65679               if (q.id) {
65680                   context.zoomToEntity(q.id.split(',')[0], !q.map);
65681               }
65682
65683               if (q.comment) {
65684                   context.storage('comment', q.comment);
65685                   context.storage('commentDate', Date.now());
65686               }
65687
65688               if (q.source) {
65689                   context.storage('source', q.source);
65690                   context.storage('commentDate', Date.now());
65691               }
65692
65693               if (q.hashtags) {
65694                   context.storage('hashtags', q.hashtags);
65695               }
65696
65697               if (q.walkthrough === 'true') {
65698                   behavior.startWalkthrough = true;
65699               }
65700
65701               hashchange();
65702
65703               if (q.map) {
65704                   behavior.hadHash = true;
65705               }
65706           }
65707       }
65708
65709
65710       behavior.off = function() {
65711           throttledUpdate.cancel();
65712
65713           context.map()
65714               .on('move.hash', null);
65715
65716           context
65717               .on('enter.hash', null);
65718
65719           select(window)
65720               .on('hashchange.hash', null);
65721
65722           window.location.hash = '';
65723       };
65724
65725
65726       return behavior;
65727   }
65728
65729   function behaviorLasso(context) {
65730
65731       var behavior = function(selection$$1) {
65732           var lasso;
65733
65734
65735           function mousedown() {
65736               var button = 0;  // left
65737               if (event.button === button && event.shiftKey === true) {
65738                   lasso = null;
65739
65740                   select(window)
65741                       .on('mousemove.lasso', mousemove)
65742                       .on('mouseup.lasso', mouseup);
65743
65744                   event.stopPropagation();
65745               }
65746           }
65747
65748
65749           function mousemove() {
65750               if (!lasso) {
65751                   lasso = uiLasso(context);
65752                   context.surface().call(lasso);
65753               }
65754
65755               lasso.p(context.mouse());
65756           }
65757
65758
65759           function normalize(a, b) {
65760               return [
65761                   [Math.min(a[0], b[0]), Math.min(a[1], b[1])],
65762                   [Math.max(a[0], b[0]), Math.max(a[1], b[1])]];
65763           }
65764
65765
65766           function lassoed() {
65767               if (!lasso) return [];
65768
65769               var graph = context.graph();
65770               var bounds = lasso.extent().map(context.projection.invert);
65771               var extent = geoExtent$$1(normalize(bounds[0], bounds[1]));
65772
65773               return map$3(context.intersects(extent).filter(function(entity) {
65774                   return entity.type === 'node' &&
65775                       geoPointInPolygon(context.projection(entity.loc), lasso.coordinates) &&
65776                       !context.features().isHidden(entity, graph, entity.geometry(graph));
65777               }), 'id');
65778           }
65779
65780
65781           function mouseup() {
65782               select(window)
65783                   .on('mousemove.lasso', null)
65784                   .on('mouseup.lasso', null);
65785
65786               if (!lasso) return;
65787
65788               var ids = lassoed();
65789               lasso.close();
65790
65791               if (ids.length) {
65792                   context.enter(modeSelect(context, ids));
65793               }
65794           }
65795
65796           selection$$1
65797               .on('mousedown.lasso', mousedown);
65798       };
65799
65800
65801       behavior.off = function(selection$$1) {
65802           selection$$1.on('mousedown.lasso', null);
65803       };
65804
65805
65806       return behavior;
65807   }
65808
65809   /* Creates a keybinding behavior for an operation */
65810   function behaviorOperation(context) {
65811       var _operation;
65812
65813       function keypress() {
65814           event.preventDefault();
65815           var disabled = _operation.disabled();
65816           var flash;
65817
65818           if (disabled) {
65819               flash = uiFlash()
65820                   .duration(4000)
65821                   .iconName('#iD-operation-' + _operation.id)
65822                   .iconClass('operation disabled')
65823                   .text(_operation.tooltip);
65824
65825               flash();
65826
65827           } else {
65828               flash = uiFlash()
65829                   .duration(2000)
65830                   .iconName('#iD-operation-' + _operation.id)
65831                   .iconClass('operation')
65832                   .text(_operation.annotation() || _operation.title);
65833
65834               flash();
65835               _operation();
65836           }
65837       }
65838
65839
65840       function behavior() {
65841           if (_operation && _operation.available()) {
65842               context.keybinding()
65843                   .on(_operation.keys, keypress);
65844           }
65845
65846           return behavior;
65847       }
65848
65849
65850       behavior.off = function() {
65851           context.keybinding()
65852               .off(_operation.keys);
65853       };
65854
65855
65856       behavior.which = function (_) {
65857           if (!arguments.length) return _operation;
65858           _operation = _;
65859           return behavior;
65860       };
65861
65862
65863       return behavior;
65864   }
65865
65866   /**
65867    * The base implementation of `_.invert` and `_.invertBy` which inverts
65868    * `object` with values transformed by `iteratee` and set by `setter`.
65869    *
65870    * @private
65871    * @param {Object} object The object to iterate over.
65872    * @param {Function} setter The function to set `accumulator` values.
65873    * @param {Function} iteratee The iteratee to transform values.
65874    * @param {Object} accumulator The initial inverted object.
65875    * @returns {Function} Returns `accumulator`.
65876    */
65877   function baseInverter(object, setter, iteratee, accumulator) {
65878     baseForOwn(object, function(value, key, object) {
65879       setter(accumulator, iteratee(value), key, object);
65880     });
65881     return accumulator;
65882   }
65883
65884   /**
65885    * Creates a function like `_.invertBy`.
65886    *
65887    * @private
65888    * @param {Function} setter The function to set accumulator values.
65889    * @param {Function} toIteratee The function to resolve iteratees.
65890    * @returns {Function} Returns the new inverter function.
65891    */
65892   function createInverter(setter, toIteratee) {
65893     return function(object, iteratee) {
65894       return baseInverter(object, setter, toIteratee(iteratee), {});
65895     };
65896   }
65897
65898   /** Used for built-in method references. */
65899   var objectProto$j = Object.prototype;
65900
65901   /**
65902    * Used to resolve the
65903    * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
65904    * of values.
65905    */
65906   var nativeObjectToString$2 = objectProto$j.toString;
65907
65908   /**
65909    * Creates an object composed of the inverted keys and values of `object`.
65910    * If `object` contains duplicate values, subsequent values overwrite
65911    * property assignments of previous values.
65912    *
65913    * @static
65914    * @memberOf _
65915    * @since 0.7.0
65916    * @category Object
65917    * @param {Object} object The object to invert.
65918    * @returns {Object} Returns the new inverted object.
65919    * @example
65920    *
65921    * var object = { 'a': 1, 'b': 2, 'c': 1 };
65922    *
65923    * _.invert(object);
65924    * // => { '1': 'c', '2': 'b' }
65925    */
65926   var invert = createInverter(function(result, value, key) {
65927     if (value != null &&
65928         typeof value.toString != 'function') {
65929       value = nativeObjectToString$2.call(value);
65930     }
65931
65932     result[value] = key;
65933   }, constant$d(identity$8));
65934
65935   /**
65936    * Creates an object with the same keys as `object` and values generated
65937    * by running each own enumerable string keyed property of `object` thru
65938    * `iteratee`. The iteratee is invoked with three arguments:
65939    * (value, key, object).
65940    *
65941    * @static
65942    * @memberOf _
65943    * @since 2.4.0
65944    * @category Object
65945    * @param {Object} object The object to iterate over.
65946    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
65947    * @returns {Object} Returns the new mapped object.
65948    * @see _.mapKeys
65949    * @example
65950    *
65951    * var users = {
65952    *   'fred':    { 'user': 'fred',    'age': 40 },
65953    *   'pebbles': { 'user': 'pebbles', 'age': 1 }
65954    * };
65955    *
65956    * _.mapValues(users, function(o) { return o.age; });
65957    * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
65958    *
65959    * // The `_.property` iteratee shorthand.
65960    * _.mapValues(users, 'age');
65961    * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
65962    */
65963   function mapValues(object, iteratee) {
65964     var result = {};
65965     iteratee = baseIteratee(iteratee, 3);
65966
65967     baseForOwn(object, function(value, key, object) {
65968       baseAssignValue(result, key, iteratee(value, key, object));
65969     });
65970     return result;
65971   }
65972
65973   function behaviorPaste(context) {
65974
65975       function doPaste() {
65976           event.preventDefault();
65977
65978           var baseGraph = context.graph();
65979           var mouse$$1 = context.mouse();
65980           var projection = context.projection;
65981           var viewport = geoExtent$$1(projection.clipExtent()).polygon();
65982
65983           if (!geoPointInPolygon(mouse$$1, viewport)) return;
65984
65985           var extent = geoExtent$$1();
65986           var oldIDs = context.copyIDs();
65987           var oldGraph = context.copyGraph();
65988           var newIDs = [];
65989
65990           if (!oldIDs.length) return;
65991
65992           var action = actionCopyEntities(oldIDs, oldGraph);
65993           context.perform(action);
65994
65995           var copies = action.copies();
65996           var originals = invert(mapValues(copies, 'id'));
65997           for (var id in copies) {
65998               var oldEntity = oldGraph.entity(id);
65999               var newEntity = copies[id];
66000
66001               extent._extend(oldEntity.extent(oldGraph));
66002
66003               // Exclude child nodes from newIDs if their parent way was also copied.
66004               var parents = context.graph().parentWays(newEntity);
66005               var parentCopied = false;
66006               for (var i = 0; i < parents.length; i++) {
66007                   if (originals[parents[i].id]) {
66008                       parentCopied = true;
66009                       break;
66010                   }
66011               }
66012
66013               if (!parentCopied) {
66014                   newIDs.push(newEntity.id);
66015               }
66016           }
66017
66018           // Put pasted objects where mouse pointer is..
66019           var center = projection(extent.center());
66020           var delta = geoVecSubtract(mouse$$1, center);
66021
66022           context.perform(actionMove(newIDs, delta, projection));
66023           context.enter(modeMove$$1(context, newIDs, baseGraph));
66024       }
66025
66026
66027       function behavior() {
66028           context.keybinding().on(uiCmd('⌘V'), doPaste);
66029           return behavior;
66030       }
66031
66032
66033       behavior.off = function() {
66034           context.keybinding().off(uiCmd('⌘V'));
66035       };
66036
66037
66038       return behavior;
66039   }
66040
66041   function behaviorSelect(context) {
66042       var lastMouse = null;
66043       var suppressMenu = true;
66044       var tolerance = 4;
66045       var p1 = null;
66046
66047
66048       function point$$1() {
66049           return mouse(context.container().node());
66050       }
66051
66052
66053       function keydown() {
66054           var e = event;
66055           if (e && e.shiftKey) {
66056               context.surface()
66057                   .classed('behavior-multiselect', true);
66058           }
66059
66060           if (e && e.keyCode === 93) {  // context menu
66061               e.preventDefault();
66062               e.stopPropagation();
66063           }
66064       }
66065
66066
66067       function keyup() {
66068           var e = event;
66069           if (!e || !e.shiftKey) {
66070               context.surface()
66071                   .classed('behavior-multiselect', false);
66072           }
66073
66074
66075           if (e && e.keyCode === 93) {  // context menu
66076               e.preventDefault();
66077               e.stopPropagation();
66078               contextmenu();
66079           }
66080       }
66081
66082
66083       function mousedown() {
66084           if (!p1) p1 = point$$1();
66085           select(window)
66086               .on('mouseup.select', mouseup, true);
66087
66088           var isShowAlways = +context.storage('edit-menu-show-always') === 1;
66089           suppressMenu = !isShowAlways;
66090       }
66091
66092
66093       function mousemove() {
66094           if (event) lastMouse = event;
66095       }
66096
66097
66098       function mouseup() {
66099           click();
66100       }
66101
66102
66103       function contextmenu() {
66104           var e = event;
66105           e.preventDefault();
66106           e.stopPropagation();
66107
66108           if (!+e.clientX && !+e.clientY) {
66109               if (lastMouse) {
66110                   e.sourceEvent = lastMouse;
66111               } else {
66112                   return;
66113               }
66114           }
66115
66116           if (!p1) p1 = point$$1();
66117           suppressMenu = false;
66118           click();
66119       }
66120
66121
66122       function click() {
66123           select(window)
66124               .on('mouseup.select', null, true);
66125
66126           if (!p1) return;
66127           var p2 = point$$1();
66128           var dist = geoVecLength(p1, p2);
66129
66130           p1 = null;
66131           if (dist > tolerance) {
66132               return;
66133           }
66134
66135           var isMultiselect = event.shiftKey || select('#surface .lasso').node();
66136           var isShowAlways = +context.storage('edit-menu-show-always') === 1;
66137           var datum = event.target.__data__ || (lastMouse && lastMouse.target.__data__);
66138           var mode = context.mode();
66139
66140           var entity = datum && datum.properties && datum.properties.entity;
66141           if (entity) datum = entity;
66142
66143           if (datum && datum.type === 'midpoint') {
66144               datum = datum.parents[0];
66145           }
66146
66147           if (datum instanceof osmEntity$$1) {    // clicked an entity..
66148               var selectedIDs = context.selectedIDs();
66149               context.selectedNoteID(null);
66150               context.selectedErrorID(null);
66151
66152               if (!isMultiselect) {
66153                   if (selectedIDs.length > 1 && (!suppressMenu && !isShowAlways)) {
66154                       // multiple things already selected, just show the menu...
66155                       mode.suppressMenu(false).reselect();
66156                   } else {
66157                       // select a single thing..
66158                       context.enter(modeSelect(context, [datum.id]).suppressMenu(suppressMenu));
66159                   }
66160
66161               } else {
66162                   if (selectedIDs.indexOf(datum.id) !== -1) {
66163                       // clicked entity is already in the selectedIDs list..
66164                       if (!suppressMenu && !isShowAlways) {
66165                           // don't deselect clicked entity, just show the menu.
66166                           mode.suppressMenu(false).reselect();
66167                       } else {
66168                           // deselect clicked entity, then reenter select mode or return to browse mode..
66169                           selectedIDs = without(selectedIDs, datum.id);
66170                           context.enter(selectedIDs.length ? modeSelect(context, selectedIDs) : modeBrowse(context));
66171                       }
66172                   } else {
66173                       // clicked entity is not in the selected list, add it..
66174                       selectedIDs = selectedIDs.concat([datum.id]);
66175                       context.enter(modeSelect(context, selectedIDs).suppressMenu(suppressMenu));
66176                   }
66177               }
66178
66179           } else if (datum && datum.__featurehash__ && !isMultiselect) {    // clicked Data..
66180               context
66181                   .selectedNoteID(null)
66182                   .enter(modeSelectData$$1(context, datum));
66183
66184           } else if (datum instanceof osmNote && !isMultiselect) {    // clicked a Note..
66185               context
66186                   .selectedNoteID(datum.id)
66187                   .enter(modeSelectNote$$1(context, datum.id));
66188           } else if (datum instanceof krError & !isMultiselect) {     // clicked a krError error
66189               context
66190                   .selectedErrorID(datum.id)
66191                   .enter(modeSelectError$$1(context, datum.id));
66192           } else {    // clicked nothing..
66193               context.selectedNoteID(null);
66194               context.selectedErrorID(null);
66195               if (!isMultiselect && mode.id !== 'browse') {
66196                   context.enter(modeBrowse(context));
66197               }
66198           }
66199
66200           // reset for next time..
66201           suppressMenu = true;
66202       }
66203
66204
66205       function behavior(selection$$1) {
66206           lastMouse = null;
66207           suppressMenu = true;
66208           p1 = null;
66209
66210           select(window)
66211               .on('keydown.select', keydown)
66212               .on('keyup.select', keyup)
66213               .on('contextmenu.select-window', function() {
66214                   // Edge and IE really like to show the contextmenu on the
66215                   // menubar when user presses a keyboard menu button
66216                   // even after we've already preventdefaulted the key event.
66217                   var e = event;
66218                   if (+e.clientX === 0 && +e.clientY === 0) {
66219                       event.preventDefault();
66220                       event.stopPropagation();
66221                   }
66222               });
66223
66224           selection$$1
66225               .on('mousedown.select', mousedown)
66226               .on('mousemove.select', mousemove)
66227               .on('contextmenu.select', contextmenu);
66228
66229           if (event && event.shiftKey) {
66230               context.surface()
66231                   .classed('behavior-multiselect', true);
66232           }
66233       }
66234
66235
66236       behavior.off = function(selection$$1) {
66237           select(window)
66238               .on('keydown.select', null)
66239               .on('keyup.select', null)
66240               .on('contextmenu.select-window', null)
66241               .on('mouseup.select', null, true);
66242
66243           selection$$1
66244               .on('mousedown.select', null)
66245               .on('mousemove.select', null)
66246               .on('contextmenu.select', null);
66247
66248           context.surface()
66249               .classed('behavior-multiselect', false);
66250       };
66251
66252
66253       return behavior;
66254   }
66255
66256   function modeAddArea$$1(context) {
66257       var mode = {
66258           id: 'add-area',
66259           button: 'area',
66260           title: t('modes.add_area.title'),
66261           description: t('modes.add_area.description'),
66262           key: '3'
66263       };
66264
66265       var behavior = behaviorAddWay(context)
66266           .tail(t('modes.add_area.tail'))
66267           .on('start', start)
66268           .on('startFromWay', startFromWay)
66269           .on('startFromNode', startFromNode);
66270
66271       var defaultTags = { area: 'yes' };
66272
66273
66274       function actionClose(wayId) {
66275           return function (graph) {
66276               return graph.replace(graph.entity(wayId).close());
66277           };
66278       }
66279
66280
66281       function start(loc) {
66282           var startGraph = context.graph();
66283           var node = osmNode({ loc: loc });
66284           var way = osmWay({ tags: defaultTags });
66285
66286           context.perform(
66287               actionAddEntity(node),
66288               actionAddEntity(way),
66289               actionAddVertex(way.id, node.id),
66290               actionClose(way.id)
66291           );
66292
66293           context.enter(modeDrawArea(context, way.id, startGraph));
66294       }
66295
66296
66297       function startFromWay(loc, edge) {
66298           var startGraph = context.graph();
66299           var node = osmNode({ loc: loc });
66300           var way = osmWay({ tags: defaultTags });
66301
66302           context.perform(
66303               actionAddEntity(node),
66304               actionAddEntity(way),
66305               actionAddVertex(way.id, node.id),
66306               actionClose(way.id),
66307               actionAddMidpoint({ loc: loc, edge: edge }, node)
66308           );
66309
66310           context.enter(modeDrawArea(context, way.id, startGraph));
66311       }
66312
66313
66314       function startFromNode(node) {
66315           var startGraph = context.graph();
66316           var way = osmWay({ tags: defaultTags });
66317
66318           context.perform(
66319               actionAddEntity(way),
66320               actionAddVertex(way.id, node.id),
66321               actionClose(way.id)
66322           );
66323
66324           context.enter(modeDrawArea(context, way.id, startGraph));
66325       }
66326
66327
66328       mode.enter = function() {
66329           context.install(behavior);
66330       };
66331
66332
66333       mode.exit = function() {
66334           context.uninstall(behavior);
66335       };
66336
66337
66338       return mode;
66339   }
66340
66341   function modeAddLine$$1(context) {
66342       var mode = {
66343           id: 'add-line',
66344           button: 'line',
66345           title: t('modes.add_line.title'),
66346           description: t('modes.add_line.description'),
66347           key: '2'
66348       };
66349
66350       var behavior = behaviorAddWay(context)
66351           .tail(t('modes.add_line.tail'))
66352           .on('start', start)
66353           .on('startFromWay', startFromWay)
66354           .on('startFromNode', startFromNode);
66355
66356
66357       function start(loc) {
66358           var startGraph = context.graph();
66359           var node = osmNode({ loc: loc });
66360           var way = osmWay();
66361
66362           context.perform(
66363               actionAddEntity(node),
66364               actionAddEntity(way),
66365               actionAddVertex(way.id, node.id)
66366           );
66367
66368           context.enter(modeDrawLine(context, way.id, startGraph));
66369       }
66370
66371
66372       function startFromWay(loc, edge) {
66373           var startGraph = context.graph();
66374           var node = osmNode({ loc: loc });
66375           var way = osmWay();
66376
66377           context.perform(
66378               actionAddEntity(node),
66379               actionAddEntity(way),
66380               actionAddVertex(way.id, node.id),
66381               actionAddMidpoint({ loc: loc, edge: edge }, node)
66382           );
66383
66384           context.enter(modeDrawLine(context, way.id, startGraph));
66385       }
66386
66387
66388       function startFromNode(node) {
66389           var startGraph = context.graph();
66390           var way = osmWay();
66391
66392           context.perform(
66393               actionAddEntity(way),
66394               actionAddVertex(way.id, node.id)
66395           );
66396
66397           context.enter(modeDrawLine(context, way.id, startGraph));
66398       }
66399
66400
66401       mode.enter = function() {
66402           context.install(behavior);
66403       };
66404
66405
66406       mode.exit = function() {
66407           context.uninstall(behavior);
66408       };
66409
66410       return mode;
66411   }
66412
66413   function modeAddPoint$$1(context) {
66414       var mode = {
66415           id: 'add-point',
66416           button: 'point',
66417           title: t('modes.add_point.title'),
66418           description: t('modes.add_point.description'),
66419           key: '1'
66420       };
66421
66422       var behavior = behaviorDraw(context)
66423           .tail(t('modes.add_point.tail'))
66424           .on('click', add)
66425           .on('clickWay', addWay)
66426           .on('clickNode', addNode)
66427           .on('cancel', cancel)
66428           .on('finish', cancel);
66429
66430
66431       function add(loc) {
66432           var node = osmNode({ loc: loc });
66433
66434           context.perform(
66435               actionAddEntity(node),
66436               t('operations.add.annotation.point')
66437           );
66438
66439           context.enter(
66440               modeSelect(context, [node.id]).newFeature(true)
66441           );
66442       }
66443
66444
66445       function addWay(loc, edge) {
66446           var node =  osmNode();
66447
66448           context.perform(
66449               actionAddMidpoint({loc: loc, edge: edge}, node),
66450               t('operations.add.annotation.vertex')
66451           );
66452
66453           context.enter(
66454               modeSelect(context, [node.id]).newFeature(true)
66455           );
66456       }
66457
66458
66459       function addNode(node) {
66460           add(node.loc);
66461       }
66462
66463
66464       function cancel() {
66465           context.enter(modeBrowse(context));
66466       }
66467
66468
66469       mode.enter = function() {
66470           context.install(behavior);
66471       };
66472
66473
66474       mode.exit = function() {
66475           context.uninstall(behavior);
66476       };
66477
66478
66479       return mode;
66480   }
66481
66482   function modeAddNote$$1(context) {
66483       var mode = {
66484           id: 'add-note',
66485           button: 'note',
66486           title: t('modes.add_note.title'),
66487           description: t('modes.add_note.description'),
66488           key: '4'
66489       };
66490
66491       var behavior = behaviorDraw(context)
66492           .tail(t('modes.add_note.tail'))
66493           .on('click', add)
66494           .on('cancel', cancel)
66495           .on('finish', cancel);
66496
66497
66498       function add(loc) {
66499           var osm = services.osm;
66500           if (!osm) return;
66501
66502           var note = osmNote({ loc: loc, status: 'open', comments: [] });
66503           osm.replaceNote(note);
66504
66505           // force a reraw (there is no history change that would otherwise do this)
66506           context.pan([0,0]);
66507
66508           context
66509               .selectedNoteID(note.id)
66510               .enter(modeSelectNote$$1(context, note.id).newFeature(true));
66511       }
66512
66513
66514       function cancel() {
66515           context.enter(modeBrowse(context));
66516       }
66517
66518
66519       mode.enter = function() {
66520           context.install(behavior);
66521       };
66522
66523
66524       mode.exit = function() {
66525           context.uninstall(behavior);
66526       };
66527
66528
66529       return mode;
66530   }
66531
66532   function modeDrawArea(context, wayId, startGraph) {
66533       var mode = {
66534           button: 'area',
66535           id: 'draw-area'
66536       };
66537
66538       var behavior;
66539
66540
66541       mode.enter = function() {
66542           var way = context.entity(wayId);
66543
66544           behavior = behaviorDrawWay(context, wayId, undefined, mode, startGraph)
66545               .tail(t('modes.draw_area.tail'));
66546
66547           var addNode = behavior.addNode;
66548
66549           behavior.addNode = function(node, d) {
66550               var length = way.nodes.length;
66551               var penultimate = length > 2 ? way.nodes[length - 2] : null;
66552
66553               if (node.id === way.first() || node.id === penultimate) {
66554                   behavior.finish();
66555               } else {
66556                   addNode(node, d);
66557               }
66558           };
66559
66560           context.install(behavior);
66561       };
66562
66563
66564       mode.exit = function() {
66565           context.uninstall(behavior);
66566       };
66567
66568
66569       mode.selectedIDs = function() {
66570           return [wayId];
66571       };
66572
66573
66574       mode.activeID = function() {
66575           return (behavior && behavior.activeID()) || [];
66576       };
66577
66578
66579       return mode;
66580   }
66581
66582   function modeDrawLine(context, wayID, startGraph, affix, continuing) {
66583       var mode = {
66584           button: 'line',
66585           id: 'draw-line'
66586       };
66587
66588       var behavior;
66589
66590       mode.isContinuing = continuing;
66591
66592       mode.enter = function() {
66593           var way = context.entity(wayID);
66594           var index = (affix === 'prefix') ? 0 : undefined;
66595           var headID = (affix === 'prefix') ? way.first() : way.last();
66596
66597           behavior = behaviorDrawWay(context, wayID, index, mode, startGraph, continuing)
66598               .tail(t('modes.draw_line.tail'));
66599
66600           var addNode = behavior.addNode;
66601           behavior.addNode = function(node, d) {
66602               if (node.id === headID) {
66603                   behavior.finish();
66604               } else {
66605                   addNode(node, d);
66606               }
66607           };
66608
66609           context.install(behavior);
66610       };
66611
66612
66613       mode.exit = function() {
66614           context.uninstall(behavior);
66615       };
66616
66617
66618       mode.selectedIDs = function() {
66619           return [wayID];
66620       };
66621
66622
66623       mode.activeID = function() {
66624           return (behavior && behavior.activeID()) || [];
66625       };
66626
66627       return mode;
66628   }
66629
66630   function modeMove$$1(context, entityIDs, baseGraph) {
66631       var mode = {
66632           id: 'move',
66633           button: 'browse'
66634       };
66635
66636       var keybinding = utilKeybinding('move');
66637       var behaviors = [
66638           behaviorEdit(context),
66639           operationCircularize(entityIDs, context).behavior,
66640           operationDelete(entityIDs, context).behavior,
66641           operationOrthogonalize(entityIDs, context).behavior,
66642           operationReflectLong(entityIDs, context).behavior,
66643           operationReflectShort(entityIDs, context).behavior,
66644           operationRotate(entityIDs, context).behavior
66645       ];
66646       var annotation = entityIDs.length === 1 ?
66647           t('operations.move.annotation.' + context.geometry(entityIDs[0])) :
66648           t('operations.move.annotation.multiple');
66649
66650       var _prevGraph;
66651       var _cache;
66652       var _origin;
66653       var _nudgeInterval;
66654
66655
66656       function doMove(nudge) {
66657           nudge = nudge || [0, 0];
66658
66659           var fn;
66660           if (_prevGraph !== context.graph()) {
66661               _cache = {};
66662               _origin = context.map().mouseCoordinates();
66663               fn = context.perform;
66664           } else {
66665               fn = context.overwrite;
66666           }
66667
66668           var currMouse = context.mouse();
66669           var origMouse = context.projection(_origin);
66670           var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge);
66671
66672           fn(actionMove(entityIDs, delta, context.projection, _cache), annotation);
66673           _prevGraph = context.graph();
66674       }
66675
66676
66677       function startNudge(nudge) {
66678           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
66679           _nudgeInterval = window.setInterval(function() {
66680               context.pan(nudge);
66681               doMove(nudge);
66682           }, 50);
66683       }
66684
66685
66686       function stopNudge() {
66687           if (_nudgeInterval) {
66688               window.clearInterval(_nudgeInterval);
66689               _nudgeInterval = null;
66690           }
66691       }
66692
66693
66694       function move() {
66695           doMove();
66696           var nudge = geoViewportEdge(context.mouse(), context.map().dimensions());
66697           if (nudge) {
66698               startNudge(nudge);
66699           } else {
66700               stopNudge();
66701           }
66702       }
66703
66704
66705       function finish() {
66706           event.stopPropagation();
66707           context.enter(modeSelect(context, entityIDs));
66708           stopNudge();
66709       }
66710
66711
66712       function cancel() {
66713           if (baseGraph) {
66714               while (context.graph() !== baseGraph) context.pop();
66715               context.enter(modeBrowse(context));
66716           } else {
66717               context.pop();
66718               context.enter(modeSelect(context, entityIDs));
66719           }
66720           stopNudge();
66721       }
66722
66723
66724       function undone() {
66725           context.enter(modeBrowse(context));
66726       }
66727
66728
66729       mode.enter = function() {
66730           _origin = context.map().mouseCoordinates();
66731           _prevGraph = null;
66732           _cache = {};
66733
66734           behaviors.forEach(function(behavior) {
66735               context.install(behavior);
66736           });
66737
66738           context.surface()
66739               .on('mousemove.move', move)
66740               .on('click.move', finish);
66741
66742           context.history()
66743               .on('undone.move', undone);
66744
66745           keybinding
66746               .on('⎋', cancel)
66747               .on('↩', finish);
66748
66749           select(document)
66750               .call(keybinding);
66751       };
66752
66753
66754       mode.exit = function() {
66755           stopNudge();
66756
66757           behaviors.forEach(function(behavior) {
66758               context.uninstall(behavior);
66759           });
66760
66761           context.surface()
66762               .on('mousemove.move', null)
66763               .on('click.move', null);
66764
66765           context.history()
66766               .on('undone.move', null);
66767
66768           select(document)
66769               .call(keybinding.unbind);
66770       };
66771
66772
66773       mode.selectedIDs = function() {
66774           if (!arguments.length) return entityIDs;
66775           // no assign
66776           return mode;
66777       };
66778
66779
66780       return mode;
66781   }
66782
66783   function modeRotate$$1(context, entityIDs) {
66784       var mode = {
66785           id: 'rotate',
66786           button: 'browse'
66787       };
66788
66789       var keybinding = utilKeybinding('rotate');
66790       var behaviors = [
66791           behaviorEdit(context),
66792           operationCircularize(entityIDs, context).behavior,
66793           operationDelete(entityIDs, context).behavior,
66794           operationMove(entityIDs, context).behavior,
66795           operationOrthogonalize(entityIDs, context).behavior,
66796           operationReflectLong(entityIDs, context).behavior,
66797           operationReflectShort(entityIDs, context).behavior
66798       ];
66799       var annotation = entityIDs.length === 1 ?
66800           t('operations.rotate.annotation.' + context.geometry(entityIDs[0])) :
66801           t('operations.rotate.annotation.multiple');
66802
66803       var _prevGraph;
66804       var _prevAngle;
66805       var _prevTransform;
66806       var _pivot;
66807
66808
66809       function doRotate() {
66810           var fn;
66811           if (context.graph() !== _prevGraph) {
66812               fn = context.perform;
66813           } else {
66814               fn = context.replace;
66815           }
66816
66817           // projection changed, recalculate _pivot
66818           var projection = context.projection;
66819           var currTransform = projection.transform();
66820           if (!_prevTransform ||
66821               currTransform.k !== _prevTransform.k ||
66822               currTransform.x !== _prevTransform.x ||
66823               currTransform.y !== _prevTransform.y) {
66824
66825               var nodes = utilGetAllNodes(entityIDs, context.graph());
66826               var points = nodes.map(function(n) { return projection(n.loc); });
66827
66828               if (points.length === 1) {  // degenerate case
66829                   _pivot = points[0];
66830               } else if (points.length === 2) {
66831                   _pivot = geoVecInterp(points[0], points[1], 0.5);
66832               } else {
66833                   _pivot = d3_polygonCentroid(d3_polygonHull(points));
66834               }
66835               _prevAngle = undefined;
66836           }
66837
66838
66839           var currMouse = context.mouse();
66840           var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]);
66841
66842           if (typeof _prevAngle === 'undefined') _prevAngle = currAngle;
66843           var delta = currAngle - _prevAngle;
66844
66845           fn(actionRotate(entityIDs, _pivot, delta, projection), annotation);
66846
66847           _prevTransform = currTransform;
66848           _prevAngle = currAngle;
66849           _prevGraph = context.graph();
66850       }
66851
66852
66853       function finish() {
66854           event.stopPropagation();
66855           context.enter(modeSelect(context, entityIDs));
66856       }
66857
66858
66859       function cancel() {
66860           context.pop();
66861           context.enter(modeSelect(context, entityIDs));
66862       }
66863
66864
66865       function undone() {
66866           context.enter(modeBrowse(context));
66867       }
66868
66869
66870       mode.enter = function() {
66871           behaviors.forEach(context.install);
66872
66873           context.surface()
66874               .on('mousemove.rotate', doRotate)
66875               .on('click.rotate', finish);
66876
66877           context.history()
66878               .on('undone.rotate', undone);
66879
66880           keybinding
66881               .on('⎋', cancel)
66882               .on('↩', finish);
66883
66884           select(document)
66885               .call(keybinding);
66886       };
66887
66888
66889       mode.exit = function() {
66890           behaviors.forEach(context.uninstall);
66891
66892           context.surface()
66893               .on('mousemove.rotate', null)
66894               .on('click.rotate', null);
66895
66896           context.history()
66897               .on('undone.rotate', null);
66898
66899           select(document)
66900               .call(keybinding.unbind);
66901       };
66902
66903
66904       mode.selectedIDs = function() {
66905           if (!arguments.length) return entityIDs;
66906           // no assign
66907           return mode;
66908       };
66909
66910
66911       return mode;
66912   }
66913
66914   var _isSaving = false;
66915
66916
66917   function modeSave$$1(context) {
66918       var mode = { id: 'save' };
66919       var keybinding = utilKeybinding('modeSave');
66920
66921       var loading = uiLoading(context)
66922           .message(t('save.uploading'))
66923           .blocking(true);
66924
66925       var commit = uiCommit(context)
66926           .on('cancel', cancel)
66927           .on('save', save);
66928
66929       var _toCheck = [];
66930       var _toLoad = [];
66931       var _loaded = {};
66932       var _toLoadCount = 0;
66933       var _toLoadTotal = 0;
66934
66935       var _conflicts = [];
66936       var _errors = [];
66937       var _origChanges;
66938       var _location;
66939
66940
66941       function cancel(selectedID) {
66942           if (selectedID) {
66943               context.enter(modeSelect(context, [selectedID]));
66944           } else {
66945               context.enter(modeBrowse(context));
66946           }
66947       }
66948
66949
66950       function save(changeset, tryAgain, checkConflicts) {
66951           // Guard against accidentally entering save code twice - #4641
66952           if (_isSaving && !tryAgain) {
66953               return;
66954           }
66955
66956           var osm = context.connection();
66957           if (!osm) {
66958               cancel();
66959               return;
66960           }
66961
66962           // If user somehow got logged out mid-save, try to reauthenticate..
66963           // This can happen if they were logged in from before, but the tokens are no longer valid.
66964           if (!osm.authenticated()) {
66965               osm.authenticate(function(err) {
66966                   if (err) {
66967                       cancel();   // quit save mode..
66968                   } else {
66969                       save(changeset, tryAgain, checkConflicts);  // continue where we left off..
66970                   }
66971               });
66972               return;
66973           }
66974
66975           if (!_isSaving) {
66976               keybindingOff();
66977               context.container().call(loading);  // block input
66978               _isSaving = true;
66979           }
66980
66981           var history = context.history();
66982           var localGraph = context.graph();
66983           var remoteGraph = coreGraph$$1(history.base(), true);
66984
66985           _conflicts = [];
66986           _errors = [];
66987
66988           // Store original changes, in case user wants to download them as an .osc file
66989           _origChanges = history.changes(actionDiscardTags(history.difference()));
66990
66991           // First time, `history.perform` a no-op action.
66992           // Any conflict resolutions will be done as `history.replace`
66993           if (!tryAgain) {
66994               history.perform(actionNoop());
66995           }
66996
66997           // Attempt a fast upload.. If there are conflicts, re-enter with `checkConflicts = true`
66998           if (!checkConflicts) {
66999               upload(changeset);
67000
67001           // Do the full (slow) conflict check..
67002           } else {
67003               var modified = filter(history.difference().summary(), { changeType: 'modified' });
67004               _toCheck = map$3(map$3(modified, 'entity'), 'id');
67005               _toLoad = withChildNodes(_toCheck, localGraph);
67006               _loaded = {};
67007               _toLoadCount = 0;
67008               _toLoadTotal = _toLoad.length;
67009
67010               if (_toCheck.length) {
67011                   showProgress(_toLoadCount, _toLoadTotal);
67012                   _toLoad.forEach(function(id) { _loaded[id] = false; });
67013                   osm.loadMultiple(_toLoad, loaded);
67014               } else {
67015                   upload(changeset);
67016               }
67017           }
67018
67019           return;
67020
67021
67022           function withChildNodes(ids, graph) {
67023               return uniq(reduce(ids, function(result, id) {
67024                   var entity = graph.entity(id);
67025                   if (entity.type === 'way') {
67026                       try {
67027                           var children = graph.childNodes(entity);
67028                           result.push.apply(result, map$3(filter(children, 'version'), 'id'));
67029                       } catch (err) {
67030                           /* eslint-disable no-console */
67031                           if (typeof console !== 'undefined') console.error(err);
67032                           /* eslint-enable no-console */
67033                       }
67034                   }
67035                   return result;
67036               }, clone(ids)));
67037           }
67038
67039
67040           // Reload modified entities into an alternate graph and check for conflicts..
67041           function loaded(err, result) {
67042               if (_errors.length) return;
67043
67044               if (err) {
67045                   _errors.push({
67046                       msg: err.message || err.responseText,
67047                       details: [ t('save.status_code', { code: err.status }) ]
67048                   });
67049                   showErrors();
67050
67051               } else {
67052                   var loadMore = [];
67053
67054                   result.data.forEach(function(entity) {
67055                       remoteGraph.replace(entity);
67056                       _loaded[entity.id] = true;
67057                       _toLoad = without(_toLoad, entity.id);
67058
67059                       if (!entity.visible) return;
67060
67061                       // Because loadMultiple doesn't download /full like loadEntity,
67062                       // need to also load children that aren't already being checked..
67063                       var i, id;
67064                       if (entity.type === 'way') {
67065                           for (i = 0; i < entity.nodes.length; i++) {
67066                               id = entity.nodes[i];
67067                               if (_loaded[id] === undefined) {
67068                                   _loaded[id] = false;
67069                                   loadMore.push(id);
67070                               }
67071                           }
67072                       } else if (entity.type === 'relation' && entity.isMultipolygon()) {
67073                           for (i = 0; i < entity.members.length; i++) {
67074                               id = entity.members[i].id;
67075                               if (_loaded[id] === undefined) {
67076                                   _loaded[id] = false;
67077                                   loadMore.push(id);
67078                               }
67079                           }
67080                       }
67081                   });
67082
67083                   _toLoadCount += result.data.length;
67084                   _toLoadTotal += loadMore.length;
67085                   showProgress(_toLoadCount, _toLoadTotal);
67086
67087                   if (loadMore.length) {
67088                       _toLoad.push.apply(_toLoad, loadMore);
67089                       osm.loadMultiple(loadMore, loaded);
67090                   }
67091
67092                   if (!_toLoad.length) {
67093                       detectConflicts();
67094                   }
67095               }
67096           }
67097
67098
67099           function detectConflicts() {
67100               function choice(id, text, action) {
67101                   return { id: id, text: text, action: function() { history.replace(action); } };
67102               }
67103               function formatUser(d) {
67104                   return '<a href="' + osm.userURL(d) + '" target="_blank">' + d + '</a>';
67105               }
67106               function entityName(entity) {
67107                   return utilDisplayName(entity) || (utilDisplayType(entity.id) + ' ' + entity.id);
67108               }
67109
67110               function sameVersions(local$$1, remote) {
67111                   if (local$$1.version !== remote.version) return false;
67112
67113                   if (local$$1.type === 'way') {
67114                       var children = union(local$$1.nodes, remote.nodes);
67115                       for (var i = 0; i < children.length; i++) {
67116                           var a = localGraph.hasEntity(children[i]);
67117                           var b = remoteGraph.hasEntity(children[i]);
67118                           if (a && b && a.version !== b.version) return false;
67119                       }
67120                   }
67121
67122                   return true;
67123               }
67124
67125               _toCheck.forEach(function(id) {
67126                   var local$$1 = localGraph.entity(id);
67127                   var remote = remoteGraph.entity(id);
67128
67129                   if (sameVersions(local$$1, remote)) return;
67130
67131                   var action = actionMergeRemoteChanges;
67132                   var merge = action(id, localGraph, remoteGraph, formatUser);
67133
67134                   history.replace(merge);
67135
67136                   var mergeConflicts = merge.conflicts();
67137                   if (!mergeConflicts.length) return;  // merged safely
67138
67139                   var forceLocal = action(id, localGraph, remoteGraph).withOption('force_local');
67140                   var forceRemote = action(id, localGraph, remoteGraph).withOption('force_remote');
67141                   var keepMine = t('save.conflict.' + (remote.visible ? 'keep_local' : 'restore'));
67142                   var keepTheirs = t('save.conflict.' + (remote.visible ? 'keep_remote' : 'delete'));
67143
67144                   _conflicts.push({
67145                       id: id,
67146                       name: entityName(local$$1),
67147                       details: mergeConflicts,
67148                       chosen: 1,
67149                       choices: [
67150                           choice(id, keepMine, forceLocal),
67151                           choice(id, keepTheirs, forceRemote)
67152                       ]
67153                   });
67154               });
67155
67156               upload(changeset);
67157           }
67158       }
67159
67160
67161       function upload(changeset) {
67162           var osm = context.connection();
67163           if (!osm) {
67164               _errors.push({ msg: 'No OSM Service' });
67165           }
67166
67167           if (_conflicts.length) {
67168               _conflicts.sort(function(a, b) { return b.id.localeCompare(a.id); });
67169               showConflicts(changeset);
67170
67171           } else if (_errors.length) {
67172               showErrors();
67173
67174           } else {
67175               var history = context.history();
67176               var changes = history.changes(actionDiscardTags(history.difference()));
67177               if (changes.modified.length || changes.created.length || changes.deleted.length) {
67178                   loadLocation();  // so it is ready when we display the save screen
67179                   osm.putChangeset(changeset, changes, uploadCallback);
67180               } else {        // changes were insignificant or reverted by user
67181                   select('.inspector-wrap *').remove();
67182                   loading.close();
67183                   _isSaving = false;
67184                   context.flush();
67185                   cancel();
67186               }
67187           }
67188       }
67189
67190
67191       function uploadCallback(err, changeset) {
67192           if (err) {
67193               if (err.status === 409) {          // 409 Conflict
67194                   save(changeset, true, true);   // tryAgain = true, checkConflicts = true
67195               } else {
67196                   _errors.push({
67197                       msg: err.message || err.responseText,
67198                       details: [ t('save.status_code', { code: err.status }) ]
67199                   });
67200                   showErrors();
67201               }
67202
67203           } else {
67204               context.history().clearSaved();
67205               success(changeset);
67206               // Add delay to allow for postgres replication #1646 #2678
67207               window.setTimeout(function() {
67208                   select('.inspector-wrap *').remove();
67209                   loading.close();
67210                   _isSaving = false;
67211                   context.flush();
67212               }, 2500);
67213           }
67214       }
67215
67216
67217       function showProgress(num, total) {
67218           var modal = context.container().select('.loading-modal .modal-section');
67219           var progress = modal.selectAll('.progress')
67220               .data([0]);
67221
67222           // enter/update
67223           progress.enter()
67224               .append('div')
67225               .attr('class', 'progress')
67226               .merge(progress)
67227               .text(t('save.conflict_progress', { num: num, total: total }));
67228       }
67229
67230
67231       function showConflicts(changeset) {
67232           var history = context.history();
67233           var selection$$1 = context.container()
67234               .select('#sidebar')
67235               .append('div')
67236               .attr('class','sidebar-component');
67237
67238           loading.close();
67239           _isSaving = false;
67240
67241           var ui = uiConflicts(context)
67242               .conflictList(_conflicts)
67243               .origChanges(_origChanges)
67244               .on('cancel', function() {
67245                   history.pop();
67246                   selection$$1.remove();
67247                   keybindingOn();
67248               })
67249               .on('save', function() {
67250                   for (var i = 0; i < _conflicts.length; i++) {
67251                       if (_conflicts[i].chosen === 1) {  // user chose "keep theirs"
67252                           var entity = context.hasEntity(_conflicts[i].id);
67253                           if (entity && entity.type === 'way') {
67254                               var children = uniq(entity.nodes);
67255                               for (var j = 0; j < children.length; j++) {
67256                                   history.replace(actionRevert(children[j]));
67257                               }
67258                           }
67259                           history.replace(actionRevert(_conflicts[i].id));
67260                       }
67261                   }
67262
67263                   selection$$1.remove();
67264                   save(changeset, true, false);  // tryAgain = true, checkConflicts = false
67265               });
67266
67267           selection$$1.call(ui);
67268       }
67269
67270
67271       function showErrors() {
67272           keybindingOn();
67273           context.history().pop();
67274           loading.close();
67275           _isSaving = false;
67276
67277           var selection$$1 = uiConfirm(context.container());
67278           selection$$1
67279               .select('.modal-section.header')
67280               .append('h3')
67281               .text(t('save.error'));
67282
67283           addErrors(selection$$1, _errors);
67284           selection$$1.okButton();
67285       }
67286
67287
67288       function addErrors(selection$$1, data) {
67289           var message = selection$$1
67290               .select('.modal-section.message-text');
67291
67292           var items = message
67293               .selectAll('.error-container')
67294               .data(data);
67295
67296           var enter = items.enter()
67297               .append('div')
67298               .attr('class', 'error-container');
67299
67300           enter
67301               .append('a')
67302               .attr('class', 'error-description')
67303               .attr('href', '#')
67304               .classed('hide-toggle', true)
67305               .text(function(d) { return d.msg || t('save.unknown_error_details'); })
67306               .on('click', function() {
67307                   event.preventDefault();
67308
67309                   var error = select(this);
67310                   var detail = select(this.nextElementSibling);
67311                   var exp = error.classed('expanded');
67312
67313                   detail.style('display', exp ? 'none' : 'block');
67314                   error.classed('expanded', !exp);
67315               });
67316
67317           var details = enter
67318               .append('div')
67319               .attr('class', 'error-detail-container')
67320               .style('display', 'none');
67321
67322           details
67323               .append('ul')
67324               .attr('class', 'error-detail-list')
67325               .selectAll('li')
67326               .data(function(d) { return d.details || []; })
67327               .enter()
67328               .append('li')
67329               .attr('class', 'error-detail-item')
67330               .text(function(d) { return d; });
67331
67332           items.exit()
67333               .remove();
67334       }
67335
67336
67337       function success(changeset) {
67338           commit.reset();
67339
67340           var ui = uiSuccess$$1(context)
67341               .changeset(changeset)
67342               .location(_location)
67343               .on('cancel', function() { context.ui().sidebar.hide(); });
67344
67345           context.enter(modeBrowse(context).sidebar(ui));
67346       }
67347
67348
67349       function keybindingOn() {
67350           select(document)
67351               .call(keybinding.on('⎋', cancel, true));
67352       }
67353
67354
67355       function keybindingOff() {
67356           select(document)
67357               .call(keybinding.unbind);
67358       }
67359
67360
67361       // Reverse geocode current map location so we can display a message on
67362       // the success screen like "Thank you for editing around city, state."
67363       function loadLocation() {
67364           _location = null;
67365           if (!services.geocoder) return;
67366
67367           services.geocoder.reverse(context.map().center(), function(err, result) {
67368               if (err || !result || !result.address) return;
67369
67370               var parts = [];
67371               var addr = result.address;
67372               var city = addr && (addr.town || addr.city || addr.county);
67373               if (city) parts.push(city);
67374               var region = addr && (addr.state || addr.country);
67375               if (region) parts.push(region);
67376
67377               _location = parts.join(', ');
67378           });
67379       }
67380
67381
67382       mode.enter = function() {
67383           // Show sidebar
67384           context.ui().sidebar.expand();
67385
67386           function done() {
67387               context.ui().sidebar.show(commit);
67388           }
67389
67390           keybindingOn();
67391
67392           context.container().selectAll('#content')
67393               .attr('class', 'inactive');
67394
67395           var osm = context.connection();
67396           if (!osm) {
67397               cancel();
67398               return;
67399           }
67400
67401           if (osm.authenticated()) {
67402               done();
67403           } else {
67404               osm.authenticate(function(err) {
67405                   if (err) {
67406                       cancel();
67407                   } else {
67408                       done();
67409                   }
67410               });
67411           }
67412       };
67413
67414
67415       mode.exit = function() {
67416           _isSaving = false;
67417
67418           keybindingOff();
67419
67420           context.container().selectAll('#content')
67421               .attr('class', 'active');
67422
67423           context.ui().sidebar.hide();
67424       };
67425
67426       return mode;
67427   }
67428
67429   var _relatedParent;
67430
67431
67432   function modeSelect(context, selectedIDs) {
67433       var mode = {
67434           id: 'select',
67435           button: 'browse'
67436       };
67437
67438       var keybinding = utilKeybinding('select');
67439       var timeout = null;
67440       var behaviors = [
67441           behaviorCopy(context),
67442           behaviorPaste(context),
67443           behaviorBreathe(context),
67444           behaviorHover(context),
67445           behaviorSelect(context),
67446           behaviorLasso(context),
67447           modeDragNode$$1(context).restoreSelectedIDs(selectedIDs).behavior,
67448           modeDragNote$$1(context).behavior
67449       ];
67450       var editMenu;
67451       var newFeature = false;
67452       var suppressMenu = true;
67453       var follow = false;
67454
67455
67456       var wrap = context.container()
67457           .select('.inspector-wrap');
67458
67459
67460       function singular() {
67461           if (selectedIDs.length === 1) {
67462               return context.hasEntity(selectedIDs[0]);
67463           }
67464       }
67465
67466
67467       function checkSelectedIDs() {
67468           var ids = [];
67469           if (Array.isArray(selectedIDs)) {
67470               ids = selectedIDs.filter(function(id) {
67471                   return context.hasEntity(id);
67472               });
67473           }
67474
67475           if (ids.length) {
67476               selectedIDs = ids;
67477           } else {
67478               context.enter(modeBrowse(context));
67479           }
67480           return !!ids.length;
67481       }
67482
67483
67484       // find the common parent ways for nextVertex, previousVertex
67485       function commonParents() {
67486           var graph = context.graph();
67487           var commonParents = [];
67488
67489           for (var i = 0; i < selectedIDs.length; i++) {
67490               var entity = context.hasEntity(selectedIDs[i]);
67491               if (!entity || entity.geometry(graph) !== 'vertex') {
67492                   return [];  // selection includes some not vertexes
67493               }
67494
67495               var currParents = map$3(graph.parentWays(entity), 'id');
67496               if (!commonParents.length) {
67497                   commonParents = currParents;
67498                   continue;
67499               }
67500
67501               commonParents = intersection(commonParents, currParents);
67502               if (!commonParents.length) {
67503                   return [];
67504               }
67505           }
67506
67507           return commonParents;
67508       }
67509
67510
67511       function singularParent() {
67512           var parents = commonParents();
67513           if (!parents || parents.length === 0) {
67514               _relatedParent = null;
67515               return null;
67516           }
67517
67518           // relatedParent is used when we visit a vertex with multiple
67519           // parents, and we want to remember which parent line we started on.
67520
67521           if (parents.length === 1) {
67522               _relatedParent = parents[0];  // remember this parent for later
67523               return _relatedParent;
67524           }
67525
67526           if (parents.indexOf(_relatedParent) !== -1) {
67527               return _relatedParent;   // prefer the previously seen parent
67528           }
67529
67530           return parents[0];
67531       }
67532
67533
67534       function closeMenu() {
67535           if (editMenu) {
67536               context.surface().call(editMenu.close);
67537           }
67538       }
67539
67540
67541       function positionMenu() {
67542           if (!editMenu) { return; }
67543
67544           var entity = singular();
67545           if (entity && context.geometry(entity.id) === 'relation') {
67546               suppressMenu = true;
67547           } else {
67548               var point$$1 = context.mouse();
67549               var viewport = geoExtent$$1(context.projection.clipExtent()).polygon();
67550
67551               if (point$$1 && geoPointInPolygon(point$$1, viewport)) {
67552                   editMenu.center(point$$1);
67553               } else {
67554                   suppressMenu = true;
67555               }
67556           }
67557       }
67558
67559
67560       function showMenu() {
67561           closeMenu();
67562           if (editMenu) {
67563               context.surface().call(editMenu);
67564           }
67565       }
67566
67567
67568       function toggleMenu() {
67569           // deprecation warning - Radial Menu to be removed in iD v3
67570           if (select('.edit-menu, .radial-menu').empty()) {
67571               positionMenu();
67572               showMenu();
67573           } else {
67574               closeMenu();
67575           }
67576       }
67577
67578
67579       mode.selectedIDs = function() {
67580           return selectedIDs;
67581       };
67582
67583
67584       mode.zoomToSelected = function() {
67585           var entity = singular();
67586           if (entity) {
67587               context.map().zoomToEase(entity);
67588           }
67589       };
67590
67591
67592       mode.reselect = function() {
67593           if (!checkSelectedIDs()) return;
67594
67595           var surfaceNode = context.surface().node();
67596           if (surfaceNode.focus) {   // FF doesn't support it
67597               surfaceNode.focus();
67598           }
67599
67600           positionMenu();
67601           if (!suppressMenu) {
67602               showMenu();
67603           }
67604       };
67605
67606
67607       mode.newFeature = function(_) {
67608           if (!arguments.length) return newFeature;
67609           newFeature = _;
67610           return mode;
67611       };
67612
67613
67614       mode.suppressMenu = function(_) {
67615           if (!arguments.length) return suppressMenu;
67616           suppressMenu = _;
67617           return mode;
67618       };
67619
67620
67621       mode.follow = function(_) {
67622           if (!arguments.length) return follow;
67623           follow = _;
67624           return mode;
67625       };
67626
67627
67628       mode.enter = function() {
67629           if (!checkSelectedIDs()) return;
67630
67631           var operations = without(values$1(Operations), operationDelete)
67632               .map(function(o) { return o(selectedIDs, context); })
67633               .filter(function(o) { return o.available(); });
67634
67635           // deprecation warning - Radial Menu to be removed in iD v3
67636           var isRadialMenu = context.storage('edit-menu-style') === 'radial';
67637           if (isRadialMenu) {
67638               operations = operations.slice(0,7);
67639               operations.unshift(operationDelete(selectedIDs, context));
67640           } else {
67641               operations.push(operationDelete(selectedIDs, context));
67642           }
67643
67644           operations.forEach(function(operation) {
67645               if (operation.behavior) {
67646                   behaviors.push(operation.behavior);
67647               }
67648           });
67649
67650           behaviors.forEach(context.install);
67651
67652           keybinding
67653               .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
67654               .on(['[', 'pgup'], previousVertex)
67655               .on([']', 'pgdown'], nextVertex)
67656               .on(['{', uiCmd('⌘['), 'home'], firstVertex)
67657               .on(['}', uiCmd('⌘]'), 'end'], lastVertex)
67658               .on(['\\', 'pause'], nextParent)
67659               .on('⎋', esc, true)
67660               .on('space', toggleMenu);
67661
67662           select(document)
67663               .call(keybinding);
67664
67665
67666           // deprecation warning - Radial Menu to be removed in iD v3
67667           editMenu = isRadialMenu
67668               ? uiRadialMenu(context, operations)
67669               : uiEditMenu(context, operations);
67670
67671           context.ui().sidebar
67672               .select(singular() ? singular().id : null, newFeature);
67673
67674           context.history()
67675               .on('undone.select', update)
67676               .on('redone.select', update);
67677
67678           context.map()
67679               .on('move.select', closeMenu)
67680               .on('drawn.select', selectElements);
67681
67682           context.surface()
67683               .on('dblclick.select', dblclick);
67684
67685
67686           selectElements();
67687
67688           if (selectedIDs.length > 1) {
67689               var entities = uiSelectionList(context, selectedIDs);
67690               context.ui().sidebar.show(entities);
67691           }
67692
67693           if (follow) {
67694               var extent = geoExtent$$1();
67695               var graph = context.graph();
67696               selectedIDs.forEach(function(id) {
67697                   var entity = context.entity(id);
67698                   extent._extend(entity.extent(graph));
67699               });
67700
67701               var loc = extent.center();
67702               context.map().centerEase(loc);
67703           } else if (singular() && singular().type === 'way') {
67704               context.map().pan([0,0]);  // full redraw, to adjust z-sorting #2914
67705           }
67706
67707           timeout = window.setTimeout(function() {
67708               positionMenu();
67709               if (!suppressMenu) {
67710                   showMenu();
67711               }
67712           }, 270);  /* after any centerEase completes */
67713
67714
67715           function update() {
67716               closeMenu();
67717               checkSelectedIDs();
67718           }
67719
67720
67721           function dblclick() {
67722               var target = select(event.target);
67723
67724               var datum = target.datum();
67725               var entity = datum && datum.properties && datum.properties.entity;
67726               if (!entity) return;
67727
67728               if (entity instanceof osmWay && target.classed('target')) {
67729                   var choice = geoChooseEdge(context.childNodes(entity), context.mouse(), context.projection);
67730                   var prev = entity.nodes[choice.index - 1];
67731                   var next = entity.nodes[choice.index];
67732
67733                   context.perform(
67734                       actionAddMidpoint({loc: choice.loc, edge: [prev, next]}, osmNode()),
67735                       t('operations.add.annotation.vertex')
67736                   );
67737
67738                   event.preventDefault();
67739                   event.stopPropagation();
67740
67741               } else if (entity.type === 'midpoint') {
67742                   context.perform(
67743                       actionAddMidpoint({loc: entity.loc, edge: entity.edge}, osmNode()),
67744                       t('operations.add.annotation.vertex'));
67745
67746                   event.preventDefault();
67747                   event.stopPropagation();
67748               }
67749           }
67750
67751
67752           function selectElements(drawn) {
67753               if (!checkSelectedIDs()) return;
67754
67755               var surface = context.surface();
67756               var entity = singular();
67757
67758               if (entity && context.geometry(entity.id) === 'relation') {
67759                   suppressMenu = true;
67760                   return;
67761               }
67762
67763               surface.selectAll('.related')
67764                   .classed('related', false);
67765
67766               singularParent();
67767               if (_relatedParent) {
67768                   surface.selectAll(utilEntitySelector([_relatedParent]))
67769                       .classed('related', true);
67770               }
67771
67772               var selection$$1 = context.surface()
67773                   .selectAll(utilEntityOrMemberSelector(selectedIDs, context.graph()));
67774
67775               if (selection$$1.empty()) {
67776                   // Return to browse mode if selected DOM elements have
67777                   // disappeared because the user moved them out of view..
67778                   var source = event && event.type === 'zoom' && event.sourceEvent;
67779                   if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
67780                       context.enter(modeBrowse(context));
67781                   }
67782               } else {
67783                   selection$$1
67784                       .classed('selected', true);
67785               }
67786           }
67787
67788
67789           function esc() {
67790               if (select('.combobox').size()) return;
67791               context.enter(modeBrowse(context));
67792           }
67793
67794
67795           function firstVertex() {
67796               event.preventDefault();
67797               var entity = singular();
67798               var parent = singularParent();
67799               var way;
67800
67801               if (entity && entity.type === 'way') {
67802                   way = entity;
67803               } else if (parent) {
67804                   way = context.entity(parent);
67805               }
67806
67807               if (way) {
67808                   context.enter(
67809                       modeSelect(context, [way.first()]).follow(true)
67810                   );
67811               }
67812           }
67813
67814
67815           function lastVertex() {
67816               event.preventDefault();
67817               var entity = singular();
67818               var parent = singularParent();
67819               var way;
67820
67821               if (entity && entity.type === 'way') {
67822                   way = entity;
67823               } else if (parent) {
67824                   way = context.entity(parent);
67825               }
67826
67827               if (way) {
67828                   context.enter(
67829                       modeSelect(context, [way.last()]).follow(true)
67830                   );
67831               }
67832           }
67833
67834
67835           function previousVertex() {
67836               event.preventDefault();
67837               var parent = singularParent();
67838               if (!parent) return;
67839
67840               var way = context.entity(parent);
67841               var length = way.nodes.length;
67842               var curr = way.nodes.indexOf(selectedIDs[0]);
67843               var index = -1;
67844
67845               if (curr > 0) {
67846                   index = curr - 1;
67847               } else if (way.isClosed()) {
67848                   index = length - 2;
67849               }
67850
67851               if (index !== -1) {
67852                   context.enter(
67853                       modeSelect(context, [way.nodes[index]]).follow(true)
67854                   );
67855               }
67856           }
67857
67858
67859           function nextVertex() {
67860               event.preventDefault();
67861               var parent = singularParent();
67862               if (!parent) return;
67863
67864               var way = context.entity(parent);
67865               var length = way.nodes.length;
67866               var curr = way.nodes.indexOf(selectedIDs[0]);
67867               var index = -1;
67868
67869               if (curr < length - 1) {
67870                   index = curr + 1;
67871               } else if (way.isClosed()) {
67872                   index = 0;
67873               }
67874
67875               if (index !== -1) {
67876                   context.enter(
67877                       modeSelect(context, [way.nodes[index]]).follow(true)
67878                   );
67879               }
67880           }
67881
67882
67883           function nextParent() {
67884               event.preventDefault();
67885               var parents = uniq(commonParents());
67886               if (!parents || parents.length < 2) return;
67887
67888               var index = parents.indexOf(_relatedParent);
67889               if (index < 0 || index > parents.length - 2) {
67890                   _relatedParent = parents[0];
67891               } else {
67892                   _relatedParent = parents[index + 1];
67893               }
67894
67895               var surface = context.surface();
67896               surface.selectAll('.related')
67897                   .classed('related', false);
67898
67899               if (_relatedParent) {
67900                   surface.selectAll(utilEntitySelector([_relatedParent]))
67901                       .classed('related', true);
67902               }
67903           }
67904       };
67905
67906
67907       mode.exit = function() {
67908           if (timeout) window.clearTimeout(timeout);
67909
67910           behaviors.forEach(context.uninstall);
67911
67912           select(document)
67913               .call(keybinding.unbind);
67914
67915           closeMenu();
67916           editMenu = undefined;
67917
67918           context.history()
67919               .on('undone.select', null)
67920               .on('redone.select', null);
67921
67922           var surface = context.surface();
67923
67924           surface
67925               .on('dblclick.select', null);
67926
67927           surface
67928               .selectAll('.selected')
67929               .classed('selected', false);
67930
67931           surface
67932               .selectAll('.related')
67933               .classed('related', false);
67934
67935           context.map().on('drawn.select', null);
67936           context.ui().sidebar.hide();
67937       };
67938
67939
67940       return mode;
67941   }
67942
67943   function modeSelectData$$1(context, selectedDatum) {
67944       var mode = {
67945           id: 'select-data',
67946           button: 'browse'
67947       };
67948
67949       var keybinding = utilKeybinding('select-data');
67950       var dataEditor = uiDataEditor$$1(context);
67951
67952       var behaviors = [
67953           behaviorBreathe(context),
67954           behaviorHover(context),
67955           behaviorSelect(context),
67956           behaviorLasso(context),
67957           modeDragNode$$1(context).behavior,
67958           modeDragNote$$1(context).behavior
67959       ];
67960
67961
67962       // class the data as selected, or return to browse mode if the data is gone
67963       function selectData(drawn) {
67964           var selection$$1 = context.surface().selectAll('.layer-mapdata .data' + selectedDatum.__featurehash__);
67965
67966           if (selection$$1.empty()) {
67967               // Return to browse mode if selected DOM elements have
67968               // disappeared because the user moved them out of view..
67969               var source = event && event.type === 'zoom' && event.sourceEvent;
67970               if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
67971                   context.enter(modeBrowse(context));
67972               }
67973           } else {
67974               selection$$1.classed('selected', true);
67975           }
67976       }
67977
67978
67979       function esc() {
67980           if (select('.combobox').size()) return;
67981           context.enter(modeBrowse(context));
67982       }
67983
67984
67985       mode.zoomToSelected = function() {
67986           var extent = geoExtent$$1(d3_geoBounds(selectedDatum));
67987           context.map().centerZoomEase(extent.center(), context.map().trimmedExtentZoom(extent));
67988       };
67989
67990
67991       mode.enter = function() {
67992           behaviors.forEach(context.install);
67993
67994           keybinding
67995               .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
67996               .on('⎋', esc, true);
67997
67998           select(document)
67999               .call(keybinding);
68000
68001           selectData();
68002
68003           var sidebar = context.ui().sidebar;
68004           sidebar.show(dataEditor.datum(selectedDatum));
68005
68006           // expand the sidebar, avoid obscuring the data if needed
68007           var extent = geoExtent$$1(d3_geoBounds(selectedDatum));
68008           sidebar.expand(sidebar.intersects(extent));
68009
68010           context.map()
68011               .on('drawn.select-data', selectData);
68012       };
68013
68014
68015       mode.exit = function() {
68016           behaviors.forEach(context.uninstall);
68017
68018           select(document)
68019               .call(keybinding.unbind);
68020
68021           context.surface()
68022               .selectAll('.layer-mapdata .selected')
68023               .classed('selected hover', false);
68024
68025           context.map()
68026               .on('drawn.select-data', null);
68027
68028           context.ui().sidebar
68029               .hide();
68030       };
68031
68032
68033       return mode;
68034   }
68035
68036   function modeSelectError$$1(context, selectedErrorID) {
68037       var mode = {
68038           id: 'select-error',
68039           button: 'browse'
68040       };
68041
68042       var keepRight = services.keepRight;
68043       var keybinding = utilKeybinding('select-error');
68044       var keepRightEditor = uiKeepRightEditor$$1(context)
68045           .on('change', function() {
68046               context.map().pan([0,0]);  // trigger a redraw
68047               var error = checkSelectedID();
68048               if (!error) return;
68049               context.ui().sidebar
68050                   .show(keepRightEditor.error(error));
68051           });
68052
68053       var behaviors = [
68054           behaviorBreathe(context),
68055           behaviorHover(context),
68056           behaviorSelect(context),
68057           behaviorLasso(context),
68058           modeDragNode$$1(context).behavior,
68059           modeDragNote$$1(context).behavior
68060       ];
68061
68062
68063       function checkSelectedID() {
68064           if (!keepRight) return;
68065           var error = keepRight.getError(selectedErrorID);
68066           if (!error) {
68067               context.enter(modeBrowse(context));
68068           }
68069           return error;
68070       }
68071
68072
68073       mode.zoomToSelected = function() {
68074           if (!keepRight) return;
68075           var error = keepRight.getError(selectedErrorID);
68076           if (error) {
68077               context.map().centerZoomEase(error.loc, 20);
68078           }
68079       };
68080
68081
68082       mode.enter = function() {
68083           var error = checkSelectedID();
68084           if (!error) return;
68085
68086           behaviors.forEach(context.install);
68087           keybinding
68088               .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
68089               .on('⎋', esc, true);
68090
68091           select(document)
68092               .call(keybinding);
68093
68094           selectError();
68095
68096           var sidebar = context.ui().sidebar;
68097           sidebar.show(keepRightEditor.error(error));
68098
68099           context.map()
68100               .on('drawn.select-error', selectError);
68101
68102
68103           // class the error as selected, or return to browse mode if the error is gone
68104           function selectError(drawn) {
68105               if (!checkSelectedID()) return;
68106
68107               var selection$$1 = context.surface()
68108                   .selectAll('.kr_error-' + selectedErrorID);
68109
68110               if (selection$$1.empty()) {
68111                   // Return to browse mode if selected DOM elements have
68112                   // disappeared because the user moved them out of view..
68113                   var source = event && event.type === 'zoom' && event.sourceEvent;
68114                   if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
68115                       context.enter(modeBrowse(context));
68116                   }
68117
68118               } else {
68119                   selection$$1
68120                       .classed('selected', true);
68121
68122                   context.selectedErrorID(selectedErrorID);
68123               }
68124           }
68125
68126           function esc() {
68127               if (select('.combobox').size()) return;
68128               context.enter(modeBrowse(context));
68129           }
68130       };
68131
68132
68133       mode.exit = function() {
68134           behaviors.forEach(context.uninstall);
68135
68136           select(document)
68137               .call(keybinding.unbind);
68138
68139           context.surface()
68140               .selectAll('.kr_error.selected')
68141               .classed('selected hover', false);
68142
68143           context.map()
68144               .on('drawn.select-error', null);
68145
68146           context.ui().sidebar
68147               .hide();
68148
68149           context.selectedErrorID(null);
68150       };
68151
68152
68153       return mode;
68154   }
68155
68156   function modeSelectNote$$1(context, selectedNoteID) {
68157       var mode = {
68158           id: 'select-note',
68159           button: 'browse'
68160       };
68161
68162       var osm = services.osm;
68163       var keybinding = utilKeybinding('select-note');
68164       var noteEditor = uiNoteEditor$$1(context)
68165           .on('change', function() {
68166               context.map().pan([0,0]);  // trigger a redraw
68167               var note = checkSelectedID();
68168               if (!note) return;
68169               context.ui().sidebar
68170                   .show(noteEditor.note(note));
68171           });
68172
68173       var behaviors = [
68174           behaviorBreathe(context),
68175           behaviorHover(context),
68176           behaviorSelect(context),
68177           behaviorLasso(context),
68178           modeDragNode$$1(context).behavior,
68179           modeDragNote$$1(context).behavior
68180       ];
68181
68182       var newFeature = false;
68183
68184
68185       function checkSelectedID() {
68186           if (!osm) return;
68187           var note = osm.getNote(selectedNoteID);
68188           if (!note) {
68189               context.enter(modeBrowse(context));
68190           }
68191           return note;
68192       }
68193
68194
68195       // class the note as selected, or return to browse mode if the note is gone
68196       function selectNote(drawn) {
68197           if (!checkSelectedID()) return;
68198
68199           var selection$$1 = context.surface().selectAll('.layer-notes .note-' + selectedNoteID);
68200
68201           if (selection$$1.empty()) {
68202               // Return to browse mode if selected DOM elements have
68203               // disappeared because the user moved them out of view..
68204               var source = event && event.type === 'zoom' && event.sourceEvent;
68205               if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
68206                   context.enter(modeBrowse(context));
68207               }
68208
68209           } else {
68210               selection$$1
68211                   .classed('selected', true);
68212
68213               context.selectedNoteID(selectedNoteID);
68214           }
68215       }
68216
68217
68218       function esc() {
68219           if (select('.combobox').size()) return;
68220           context.enter(modeBrowse(context));
68221       }
68222
68223
68224       mode.zoomToSelected = function() {
68225           if (!osm) return;
68226           var note = osm.getNote(selectedNoteID);
68227           if (note) {
68228               context.map().centerZoomEase(note.loc, 20);
68229           }
68230       };
68231
68232
68233       mode.newFeature = function(val) {
68234           if (!arguments.length) return newFeature;
68235           newFeature = val;
68236           return mode;
68237       };
68238
68239
68240       mode.enter = function() {
68241           var note = checkSelectedID();
68242           if (!note) return;
68243
68244           behaviors.forEach(context.install);
68245
68246           keybinding
68247               .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
68248               .on('⎋', esc, true);
68249
68250           select(document)
68251               .call(keybinding);
68252
68253           selectNote();
68254
68255           var sidebar = context.ui().sidebar;
68256           sidebar.show(noteEditor.note(note));
68257
68258           // expand the sidebar, avoid obscuring the note if needed
68259           sidebar.expand(sidebar.intersects(note.extent()));
68260
68261           context.map()
68262               .on('drawn.select', selectNote);
68263       };
68264
68265
68266       mode.exit = function() {
68267           behaviors.forEach(context.uninstall);
68268
68269           select(document)
68270               .call(keybinding.unbind);
68271
68272           context.surface()
68273               .selectAll('.layer-notes .selected')
68274               .classed('selected hover', false);
68275
68276           context.map()
68277               .on('drawn.select', null);
68278
68279           context.ui().sidebar
68280               .hide();
68281
68282           context.selectedNoteID(null);
68283       };
68284
68285
68286       return mode;
68287   }
68288
68289   var _keepRightEnabled = false;
68290   var _keepRightService;
68291
68292
68293   function svgKeepRight$$1(projection, context, dispatch) {
68294       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
68295       var minZoom = 12;
68296       var touchLayer = select(null);
68297       var drawLayer = select(null);
68298       var _keepRightVisible = false;
68299
68300
68301       function markerPath(selection$$1, klass) {
68302           selection$$1
68303               .attr('class', klass)
68304               .attr('transform', 'translate(-4, -24)')
68305               .attr('d', 'M11.6,6.2H7.1l1.4-5.1C8.6,0.6,8.1,0,7.5,0H2.2C1.7,0,1.3,0.3,1.3,0.8L0,10.2c-0.1,0.6,0.4,1.1,0.9,1.1h4.6l-1.8,7.6C3.6,19.4,4.1,20,4.7,20c0.3,0,0.6-0.2,0.8-0.5l6.9-11.9C12.7,7,12.3,6.2,11.6,6.2z');
68306       }
68307
68308
68309       // Loosely-coupled keepRight service for fetching errors.
68310       function getService() {
68311           if (services.keepRight && !_keepRightService) {
68312               _keepRightService = services.keepRight;
68313               _keepRightService.on('loaded', throttledRedraw);
68314           } else if (!services.keepRight && _keepRightService) {
68315               _keepRightService = null;
68316           }
68317
68318           return _keepRightService;
68319       }
68320
68321
68322       // Show the errors
68323       function editOn() {
68324           if (!_keepRightVisible) {
68325               _keepRightVisible = true;
68326               drawLayer
68327                   .style('display', 'block');
68328           }
68329       }
68330
68331
68332       // Immediately remove the errors and their touch targets
68333       function editOff() {
68334           if (_keepRightVisible) {
68335               _keepRightVisible = false;
68336               drawLayer
68337                   .style('display', 'none');
68338               drawLayer.selectAll('.kr_error')
68339                   .remove();
68340               touchLayer.selectAll('.kr_error')
68341                   .remove();
68342           }
68343       }
68344
68345
68346       // Enable the layer.  This shows the errors and transitions them to visible.
68347       function layerOn() {
68348           editOn();
68349
68350           drawLayer
68351               .style('opacity', 0)
68352               .transition()
68353               .duration(250)
68354               .style('opacity', 1)
68355               .on('end interrupt', function () {
68356                   dispatch.call('change');
68357               });
68358       }
68359
68360
68361       // Disable the layer.  This transitions the layer invisible and then hides the errors.
68362       function layerOff() {
68363           throttledRedraw.cancel();
68364           drawLayer.interrupt();
68365           touchLayer.selectAll('.kr_error')
68366               .remove();
68367
68368           drawLayer
68369               .transition()
68370               .duration(250)
68371               .style('opacity', 0)
68372               .on('end interrupt', function () {
68373                   editOff();
68374                   dispatch.call('change');
68375               });
68376       }
68377
68378
68379       // Update the error markers
68380       function updateMarkers() {
68381           if (!_keepRightVisible || !_keepRightEnabled) return;
68382
68383           var service = getService();
68384           var selectedID = context.selectedErrorID();
68385           var data = (service ? service.getErrors(projection) : []);
68386           var getTransform = svgPointTransform(projection);
68387
68388           // Draw markers..
68389           var markers = drawLayer.selectAll('.kr_error')
68390               .data(data, function(d) { return d.id; });
68391
68392           // exit
68393           markers.exit()
68394               .remove();
68395
68396           // enter
68397           var markersEnter = markers.enter()
68398               .append('g')
68399               .attr('class', function(d) {
68400                   return 'kr_error kr_error-' + d.id + ' kr_error_type_' + d.parent_error_type; }
68401               );
68402
68403           markersEnter
68404               .append('ellipse')
68405               .attr('cx', 0.5)
68406               .attr('cy', 1)
68407               .attr('rx', 6.5)
68408               .attr('ry', 3)
68409               .attr('class', 'stroke');
68410
68411           markersEnter
68412               .append('path')
68413               .call(markerPath, 'shadow');
68414
68415           markersEnter
68416               .append('use')
68417               .attr('class', 'kr_error-fill')
68418               .attr('width', '20px')
68419               .attr('height', '20px')
68420               .attr('x', '-8px')
68421               .attr('y', '-22px')
68422               .attr('xlink:href', '#iD-icon-bolt');
68423
68424           // update
68425           markers
68426               .merge(markersEnter)
68427               .sort(sortY)
68428               .classed('selected', function(d) { return d.id === selectedID; })
68429               .attr('transform', getTransform);
68430
68431
68432           // Draw targets..
68433           if (touchLayer.empty()) return;
68434           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
68435
68436           var targets = touchLayer.selectAll('.kr_error')
68437               .data(data, function(d) { return d.id; });
68438
68439           // exit
68440           targets.exit()
68441               .remove();
68442
68443           // enter/update
68444           targets.enter()
68445               .append('rect')
68446               .attr('width', '20px')
68447               .attr('height', '20px')
68448               .attr('x', '-8px')
68449               .attr('y', '-22px')
68450               .merge(targets)
68451               .sort(sortY)
68452               .attr('class', function(d) {
68453                   return 'kr_error target kr_error-' + d.id + ' ' + fillClass;
68454               })
68455               .attr('transform', getTransform);
68456
68457
68458           function sortY(a, b) {
68459               return (a.id === selectedID) ? 1
68460                   : (b.id === selectedID) ? -1
68461                   : (a.severity === 'error' && b.severity !== 'error') ? 1
68462                   : (b.severity === 'error' && a.severity !== 'error') ? -1
68463                   : b.loc[1] - a.loc[1];
68464           }
68465       }
68466
68467
68468       // Draw the keepRight layer and schedule loading errors and updating markers.
68469       function drawKeepRight(selection$$1) {
68470           var service = getService();
68471
68472           var surface = context.surface();
68473           if (surface && !surface.empty()) {
68474               touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
68475           }
68476
68477           drawLayer = selection$$1.selectAll('.layer-keepRight')
68478               .data(service ? [0] : []);
68479
68480           drawLayer.exit()
68481               .remove();
68482
68483           drawLayer = drawLayer.enter()
68484               .append('g')
68485               .attr('class', 'layer-keepRight')
68486               .style('display', _keepRightEnabled ? 'block' : 'none')
68487               .merge(drawLayer);
68488
68489           if (_keepRightEnabled) {
68490               if (service && ~~context.map().zoom() >= minZoom) {
68491                   editOn();
68492                   service.loadErrors(projection);
68493                   updateMarkers();
68494               } else {
68495                   editOff();
68496               }
68497           }
68498       }
68499
68500
68501       // Toggles the layer on and off
68502       drawKeepRight.enabled = function(val) {
68503           if (!arguments.length) return _keepRightEnabled;
68504
68505           _keepRightEnabled = val;
68506           if (_keepRightEnabled) {
68507               layerOn();
68508           } else {
68509               layerOff();
68510               if (context.selectedErrorID()) {
68511                   context.enter(modeBrowse(context));
68512               }
68513           }
68514
68515           dispatch.call('change');
68516           return this;
68517       };
68518
68519
68520       drawKeepRight.supported = function() {
68521           return !!getService();
68522       };
68523
68524
68525       return drawKeepRight;
68526   }
68527
68528   // Touch targets control which other vertices we can drag a vertex onto.
68529   //
68530   // - the activeID - nope
68531   // - 1 away (adjacent) to the activeID - yes (vertices will be merged)
68532   // - 2 away from the activeID - nope (would create a self intersecting segment)
68533   // - all others on a linear way - yes
68534   // - all others on a closed way - nope (would create a self intersecting polygon)
68535   //
68536   // returns
68537   // 0 = active vertex - no touch/connect
68538   // 1 = passive vertex - yes touch/connect
68539   // 2 = adjacent vertex - yes but pay attention segmenting a line here
68540   //
68541   function svgPassiveVertex(node, graph, activeID) {
68542       if (!activeID) return 1;
68543       if (activeID === node.id) return 0;
68544
68545       var parents = graph.parentWays(node);
68546
68547       for (var i = 0; i < parents.length; i++) {
68548           var nodes = parents[i].nodes;
68549           var isClosed = parents[i].isClosed();
68550           for (var j = 0; j < nodes.length; j++) {   // find this vertex, look nearby
68551               if (nodes[j] === node.id) {
68552                   var ix1 = j - 2;
68553                   var ix2 = j - 1;
68554                   var ix3 = j + 1;
68555                   var ix4 = j + 2;
68556
68557                   if (isClosed) {  // wraparound if needed
68558                       var max = nodes.length - 1;
68559                       if (ix1 < 0)   ix1 = max + ix1;
68560                       if (ix2 < 0)   ix2 = max + ix2;
68561                       if (ix3 > max) ix3 = ix3 - max;
68562                       if (ix4 > max) ix4 = ix4 - max;
68563                   }
68564
68565                   if (nodes[ix1] === activeID) return 0;        // no - prevent self intersect
68566                   else if (nodes[ix2] === activeID) return 2;   // ok - adjacent
68567                   else if (nodes[ix3] === activeID) return 2;   // ok - adjacent
68568                   else if (nodes[ix4] === activeID) return 0;   // no - prevent self intersect
68569                   else if (isClosed && nodes.indexOf(activeID) !== -1) return 0;  // no - prevent self intersect
68570               }
68571           }
68572       }
68573
68574       return 1;   // ok
68575   }
68576
68577
68578   function svgMarkerSegments(projection$$1, graph, dt,
68579                                     shouldReverse,
68580                                     bothDirections) {
68581       return function(entity) {
68582           var i = 0;
68583           var offset = dt;
68584           var segments = [];
68585           var clip = d3_geoIdentity().clipExtent(projection$$1.clipExtent()).stream;
68586           var coordinates = graph.childNodes(entity).map(function(n) { return n.loc; });
68587           var a, b;
68588
68589           if (shouldReverse(entity)) {
68590               coordinates.reverse();
68591           }
68592
68593           geoStream({
68594               type: 'LineString',
68595               coordinates: coordinates
68596           }, projection$$1.stream(clip({
68597               lineStart: function() {},
68598               lineEnd: function() { a = null; },
68599               point: function(x, y) {
68600                   b = [x, y];
68601
68602                   if (a) {
68603                       var span = geoVecLength(a, b) - offset;
68604
68605                       if (span >= 0) {
68606                           var heading = geoVecAngle(a, b);
68607                           var dx = dt * Math.cos(heading);
68608                           var dy = dt * Math.sin(heading);
68609                           var p = [
68610                               a[0] + offset * Math.cos(heading),
68611                               a[1] + offset * Math.sin(heading)
68612                           ];
68613
68614                           // gather coordinates
68615                           var coord = [a, p];
68616                           for (span -= dt; span >= 0; span -= dt) {
68617                               p = geoVecAdd(p, [dx, dy]);
68618                               coord.push(p);
68619                           }
68620                           coord.push(b);
68621
68622                           // generate svg paths
68623                           var segment = '';
68624                           var j;
68625
68626                           for (j = 0; j < coord.length; j++) {
68627                               segment += (j === 0 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
68628                           }
68629                           segments.push({ id: entity.id, index: i++, d: segment });
68630
68631                           if (bothDirections(entity)) {
68632                               segment = '';
68633                               for (j = coord.length - 1; j >= 0; j--) {
68634                                   segment += (j === coord.length - 1 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
68635                               }
68636                               segments.push({ id: entity.id, index: i++, d: segment });
68637                           }
68638                       }
68639
68640                       offset = -span;
68641                   }
68642
68643                   a = b;
68644               }
68645           })));
68646
68647           return segments;
68648       };
68649   }
68650
68651
68652   function svgPath(projection$$1, graph, isArea) {
68653
68654       // Explanation of magic numbers:
68655       // "padding" here allows space for strokes to extend beyond the viewport,
68656       // so that the stroke isn't drawn along the edge of the viewport when
68657       // the shape is clipped.
68658       //
68659       // When drawing lines, pad viewport by 5px.
68660       // When drawing areas, pad viewport by 65px in each direction to allow
68661       // for 60px area fill stroke (see ".fill-partial path.fill" css rule)
68662
68663       var cache = {};
68664       var padding = isArea ? 65 : 5;
68665       var viewport = projection$$1.clipExtent();
68666       var paddedExtent = [
68667           [viewport[0][0] - padding, viewport[0][1] - padding],
68668           [viewport[1][0] + padding, viewport[1][1] + padding]
68669       ];
68670       var clip = d3_geoIdentity().clipExtent(paddedExtent).stream;
68671       var project = projection$$1.stream;
68672       var path = d3_geoPath()
68673           .projection({stream: function(output) { return project(clip(output)); }});
68674
68675       var svgpath = function(entity) {
68676           if (entity.id in cache) {
68677               return cache[entity.id];
68678           } else {
68679               return cache[entity.id] = path(entity.asGeoJSON(graph));
68680           }
68681       };
68682
68683       svgpath.geojson = function(d) {
68684           if (d.__featurehash__ !== undefined) {
68685               if (d.__featurehash__ in cache) {
68686                   return cache[d.__featurehash__];
68687               } else {
68688                   return cache[d.__featurehash__] = path(d);
68689               }
68690           } else {
68691               return path(d);
68692           }
68693       };
68694
68695       return svgpath;
68696   }
68697
68698
68699   function svgPointTransform(projection$$1) {
68700       var svgpoint = function(entity) {
68701           // http://jsperf.com/short-array-join
68702           var pt = projection$$1(entity.loc);
68703           return 'translate(' + pt[0] + ',' + pt[1] + ')';
68704       };
68705
68706       svgpoint.geojson = function(d) {
68707           return svgpoint(d.properties.entity);
68708       };
68709
68710       return svgpoint;
68711   }
68712
68713
68714   function svgRelationMemberTags(graph) {
68715       return function(entity) {
68716           var tags = entity.tags;
68717           graph.parentRelations(entity).forEach(function(relation) {
68718               var type = relation.tags.type;
68719               if (type === 'multipolygon' || type === 'boundary') {
68720                   tags = assignIn({}, relation.tags, tags);
68721               }
68722           });
68723           return tags;
68724       };
68725   }
68726
68727
68728   function svgSegmentWay(way, graph, activeID) {
68729       // When there is no activeID, we can memoize this expensive computation
68730       if (activeID === undefined) {
68731           return graph.transient(way, 'waySegments', getWaySegments);
68732       } else {
68733           return getWaySegments();
68734       }
68735
68736       function getWaySegments() {
68737           var isActiveWay = (way.nodes.indexOf(activeID) !== -1);
68738           var features = { passive: [], active: [] };
68739           var start = {};
68740           var end = {};
68741           var node, type;
68742
68743           for (var i = 0; i < way.nodes.length; i++) {
68744               node = graph.entity(way.nodes[i]);
68745               type = svgPassiveVertex(node, graph, activeID);
68746               end = { node: node, type: type };
68747
68748               if (start.type !== undefined) {
68749                   if (start.node.id === activeID || end.node.id === activeID) ; else if (isActiveWay && (start.type === 2 || end.type === 2)) {   // one adjacent vertex
68750                       pushActive(start, end, i);
68751                   } else if (start.type === 0 && end.type === 0) {   // both active vertices
68752                       pushActive(start, end, i);
68753                   } else {
68754                       pushPassive(start, end, i);
68755                   }
68756               }
68757
68758               start = end;
68759           }
68760
68761           return features;
68762
68763           function pushActive(start, end, index) {
68764               features.active.push({
68765                   type: 'Feature',
68766                   id: way.id + '-' + index + '-nope',
68767                   properties: {
68768                       nope: true,
68769                       target: true,
68770                       entity: way,
68771                       nodes: [start.node, end.node],
68772                       index: index
68773                   },
68774                   geometry: {
68775                       type: 'LineString',
68776                       coordinates: [start.node.loc, end.node.loc]
68777                   }
68778               });
68779           }
68780
68781           function pushPassive(start, end, index) {
68782               features.passive.push({
68783                   type: 'Feature',
68784                   id: way.id + '-' + index,
68785                   properties: {
68786                       target: true,
68787                       entity: way,
68788                       nodes: [start.node, end.node],
68789                       index: index
68790                   },
68791                   geometry: {
68792                       type: 'LineString',
68793                       coordinates: [start.node.loc, end.node.loc]
68794                   }
68795               });
68796           }
68797       }
68798   }
68799
68800   function svgGeolocate(projection) {
68801       var layer = select(null);
68802       var _position;
68803
68804
68805       function init() {
68806           if (svgGeolocate.initialized) return;  // run once
68807           svgGeolocate.enabled = false;
68808           svgGeolocate.initialized = true;
68809       }
68810
68811       function showLayer() {
68812           layer.style('display', 'block');
68813       }
68814
68815
68816       function hideLayer() {
68817           layer
68818               .transition()
68819               .duration(250)
68820               .style('opacity', 0);
68821       }
68822
68823       function layerOn() {
68824           layer
68825               .style('opacity', 0)
68826               .transition()
68827               .duration(250)
68828               .style('opacity', 1);
68829
68830       }
68831
68832       function layerOff() {
68833           layer.style('display', 'none');
68834       }
68835
68836       function transform(d) {
68837           return svgPointTransform(projection)(d);
68838       }
68839
68840       function accuracy(accuracy, loc) { // converts accuracy to pixels...
68841           var degreesRadius = geoMetersToLat(accuracy),
68842               tangentLoc = [loc[0], loc[1] + degreesRadius],
68843               projectedTangent = projection(tangentLoc),
68844               projectedLoc = projection([loc[0], loc[1]]);
68845
68846           // southern most point will have higher pixel value...
68847          return Math.round(projectedLoc[1] - projectedTangent[1]).toString();
68848       }
68849
68850       function update() {
68851           var geolocation = { loc: [_position.coords.longitude, _position.coords.latitude] };
68852
68853           var groups = layer.selectAll('.geolocations').selectAll('.geolocation')
68854               .data([geolocation]);
68855
68856           groups.exit()
68857               .remove();
68858
68859           var pointsEnter = groups.enter()
68860               .append('g')
68861               .attr('class', 'geolocation');
68862
68863           pointsEnter
68864               .append('circle')
68865               .attr('id', 'geolocate-radius')
68866               .attr('dx', '0')
68867               .attr('dy', '0')
68868               .attr('fill', 'rgb(15,128,225)')
68869               .attr('fill-opacity', '0.3')
68870               .attr('r', '0');
68871
68872           pointsEnter
68873               .append('circle')
68874               .attr('dx', '0')
68875               .attr('dy', '0')
68876               .attr('fill', 'rgb(15,128,225)')
68877               .attr('stroke', 'white')
68878               .attr('stroke-width', '1.5')
68879               .attr('r', '6');
68880
68881           groups.merge(pointsEnter)
68882               .attr('transform', transform);
68883
68884           select('#geolocate-radius').attr('r', accuracy(_position.coords.accuracy, geolocation.loc));
68885       }
68886
68887       function drawLocation(selection$$1) {
68888           var enabled = svgGeolocate.enabled;
68889
68890           layer = selection$$1.selectAll('.layer-geolocate')
68891               .data([0]);
68892
68893           layer.exit()
68894               .remove();
68895
68896           var layerEnter = layer.enter()
68897               .append('g')
68898               .attr('class', 'layer-geolocate')
68899               .style('display', enabled ? 'block' : 'none');
68900
68901           layerEnter
68902               .append('g')
68903               .attr('class', 'geolocations');
68904
68905           layer = layerEnter
68906               .merge(layer);
68907
68908           if (enabled) {
68909               update();
68910           } else {
68911               layerOff();
68912           }
68913       }
68914
68915       drawLocation.enabled = function (position, enabled) {
68916           if (!arguments.length) return svgGeolocate.enabled;
68917           _position = position;
68918           svgGeolocate.enabled = enabled;
68919           if (svgGeolocate.enabled) {
68920               showLayer();
68921               layerOn();
68922           } else {
68923               hideLayer();
68924           }
68925           return this;
68926       };
68927
68928       init();
68929       return drawLocation;
68930   }
68931
68932   function svgLabels(projection$$1, context) {
68933       var path = d3_geoPath(projection$$1);
68934       var detected = utilDetect();
68935       var baselineHack = (detected.ie || detected.browser.toLowerCase() === 'edge');
68936       var _rdrawn = rbush_1();
68937       var _rskipped = rbush_1();
68938       var _textWidthCache = {};
68939       var _entitybboxes = {};
68940
68941       // Listed from highest to lowest priority
68942       var labelStack = [
68943           ['line', 'aeroway', '*', 12],
68944           ['line', 'highway', 'motorway', 12],
68945           ['line', 'highway', 'trunk', 12],
68946           ['line', 'highway', 'primary', 12],
68947           ['line', 'highway', 'secondary', 12],
68948           ['line', 'highway', 'tertiary', 12],
68949           ['line', 'highway', '*', 12],
68950           ['line', 'railway', '*', 12],
68951           ['line', 'waterway', '*', 12],
68952           ['area', 'aeroway', '*', 12],
68953           ['area', 'amenity', '*', 12],
68954           ['area', 'building', '*', 12],
68955           ['area', 'historic', '*', 12],
68956           ['area', 'leisure', '*', 12],
68957           ['area', 'man_made', '*', 12],
68958           ['area', 'natural', '*', 12],
68959           ['area', 'shop', '*', 12],
68960           ['area', 'tourism', '*', 12],
68961           ['area', 'camp_site', '*', 12],
68962           ['point', 'aeroway', '*', 10],
68963           ['point', 'amenity', '*', 10],
68964           ['point', 'building', '*', 10],
68965           ['point', 'historic', '*', 10],
68966           ['point', 'leisure', '*', 10],
68967           ['point', 'man_made', '*', 10],
68968           ['point', 'natural', '*', 10],
68969           ['point', 'shop', '*', 10],
68970           ['point', 'tourism', '*', 10],
68971           ['point', 'camp_site', '*', 10],
68972           ['line', 'name', '*', 12],
68973           ['area', 'name', '*', 12],
68974           ['point', 'name', '*', 10]
68975       ];
68976
68977
68978       function blacklisted(preset) {
68979           var noIcons = ['building', 'landuse', 'natural'];
68980           return some(noIcons, function(s) {
68981               return preset.id.indexOf(s) >= 0;
68982           });
68983       }
68984
68985
68986       function get(array, prop) {
68987           return function(d, i) { return array[i][prop]; };
68988       }
68989
68990
68991       function textWidth(text, size, elem) {
68992           var c = _textWidthCache[size];
68993           if (!c) c = _textWidthCache[size] = {};
68994
68995           if (c[text]) {
68996               return c[text];
68997
68998           } else if (elem) {
68999               c[text] = elem.getComputedTextLength();
69000               return c[text];
69001
69002           } else {
69003               var str = encodeURIComponent(text).match(/%[CDEFcdef]/g);
69004               if (str === null) {
69005                   return size / 3 * 2 * text.length;
69006               } else {
69007                   return size / 3 * (2 * text.length + str.length);
69008               }
69009           }
69010       }
69011
69012
69013       function drawLinePaths(selection, entities, filter, classes, labels) {
69014           var paths = selection.selectAll('path')
69015               .filter(filter)
69016               .data(entities, osmEntity$$1.key);
69017
69018           // exit
69019           paths.exit()
69020               .remove();
69021
69022           // enter/update
69023           paths.enter()
69024               .append('path')
69025               .style('stroke-width', get(labels, 'font-size'))
69026               .attr('id', function(d) { return 'labelpath-' + d.id; })
69027               .attr('class', classes)
69028               .merge(paths)
69029               .attr('d', get(labels, 'lineString'));
69030       }
69031
69032
69033       function drawLineLabels(selection, entities, filter, classes, labels) {
69034           var texts = selection.selectAll('text.' + classes)
69035               .filter(filter)
69036               .data(entities, osmEntity$$1.key);
69037
69038           // exit
69039           texts.exit()
69040               .remove();
69041
69042           // enter
69043           texts.enter()
69044               .append('text')
69045               .attr('class', function(d, i) { return classes + ' ' + labels[i].classes + ' ' + d.id; })
69046               .attr('dy', baselineHack ? '0.35em' : null)
69047               .append('textPath')
69048               .attr('class', 'textpath');
69049
69050           // update
69051           selection.selectAll('text.' + classes).selectAll('.textpath')
69052               .filter(filter)
69053               .data(entities, osmEntity$$1.key)
69054               .attr('startOffset', '50%')
69055               .attr('xlink:href', function(d) { return '#labelpath-' + d.id; })
69056               .text(utilDisplayNameForPath);
69057       }
69058
69059
69060       function drawPointLabels(selection, entities, filter, classes, labels) {
69061           var texts = selection.selectAll('text.' + classes)
69062               .filter(filter)
69063               .data(entities, osmEntity$$1.key);
69064
69065           // exit
69066           texts.exit()
69067               .remove();
69068
69069           // enter/update
69070           texts.enter()
69071               .append('text')
69072               .attr('class', function(d, i) {
69073                   return classes + ' ' + labels[i].classes + ' ' + d.id;
69074               })
69075               .merge(texts)
69076               .attr('x', get(labels, 'x'))
69077               .attr('y', get(labels, 'y'))
69078               .style('text-anchor', get(labels, 'textAnchor'))
69079               .text(utilDisplayName)
69080               .each(function(d, i) {
69081                   textWidth(utilDisplayName(d), labels[i].height, this);
69082               });
69083       }
69084
69085
69086       function drawAreaLabels(selection, entities, filter, classes, labels) {
69087           entities = entities.filter(hasText);
69088           labels = labels.filter(hasText);
69089           drawPointLabels(selection, entities, filter, classes, labels);
69090
69091           function hasText(d, i) {
69092               return labels[i].hasOwnProperty('x') && labels[i].hasOwnProperty('y');
69093           }
69094       }
69095
69096
69097       function drawAreaIcons(selection, entities, filter, classes, labels) {
69098           var icons = selection.selectAll('use.' + classes)
69099               .filter(filter)
69100               .data(entities, osmEntity$$1.key);
69101
69102           // exit
69103           icons.exit()
69104               .remove();
69105
69106           // enter/update
69107           icons.enter()
69108               .append('use')
69109               .attr('class', 'icon ' + classes)
69110               .attr('width', '17px')
69111               .attr('height', '17px')
69112               .merge(icons)
69113               .attr('transform', get(labels, 'transform'))
69114               .attr('xlink:href', function(d) {
69115                   var preset = context.presets().match(d, context.graph());
69116                   var picon = preset && preset.icon;
69117
69118                   if (!picon) {
69119                       return '';
69120                   } else {
69121                       var isMaki = /^maki-/.test(picon);
69122                       return '#' + picon + (isMaki ? '-15' : '');
69123                   }
69124               });
69125       }
69126
69127
69128       function drawCollisionBoxes(selection, rtree, which) {
69129           var classes = 'debug ' + which + ' ' + (which === 'debug-skipped' ? 'orange' : 'yellow');
69130
69131           var gj = [];
69132           if (context.getDebug('collision')) {
69133               gj = rtree.all().map(function(d) {
69134                   return { type: 'Polygon', coordinates: [[
69135                       [d.minX, d.minY],
69136                       [d.maxX, d.minY],
69137                       [d.maxX, d.maxY],
69138                       [d.minX, d.maxY],
69139                       [d.minX, d.minY]
69140                   ]]};
69141               });
69142           }
69143
69144           var boxes = selection.selectAll('.' + which)
69145               .data(gj);
69146
69147           // exit
69148           boxes.exit()
69149               .remove();
69150
69151           // enter/update
69152           boxes.enter()
69153               .append('path')
69154               .attr('class', classes)
69155               .merge(boxes)
69156               .attr('d', d3_geoPath());
69157       }
69158
69159
69160       function drawLabels(selection, graph, entities, filter, dimensions, fullRedraw) {
69161           var wireframe = context.surface().classed('fill-wireframe');
69162           var zoom = geoScaleToZoom(projection$$1.scale());
69163
69164           var labelable = [];
69165           var renderNodeAs = {};
69166           var i, j, k, entity, geometry;
69167
69168           for (i = 0; i < labelStack.length; i++) {
69169               labelable.push([]);
69170           }
69171
69172           if (fullRedraw) {
69173               _rdrawn.clear();
69174               _rskipped.clear();
69175               _entitybboxes = {};
69176
69177           } else {
69178               for (i = 0; i < entities.length; i++) {
69179                   entity = entities[i];
69180                   var toRemove = []
69181                       .concat(_entitybboxes[entity.id] || [])
69182                       .concat(_entitybboxes[entity.id + 'I'] || []);
69183
69184                   for (j = 0; j < toRemove.length; j++) {
69185                       _rdrawn.remove(toRemove[j]);
69186                       _rskipped.remove(toRemove[j]);
69187                   }
69188               }
69189           }
69190
69191           // Loop through all the entities to do some preprocessing
69192           for (i = 0; i < entities.length; i++) {
69193               entity = entities[i];
69194               geometry = entity.geometry(graph);
69195
69196               // Insert collision boxes around interesting points/vertices
69197               if (geometry === 'point' || (geometry === 'vertex' && isInterestingVertex(entity))) {
69198                   var hasDirections = entity.directions(graph, projection$$1).length;
69199                   var markerPadding;
69200
69201                   if (!wireframe && geometry === 'point' && !(zoom >= 18 && hasDirections)) {
69202                       renderNodeAs[entity.id] = 'point';
69203                       markerPadding = 20;   // extra y for marker height
69204                   } else {
69205                       renderNodeAs[entity.id] = 'vertex';
69206                       markerPadding = 0;
69207                   }
69208
69209                   var coord = projection$$1(entity.loc);
69210                   var nodePadding = 10;
69211                   var bbox = {
69212                       minX: coord[0] - nodePadding,
69213                       minY: coord[1] - nodePadding - markerPadding,
69214                       maxX: coord[0] + nodePadding,
69215                       maxY: coord[1] + nodePadding
69216                   };
69217
69218                   doInsert(bbox, entity.id + 'P');
69219               }
69220
69221               // From here on, treat vertices like points
69222               if (geometry === 'vertex') {
69223                   geometry = 'point';
69224               }
69225
69226               // Determine which entities are label-able
69227               var preset = geometry === 'area' && context.presets().match(entity, graph);
69228               var icon = preset && !blacklisted(preset) && preset.icon;
69229
69230               if (!icon && !utilDisplayName(entity))
69231                   continue;
69232
69233               for (k = 0; k < labelStack.length; k++) {
69234                   var matchGeom = labelStack[k][0];
69235                   var matchKey = labelStack[k][1];
69236                   var matchVal = labelStack[k][2];
69237                   var hasVal = entity.tags[matchKey];
69238
69239                   if (geometry === matchGeom && hasVal && (matchVal === '*' || matchVal === hasVal)) {
69240                       labelable[k].push(entity);
69241                       break;
69242                   }
69243               }
69244           }
69245
69246           var positions = {
69247               point: [],
69248               line: [],
69249               area: []
69250           };
69251
69252           var labelled = {
69253               point: [],
69254               line: [],
69255               area: []
69256           };
69257
69258           // Try and find a valid label for labellable entities
69259           for (k = 0; k < labelable.length; k++) {
69260               var fontSize = labelStack[k][3];
69261
69262               for (i = 0; i < labelable[k].length; i++) {
69263                   entity = labelable[k][i];
69264                   geometry = entity.geometry(graph);
69265
69266                   var getName = (geometry === 'line') ? utilDisplayNameForPath : utilDisplayName;
69267                   var name = getName(entity);
69268                   var width = name && textWidth(name, fontSize);
69269                   var p = null;
69270
69271                   if (geometry === 'point' || geometry === 'vertex') {
69272                       // no point or vertex labels in wireframe mode
69273                       // no vertex labels at low zooms (vertices have no icons)
69274                       if (wireframe) continue;
69275                       var renderAs = renderNodeAs[entity.id];
69276                       if (renderAs === 'vertex' && zoom < 17) continue;
69277
69278                       p = getPointLabel(entity, width, fontSize, renderAs);
69279
69280                   } else if (geometry === 'line') {
69281                       p = getLineLabel(entity, width, fontSize);
69282
69283                   } else if (geometry === 'area') {
69284                       p = getAreaLabel(entity, width, fontSize);
69285                   }
69286
69287                   if (p) {
69288                       if (geometry === 'vertex') { geometry = 'point'; }  // treat vertex like point
69289                       p.classes = geometry + ' tag-' + labelStack[k][1];
69290                       positions[geometry].push(p);
69291                       labelled[geometry].push(entity);
69292                   }
69293               }
69294           }
69295
69296
69297           function isInterestingVertex(entity) {
69298               var selectedIDs = context.selectedIDs();
69299
69300               return entity.hasInterestingTags() ||
69301                   entity.isEndpoint(graph) ||
69302                   entity.isConnected(graph) ||
69303                   selectedIDs.indexOf(entity.id) !== -1 ||
69304                   some(graph.parentWays(entity), function(parent) {
69305                       return selectedIDs.indexOf(parent.id) !== -1;
69306                   });
69307           }
69308
69309
69310           function getPointLabel(entity, width, height, geometry) {
69311               var y = (geometry === 'point' ? -12 : 0);
69312               var pointOffsets = {
69313                   ltr: [15, y, 'start'],
69314                   rtl: [-15, y, 'end']
69315               };
69316
69317               var coord = projection$$1(entity.loc);
69318               var textPadding = 2;
69319               var offset = pointOffsets[textDirection];
69320               var p = {
69321                   height: height,
69322                   width: width,
69323                   x: coord[0] + offset[0],
69324                   y: coord[1] + offset[1],
69325                   textAnchor: offset[2]
69326               };
69327
69328               // insert a collision box for the text label..
69329               var bbox;
69330               if (textDirection === 'rtl') {
69331                   bbox = {
69332                       minX: p.x - width - textPadding,
69333                       minY: p.y - (height / 2) - textPadding,
69334                       maxX: p.x + textPadding,
69335                       maxY: p.y + (height / 2) + textPadding
69336                   };
69337               } else {
69338                   bbox = {
69339                       minX: p.x - textPadding,
69340                       minY: p.y - (height / 2) - textPadding,
69341                       maxX: p.x + width + textPadding,
69342                       maxY: p.y + (height / 2) + textPadding
69343                   };
69344               }
69345
69346               if (tryInsert([bbox], entity.id, true)) {
69347                   return p;
69348               }
69349           }
69350
69351
69352           function getLineLabel(entity, width, height) {
69353               var viewport = geoExtent$$1(context.projection.clipExtent()).polygon();
69354               var points = map$3(graph.childNodes(entity), 'loc').map(projection$$1);
69355               var length = geoPathLength(points);
69356
69357               if (length < width + 20) return;
69358
69359               // todo: properly clip points to viewport
69360
69361               // % along the line to attempt to place the label
69362               var lineOffsets = [50, 45, 55, 40, 60, 35, 65, 30, 70,
69363                                  25, 75, 20, 80, 15, 95, 10, 90, 5, 95];
69364               var padding = 3;
69365
69366               for (var i = 0; i < lineOffsets.length; i++) {
69367                   var offset = lineOffsets[i];
69368                   var middle = offset / 100 * length;
69369                   var start = middle - width / 2;
69370
69371                   if (start < 0 || start + width > length) continue;
69372
69373                   // generate subpath and ignore paths that are invalid or don't cross viewport.
69374                   var sub = subpath(points, start, start + width);
69375                   if (!sub || !geoPolygonIntersectsPolygon(viewport, sub, true)) {
69376                       continue;
69377                   }
69378
69379                   var isReverse = reverse(sub);
69380                   if (isReverse) {
69381                       sub = sub.reverse();
69382                   }
69383
69384                   var bboxes = [];
69385                   var boxsize = (height + 2) / 2;
69386
69387                   for (var j = 0; j < sub.length - 1; j++) {
69388                       var a = sub[j];
69389                       var b = sub[j + 1];
69390
69391                       // split up the text into small collision boxes
69392                       var num = Math.max(1, Math.floor(geoVecLength(a, b) / boxsize / 2));
69393
69394                       for (var box = 0; box < num; box++) {
69395                           var p = geoVecInterp(a, b, box / num);
69396                           var x0 = p[0] - boxsize - padding;
69397                           var y0 = p[1] - boxsize - padding;
69398                           var x1 = p[0] + boxsize + padding;
69399                           var y1 = p[1] + boxsize + padding;
69400
69401                           bboxes.push({
69402                               minX: Math.min(x0, x1),
69403                               minY: Math.min(y0, y1),
69404                               maxX: Math.max(x0, x1),
69405                               maxY: Math.max(y0, y1)
69406                           });
69407                       }
69408                   }
69409
69410                   if (tryInsert(bboxes, entity.id, false)) {   // accept this one
69411                       return {
69412                           'font-size': height + 2,
69413                           lineString: lineString(sub),
69414                           startOffset: offset + '%'
69415                       };
69416                   }
69417               }
69418
69419               function reverse(p) {
69420                   var angle = Math.atan2(p[1][1] - p[0][1], p[1][0] - p[0][0]);
69421                   return !(p[0][0] < p[p.length - 1][0] && angle < Math.PI/2 && angle > -Math.PI/2);
69422               }
69423
69424               function lineString(points) {
69425                   return 'M' + points.join('L');
69426               }
69427
69428               function subpath(points, from, to) {
69429                   var sofar = 0;
69430                   var start, end, i0, i1;
69431
69432                   for (var i = 0; i < points.length - 1; i++) {
69433                       var a = points[i];
69434                       var b = points[i + 1];
69435                       var current = geoVecLength(a, b);
69436                       var portion;
69437                       if (!start && sofar + current >= from) {
69438                           portion = (from - sofar) / current;
69439                           start = [
69440                               a[0] + portion * (b[0] - a[0]),
69441                               a[1] + portion * (b[1] - a[1])
69442                           ];
69443                           i0 = i + 1;
69444                       }
69445                       if (!end && sofar + current >= to) {
69446                           portion = (to - sofar) / current;
69447                           end = [
69448                               a[0] + portion * (b[0] - a[0]),
69449                               a[1] + portion * (b[1] - a[1])
69450                           ];
69451                           i1 = i + 1;
69452                       }
69453                       sofar += current;
69454                   }
69455
69456                   var result = points.slice(i0, i1);
69457                   result.unshift(start);
69458                   result.push(end);
69459                   return result;
69460               }
69461           }
69462
69463
69464           function getAreaLabel(entity, width, height) {
69465               var centroid = path.centroid(entity.asGeoJSON(graph, true));
69466               var extent = entity.extent(graph);
69467               var areaWidth = projection$$1(extent[1])[0] - projection$$1(extent[0])[0];
69468
69469               if (isNaN(centroid[0]) || areaWidth < 20) return;
69470
69471               var preset = context.presets().match(entity, context.graph());
69472               var picon = preset && preset.icon;
69473               var iconSize = 17;
69474               var padding = 2;
69475               var p = {};
69476
69477               if (picon) {  // icon and label..
69478                   if (addIcon()) {
69479                       addLabel(iconSize + padding);
69480                       return p;
69481                   }
69482               } else {   // label only..
69483                   if (addLabel(0)) {
69484                       return p;
69485                   }
69486               }
69487
69488
69489               function addIcon() {
69490                   var iconX = centroid[0] - (iconSize / 2);
69491                   var iconY = centroid[1] - (iconSize / 2);
69492                   var bbox = {
69493                       minX: iconX,
69494                       minY: iconY,
69495                       maxX: iconX + iconSize,
69496                       maxY: iconY + iconSize
69497                   };
69498
69499                   if (tryInsert([bbox], entity.id + 'I', true)) {
69500                       p.transform = 'translate(' + iconX + ',' + iconY + ')';
69501                       return true;
69502                   }
69503                   return false;
69504               }
69505
69506               function addLabel(yOffset) {
69507                   if (width && areaWidth >= width + 20) {
69508                       var labelX = centroid[0];
69509                       var labelY = centroid[1] + yOffset;
69510                       var bbox = {
69511                           minX: labelX - (width / 2) - padding,
69512                           minY: labelY - (height / 2) - padding,
69513                           maxX: labelX + (width / 2) + padding,
69514                           maxY: labelY + (height / 2) + padding
69515                       };
69516
69517                       if (tryInsert([bbox], entity.id, true)) {
69518                           p.x = labelX;
69519                           p.y = labelY;
69520                           p.textAnchor = 'middle';
69521                           p.height = height;
69522                           return true;
69523                       }
69524                   }
69525                   return false;
69526               }
69527           }
69528
69529
69530           // force insert a singular bounding box
69531           // singular box only, no array, id better be unique
69532           function doInsert(bbox, id) {
69533               bbox.id = id;
69534
69535               var oldbox = _entitybboxes[id];
69536               if (oldbox) {
69537                   _rdrawn.remove(oldbox);
69538               }
69539               _entitybboxes[id] = bbox;
69540               _rdrawn.insert(bbox);
69541           }
69542
69543
69544           function tryInsert(bboxes, id, saveSkipped) {
69545               var skipped = false;
69546
69547               for (var i = 0; i < bboxes.length; i++) {
69548                   var bbox = bboxes[i];
69549                   bbox.id = id;
69550
69551                   // Check that label is visible
69552                   if (bbox.minX < 0 || bbox.minY < 0 || bbox.maxX > dimensions[0] || bbox.maxY > dimensions[1]) {
69553                       skipped = true;
69554                       break;
69555                   }
69556                   if (_rdrawn.collides(bbox)) {
69557                       skipped = true;
69558                       break;
69559                   }
69560               }
69561
69562               _entitybboxes[id] = bboxes;
69563
69564               if (skipped) {
69565                   if (saveSkipped) {
69566                       _rskipped.load(bboxes);
69567                   }
69568               } else {
69569                   _rdrawn.load(bboxes);
69570               }
69571
69572               return !skipped;
69573           }
69574
69575
69576           var layer = selection.selectAll('.layer-osm.labels');
69577           layer.selectAll('.labels-group')
69578               .data(['halo', 'label', 'debug'])
69579               .enter()
69580               .append('g')
69581               .attr('class', function(d) { return 'labels-group ' + d; });
69582
69583           var halo = layer.selectAll('.labels-group.halo');
69584           var label = layer.selectAll('.labels-group.label');
69585           var debug = layer.selectAll('.labels-group.debug');
69586
69587           // points
69588           drawPointLabels(label, labelled.point, filter, 'pointlabel', positions.point);
69589           drawPointLabels(halo, labelled.point, filter, 'pointlabel-halo', positions.point);
69590
69591           // lines
69592           drawLinePaths(layer, labelled.line, filter, '', positions.line);
69593           drawLineLabels(label, labelled.line, filter, 'linelabel', positions.line);
69594           drawLineLabels(halo, labelled.line, filter, 'linelabel-halo', positions.line);
69595
69596           // areas
69597           drawAreaLabels(label, labelled.area, filter, 'arealabel', positions.area);
69598           drawAreaLabels(halo, labelled.area, filter, 'arealabel-halo', positions.area);
69599           drawAreaIcons(label, labelled.area, filter, 'areaicon', positions.area);
69600           drawAreaIcons(halo, labelled.area, filter, 'areaicon-halo', positions.area);
69601
69602           // debug
69603           drawCollisionBoxes(debug, _rskipped, 'debug-skipped');
69604           drawCollisionBoxes(debug, _rdrawn, 'debug-drawn');
69605
69606           layer.call(filterLabels);
69607       }
69608
69609
69610       function filterLabels(selection) {
69611           var drawLayer = selection.selectAll('.layer-osm.labels');
69612           var layers = drawLayer.selectAll('.labels-group.halo, .labels-group.label');
69613
69614           layers.selectAll('.nolabel')
69615               .classed('nolabel', false);
69616
69617           var mouse = context.mouse();
69618           var graph = context.graph();
69619           var selectedIDs = context.selectedIDs();
69620           var ids = [];
69621           var pad, bbox;
69622
69623           // hide labels near the mouse
69624           if (mouse) {
69625               pad = 20;
69626               bbox = { minX: mouse[0] - pad, minY: mouse[1] - pad, maxX: mouse[0] + pad, maxY: mouse[1] + pad };
69627               ids.push.apply(ids, map$3(_rdrawn.search(bbox), 'id'));
69628           }
69629
69630           // hide labels on selected nodes (they look weird when dragging / haloed)
69631           for (var i = 0; i < selectedIDs.length; i++) {
69632               var entity = graph.hasEntity(selectedIDs[i]);
69633               if (entity && entity.type === 'node') {
69634                   ids.push(selectedIDs[i]);
69635               }
69636           }
69637
69638           layers.selectAll(utilEntitySelector(ids))
69639               .classed('nolabel', true);
69640
69641
69642           // draw the mouse bbox if debugging is on..
69643           var debug = selection.selectAll('.labels-group.debug');
69644           var gj = [];
69645           if (context.getDebug('collision')) {
69646               gj = bbox ? [{
69647                   type: 'Polygon',
69648                   coordinates: [[
69649                       [bbox.minX, bbox.minY],
69650                       [bbox.maxX, bbox.minY],
69651                       [bbox.maxX, bbox.maxY],
69652                       [bbox.minX, bbox.maxY],
69653                       [bbox.minX, bbox.minY]
69654                   ]]
69655               }] : [];
69656           }
69657
69658           var box = debug.selectAll('.debug-mouse')
69659               .data(gj);
69660
69661           // exit
69662           box.exit()
69663               .remove();
69664
69665           // enter/update
69666           box.enter()
69667               .append('path')
69668               .attr('class', 'debug debug-mouse yellow')
69669               .merge(box)
69670               .attr('d', d3_geoPath());
69671       }
69672
69673
69674       var throttleFilterLabels = throttle(utilCallWhenIdle(filterLabels), 100);
69675
69676
69677       drawLabels.observe = function(selection) {
69678           var listener = function() { throttleFilterLabels(selection); };
69679           selection.on('mousemove.hidelabels', listener);
69680           context.on('enter.hidelabels', listener);
69681       };
69682
69683
69684       drawLabels.off = function(selection) {
69685           throttleFilterLabels.cancel();
69686           selection.on('mousemove.hidelabels', null);
69687           context.on('enter.hidelabels', null);
69688       };
69689
69690
69691       return drawLabels;
69692   }
69693
69694   function svgStreetside$$1(projection, context, dispatch) {
69695       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
69696       var minZoom = 14;
69697       var minMarkerZoom = 16;
69698       var minViewfieldZoom = 18;
69699       var layer = select(null);
69700       var _viewerYaw = 0;
69701       var _selectedSequence = null;
69702       var _hoveredBubble = null;
69703       var _streetside;
69704
69705       /**
69706        * init().
69707        */
69708       function init() {
69709           if (svgStreetside$$1.initialized) return;  // run once
69710           svgStreetside$$1.enabled = false;
69711           svgStreetside$$1.initialized = true;
69712       }
69713
69714       /**
69715        * getService().
69716        */
69717       function getService() {
69718           if (services.streetside && !_streetside) {
69719               _streetside = services.streetside;
69720               _streetside.event
69721                   .on('viewerChanged', viewerChanged)
69722                   .on('loadedBubbles', throttledRedraw);
69723           } else if (!services.streetside && _streetside) {
69724               _streetside = null;
69725           }
69726
69727           return _streetside;
69728       }
69729
69730       /**
69731        * showLayer().
69732        */
69733       function showLayer() {
69734           var service = getService();
69735           if (!service) return;
69736
69737           service.loadViewer(context);
69738           editOn();
69739
69740           layer
69741               .style('opacity', 0)
69742               .transition()
69743               .duration(250)
69744               .style('opacity', 1)
69745               .on('end', function () { dispatch.call('change'); });
69746       }
69747
69748       /**
69749        * hideLayer().
69750        */
69751       function hideLayer() {
69752           var service = getService();
69753           if (service) {
69754               service.hideViewer();
69755           }
69756
69757           throttledRedraw.cancel();
69758
69759           layer
69760               .transition()
69761               .duration(250)
69762               .style('opacity', 0)
69763               .on('end', editOff);
69764       }
69765
69766       /**
69767        * editOn().
69768        */
69769       function editOn() {
69770           layer.style('display', 'block');
69771       }
69772
69773       /**
69774        * editOff().
69775        */
69776       function editOff() {
69777           layer.selectAll('.viewfield-group').remove();
69778           layer.style('display', 'none');
69779       }
69780
69781       /**
69782        * click() Handles 'bubble' point click event.
69783        */
69784       function click(d) {
69785           var service = getService();
69786           if (!service) return;
69787
69788           // try to preserve the viewer rotation when staying on the same sequence
69789           if (d.sequenceKey !== _selectedSequence) {
69790               _viewerYaw = 0;  // reset
69791           }
69792           _selectedSequence = d.sequenceKey;
69793
69794           service
69795               .selectImage(d)
69796               .then(function(r) {
69797                   if (r.status === 'ok'){
69798                       service.showViewer(_viewerYaw);
69799                   }
69800               });
69801
69802
69803           context.map().centerEase(d.loc);
69804       }
69805
69806       /**
69807        * mouseover().
69808        */
69809       function mouseover(d) {
69810           var service = getService();
69811           _hoveredBubble = d;
69812           if (service) service.setStyles(d, true);
69813       }
69814
69815       /**
69816        * mouseout().
69817        */
69818       function mouseout() {
69819           var service = getService();
69820           _hoveredBubble = null;
69821           if (service) service.setStyles(null, true);
69822       }
69823
69824       /**
69825        * transform().
69826        */
69827       function transform(d) {
69828           var t = svgPointTransform(projection)(d);
69829           var rot = d.ca + _viewerYaw;
69830           if (rot) {
69831               t += ' rotate(' + Math.floor(rot) + ',0,0)';
69832           }
69833           return t;
69834       }
69835
69836
69837       function viewerChanged() {
69838           var service = getService();
69839           if (!service) return;
69840
69841           var viewer = service.viewer();
69842           if (!viewer) return;
69843
69844           // update viewfield rotation
69845           _viewerYaw = viewer.getYaw();
69846
69847           // avoid updating if the map is currently transformed
69848           // e.g. during drags or easing.
69849           if (context.map().isTransformed()) return;
69850
69851           layer.selectAll('.viewfield-group.selected')
69852               .attr('transform', transform);
69853       }
69854
69855
69856       /**
69857        * update().
69858        */
69859       function update() {
69860           var viewer = select('#photoviewer');
69861           var selected = viewer.empty() ? undefined : viewer.datum();
69862           var z = ~~context.map().zoom();
69863           var showMarkers = (z >= minMarkerZoom);
69864           var showViewfields = (z >= minViewfieldZoom);
69865           var service = getService();
69866
69867           var sequences = (service ? service.sequences(projection) : []);
69868           var bubbles = (service && showMarkers ? service.bubbles(projection) : []);
69869
69870           var traces = layer.selectAll('.sequences').selectAll('.sequence')
69871               .data(sequences, function(d) { return d.properties.key; });
69872
69873           // exit
69874           traces.exit()
69875               .remove();
69876
69877           // enter/update
69878           traces = traces.enter()
69879               .append('path')
69880               .attr('class', 'sequence')
69881               .merge(traces)
69882               .attr('d', svgPath(projection).geojson);
69883
69884
69885           var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
69886               .data(bubbles, function(d) {
69887                   // force reenter once bubbles are attached to a sequence
69888                   return d.key + (d.sequenceKey ? 'v1' : 'v0');
69889               });
69890
69891           // exit
69892           groups.exit()
69893               .remove();
69894
69895           // enter
69896           var groupsEnter = groups.enter()
69897               .append('g')
69898               .attr('class', 'viewfield-group')
69899               .on('mouseover', mouseover)
69900               .on('mouseout', mouseout)
69901               .on('click', click);
69902
69903           groupsEnter
69904               .append('g')
69905               .attr('class', 'viewfield-scale');
69906
69907           // update
69908           var markers = groups
69909               .merge(groupsEnter)
69910               .sort(function(a, b) {
69911                   return (a === selected) ? 1
69912                       : (b === selected) ? -1
69913                       : b.loc[1] - a.loc[1];
69914               })
69915               .attr('transform', transform)
69916               .select('.viewfield-scale');
69917
69918
69919           markers.selectAll('circle')
69920               .data([0])
69921               .enter()
69922               .append('circle')
69923               .attr('dx', '0')
69924               .attr('dy', '0')
69925               .attr('r', '6');
69926
69927           var viewfields = markers.selectAll('.viewfield')
69928               .data(showViewfields ? [0] : []);
69929
69930           viewfields.exit()
69931               .remove();
69932
69933           // viewfields may or may not be drawn...
69934           // but if they are, draw below the circles
69935           viewfields.enter()
69936               .insert('path', 'circle')
69937               .attr('class', 'viewfield')
69938               .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
69939               .attr('d', viewfieldPath);
69940
69941
69942           if (service) {
69943               service.setStyles(_hoveredBubble, true);
69944           }
69945
69946
69947           function viewfieldPath() {
69948               var d = this.parentNode.__data__;
69949               if (d.pano) {
69950                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
69951               } else {
69952                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
69953               }
69954           }
69955
69956       }
69957
69958       /**
69959        * drawImages()
69960        * drawImages is the method that is returned (and that runs) everytime 'svgStreetside()' is called.
69961        * 'svgStreetside()' is called from index.js
69962        */
69963       function drawImages(selection$$1) {
69964           var enabled = svgStreetside$$1.enabled;
69965           var service = getService();
69966
69967           layer = selection$$1.selectAll('.layer-streetside-images')
69968               .data(service ? [0] : []);
69969
69970           layer.exit()
69971               .remove();
69972
69973           var layerEnter = layer.enter()
69974               .append('g')
69975               .attr('class', 'layer-streetside-images')
69976               .style('display', enabled ? 'block' : 'none');
69977
69978           layerEnter
69979               .append('g')
69980               .attr('class', 'sequences');
69981
69982           layerEnter
69983               .append('g')
69984               .attr('class', 'markers');
69985
69986           layer = layerEnter
69987               .merge(layer);
69988
69989           if (enabled) {
69990               if (service && ~~context.map().zoom() >= minZoom) {
69991                   editOn();
69992                   update();
69993                   service.loadBubbles(projection);
69994               } else {
69995                   editOff();
69996               }
69997           }
69998       }
69999
70000
70001       /**
70002        * drawImages.enabled().
70003        */
70004       drawImages.enabled = function(_) {
70005           if (!arguments.length) return svgStreetside$$1.enabled;
70006           svgStreetside$$1.enabled = _;
70007           if (svgStreetside$$1.enabled) {
70008               showLayer();
70009           } else {
70010               hideLayer();
70011           }
70012           dispatch.call('change');
70013           return this;
70014       };
70015
70016       /**
70017        * drawImages.supported().
70018        */
70019       drawImages.supported = function() {
70020           return !!getService();
70021       };
70022
70023       init();
70024
70025       return drawImages;
70026   }
70027
70028   function svgMapillaryImages$$1(projection, context, dispatch) {
70029       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
70030       var minZoom = 12;
70031       var minMarkerZoom = 16;
70032       var minViewfieldZoom = 18;
70033       var layer = select(null);
70034       var _mapillary;
70035       var viewerCompassAngle;
70036
70037
70038       function init() {
70039           if (svgMapillaryImages$$1.initialized) return;  // run once
70040           svgMapillaryImages$$1.enabled = false;
70041           svgMapillaryImages$$1.initialized = true;
70042       }
70043
70044
70045       function getService() {
70046           if (services.mapillary && !_mapillary) {
70047               _mapillary = services.mapillary;
70048               _mapillary.event.on('loadedImages', throttledRedraw);
70049               _mapillary.event.on('bearingChanged', function(e) {
70050                   viewerCompassAngle = e;
70051
70052                   // avoid updating if the map is currently transformed
70053                   // e.g. during drags or easing.
70054                   if (context.map().isTransformed()) return;
70055
70056                   layer.selectAll('.viewfield-group.selected')
70057                       .filter(function(d) {
70058                           return d.pano;
70059                       })
70060                       .attr('transform', transform);
70061               });
70062           } else if (!services.mapillary && _mapillary) {
70063               _mapillary = null;
70064           }
70065
70066           return _mapillary;
70067       }
70068
70069
70070       function showLayer() {
70071           var service = getService();
70072           if (!service) return;
70073
70074           service.loadViewer(context);
70075           editOn();
70076
70077           layer
70078               .style('opacity', 0)
70079               .transition()
70080               .duration(250)
70081               .style('opacity', 1)
70082               .on('end', function () { dispatch.call('change'); });
70083       }
70084
70085
70086       function hideLayer() {
70087           var service = getService();
70088           if (service) {
70089               service.hideViewer();
70090           }
70091
70092           throttledRedraw.cancel();
70093
70094           layer
70095               .transition()
70096               .duration(250)
70097               .style('opacity', 0)
70098               .on('end', editOff);
70099       }
70100
70101
70102       function editOn() {
70103           layer.style('display', 'block');
70104       }
70105
70106
70107       function editOff() {
70108           layer.selectAll('.viewfield-group').remove();
70109           layer.style('display', 'none');
70110       }
70111
70112
70113       function click(d) {
70114           var service = getService();
70115           if (!service) return;
70116
70117           service
70118               .selectImage(d)
70119               .updateViewer(d.key, context)
70120               .showViewer();
70121
70122           context.map().centerEase(d.loc);
70123       }
70124
70125
70126       function mouseover(d) {
70127           var service = getService();
70128           if (service) service.setStyles(d);
70129       }
70130
70131
70132       function mouseout() {
70133           var service = getService();
70134           if (service) service.setStyles(null);
70135       }
70136
70137
70138       function transform(d) {
70139           var t = svgPointTransform(projection)(d);
70140           if (d.pano && isNumber(viewerCompassAngle)) {
70141               t += ' rotate(' + Math.floor(viewerCompassAngle) + ',0,0)';
70142           } else if (d.ca) {
70143               t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
70144           }
70145           return t;
70146       }
70147
70148
70149       function update() {
70150           var viewer = select('#photoviewer');
70151           var selected = viewer.empty() ? undefined : viewer.datum();
70152
70153           var z = ~~context.map().zoom();
70154           var showMarkers = (z >= minMarkerZoom);
70155           var showViewfields = (z >= minViewfieldZoom);
70156
70157           var service = getService();
70158           var sequences = (service ? service.sequences(projection) : []);
70159           var images = (service && showMarkers ? service.images(projection) : []);
70160
70161           var traces = layer.selectAll('.sequences').selectAll('.sequence')
70162               .data(sequences, function(d) { return d.properties.key; });
70163
70164           // exit
70165           traces.exit()
70166               .remove();
70167
70168           // enter/update
70169           traces = traces.enter()
70170               .append('path')
70171               .attr('class', 'sequence')
70172               .merge(traces)
70173               .attr('d', svgPath(projection).geojson);
70174
70175
70176           var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
70177               .data(images, function(d) { return d.key; });
70178
70179           // exit
70180           groups.exit()
70181               .remove();
70182
70183           // enter
70184           var groupsEnter = groups.enter()
70185               .append('g')
70186               .attr('class', 'viewfield-group')
70187               .on('mouseover', mouseover)
70188               .on('mouseout', mouseout)
70189               .on('click', click);
70190
70191           groupsEnter
70192               .append('g')
70193               .attr('class', 'viewfield-scale');
70194
70195           // update
70196           var markers = groups
70197               .merge(groupsEnter)
70198               .sort(function(a, b) {
70199                   return (a === selected) ? 1
70200                       : (b === selected) ? -1
70201                       : b.loc[1] - a.loc[1];  // sort Y
70202               })
70203               .attr('transform', transform)
70204               .select('.viewfield-scale');
70205
70206
70207           markers.selectAll('circle')
70208               .data([0])
70209               .enter()
70210               .append('circle')
70211               .attr('dx', '0')
70212               .attr('dy', '0')
70213               .attr('r', '6');
70214
70215           var viewfields = markers.selectAll('.viewfield')
70216               .data(showViewfields ? [0] : []);
70217
70218           viewfields.exit()
70219               .remove();
70220
70221           viewfields.enter()               // viewfields may or may not be drawn...
70222               .insert('path', 'circle')    // but if they are, draw below the circles
70223               .attr('class', 'viewfield')
70224               .classed('pano', function() { return this.parentNode.__data__.pano; })
70225               .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
70226               .attr('d', viewfieldPath);
70227
70228           function viewfieldPath() {
70229               var d = this.parentNode.__data__;
70230               if (d.pano) {
70231                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
70232               } else {
70233                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
70234               }
70235           }
70236       }
70237
70238
70239       function drawImages(selection$$1) {
70240           var enabled = svgMapillaryImages$$1.enabled;
70241           var service = getService();
70242
70243           layer = selection$$1.selectAll('.layer-mapillary-images')
70244               .data(service ? [0] : []);
70245
70246           layer.exit()
70247               .remove();
70248
70249           var layerEnter = layer.enter()
70250               .append('g')
70251               .attr('class', 'layer-mapillary-images')
70252               .style('display', enabled ? 'block' : 'none');
70253
70254           layerEnter
70255               .append('g')
70256               .attr('class', 'sequences');
70257
70258           layerEnter
70259               .append('g')
70260               .attr('class', 'markers');
70261
70262           layer = layerEnter
70263               .merge(layer);
70264
70265           if (enabled) {
70266               if (service && ~~context.map().zoom() >= minZoom) {
70267                   editOn();
70268                   update();
70269                   service.loadImages(projection);
70270               } else {
70271                   editOff();
70272               }
70273           }
70274       }
70275
70276
70277       drawImages.enabled = function(_) {
70278           if (!arguments.length) return svgMapillaryImages$$1.enabled;
70279           svgMapillaryImages$$1.enabled = _;
70280           if (svgMapillaryImages$$1.enabled) {
70281               showLayer();
70282           } else {
70283               hideLayer();
70284           }
70285           dispatch.call('change');
70286           return this;
70287       };
70288
70289
70290       drawImages.supported = function() {
70291           return !!getService();
70292       };
70293
70294
70295       init();
70296       return drawImages;
70297   }
70298
70299   function svgMapillarySigns$$1(projection, context, dispatch) {
70300       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
70301       var minZoom = 12;
70302       var layer = select(null);
70303       var _mapillary;
70304
70305
70306       function init() {
70307           if (svgMapillarySigns$$1.initialized) return;  // run once
70308           svgMapillarySigns$$1.enabled = false;
70309           svgMapillarySigns$$1.initialized = true;
70310       }
70311
70312
70313       function getService() {
70314           if (services.mapillary && !_mapillary) {
70315               _mapillary = services.mapillary;
70316               _mapillary.event.on('loadedSigns', throttledRedraw);
70317           } else if (!services.mapillary && _mapillary) {
70318               _mapillary = null;
70319           }
70320           return _mapillary;
70321       }
70322
70323
70324       function showLayer() {
70325           var service = getService();
70326           if (!service) return;
70327
70328           service.loadViewer(context);
70329           editOn();
70330       }
70331
70332
70333       function hideLayer() {
70334           throttledRedraw.cancel();
70335           editOff();
70336       }
70337
70338
70339       function editOn() {
70340           layer.style('display', 'block');
70341       }
70342
70343
70344       function editOff() {
70345           layer.selectAll('.icon-sign').remove();
70346           layer.style('display', 'none');
70347       }
70348
70349
70350       function click(d) {
70351           var service = getService();
70352           if (!service) return;
70353
70354           context.map().centerEase(d.loc);
70355
70356           var selected = service.getSelectedImage();
70357           var selectedImageKey = selected && selected.key;
70358           var imageKey;
70359
70360           // Pick one of the images the sign was detected in,
70361           // preference given to an image already selected.
70362           d.detections.forEach(function(detection) {
70363               if (!imageKey || selectedImageKey === detection.image_key) {
70364                   imageKey = detection.image_key;
70365               }
70366           });
70367
70368           service
70369               .selectImage(null, imageKey)
70370               .updateViewer(imageKey, context)
70371               .showViewer();
70372       }
70373
70374
70375       function update() {
70376           var service = getService();
70377           var data = (service ? service.signs(projection) : []);
70378           var viewer = select('#photoviewer');
70379           var selected = viewer.empty() ? undefined : viewer.datum();
70380           var selectedImageKey = selected && selected.key;
70381           var transform = svgPointTransform(projection);
70382
70383           var signs = layer.selectAll('.icon-sign')
70384               .data(data, function(d) { return d.key; });
70385
70386           // exit
70387           signs.exit()
70388               .remove();
70389
70390           // enter
70391           var enter = signs.enter()
70392               .append('use')
70393               .attr('class', 'icon-sign')
70394               .attr('width', '24px')
70395               .attr('height', '24px')
70396               .attr('x', '-12px')
70397               .attr('y', '-12px')
70398               .attr('xlink:href', function(d) { return '#' + d.value; })
70399               .classed('selected', function(d) {
70400                   return some(d.detections, function(detection) {
70401                       return detection.image_key === selectedImageKey;
70402                   });
70403               })
70404               .on('click', click);
70405
70406           // update
70407           signs
70408               .merge(enter)
70409               .sort(function(a, b) {
70410                   return (a === selected) ? 1
70411                       : (b === selected) ? -1
70412                       : b.loc[1] - a.loc[1];  // sort Y
70413               })
70414               .attr('transform', transform);
70415       }
70416
70417
70418       function drawSigns(selection$$1) {
70419           var enabled = svgMapillarySigns$$1.enabled;
70420           var service = getService();
70421
70422           layer = selection$$1.selectAll('.layer-mapillary-signs')
70423               .data(service ? [0] : []);
70424
70425           layer.exit()
70426               .remove();
70427
70428           layer = layer.enter()
70429               .append('g')
70430               .attr('class', 'layer-mapillary-signs')
70431               .style('display', enabled ? 'block' : 'none')
70432               .merge(layer);
70433
70434           if (enabled) {
70435               if (service && ~~context.map().zoom() >= minZoom) {
70436                   editOn();
70437                   update();
70438                   service.loadSigns(context, projection);
70439               } else {
70440                   editOff();
70441               }
70442           }
70443       }
70444
70445
70446       drawSigns.enabled = function(_) {
70447           if (!arguments.length) return svgMapillarySigns$$1.enabled;
70448           svgMapillarySigns$$1.enabled = _;
70449           if (svgMapillarySigns$$1.enabled) {
70450               showLayer();
70451           } else {
70452               hideLayer();
70453           }
70454           dispatch.call('change');
70455           return this;
70456       };
70457
70458
70459       drawSigns.supported = function() {
70460           return !!getService();
70461       };
70462
70463
70464       init();
70465       return drawSigns;
70466   }
70467
70468   function svgOpenstreetcamImages$$1(projection, context, dispatch) {
70469       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
70470       var minZoom = 12;
70471       var minMarkerZoom = 16;
70472       var minViewfieldZoom = 18;
70473       var layer = select(null);
70474       var _openstreetcam;
70475
70476
70477       function init() {
70478           if (svgOpenstreetcamImages$$1.initialized) return;  // run once
70479           svgOpenstreetcamImages$$1.enabled = false;
70480           svgOpenstreetcamImages$$1.initialized = true;
70481       }
70482
70483
70484       function getService() {
70485           if (services.openstreetcam && !_openstreetcam) {
70486               _openstreetcam = services.openstreetcam;
70487               _openstreetcam.event.on('loadedImages', throttledRedraw);
70488           } else if (!services.openstreetcam && _openstreetcam) {
70489               _openstreetcam = null;
70490           }
70491
70492           return _openstreetcam;
70493       }
70494
70495
70496       function showLayer() {
70497           var service = getService();
70498           if (!service) return;
70499
70500           service.loadViewer(context);
70501           editOn();
70502
70503           layer
70504               .style('opacity', 0)
70505               .transition()
70506               .duration(250)
70507               .style('opacity', 1)
70508               .on('end', function () { dispatch.call('change'); });
70509       }
70510
70511
70512       function hideLayer() {
70513           var service = getService();
70514           if (service) {
70515               service.hideViewer();
70516           }
70517
70518           throttledRedraw.cancel();
70519
70520           layer
70521               .transition()
70522               .duration(250)
70523               .style('opacity', 0)
70524               .on('end', editOff);
70525       }
70526
70527
70528       function editOn() {
70529           layer.style('display', 'block');
70530       }
70531
70532
70533       function editOff() {
70534           layer.selectAll('.viewfield-group').remove();
70535           layer.style('display', 'none');
70536       }
70537
70538
70539       function click(d) {
70540           var service = getService();
70541           if (!service) return;
70542
70543           service
70544               .selectImage(d)
70545               .updateViewer(d)
70546               .showViewer();
70547
70548           context.map().centerEase(d.loc);
70549       }
70550
70551
70552       function mouseover(d) {
70553           var service = getService();
70554           if (service) service.setStyles(d);
70555       }
70556
70557
70558       function mouseout() {
70559           var service = getService();
70560           if (service) service.setStyles(null);
70561       }
70562
70563
70564       function transform(d) {
70565           var t = svgPointTransform(projection)(d);
70566           if (d.ca) {
70567               t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
70568           }
70569           return t;
70570       }
70571
70572
70573       function update() {
70574           var viewer = select('#photoviewer');
70575           var selected = viewer.empty() ? undefined : viewer.datum();
70576
70577           var z = ~~context.map().zoom();
70578           var showMarkers = (z >= minMarkerZoom);
70579           var showViewfields = (z >= minViewfieldZoom);
70580
70581           var service = getService();
70582           var sequences = (service ? service.sequences(projection) : []);
70583           var images = (service && showMarkers ? service.images(projection) : []);
70584
70585           var traces = layer.selectAll('.sequences').selectAll('.sequence')
70586               .data(sequences, function(d) { return d.properties.key; });
70587
70588           // exit
70589           traces.exit()
70590               .remove();
70591
70592           // enter/update
70593           traces = traces.enter()
70594               .append('path')
70595               .attr('class', 'sequence')
70596               .merge(traces)
70597               .attr('d', svgPath(projection).geojson);
70598
70599
70600           var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
70601               .data(images, function(d) { return d.key; });
70602
70603           // exit
70604           groups.exit()
70605               .remove();
70606
70607           // enter
70608           var groupsEnter = groups.enter()
70609               .append('g')
70610               .attr('class', 'viewfield-group')
70611               .on('mouseover', mouseover)
70612               .on('mouseout', mouseout)
70613               .on('click', click);
70614
70615           groupsEnter
70616               .append('g')
70617               .attr('class', 'viewfield-scale');
70618
70619           // update
70620           var markers = groups
70621               .merge(groupsEnter)
70622               .sort(function(a, b) {
70623                   return (a === selected) ? 1
70624                       : (b === selected) ? -1
70625                       : b.loc[1] - a.loc[1];  // sort Y
70626               })
70627               .attr('transform', transform)
70628               .select('.viewfield-scale');
70629
70630
70631           markers.selectAll('circle')
70632               .data([0])
70633               .enter()
70634               .append('circle')
70635               .attr('dx', '0')
70636               .attr('dy', '0')
70637               .attr('r', '6');
70638
70639           var viewfields = markers.selectAll('.viewfield')
70640               .data(showViewfields ? [0] : []);
70641
70642           viewfields.exit()
70643               .remove();
70644
70645           viewfields.enter()               // viewfields may or may not be drawn...
70646               .insert('path', 'circle')    // but if they are, draw below the circles
70647               .attr('class', 'viewfield')
70648               .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
70649               .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');
70650       }
70651
70652
70653       function drawImages(selection$$1) {
70654           var enabled = svgOpenstreetcamImages$$1.enabled,
70655               service = getService();
70656
70657           layer = selection$$1.selectAll('.layer-openstreetcam-images')
70658               .data(service ? [0] : []);
70659
70660           layer.exit()
70661               .remove();
70662
70663           var layerEnter = layer.enter()
70664               .append('g')
70665               .attr('class', 'layer-openstreetcam-images')
70666               .style('display', enabled ? 'block' : 'none');
70667
70668           layerEnter
70669               .append('g')
70670               .attr('class', 'sequences');
70671
70672           layerEnter
70673               .append('g')
70674               .attr('class', 'markers');
70675
70676           layer = layerEnter
70677               .merge(layer);
70678
70679           if (enabled) {
70680               if (service && ~~context.map().zoom() >= minZoom) {
70681                   editOn();
70682                   update();
70683                   service.loadImages(projection);
70684               } else {
70685                   editOff();
70686               }
70687           }
70688       }
70689
70690
70691       drawImages.enabled = function(_) {
70692           if (!arguments.length) return svgOpenstreetcamImages$$1.enabled;
70693           svgOpenstreetcamImages$$1.enabled = _;
70694           if (svgOpenstreetcamImages$$1.enabled) {
70695               showLayer();
70696           } else {
70697               hideLayer();
70698           }
70699           dispatch.call('change');
70700           return this;
70701       };
70702
70703
70704       drawImages.supported = function() {
70705           return !!getService();
70706       };
70707
70708
70709       init();
70710       return drawImages;
70711   }
70712
70713   function svgOsm(projection, context, dispatch) {
70714       var enabled = true;
70715
70716
70717       function drawOsm(selection) {
70718           selection.selectAll('.layer-osm')
70719               .data(['covered', 'areas', 'lines', 'points', 'labels'])
70720               .enter()
70721               .append('g')
70722               .attr('class', function(d) { return 'layer-osm ' + d; });
70723
70724           selection.selectAll('.layer-osm.points').selectAll('.points-group')
70725               .data(['points', 'midpoints', 'vertices', 'turns'])
70726               .enter()
70727               .append('g')
70728               .attr('class', function(d) { return 'points-group ' + d; });
70729       }
70730
70731
70732       function showLayer() {
70733           var layer = context.surface().selectAll('.data-layer.osm');
70734           layer.interrupt();
70735
70736           layer
70737               .classed('disabled', false)
70738               .style('opacity', 0)
70739               .transition()
70740               .duration(250)
70741               .style('opacity', 1)
70742               .on('end interrupt', function () {
70743                   dispatch.call('change');
70744               });
70745       }
70746
70747
70748       function hideLayer() {
70749           var layer = context.surface().selectAll('.data-layer.osm');
70750           layer.interrupt();
70751
70752           layer
70753               .transition()
70754               .duration(250)
70755               .style('opacity', 0)
70756               .on('end interrupt', function () {
70757                   layer.classed('disabled', true);
70758                   dispatch.call('change');
70759               });
70760       }
70761
70762
70763       drawOsm.enabled = function(_) {
70764           if (!arguments.length) return enabled;
70765           enabled = _;
70766
70767           if (enabled) {
70768               showLayer();
70769           } else {
70770               hideLayer();
70771           }
70772
70773           dispatch.call('change');
70774           return this;
70775       };
70776
70777
70778       return drawOsm;
70779   }
70780
70781   var _notesEnabled = false;
70782   var _osmService;
70783
70784
70785   function svgNotes$$1(projection, context, dispatch$$1) {
70786       if (!dispatch$$1) { dispatch$$1 = dispatch('change'); }
70787       var throttledRedraw = throttle(function () { dispatch$$1.call('change'); }, 1000);
70788       var minZoom = 12;
70789       var touchLayer = select(null);
70790       var drawLayer = select(null);
70791       var _notesVisible = false;
70792
70793
70794       function markerPath(selection$$1, klass) {
70795           selection$$1
70796               .attr('class', klass)
70797               .attr('transform', 'translate(-8, -22)')
70798               .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');
70799       }
70800
70801
70802       // Loosely-coupled osm service for fetching notes.
70803       function getService() {
70804           if (services.osm && !_osmService) {
70805               _osmService = services.osm;
70806               _osmService.on('loadedNotes', throttledRedraw);
70807           } else if (!services.osm && _osmService) {
70808               _osmService = null;
70809           }
70810
70811           return _osmService;
70812       }
70813
70814
70815       // Show the notes
70816       function editOn() {
70817           if (!_notesVisible) {
70818               _notesVisible = true;
70819               drawLayer
70820                   .style('display', 'block');
70821           }
70822       }
70823
70824
70825       // Immediately remove the notes and their touch targets
70826       function editOff() {
70827           if (_notesVisible) {
70828               _notesVisible = false;
70829               drawLayer
70830                   .style('display', 'none');
70831               drawLayer.selectAll('.note')
70832                   .remove();
70833               touchLayer.selectAll('.note')
70834                   .remove();
70835           }
70836       }
70837
70838
70839       // Enable the layer.  This shows the notes and transitions them to visible.
70840       function layerOn() {
70841           editOn();
70842
70843           drawLayer
70844               .style('opacity', 0)
70845               .transition()
70846               .duration(250)
70847               .style('opacity', 1)
70848               .on('end interrupt', function () {
70849                   dispatch$$1.call('change');
70850               });
70851       }
70852
70853
70854       // Disable the layer.  This transitions the layer invisible and then hides the notes.
70855       function layerOff() {
70856           throttledRedraw.cancel();
70857           drawLayer.interrupt();
70858           touchLayer.selectAll('.note')
70859               .remove();
70860
70861           drawLayer
70862               .transition()
70863               .duration(250)
70864               .style('opacity', 0)
70865               .on('end interrupt', function () {
70866                   editOff();
70867                   dispatch$$1.call('change');
70868               });
70869       }
70870
70871
70872       // Update the note markers
70873       function updateMarkers() {
70874           if (!_notesVisible || !_notesEnabled) return;
70875
70876           var service = getService();
70877           var selectedID = context.selectedNoteID();
70878           var data = (service ? service.notes(projection) : []);
70879           var getTransform = svgPointTransform(projection);
70880
70881           // Draw markers..
70882           var notes = drawLayer.selectAll('.note')
70883               .data(data, function(d) { return d.status + d.id; });
70884
70885           // exit
70886           notes.exit()
70887               .remove();
70888
70889           // enter
70890           var notesEnter = notes.enter()
70891               .append('g')
70892               .attr('class', function(d) { return 'note note-' + d.id + ' ' + d.status; })
70893               .classed('new', function(d) { return d.id < 0; });
70894
70895           notesEnter
70896               .append('ellipse')
70897               .attr('cx', 0.5)
70898               .attr('cy', 1)
70899               .attr('rx', 6.5)
70900               .attr('ry', 3)
70901               .attr('class', 'stroke');
70902
70903           notesEnter
70904               .append('path')
70905               .call(markerPath, 'shadow');
70906
70907           notesEnter
70908               .append('use')
70909               .attr('class', 'note-fill')
70910               .attr('width', '20px')
70911               .attr('height', '20px')
70912               .attr('x', '-8px')
70913               .attr('y', '-22px')
70914               .attr('xlink:href', '#iD-icon-note');
70915
70916           notesEnter.selectAll('.note-annotation')
70917               .data(function(d) { return [d]; })
70918               .enter()
70919               .append('use')
70920               .attr('class', 'note-annotation')
70921               .attr('width', '10px')
70922               .attr('height', '10px')
70923               .attr('x', '-3px')
70924               .attr('y', '-19px')
70925               .attr('xlink:href', function(d) {
70926                   return '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply'));
70927               });
70928
70929           // update
70930           notes
70931               .merge(notesEnter)
70932               .sort(sortY)
70933               .classed('selected', function(d) {
70934                   var mode = context.mode();
70935                   var isMoving = mode && mode.id === 'drag-note';  // no shadows when dragging
70936                   return !isMoving && d.id === selectedID;
70937               })
70938               .attr('transform', getTransform);
70939
70940
70941           // Draw targets..
70942           if (touchLayer.empty()) return;
70943           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
70944
70945           var targets = touchLayer.selectAll('.note')
70946               .data(data, function(d) { return d.id; });
70947
70948           // exit
70949           targets.exit()
70950               .remove();
70951
70952           // enter/update
70953           targets.enter()
70954               .append('rect')
70955               .attr('width', '20px')
70956               .attr('height', '20px')
70957               .attr('x', '-8px')
70958               .attr('y', '-22px')
70959               .merge(targets)
70960               .sort(sortY)
70961               .attr('class', function(d) {
70962                   var newClass = (d.id < 0 ? 'new' : '');
70963                   return 'note target note-' + d.id + ' ' + fillClass + newClass;
70964               })
70965               .attr('transform', getTransform);
70966
70967
70968           function sortY(a, b) {
70969               return (a.id === selectedID) ? 1 : (b.id === selectedID) ? -1 : b.loc[1] - a.loc[1];
70970           }
70971       }
70972
70973
70974       // Draw the notes layer and schedule loading notes and updating markers.
70975       function drawNotes(selection$$1) {
70976           var service = getService();
70977
70978           var surface = context.surface();
70979           if (surface && !surface.empty()) {
70980               touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
70981           }
70982
70983           drawLayer = selection$$1.selectAll('.layer-notes')
70984               .data(service ? [0] : []);
70985
70986           drawLayer.exit()
70987               .remove();
70988
70989           drawLayer = drawLayer.enter()
70990               .append('g')
70991               .attr('class', 'layer-notes')
70992               .style('display', _notesEnabled ? 'block' : 'none')
70993               .merge(drawLayer);
70994
70995           if (_notesEnabled) {
70996               if (service && ~~context.map().zoom() >= minZoom) {
70997                   editOn();
70998                   service.loadNotes(projection);
70999                   updateMarkers();
71000               } else {
71001                   editOff();
71002               }
71003           }
71004       }
71005
71006
71007       // Toggles the layer on and off
71008       drawNotes.enabled = function(val) {
71009           if (!arguments.length) return _notesEnabled;
71010
71011           _notesEnabled = val;
71012           if (_notesEnabled) {
71013               layerOn();
71014           } else {
71015               layerOff();
71016               if (context.selectedNoteID()) {
71017                   context.enter(modeBrowse(context));
71018               }
71019           }
71020
71021           dispatch$$1.call('change');
71022           return this;
71023       };
71024
71025
71026       return drawNotes;
71027   }
71028
71029   function svgTouch() {
71030
71031       function drawTouch(selection) {
71032           selection.selectAll('.layer-touch')
71033               .data(['areas', 'lines', 'points', 'turns', 'markers'])
71034               .enter()
71035               .append('g')
71036               .attr('class', function(d) { return 'layer-touch ' + d; });
71037       }
71038
71039       return drawTouch;
71040   }
71041
71042   function svgLayers(projection, context) {
71043       var dispatch$$1 = dispatch('change');
71044       var svg = select(null);
71045       var layers = [
71046           { id: 'osm', layer: svgOsm(projection, context, dispatch$$1) },
71047           { id: 'notes', layer: svgNotes$$1(projection, context, dispatch$$1) },
71048           { id: 'data', layer: svgData$$1(projection, context, dispatch$$1) },
71049           { id: 'keepRight', layer: svgKeepRight$$1(projection, context, dispatch$$1) },
71050           { id: 'streetside', layer: svgStreetside$$1(projection, context, dispatch$$1)},
71051           { id: 'mapillary-images', layer: svgMapillaryImages$$1(projection, context, dispatch$$1) },
71052           { id: 'mapillary-signs',  layer: svgMapillarySigns$$1(projection, context, dispatch$$1) },
71053           { id: 'openstreetcam-images', layer: svgOpenstreetcamImages$$1(projection, context, dispatch$$1) },
71054           { id: 'debug', layer: svgDebug$$1(projection, context, dispatch$$1) },
71055           { id: 'geolocate', layer: svgGeolocate(projection, context, dispatch$$1) },
71056           { id: 'touch', layer: svgTouch(projection, context, dispatch$$1) }
71057       ];
71058
71059
71060       function drawLayers(selection$$1) {
71061           svg = selection$$1.selectAll('.surface')
71062               .data([0]);
71063
71064           svg = svg.enter()
71065               .append('svg')
71066               .attr('class', 'surface')
71067               .merge(svg);
71068
71069           var defs = svg.selectAll('.surface-defs')
71070               .data([0]);
71071
71072           defs.enter()
71073               .append('defs')
71074               .attr('class', 'surface-defs');
71075
71076           var groups = svg.selectAll('.data-layer')
71077               .data(layers);
71078
71079           groups.exit()
71080               .remove();
71081
71082           groups.enter()
71083               .append('g')
71084               .attr('class', function(d) { return 'data-layer ' + d.id; })
71085               .merge(groups)
71086               .each(function(d) { select(this).call(d.layer); });
71087       }
71088
71089
71090       drawLayers.all = function() {
71091           return layers;
71092       };
71093
71094
71095       drawLayers.layer = function(id) {
71096           var obj = find$1(layers, function(o) {return o.id === id;});
71097           return obj && obj.layer;
71098       };
71099
71100
71101       drawLayers.only = function(what) {
71102           var arr = [].concat(what);
71103           drawLayers.remove(difference(map$3(layers, 'id'), arr));
71104           return this;
71105       };
71106
71107
71108       drawLayers.remove = function(what) {
71109           var arr = [].concat(what);
71110           arr.forEach(function(id) {
71111               layers = reject(layers, function(o) {return o.id === id;});
71112           });
71113           dispatch$$1.call('change');
71114           return this;
71115       };
71116
71117
71118       drawLayers.add = function(what) {
71119           var arr = [].concat(what);
71120           arr.forEach(function(obj) {
71121               if ('id' in obj && 'layer' in obj) {
71122                   layers.push(obj);
71123               }
71124           });
71125           dispatch$$1.call('change');
71126           return this;
71127       };
71128
71129
71130       drawLayers.dimensions = function(_) {
71131           if (!arguments.length) return utilGetDimensions(svg);
71132           utilSetDimensions(svg, _);
71133           return this;
71134       };
71135
71136
71137       return utilRebind(drawLayers, dispatch$$1, 'on');
71138   }
71139
71140   function svgLines$$1(projection, context) {
71141       var detected = utilDetect();
71142
71143       var highway_stack = {
71144           motorway: 0,
71145           motorway_link: 1,
71146           trunk: 2,
71147           trunk_link: 3,
71148           primary: 4,
71149           primary_link: 5,
71150           secondary: 6,
71151           tertiary: 7,
71152           unclassified: 8,
71153           residential: 9,
71154           service: 10,
71155           footway: 11
71156       };
71157
71158
71159       function drawTargets(selection, graph, entities, filter$$1) {
71160           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
71161           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
71162           var getPath = svgPath(projection).geojson;
71163           var activeID = context.activeID();
71164
71165           // The targets and nopes will be MultiLineString sub-segments of the ways
71166           var data = { targets: [], nopes: [] };
71167
71168           entities.forEach(function(way) {
71169               var features = svgSegmentWay(way, graph, activeID);
71170               data.targets.push.apply(data.targets, features.passive);
71171               data.nopes.push.apply(data.nopes, features.active);
71172           });
71173
71174
71175           // Targets allow hover and vertex snapping
71176           var targetData = data.targets.filter(getPath);
71177           var targets = selection.selectAll('.line.target-allowed')
71178               .filter(function(d) { return filter$$1(d.properties.entity); })
71179               .data(targetData, function key(d) { return d.id; });
71180
71181           // exit
71182           targets.exit()
71183               .remove();
71184
71185           // enter/update
71186           targets.enter()
71187               .append('path')
71188               .merge(targets)
71189               .attr('d', getPath)
71190               .attr('class', function(d) { return 'way line target target-allowed ' + targetClass + d.id; });
71191
71192
71193           // NOPE
71194           var nopeData = data.nopes.filter(getPath);
71195           var nopes = selection.selectAll('.line.target-nope')
71196               .filter(function(d) { return filter$$1(d.properties.entity); })
71197               .data(nopeData, function key(d) { return d.id; });
71198
71199           // exit
71200           nopes.exit()
71201               .remove();
71202
71203           // enter/update
71204           nopes.enter()
71205               .append('path')
71206               .merge(nopes)
71207               .attr('d', getPath)
71208               .attr('class', function(d) { return 'way line target target-nope ' + nopeClass + d.id; });
71209       }
71210
71211
71212       function drawLines(selection, graph, entities, filter$$1) {
71213
71214           function waystack(a, b) {
71215               var selected = context.selectedIDs();
71216               var scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0;
71217               var scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0;
71218
71219               if (a.tags.highway) { scoreA -= highway_stack[a.tags.highway]; }
71220               if (b.tags.highway) { scoreB -= highway_stack[b.tags.highway]; }
71221               return scoreA - scoreB;
71222           }
71223
71224
71225           function drawLineGroup(selection, klass, isSelected) {
71226               // Note: Don't add `.selected` class in draw modes
71227               var mode = context.mode();
71228               var isDrawing = mode && /^draw/.test(mode.id);
71229               var selectedClass = (!isDrawing && isSelected) ? 'selected ' : '';
71230
71231               var lines = selection
71232                   .selectAll('path')
71233                   .filter(filter$$1)
71234                   .data(getPathData(isSelected), osmEntity$$1.key);
71235
71236               lines.exit()
71237                   .remove();
71238
71239               // Optimization: Call expensive TagClasses only on enter selection. This
71240               // works because osmEntity.key is defined to include the entity v attribute.
71241               lines.enter()
71242                   .append('path')
71243                   .attr('class', function(d) {
71244                       var oldMPClass = oldMultiPolygonOuters[d.id] ? 'old-multipolygon ' : '';
71245                       return 'way line ' + klass + ' ' + selectedClass + oldMPClass + d.id;
71246                   })
71247                   .call(svgTagClasses())
71248                   .merge(lines)
71249                   .sort(waystack)
71250                   .attr('d', getPath)
71251                   .call(svgTagClasses().tags(svgRelationMemberTags(graph)));
71252
71253               return selection;
71254           }
71255
71256
71257           function getPathData(isSelected) {
71258               return function() {
71259                   var layer = this.parentNode.__data__;
71260                   var data = pathdata[layer] || [];
71261                   return data.filter(function(d) {
71262                       if (isSelected)
71263                           return context.selectedIDs().indexOf(d.id) !== -1;
71264                       else
71265                           return context.selectedIDs().indexOf(d.id) === -1;
71266                   });
71267               };
71268           }
71269
71270           function addMarkers(layergroup, pathclass, groupclass, groupdata, marker) {
71271               var markergroup = layergroup
71272                   .selectAll('g.' + groupclass)
71273                   .data([pathclass]);
71274
71275               markergroup = markergroup.enter()
71276                   .append('g')
71277                   .attr('class', groupclass)
71278                   .merge(markergroup);
71279
71280               var markers = markergroup
71281                   .selectAll('path')
71282                   .filter(filter$$1)
71283                   .data(
71284                       function data() { return groupdata[this.parentNode.__data__] || []; },
71285                       function key(d) { return [d.id, d.index]; }
71286                   );
71287
71288               markers.exit()
71289                   .remove();
71290
71291               markers = markers.enter()
71292                   .append('path')
71293                   .attr('class', pathclass)
71294                   .attr('marker-mid', marker)
71295                   .merge(markers)
71296                   .attr('d', function(d) { return d.d; });
71297
71298               if (detected.ie) {
71299                   markers.each(function() { this.parentNode.insertBefore(this, this); });
71300               }
71301           }
71302
71303
71304           var getPath = svgPath(projection, graph);
71305           var ways = [];
71306           var pathdata = {};
71307           var onewaydata = {};
71308           var sideddata = {};
71309           var oldMultiPolygonOuters = {};
71310
71311           for (var i = 0; i < entities.length; i++) {
71312               var entity = entities[i];
71313               var outer = osmSimpleMultipolygonOuterMember(entity, graph);
71314               if (outer) {
71315                   ways.push(entity.mergeTags(outer.tags));
71316                   oldMultiPolygonOuters[outer.id] = true;
71317               } else if (entity.geometry(graph) === 'line') {
71318                   ways.push(entity);
71319               }
71320           }
71321
71322           ways = ways.filter(getPath);
71323           pathdata = groupBy(ways, function(way) { return way.layer(); });
71324
71325           forOwn(pathdata, function(v, k) {
71326               var onewayArr = filter(v, function(d) { return d.isOneWay(); });
71327               var onewaySegments = svgMarkerSegments(
71328                   projection, graph, 35,
71329                   function shouldReverse(entity) { return entity.tags.oneway === '-1'; },
71330                   function bothDirections(entity) {
71331                       return entity.tags.oneway === 'reversible' || entity.tags.oneway === 'alternating';
71332                   }
71333               );
71334               onewaydata[k] = flatten(map$3(onewayArr, onewaySegments));
71335
71336               var sidedArr = filter(v, function(d) { return d.isSided(); });
71337               var sidedSegments = svgMarkerSegments(
71338                   projection, graph, 30,
71339                   function shouldReverse() { return false; },
71340                   function bothDirections() { return false; }
71341               );
71342               sideddata[k] = flatten(map$3(sidedArr, sidedSegments));
71343           });
71344
71345
71346           var covered = selection.selectAll('.layer-osm.covered');     // under areas
71347           var uncovered = selection.selectAll('.layer-osm.lines');     // over areas
71348           var touchLayer = selection.selectAll('.layer-touch.lines');
71349
71350           // Draw lines..
71351           [covered, uncovered].forEach(function(selection) {
71352               var range$$1 = (selection === covered ? range(-10,0) : range(0,11));
71353               var layergroup = selection
71354                   .selectAll('g.layergroup')
71355                   .data(range$$1);
71356
71357               layergroup = layergroup.enter()
71358                   .append('g')
71359                   .attr('class', function(d) { return 'layergroup layer' + String(d); })
71360                   .merge(layergroup);
71361
71362               layergroup
71363                   .selectAll('g.linegroup')
71364                   .data(['shadow', 'casing', 'stroke', 'shadow-highlighted', 'casing-highlighted', 'stroke-highlighted'])
71365                   .enter()
71366                   .append('g')
71367                   .attr('class', function(d) { return 'linegroup line-' + d; });
71368
71369               layergroup.selectAll('g.line-shadow')
71370                   .call(drawLineGroup, 'shadow', false);
71371               layergroup.selectAll('g.line-casing')
71372                   .call(drawLineGroup, 'casing', false);
71373               layergroup.selectAll('g.line-stroke')
71374                   .call(drawLineGroup, 'stroke', false);
71375
71376               layergroup.selectAll('g.line-shadow-highlighted')
71377                   .call(drawLineGroup, 'shadow', true);
71378               layergroup.selectAll('g.line-casing-highlighted')
71379                   .call(drawLineGroup, 'casing', true);
71380               layergroup.selectAll('g.line-stroke-highlighted')
71381                   .call(drawLineGroup, 'stroke', true);
71382
71383               addMarkers(layergroup, 'oneway', 'onewaygroup', onewaydata, 'url(#oneway-marker)');
71384               addMarkers(layergroup, 'sided', 'sidedgroup', sideddata,
71385                   function marker(d) {
71386                       var category = graph.entity(d.id).sidednessIdentifier();
71387                       return 'url(#sided-marker-' + category + ')';
71388                   }
71389               );
71390           });
71391
71392           // Draw touch targets..
71393           touchLayer
71394               .call(drawTargets, graph, ways, filter$$1);
71395       }
71396
71397
71398       return drawLines;
71399   }
71400
71401   function svgMidpoints$$1(projection, context) {
71402       var targetRadius = 8;
71403
71404       function drawTargets(selection, graph, entities, filter) {
71405           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
71406           var getTransform = svgPointTransform(projection).geojson;
71407
71408           var data = entities.map(function(midpoint) {
71409               return {
71410                   type: 'Feature',
71411                   id: midpoint.id,
71412                   properties: {
71413                       target: true,
71414                       entity: midpoint
71415                   },
71416                   geometry: {
71417                       type: 'Point',
71418                       coordinates: midpoint.loc
71419                   }
71420               };
71421           });
71422
71423           var targets = selection.selectAll('.midpoint.target')
71424               .filter(function(d) { return filter(d.properties.entity); })
71425               .data(data, function key(d) { return d.id; });
71426
71427           // exit
71428           targets.exit()
71429               .remove();
71430
71431           // enter/update
71432           targets.enter()
71433               .append('circle')
71434               .attr('r', targetRadius)
71435               .merge(targets)
71436               .attr('class', function(d) { return 'node midpoint target ' + fillClass + d.id; })
71437               .attr('transform', getTransform);
71438       }
71439
71440
71441       function drawMidpoints(selection, graph, entities, filter, extent) {
71442           var drawLayer = selection.selectAll('.layer-osm.points .points-group.midpoints');
71443           var touchLayer = selection.selectAll('.layer-touch.points');
71444
71445           var mode = context.mode();
71446           if (mode && mode.id !== 'select') {
71447               drawLayer.selectAll('.midpoint').remove();
71448               touchLayer.selectAll('.midpoint.target').remove();
71449               return;
71450           }
71451
71452           var poly = extent.polygon();
71453           var midpoints = {};
71454
71455           for (var i = 0; i < entities.length; i++) {
71456               var entity = entities[i];
71457
71458               if (entity.type !== 'way') continue;
71459               if (!filter(entity)) continue;
71460               if (context.selectedIDs().indexOf(entity.id) < 0) continue;
71461
71462               var nodes = graph.childNodes(entity);
71463               for (var j = 0; j < nodes.length - 1; j++) {
71464                   var a = nodes[j];
71465                   var b = nodes[j + 1];
71466                   var id = [a.id, b.id].sort().join('-');
71467
71468                   if (midpoints[id]) {
71469                       midpoints[id].parents.push(entity);
71470                   } else if (geoVecLength(projection(a.loc), projection(b.loc)) > 40) {
71471                       var point = geoVecInterp(a.loc, b.loc, 0.5);
71472                       var loc = null;
71473
71474                       if (extent.intersects(point)) {
71475                           loc = point;
71476                       } else {
71477                           for (var k = 0; k < 4; k++) {
71478                               point = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]);
71479                               if (point &&
71480                                   geoVecLength(projection(a.loc), projection(point)) > 20 &&
71481                                   geoVecLength(projection(b.loc), projection(point)) > 20)
71482                               {
71483                                   loc = point;
71484                                   break;
71485                               }
71486                           }
71487                       }
71488
71489                       if (loc) {
71490                           midpoints[id] = {
71491                               type: 'midpoint',
71492                               id: id,
71493                               loc: loc,
71494                               edge: [a.id, b.id],
71495                               parents: [entity]
71496                           };
71497                       }
71498                   }
71499               }
71500           }
71501
71502
71503           function midpointFilter(d) {
71504               if (midpoints[d.id])
71505                   return true;
71506
71507               for (var i = 0; i < d.parents.length; i++) {
71508                   if (filter(d.parents[i])) {
71509                       return true;
71510                   }
71511               }
71512
71513               return false;
71514           }
71515
71516
71517           var groups = drawLayer.selectAll('.midpoint')
71518               .filter(midpointFilter)
71519               .data(values$1(midpoints), function(d) { return d.id; });
71520
71521           groups.exit()
71522               .remove();
71523
71524           var enter = groups.enter()
71525               .insert('g', ':first-child')
71526               .attr('class', 'midpoint');
71527
71528           enter
71529               .append('polygon')
71530               .attr('points', '-6,8 10,0 -6,-8')
71531               .attr('class', 'shadow');
71532
71533           enter
71534               .append('polygon')
71535               .attr('points', '-3,4 5,0 -3,-4')
71536               .attr('class', 'fill');
71537
71538           groups = groups
71539               .merge(enter)
71540               .attr('transform', function(d) {
71541                   var translate = svgPointTransform(projection);
71542                   var a = graph.entity(d.edge[0]);
71543                   var b = graph.entity(d.edge[1]);
71544                   var angle = geoAngle(a, b, projection) * (180 / Math.PI);
71545                   return translate(d) + ' rotate(' + angle + ')';
71546               })
71547               .call(svgTagClasses().tags(
71548                   function(d) { return d.parents[0].tags; }
71549               ));
71550
71551           // Propagate data bindings.
71552           groups.select('polygon.shadow');
71553           groups.select('polygon.fill');
71554
71555
71556           // Draw touch targets..
71557           touchLayer
71558               .call(drawTargets, graph, values$1(midpoints), midpointFilter);
71559       }
71560
71561       return drawMidpoints;
71562   }
71563
71564   function svgPoints$$1(projection, context) {
71565
71566       function markerPath(selection, klass) {
71567           selection
71568               .attr('class', klass)
71569               .attr('transform', 'translate(-8, -23)')
71570               .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');
71571       }
71572
71573       function sortY(a, b) {
71574           return b.loc[1] - a.loc[1];
71575       }
71576
71577
71578       // Avoid exit/enter if we're just moving stuff around.
71579       // The node will get a new version but we only need to run the update selection.
71580       function fastEntityKey(d) {
71581           var mode = context.mode();
71582           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
71583           return isMoving ? d.id : osmEntity$$1.key(d);
71584       }
71585
71586
71587       function drawTargets(selection, graph, entities, filter) {
71588           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
71589           var getTransform = svgPointTransform(projection).geojson;
71590           var activeID = context.activeID();
71591           var data = [];
71592
71593           entities.forEach(function(node) {
71594               if (activeID === node.id) return;   // draw no target on the activeID
71595
71596               data.push({
71597                   type: 'Feature',
71598                   id: node.id,
71599                   properties: {
71600                       target: true,
71601                       entity: node
71602                   },
71603                   geometry: node.asGeoJSON()
71604               });
71605           });
71606
71607           var targets = selection.selectAll('.point.target')
71608               .filter(function(d) { return filter(d.properties.entity); })
71609               .data(data, function key(d) { return d.id; });
71610
71611           // exit
71612           targets.exit()
71613               .remove();
71614
71615           // enter/update
71616           targets.enter()
71617               .append('rect')
71618               .attr('x', -10)
71619               .attr('y', -26)
71620               .attr('width', 20)
71621               .attr('height', 30)
71622               .merge(targets)
71623               .attr('class', function(d) { return 'node point target ' + fillClass + d.id; })
71624               .attr('transform', getTransform);
71625       }
71626
71627
71628       function drawPoints(selection, graph, entities, filter) {
71629           var wireframe = context.surface().classed('fill-wireframe');
71630           var zoom = geoScaleToZoom(projection.scale());
71631
71632           // Points with a direction will render as vertices at higher zooms..
71633           function renderAsPoint(entity) {
71634               return entity.geometry(graph) === 'point' &&
71635                   !(zoom >= 18 && entity.directions(graph, projection).length);
71636           }
71637
71638           // All points will render as vertices in wireframe mode too..
71639           var points = wireframe ? [] : entities.filter(renderAsPoint);
71640           points.sort(sortY);
71641
71642
71643           var drawLayer = selection.selectAll('.layer-osm.points .points-group.points');
71644           var touchLayer = selection.selectAll('.layer-touch.points');
71645
71646           // Draw points..
71647           var groups = drawLayer.selectAll('g.point')
71648               .filter(filter)
71649               .data(points, fastEntityKey);
71650
71651           groups.exit()
71652               .remove();
71653
71654           var enter = groups.enter()
71655               .append('g')
71656               .attr('class', function(d) { return 'node point ' + d.id; })
71657               .order();
71658
71659           enter
71660               .append('path')
71661               .call(markerPath, 'shadow');
71662
71663           enter
71664               .append('ellipse')
71665               .attr('cx', 0.5)
71666               .attr('cy', 1)
71667               .attr('rx', 6.5)
71668               .attr('ry', 3)
71669               .attr('class', 'stroke');
71670
71671           enter
71672               .append('path')
71673               .call(markerPath, 'stroke');
71674
71675           enter
71676               .append('use')
71677               .attr('transform', 'translate(-5, -19)')
71678               .attr('class', 'icon')
71679               .attr('width', '11px')
71680               .attr('height', '11px');
71681
71682           groups = groups
71683               .merge(enter)
71684               .attr('transform', svgPointTransform(projection))
71685               .call(svgTagClasses());
71686
71687           // Selecting the following implicitly
71688           // sets the data (point entity) on the element
71689           groups.select('.shadow');
71690           groups.select('.stroke');
71691           groups.select('.icon')
71692               .attr('xlink:href', function(entity) {
71693                   var preset = context.presets().match(entity, graph);
71694                   var picon = preset && preset.icon;
71695
71696                   if (!picon) {
71697                       return '';
71698                   } else {
71699                       var isMaki = /^maki-/.test(picon);
71700                       return '#' + picon + (isMaki ? '-11' : '');
71701                   }
71702               });
71703
71704
71705           // Draw touch targets..
71706           touchLayer
71707               .call(drawTargets, graph, points, filter);
71708       }
71709
71710
71711       return drawPoints;
71712   }
71713
71714   function svgTagClasses() {
71715       var primaries = [
71716           'building', 'highway', 'railway', 'waterway', 'aeroway',
71717           'motorway', 'boundary', 'power', 'amenity', 'natural', 'landuse',
71718           'leisure', 'military', 'place', 'man_made', 'route', 'attraction'
71719       ];
71720       var statuses = [
71721           'proposed', 'construction', 'disused', 'abandoned', 'dismantled',
71722           'razed', 'demolished', 'obliterated', 'intermittent'
71723       ];
71724       var secondaries = [
71725           'oneway', 'bridge', 'tunnel', 'embankment', 'cutting', 'barrier',
71726           'surface', 'tracktype', 'footway', 'crossing', 'service', 'sport',
71727           'public_transport', 'location', 'parking'
71728       ];
71729       var _tags = function(entity) { return entity.tags; };
71730
71731
71732       var tagClasses = function(selection$$1) {
71733           selection$$1.each(function tagClassesEach(entity) {
71734               var value = this.className;
71735               var primary, status;
71736
71737               if (value.baseVal !== undefined) {
71738                   value = value.baseVal;
71739               }
71740
71741               var t = _tags(entity);
71742               var isMultiPolygon = (t.type === 'multipolygon');
71743               var shouldRenderLineAsArea = isMultiPolygon && !entity.hasInterestingTags();
71744
71745               var i, k, v;
71746
71747               // preserve base classes (nothing with `tag-`)
71748               var classes = value.trim().split(/\s+/)
71749                   .filter(function(klass) {
71750                       return klass.length && !/^tag-/.test(klass);
71751                   })
71752                   .map(function(klass) {  // style multipolygon inner/outers as areas not lines
71753                       return (klass === 'line' && shouldRenderLineAsArea) ? 'area' : klass;
71754                   });
71755
71756
71757               // pick at most one primary classification tag..
71758               for (i = 0; i < primaries.length; i++) {
71759                   k = primaries[i];
71760                   v = t[k];
71761                   if (!v || v === 'no') continue;
71762
71763                   primary = k;
71764                   if (statuses.indexOf(v) !== -1) {   // e.g. `railway=abandoned`
71765                       status = v;
71766                       classes.push('tag-' + k);
71767                   } else {
71768                       classes.push('tag-' + k);
71769                       classes.push('tag-' + k + '-' + v);
71770                   }
71771
71772                   break;
71773               }
71774
71775               // add at most one status tag, only if relates to primary tag..
71776               if (!status) {
71777                   for (i = 0; i < statuses.length; i++) {
71778                       k = statuses[i];
71779                       v = t[k];
71780                       if (!v || v === 'no') continue;
71781
71782                       if (v === 'yes') {   // e.g. `railway=rail + abandoned=yes`
71783                           status = k;
71784                       }
71785                       else if (primary && primary === v) {  // e.g. `railway=rail + abandoned=railway`
71786                           status = k;
71787                       } else if (!primary && primaries.indexOf(v) !== -1) {  // e.g. `abandoned=railway`
71788                           status = k;
71789                           primary = v;
71790                           classes.push('tag-' + v);
71791                       }  // else ignore e.g.  `highway=path + abandoned=railway`
71792
71793                       if (status) break;
71794                   }
71795               }
71796
71797               if (status) {
71798                   classes.push('tag-status');
71799                   classes.push('tag-status-' + status);
71800               }
71801
71802               // add any secondary tags
71803               for (i = 0; i < secondaries.length; i++) {
71804                   k = secondaries[i];
71805                   v = t[k];
71806                   if (!v || v === 'no') continue;
71807                   classes.push('tag-' + k);
71808                   classes.push('tag-' + k + '-' + v);
71809               }
71810
71811               // For highways, look for surface tagging..
71812               if (primary === 'highway' || primary === 'aeroway') {
71813                   var paved = (t.highway !== 'track');
71814                   for (k in t) {
71815                       v = t[k];
71816                       if (k in osmPavedTags) {
71817                           paved = !!osmPavedTags[k][v];
71818                           break;
71819                       }
71820                   }
71821                   if (!paved) {
71822                       classes.push('tag-unpaved');
71823                   }
71824               }
71825
71826
71827               var computed = classes.join(' ').trim();
71828               if (computed !== value) {
71829                   select(this).attr('class', computed);
71830               }
71831           });
71832       };
71833
71834
71835       tagClasses.tags = function(val) {
71836           if (!arguments.length) return _tags;
71837           _tags = val;
71838           return tagClasses;
71839       };
71840
71841       return tagClasses;
71842   }
71843
71844   function svgTurns(projection, context) {
71845
71846       function icon(turn) {
71847           var u = turn.u ? '-u' : '';
71848           if (turn.no) return '#iD-turn-no' + u;
71849           if (turn.only) return '#iD-turn-only' + u;
71850           return '#iD-turn-yes' + u;
71851       }
71852
71853       function drawTurns(selection, graph, turns) {
71854
71855           function turnTransform(d) {
71856               var pxRadius = 50;
71857               var toWay = graph.entity(d.to.way);
71858               var toPoints = graph.childNodes(toWay)
71859                   .map(function (n) { return n.loc; })
71860                   .map(projection);
71861               var toLength = geoPathLength(toPoints);
71862               var mid = toLength / 2;    // midpoint of destination way
71863
71864               var toNode = graph.entity(d.to.node);
71865               var toVertex = graph.entity(d.to.vertex);
71866               var a = geoAngle(toVertex, toNode, projection);
71867               var o = projection(toVertex.loc);
71868               var r = d.u ? 0                  // u-turn: no radius
71869                   : !toWay.__via ? pxRadius    // leaf way: put marker at pxRadius
71870                   : Math.min(mid, pxRadius);   // via way: prefer pxRadius, fallback to mid for very short ways
71871
71872               return 'translate(' + (r * Math.cos(a) + o[0]) + ',' + (r * Math.sin(a) + o[1]) + ') ' +
71873                   'rotate(' + a * 180 / Math.PI + ')';
71874           }
71875
71876
71877           var drawLayer = selection.selectAll('.layer-osm.points .points-group.turns');
71878           var touchLayer = selection.selectAll('.layer-touch.turns');
71879
71880           // Draw turns..
71881           var groups = drawLayer.selectAll('g.turn')
71882               .data(turns, function(d) { return d.key; });
71883
71884           // exit
71885           groups.exit()
71886               .remove();
71887
71888           // enter
71889           var groupsEnter = groups.enter()
71890               .append('g')
71891               .attr('class', function(d) { return 'turn ' + d.key; });
71892
71893           var turnsEnter = groupsEnter
71894               .filter(function(d) { return !d.u; });
71895
71896           turnsEnter.append('rect')
71897               .attr('transform', 'translate(-22, -12)')
71898               .attr('width', '44')
71899               .attr('height', '24');
71900
71901           turnsEnter.append('use')
71902               .attr('transform', 'translate(-22, -12)')
71903               .attr('width', '44')
71904               .attr('height', '24');
71905
71906           var uEnter = groupsEnter
71907               .filter(function(d) { return d.u; });
71908
71909           uEnter.append('circle')
71910               .attr('r', '16');
71911
71912           uEnter.append('use')
71913               .attr('transform', 'translate(-16, -16)')
71914               .attr('width', '32')
71915               .attr('height', '32');
71916
71917           // update
71918           groups = groups
71919               .merge(groupsEnter)
71920               .attr('opacity', function(d) { return d.direct === false ? '0.7' : null; })
71921               .attr('transform', turnTransform);
71922
71923           groups.select('use')
71924               .attr('xlink:href', icon);
71925
71926           groups.select('rect');      // propagate bound data
71927           groups.select('circle');    // propagate bound data
71928
71929
71930           // Draw touch targets..
71931           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
71932           groups = touchLayer.selectAll('g.turn')
71933               .data(turns, function(d) { return d.key; });
71934
71935           // exit
71936           groups.exit()
71937               .remove();
71938
71939           // enter
71940           groupsEnter = groups.enter()
71941               .append('g')
71942               .attr('class', function(d) { return 'turn ' + d.key; });
71943
71944           turnsEnter = groupsEnter
71945               .filter(function(d) { return !d.u; });
71946
71947           turnsEnter.append('rect')
71948               .attr('class', 'target ' + fillClass)
71949               .attr('transform', 'translate(-22, -12)')
71950               .attr('width', '44')
71951               .attr('height', '24');
71952
71953           uEnter = groupsEnter
71954               .filter(function(d) { return d.u; });
71955
71956           uEnter.append('circle')
71957               .attr('class', 'target ' + fillClass)
71958               .attr('r', '16');
71959
71960           // update
71961           groups = groups
71962               .merge(groupsEnter)
71963               .attr('transform', turnTransform);
71964
71965           groups.select('rect');      // propagate bound data
71966           groups.select('circle');    // propagate bound data
71967
71968
71969           return this;
71970       }
71971
71972       return drawTurns;
71973   }
71974
71975   function svgVertices$$1(projection, context) {
71976       var radiuses = {
71977           //       z16-, z17,   z18+,  w/icon
71978           shadow: [6,    7.5,   7.5,   12],
71979           stroke: [2.5,  3.5,   3.5,   8],
71980           fill:   [1,    1.5,   1.5,   1.5]
71981       };
71982
71983       var _currHoverTarget;
71984       var _currPersistent = {};
71985       var _currHover = {};
71986       var _prevHover = {};
71987       var _currSelected = {};
71988       var _prevSelected = {};
71989       var _radii = {};
71990
71991
71992       function sortY(a, b) {
71993           return b.loc[1] - a.loc[1];
71994       }
71995
71996       // Avoid exit/enter if we're just moving stuff around.
71997       // The node will get a new version but we only need to run the update selection.
71998       function fastEntityKey(d) {
71999           var mode = context.mode();
72000           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
72001           return isMoving ? d.id : osmEntity$$1.key(d);
72002       }
72003
72004
72005       function draw(selection$$1, graph, vertices, sets, filter) {
72006           sets = sets || { selected: {}, important: {}, hovered: {} };
72007
72008           var icons = {};
72009           var directions = {};
72010           var wireframe = context.surface().classed('fill-wireframe');
72011           var zoom = geoScaleToZoom(projection.scale());
72012           var z = (zoom < 17 ? 0 : zoom < 18 ? 1 : 2);
72013           var activeID = context.activeID();
72014
72015
72016           function getIcon(d) {
72017               // always check latest entity, as fastEntityKey avoids enter/exit now
72018               var entity = graph.entity(d.id);
72019               if (entity.id in icons) return icons[entity.id];
72020
72021               icons[entity.id] =
72022                   entity.hasInterestingTags() &&
72023                   context.presets().match(entity, graph).icon;
72024
72025               return icons[entity.id];
72026           }
72027
72028
72029           // memoize directions results, return false for empty arrays (for use in filter)
72030           function getDirections(entity) {
72031               if (entity.id in directions) return directions[entity.id];
72032
72033               var angles = entity.directions(graph, projection);
72034               directions[entity.id] = angles.length ? angles : false;
72035               return angles;
72036           }
72037
72038
72039           function updateAttributes(selection$$1) {
72040               ['shadow', 'stroke', 'fill'].forEach(function(klass) {
72041                   var rads = radiuses[klass];
72042                   selection$$1.selectAll('.' + klass)
72043                       .each(function(entity) {
72044                           var i = z && getIcon(entity);
72045                           var r = rads[i ? 3 : z];
72046
72047                           // slightly increase the size of unconnected endpoints #3775
72048                           if (entity.id !== activeID && entity.isEndpoint(graph) && !entity.isConnected(graph)) {
72049                               r += 1.5;
72050                           }
72051
72052                           if (klass === 'shadow') {   // remember this value, so we don't need to
72053                               _radii[entity.id] = r;  // recompute it when we draw the touch targets
72054                           }
72055
72056                           select(this)
72057                               .attr('r', r)
72058                               .attr('visibility', (i && klass === 'fill') ? 'hidden' : null);
72059                       });
72060               });
72061           }
72062
72063           vertices.sort(sortY);
72064
72065           var groups = selection$$1.selectAll('g.vertex')
72066               .filter(filter)
72067               .data(vertices, fastEntityKey);
72068
72069           // exit
72070           groups.exit()
72071               .remove();
72072
72073           // enter
72074           var enter = groups.enter()
72075               .append('g')
72076               .attr('class', function(d) { return 'node vertex ' + d.id; })
72077               .order();
72078
72079           enter
72080               .append('circle')
72081               .attr('class', 'shadow');
72082
72083           enter
72084               .append('circle')
72085               .attr('class', 'stroke');
72086
72087           // Vertices with tags get a fill.
72088           enter.filter(function(d) { return d.hasInterestingTags(); })
72089               .append('circle')
72090               .attr('class', 'fill');
72091
72092           // update
72093           groups = groups
72094               .merge(enter)
72095               .attr('transform', svgPointTransform(projection))
72096               .classed('sibling', function(d) { return d.id in sets.selected; })
72097               .classed('shared', function(d) { return graph.isShared(d); })
72098               .classed('endpoint', function(d) { return d.isEndpoint(graph); })
72099               .call(updateAttributes);
72100
72101
72102           // Vertices with icons get a `use`.
72103           var iconUse = groups
72104               .selectAll('.icon')
72105               .data(function data(d) { return zoom >= 17 && getIcon(d) ? [d] : []; }, fastEntityKey);
72106
72107           // exit
72108           iconUse.exit()
72109               .remove();
72110
72111           // enter
72112           iconUse.enter()
72113               .append('use')
72114               .attr('class', 'icon')
72115               .attr('width', '11px')
72116               .attr('height', '11px')
72117               .attr('transform', 'translate(-5.5, -5.5)')
72118               .attr('xlink:href', function(d) {
72119                   var picon = getIcon(d);
72120                   var isMaki = /^maki-/.test(picon);
72121                   return '#' + picon + (isMaki ? '-11' : '');
72122               });
72123
72124
72125           // Vertices with directions get viewfields
72126           var dgroups = groups
72127               .selectAll('.viewfieldgroup')
72128               .data(function data(d) { return zoom >= 18 && getDirections(d) ? [d] : []; }, fastEntityKey);
72129
72130           // exit
72131           dgroups.exit()
72132               .remove();
72133
72134           // enter/update
72135           dgroups = dgroups.enter()
72136               .insert('g', '.shadow')
72137               .attr('class', 'viewfieldgroup')
72138               .merge(dgroups);
72139
72140           var viewfields = dgroups.selectAll('.viewfield')
72141               .data(getDirections, function key(d) { return osmEntity$$1.key(d); });
72142
72143           // exit
72144           viewfields.exit()
72145               .remove();
72146
72147           // enter/update
72148           viewfields.enter()
72149               .append('path')
72150               .attr('class', 'viewfield')
72151               .attr('d', 'M0,0H0')
72152               .merge(viewfields)
72153               .attr('marker-start', 'url(#viewfield-marker' + (wireframe ? '-wireframe' : '') + ')')
72154               .attr('transform', function(d) { return 'rotate(' + d + ')'; });
72155       }
72156
72157
72158       function drawTargets(selection$$1, graph, entities, filter) {
72159           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
72160           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
72161           var getTransform = svgPointTransform(projection).geojson;
72162           var activeID = context.activeID();
72163           var data = { targets: [], nopes: [] };
72164
72165           entities.forEach(function(node) {
72166               if (activeID === node.id) return;   // draw no target on the activeID
72167
72168               var vertexType = svgPassiveVertex(node, graph, activeID);
72169               if (vertexType !== 0) {     // passive or adjacent - allow to connect
72170                   data.targets.push({
72171                       type: 'Feature',
72172                       id: node.id,
72173                       properties: {
72174                           target: true,
72175                           entity: node
72176                       },
72177                       geometry: node.asGeoJSON()
72178                   });
72179               } else {
72180                   data.nopes.push({
72181                       type: 'Feature',
72182                       id: node.id + '-nope',
72183                       properties: {
72184                           nope: true,
72185                           target: true,
72186                           entity: node
72187                       },
72188                       geometry: node.asGeoJSON()
72189                   });
72190               }
72191           });
72192
72193
72194           // Targets allow hover and vertex snapping
72195           var targets = selection$$1.selectAll('.vertex.target-allowed')
72196               .filter(function(d) { return filter(d.properties.entity); })
72197               .data(data.targets, function key(d) { return d.id; });
72198
72199           // exit
72200           targets.exit()
72201               .remove();
72202
72203           // enter/update
72204           targets.enter()
72205               .append('circle')
72206               .attr('r', function(d) { return (_radii[d.id] || radiuses.shadow[3]); })
72207               .merge(targets)
72208               .attr('class', function(d) { return 'node vertex target target-allowed ' + targetClass + d.id; })
72209               .attr('transform', getTransform);
72210
72211
72212           // NOPE
72213           var nopes = selection$$1.selectAll('.vertex.target-nope')
72214               .filter(function(d) { return filter(d.properties.entity); })
72215               .data(data.nopes, function key(d) { return d.id; });
72216
72217           // exit
72218           nopes.exit()
72219               .remove();
72220
72221           // enter/update
72222           nopes.enter()
72223               .append('circle')
72224               .attr('r', function(d) { return (_radii[d.properties.entity.id] || radiuses.shadow[3]); })
72225               .merge(nopes)
72226               .attr('class', function(d) { return 'node vertex target target-nope ' + nopeClass + d.id; })
72227               .attr('transform', getTransform);
72228       }
72229
72230
72231       // Points can also render as vertices:
72232       // 1. in wireframe mode or
72233       // 2. at higher zooms if they have a direction
72234       function renderAsVertex(entity, graph, wireframe, zoom) {
72235           var geometry = entity.geometry(graph);
72236           return geometry === 'vertex' || (geometry === 'point' && (
72237               wireframe || (zoom >= 18 && entity.directions(graph, projection).length)
72238           ));
72239       }
72240
72241
72242       function getSiblingAndChildVertices(ids, graph, wireframe, zoom) {
72243           var results = {};
72244
72245           function addChildVertices(entity) {
72246               var geometry = entity.geometry(graph);
72247               if (!context.features().isHiddenFeature(entity, graph, geometry)) {
72248                   var i;
72249                   if (entity.type === 'way') {
72250                       for (i = 0; i < entity.nodes.length; i++) {
72251                           var child = graph.hasEntity(entity.nodes[i]);
72252                           if (child) {
72253                               addChildVertices(child);
72254                           }
72255                       }
72256                   } else if (entity.type === 'relation') {
72257                       for (i = 0; i < entity.members.length; i++) {
72258                           var member = graph.hasEntity(entity.members[i].id);
72259                           if (member) {
72260                               addChildVertices(member);
72261                           }
72262                       }
72263                   } else if (renderAsVertex(entity, graph, wireframe, zoom)) {
72264                       results[entity.id] = entity;
72265                   }
72266               }
72267           }
72268
72269           ids.forEach(function(id) {
72270               var entity = graph.hasEntity(id);
72271               if (!entity) return;
72272
72273               if (entity.type === 'node') {
72274                   if (renderAsVertex(entity, graph, wireframe, zoom)) {
72275                       results[entity.id] = entity;
72276                       graph.parentWays(entity).forEach(function(entity) {
72277                           addChildVertices(entity);
72278                       });
72279                   }
72280               } else {  // way, relation
72281                   addChildVertices(entity);
72282               }
72283           });
72284
72285           return results;
72286       }
72287
72288
72289       function drawVertices(selection$$1, graph, entities, filter, extent, fullRedraw) {
72290           var wireframe = context.surface().classed('fill-wireframe');
72291           var zoom = geoScaleToZoom(projection.scale());
72292           var mode = context.mode();
72293           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
72294
72295           var drawLayer = selection$$1.selectAll('.layer-osm.points .points-group.vertices');
72296           var touchLayer = selection$$1.selectAll('.layer-touch.points');
72297
72298           if (fullRedraw) {
72299               _currPersistent = {};
72300               _radii = {};
72301           }
72302
72303           // Collect important vertices from the `entities` list..
72304           // (during a paritial redraw, it will not contain everything)
72305           for (var i = 0; i < entities.length; i++) {
72306               var entity = entities[i];
72307               var geometry = entity.geometry(graph);
72308               var keep = false;
72309
72310               // a point that looks like a vertex..
72311               if ((geometry === 'point') && renderAsVertex(entity, graph, wireframe, zoom)) {
72312                   _currPersistent[entity.id] = entity;
72313                   keep = true;
72314
72315               // a vertex of some importance..
72316               } else if (geometry === 'vertex' &&
72317                   (entity.hasInterestingTags() || entity.isEndpoint(graph) || entity.isConnected(graph))) {
72318                   _currPersistent[entity.id] = entity;
72319                   keep = true;
72320               }
72321
72322               // whatever this is, it's not a persistent vertex..
72323               if (!keep && !fullRedraw) {
72324                   delete _currPersistent[entity.id];
72325               }
72326           }
72327
72328           // 3 sets of vertices to consider:
72329           var sets = {
72330               persistent: _currPersistent,  // persistent = important vertices (render always)
72331               selected: _currSelected,      // selected + siblings of selected (render always)
72332               hovered: _currHover           // hovered + siblings of hovered (render only in draw modes)
72333           };
72334
72335           var all = assign({}, (isMoving ? _currHover : {}), _currSelected, _currPersistent);
72336
72337           // Draw the vertices..
72338           // The filter function controls the scope of what objects d3 will touch (exit/enter/update)
72339           // Adjust the filter function to expand the scope beyond whatever entities were passed in.
72340           var filterRendered = function(d) {
72341               return d.id in _currPersistent || d.id in _currSelected || d.id in _currHover || filter(d);
72342           };
72343           drawLayer
72344               .call(draw, graph, currentVisible(all), sets, filterRendered);
72345
72346           // Draw touch targets..
72347           // When drawing, render all targets (not just those affected by a partial redraw)
72348           var filterTouch = function(d) {
72349               return isMoving ? true : filterRendered(d);
72350           };
72351           touchLayer
72352               .call(drawTargets, graph, currentVisible(all), filterTouch);
72353
72354
72355           function currentVisible(which) {
72356               return Object.keys(which)
72357                   .map(graph.hasEntity, graph)     // the current version of this entity
72358                   .filter(function (entity) { return entity && entity.intersects(extent, graph); });
72359           }
72360       }
72361
72362
72363       // partial redraw - only update the selected items..
72364       drawVertices.drawSelected = function(selection$$1, graph, extent) {
72365           var wireframe = context.surface().classed('fill-wireframe');
72366           var zoom = geoScaleToZoom(projection.scale());
72367
72368           _prevSelected = _currSelected || {};
72369           _currSelected = getSiblingAndChildVertices(context.selectedIDs(), graph, wireframe, zoom);
72370
72371           // note that drawVertices will add `_currSelected` automatically if needed..
72372           var filter = function(d) { return d.id in _prevSelected; };
72373           drawVertices(selection$$1, graph, values$1(_prevSelected), filter, extent, false);
72374       };
72375
72376
72377       // partial redraw - only update the hovered items..
72378       drawVertices.drawHover = function(selection$$1, graph, target, extent) {
72379           if (target === _currHoverTarget) return;  // continue only if something changed
72380
72381           var wireframe = context.surface().classed('fill-wireframe');
72382           var zoom = geoScaleToZoom(projection.scale());
72383
72384           _prevHover = _currHover || {};
72385           _currHoverTarget = target;
72386           var entity = target && target.properties && target.properties.entity;
72387
72388           if (entity) {
72389               _currHover = getSiblingAndChildVertices([entity.id], graph, wireframe, zoom);
72390           } else {
72391               _currHover = {};
72392           }
72393
72394           // note that drawVertices will add `_currHover` automatically if needed..
72395           var filter = function(d) { return d.id in _prevHover; };
72396           drawVertices(selection$$1, graph, values$1(_prevHover), filter, extent, false);
72397       };
72398
72399       return drawVertices;
72400   }
72401
72402   /* global Mapillary:false */
72403
72404
72405   var apibase = 'https://a.mapillary.com/v3/';
72406   var viewercss = 'mapillary-js/mapillary.min.css';
72407   var viewerjs = 'mapillary-js/mapillary.min.js';
72408   var clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi';
72409   var maxResults = 1000;
72410   var tileZoom = 14;
72411   var tiler$1 = utilTiler().zoomExtent([tileZoom, tileZoom]).skipNullIsland(true);
72412   var dispatch$2 = dispatch('loadedImages', 'loadedSigns', 'bearingChanged');
72413   var _mlyFallback = false;
72414   var _mlyCache;
72415   var _mlyClicks;
72416   var _mlySelectedImage;
72417   var _mlyViewer;
72418
72419
72420   function abortRequest$1(i) {
72421       i.abort();
72422   }
72423
72424
72425   function maxPageAtZoom(z) {
72426       if (z < 15)   return 2;
72427       if (z === 15) return 5;
72428       if (z === 16) return 10;
72429       if (z === 17) return 20;
72430       if (z === 18) return 40;
72431       if (z > 18)   return 80;
72432   }
72433
72434
72435   function loadTiles(which, url, projection) {
72436       var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
72437       var tiles = tiler$1.getTiles(projection);
72438
72439       // abort inflight requests that are no longer needed
72440       var cache = _mlyCache[which];
72441       forEach(cache.inflight, function(v, k) {
72442           var wanted = find$1(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; });
72443
72444           if (!wanted) {
72445               abortRequest$1(v);
72446               delete cache.inflight[k];
72447           }
72448       });
72449
72450       tiles.forEach(function(tile) {
72451           loadNextTilePage(which, currZoom, url, tile);
72452       });
72453   }
72454
72455
72456   function loadNextTilePage(which, currZoom, url, tile) {
72457       var cache = _mlyCache[which];
72458       var rect = tile.extent.rectangle();
72459       var maxPages = maxPageAtZoom(currZoom);
72460       var nextPage = cache.nextPage[tile.id] || 0;
72461       var nextURL = cache.nextURL[tile.id] || url +
72462           utilQsString({
72463               per_page: maxResults,
72464               page: nextPage,
72465               client_id: clientId,
72466               bbox: [rect[0], rect[1], rect[2], rect[3]].join(','),
72467           });
72468
72469       if (nextPage > maxPages) return;
72470
72471       var id = tile.id + ',' + String(nextPage);
72472       if (cache.loaded[id] || cache.inflight[id]) return;
72473       cache.inflight[id] = request(nextURL)
72474           .mimeType('application/json')
72475           .response(function(xhr) {
72476               var linkHeader = xhr.getResponseHeader('Link');
72477               if (linkHeader) {
72478                   var pagination = parsePagination(xhr.getResponseHeader('Link'));
72479                   if (pagination.next) {
72480                       cache.nextURL[tile.id] = pagination.next;
72481                   }
72482               }
72483               return JSON.parse(xhr.responseText);
72484           })
72485           .get(function(err, data) {
72486               cache.loaded[id] = true;
72487               delete cache.inflight[id];
72488               if (err || !data.features || !data.features.length) return;
72489
72490               var features = data.features.map(function(feature) {
72491                   var loc = feature.geometry.coordinates;
72492                   var d;
72493
72494                   // An image (shown as a green dot on the map) is a single street photo with extra
72495                   // information such as location, camera angle (CA), camera model, and so on.
72496                   // Each image feature is a GeoJSON Point
72497                   if (which === 'images') {
72498                       d = {
72499                           loc: loc,
72500                           key: feature.properties.key,
72501                           ca: feature.properties.ca,
72502                           captured_at: feature.properties.captured_at,
72503                           captured_by: feature.properties.username,
72504                           pano: feature.properties.pano
72505                       };
72506
72507                       cache.forImageKey[d.key] = d;     // cache imageKey -> image
72508
72509                   // Mapillary organizes images as sequences. A sequence of images are continuously captured
72510                   // by a user at a give time. Sequences are shown on the map as green lines.
72511                   // Each sequence feature is a GeoJSON LineString
72512                   } else if (which === 'sequences') {
72513                       var sequenceKey = feature.properties.key;
72514                       cache.lineString[sequenceKey] = feature;           // cache sequenceKey -> lineString
72515                       feature.properties.coordinateProperties.image_keys.forEach(function(imageKey) {
72516                           cache.forImageKey[imageKey] = sequenceKey;     // cache imageKey -> sequenceKey
72517                       });
72518                       return false;    // because no `d` data worth loading into an rbush
72519
72520                   // An image detection is a semantic pixel area on an image. The area could indicate
72521                   // sky, trees, sidewalk in the image. A detection can be a polygon, a bounding box, or a point.
72522                   // Each image_detection feature is a GeoJSON Point (located where the image was taken)
72523                   } else if (which === 'image_detections') {
72524                       d = {
72525                           key: feature.properties.key,
72526                           image_key: feature.properties.image_key,
72527                           value: feature.properties.value,
72528                           package: feature.properties.package,
72529                           shape: feature.properties.shape
72530                       };
72531
72532                       // cache imageKey -> image_detections
72533                       if (!cache.forImageKey[d.image_key]) {
72534                           cache.forImageKey[d.image_key] = [];
72535                       }
72536                       cache.forImageKey[d.image_key].push(d);
72537                       return false;    // because no `d` data worth loading into an rbush
72538
72539
72540                   // A map feature is a real world object that can be shown on a map. It could be any object
72541                   // recognized from images, manually added in images, or added on the map.
72542                   // Each map feature is a GeoJSON Point (located where the feature is)
72543                   } else if (which === 'map_features') {
72544                       d = {
72545                           loc: loc,
72546                           key: feature.properties.key,
72547                           value: feature.properties.value,
72548                           package: feature.properties.package,
72549                           detections: feature.properties.detections
72550                       };
72551                   }
72552
72553                   return {
72554                       minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
72555                   };
72556
72557               }).filter(Boolean);
72558
72559               if (cache.rtree && features) {
72560                   cache.rtree.load(features);
72561               }
72562
72563               if (which === 'images' || which === 'sequences') {
72564                   dispatch$2.call('loadedImages');
72565               } else if (which === 'map_features') {
72566                   dispatch$2.call('loadedSigns');
72567               }
72568
72569               if (data.features.length === maxResults) {  // more pages to load
72570                   cache.nextPage[tile.id] = nextPage + 1;
72571                   loadNextTilePage(which, currZoom, url, tile);
72572               } else {
72573                   cache.nextPage[tile.id] = Infinity;     // no more pages to load
72574               }
72575           });
72576   }
72577
72578   // extract links to pages of API results
72579   function parsePagination(links) {
72580       return links.split(',').map(function(rel) {
72581           var elements = rel.split(';');
72582           if (elements.length === 2) {
72583               return [
72584                   /<(.+)>/.exec(elements[0])[1],
72585                   /rel="(.+)"/.exec(elements[1])[1]
72586               ];
72587           } else {
72588               return ['',''];
72589           }
72590       }).reduce(function(pagination, val) {
72591           pagination[val[1]] = val[0];
72592           return pagination;
72593       }, {});
72594   }
72595
72596
72597   // partition viewport into higher zoom tiles
72598   function partitionViewport(projection) {
72599       var z = geoScaleToZoom(projection.scale());
72600       var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
72601       var tiler = utilTiler().zoomExtent([z2, z2]);
72602
72603       return tiler.getTiles(projection)
72604           .map(function(tile) { return tile.extent; });
72605   }
72606
72607
72608   // no more than `limit` results per partition.
72609   function searchLimited(limit, projection, rtree) {
72610       limit = limit || 5;
72611
72612       return partitionViewport(projection)
72613           .reduce(function(result, extent) {
72614               var found = rtree.search(extent.bbox())
72615                   .slice(0, limit)
72616                   .map(function(d) { return d.data; });
72617
72618               return (found.length ? result.concat(found) : result);
72619           }, []);
72620   }
72621
72622
72623
72624   var serviceMapillary = {
72625
72626       init: function() {
72627           if (!_mlyCache) {
72628               this.reset();
72629           }
72630
72631           this.event = utilRebind(this, dispatch$2, 'on');
72632       },
72633
72634       reset: function() {
72635           var cache = _mlyCache;
72636
72637           if (cache) {
72638               if (cache.images && cache.images.inflight) {
72639                   forEach(cache.images.inflight, abortRequest$1);
72640               }
72641               if (cache.image_detections && cache.image_detections.inflight) {
72642                   forEach(cache.image_detections.inflight, abortRequest$1);
72643               }
72644               if (cache.map_features && cache.map_features.inflight) {
72645                   forEach(cache.map_features.inflight, abortRequest$1);
72646               }
72647               if (cache.sequences && cache.sequences.inflight) {
72648                   forEach(cache.sequences.inflight, abortRequest$1);
72649               }
72650           }
72651
72652           _mlyCache = {
72653               images: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {} },
72654               image_detections: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, forImageKey: {} },
72655               map_features: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1() },
72656               sequences: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {}, lineString: {} }
72657           };
72658
72659           _mlySelectedImage = null;
72660           _mlyClicks = [];
72661       },
72662
72663
72664       images: function(projection) {
72665           var limit = 5;
72666           return searchLimited(limit, projection, _mlyCache.images.rtree);
72667       },
72668
72669
72670       signs: function(projection) {
72671           var limit = 5;
72672           return searchLimited(limit, projection, _mlyCache.map_features.rtree);
72673       },
72674
72675
72676       sequences: function(projection) {
72677           var viewport = projection.clipExtent();
72678           var min = [viewport[0][0], viewport[1][1]];
72679           var max = [viewport[1][0], viewport[0][1]];
72680           var bbox = geoExtent$$1(projection.invert(min), projection.invert(max)).bbox();
72681           var sequenceKeys = {};
72682
72683           // all sequences for images in viewport
72684           _mlyCache.images.rtree.search(bbox)
72685               .forEach(function(d) {
72686                   var sequenceKey = _mlyCache.sequences.forImageKey[d.data.key];
72687                   if (sequenceKey) {
72688                       sequenceKeys[sequenceKey] = true;
72689                   }
72690               });
72691
72692           // Return lineStrings for the sequences
72693           return Object.keys(sequenceKeys).map(function(sequenceKey) {
72694               return _mlyCache.sequences.lineString[sequenceKey];
72695           });
72696       },
72697
72698
72699       signsSupported: function() {
72700           return true;
72701       },
72702
72703
72704       loadImages: function(projection) {
72705           loadTiles('images', apibase + 'images?', projection);
72706           loadTiles('sequences', apibase + 'sequences?', projection);
72707       },
72708
72709
72710       loadSigns: function(context, projection) {
72711           // if we are looking at signs, we'll actually need to fetch images too
72712           loadTiles('images', apibase + 'images?', projection);
72713           loadTiles('map_features', apibase + 'map_features?layers=trafficsigns&min_nbr_image_detections=1&', projection);
72714           loadTiles('image_detections', apibase + 'image_detections?layers=trafficsigns&', projection);
72715       },
72716
72717
72718       loadViewer: function(context) {
72719           // add mly-wrapper
72720           var wrap = select('#photoviewer').selectAll('.mly-wrapper')
72721               .data([0]);
72722
72723           wrap.enter()
72724               .append('div')
72725               .attr('id', 'mly')
72726               .attr('class', 'photo-wrapper mly-wrapper')
72727               .classed('hide', true);
72728
72729           // load mapillary-viewercss
72730           select('head').selectAll('#mapillary-viewercss')
72731               .data([0])
72732               .enter()
72733               .append('link')
72734               .attr('id', 'mapillary-viewercss')
72735               .attr('rel', 'stylesheet')
72736               .attr('href', context.asset(viewercss));
72737
72738           // load mapillary-viewerjs
72739           select('head').selectAll('#mapillary-viewerjs')
72740               .data([0])
72741               .enter()
72742               .append('script')
72743               .attr('id', 'mapillary-viewerjs')
72744               .attr('src', context.asset(viewerjs));
72745
72746           // load mapillary signs sprite
72747           var defs = context.container().select('defs');
72748           defs.call(svgDefs(context).addSprites, ['mapillary-sprite']);
72749
72750           // Register viewer resize handler
72751           context.ui().photoviewer.on('resize', function() {
72752               if (_mlyViewer) {
72753                   _mlyViewer.resize();
72754               }
72755           });
72756       },
72757
72758
72759       showViewer: function() {
72760           var wrap = select('#photoviewer')
72761               .classed('hide', false);
72762
72763           var isHidden = wrap.selectAll('.photo-wrapper.mly-wrapper.hide').size();
72764
72765           if (isHidden && _mlyViewer) {
72766               wrap
72767                   .selectAll('.photo-wrapper:not(.mly-wrapper)')
72768                   .classed('hide', true);
72769
72770               wrap
72771                   .selectAll('.photo-wrapper.mly-wrapper')
72772                   .classed('hide', false);
72773
72774               _mlyViewer.resize();
72775           }
72776
72777           return this;
72778       },
72779
72780
72781       hideViewer: function() {
72782           _mlySelectedImage = null;
72783
72784           if (!_mlyFallback && _mlyViewer) {
72785               _mlyViewer.getComponent('sequence').stop();
72786           }
72787
72788           var viewer = select('#photoviewer');
72789           if (!viewer.empty()) viewer.datum(null);
72790
72791           viewer
72792               .classed('hide', true)
72793               .selectAll('.photo-wrapper')
72794               .classed('hide', true);
72795
72796           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
72797               .classed('selected', false);
72798
72799           return this.setStyles(null, true);
72800       },
72801
72802
72803       parsePagination: parsePagination,
72804
72805
72806       updateViewer: function(imageKey, context) {
72807           if (!imageKey) return this;
72808
72809           if (!_mlyViewer) {
72810               this.initViewer(imageKey, context);
72811           } else {
72812               _mlyViewer.moveToKey(imageKey)
72813                   .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
72814           }
72815
72816           return this;
72817       },
72818
72819
72820       initViewer: function(imageKey, context) {
72821           var that = this;
72822           if (window.Mapillary && imageKey) {
72823               var opts = {
72824                   baseImageSize: 320,
72825                   component: {
72826                       cover: false,
72827                       keyboard: false,
72828                       tag: true
72829                   }
72830               };
72831
72832               // Disable components requiring WebGL support
72833               if (!Mapillary.isSupported() && Mapillary.isFallbackSupported()) {
72834                   _mlyFallback = true;
72835                   opts.component = {
72836                       cover: false,
72837                       direction: false,
72838                       imagePlane: false,
72839                       keyboard: false,
72840                       mouse: false,
72841                       sequence: false,
72842                       tag: false,
72843                       image: true,        // fallback
72844                       navigation: true    // fallback
72845                   };
72846               }
72847
72848               _mlyViewer = new Mapillary.Viewer('mly', clientId, null, opts);
72849               _mlyViewer.on('nodechanged', nodeChanged);
72850               _mlyViewer.on('bearingchanged', bearingChanged);
72851               _mlyViewer.moveToKey(imageKey)
72852                   .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
72853           }
72854
72855           // nodeChanged: called after the viewer has changed images and is ready.
72856           //
72857           // There is some logic here to batch up clicks into a _mlyClicks array
72858           // because the user might click on a lot of markers quickly and nodechanged
72859           // may be called out of order asychronously.
72860           //
72861           // Clicks are added to the array in `selectedImage` and removed here.
72862           //
72863           function nodeChanged(node) {
72864               if (!_mlyFallback) {
72865                   _mlyViewer.getComponent('tag').removeAll();  // remove previous detections
72866               }
72867
72868               var clicks = _mlyClicks;
72869               var index = clicks.indexOf(node.key);
72870               var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
72871
72872               if (index > -1) {              // `nodechanged` initiated from clicking on a marker..
72873                   clicks.splice(index, 1);   // remove the click
72874                   // If `node.key` matches the current _mlySelectedImage, call `selectImage()`
72875                   // one more time to update the detections and attribution..
72876                   if (node.key === selectedKey) {
72877                       that.selectImage(_mlySelectedImage, node.key, true);
72878                   }
72879               } else {             // `nodechanged` initiated from the Mapillary viewer controls..
72880                   var loc = node.computedLatLon ? [node.computedLatLon.lon, node.computedLatLon.lat] : [node.latLon.lon, node.latLon.lat];
72881                   context.map().centerEase(loc);
72882                   that.selectImage(undefined, node.key, true);
72883               }
72884           }
72885
72886           function bearingChanged(e) {
72887               dispatch$2.call('bearingChanged', undefined, e);
72888           }
72889       },
72890
72891
72892       // Pass the image datum itself in `d` or the `imageKey` string.
72893       // This allows images to be selected from places that dont have access
72894       // to the full image datum (like the street signs layer or the js viewer)
72895       selectImage: function(d, imageKey, fromViewer) {
72896           if (!d && imageKey) {
72897               // If the user clicked on something that's not an image marker, we
72898               // might get in here.. Cache lookup can fail, e.g. if the user
72899               // clicked a streetsign, but images are loading slowly asynchronously.
72900               // We'll try to carry on anyway if there is no datum.  There just
72901               // might be a delay before user sees detections, captured_at, etc.
72902               d = _mlyCache.images.forImageKey[imageKey];
72903           }
72904
72905           _mlySelectedImage = d;
72906           var viewer = select('#photoviewer');
72907           if (!viewer.empty()) viewer.datum(d);
72908
72909           imageKey = (d && d.key) || imageKey;
72910           if (!fromViewer && imageKey) {
72911               _mlyClicks.push(imageKey);
72912           }
72913
72914           this.setStyles(null, true);
72915
72916           // if signs signs are shown, highlight the ones that appear in this image
72917           d3_selectAll('.layer-mapillary-signs .icon-sign')
72918               .classed('selected', function(d) {
72919                   return some(d.detections, function(detection) {
72920                       return detection.image_key === imageKey;
72921                   });
72922               });
72923
72924           if (d) {
72925               this.updateDetections(d);
72926           }
72927
72928           return this;
72929       },
72930
72931
72932       getSelectedImage: function() {
72933           return _mlySelectedImage;
72934       },
72935
72936
72937       getSequenceKeyForImage: function(d) {
72938           var imageKey = d && d.key;
72939           return imageKey && _mlyCache.sequences.forImageKey[imageKey];
72940       },
72941
72942
72943       setStyles: function(hovered, reset) {
72944           if (reset) {  // reset all layers
72945               d3_selectAll('.viewfield-group')
72946                   .classed('highlighted', false)
72947                   .classed('hovered', false)
72948                   .classed('selected', false);
72949
72950               d3_selectAll('.sequence')
72951                   .classed('highlighted', false)
72952                   .classed('selected', false);
72953           }
72954
72955           var hoveredImageKey = hovered && hovered.key;
72956           var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
72957           var hoveredLineString = hoveredSequenceKey && _mlyCache.sequences.lineString[hoveredSequenceKey];
72958           var hoveredImageKeys = (hoveredLineString && hoveredLineString.properties.coordinateProperties.image_keys) || [];
72959
72960           var viewer = select('#photoviewer');
72961           var selected = viewer.empty() ? undefined : viewer.datum();
72962           var selectedImageKey = selected && selected.key;
72963           var selectedSequenceKey = this.getSequenceKeyForImage(selected);
72964           var selectedLineString = selectedSequenceKey && _mlyCache.sequences.lineString[selectedSequenceKey];
72965           var selectedImageKeys = (selectedLineString && selectedLineString.properties.coordinateProperties.image_keys) || [];
72966
72967           // highlight sibling viewfields on either the selected or the hovered sequences
72968           var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
72969
72970           d3_selectAll('.layer-mapillary-images .viewfield-group')
72971               .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
72972               .classed('hovered', function(d) { return d.key === hoveredImageKey; })
72973               .classed('selected', function(d) { return d.key === selectedImageKey; });
72974
72975           d3_selectAll('.layer-mapillary-images .sequence')
72976               .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
72977               .classed('selected', function(d) { return d.properties.key === selectedSequenceKey; });
72978
72979           // update viewfields if needed
72980           d3_selectAll('.viewfield-group .viewfield')
72981               .attr('d', viewfieldPath);
72982
72983           function viewfieldPath() {
72984               var d = this.parentNode.__data__;
72985               if (d.pano && d.key !== selectedImageKey) {
72986                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
72987               } else {
72988                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
72989               }
72990           }
72991
72992           return this;
72993       },
72994
72995
72996       updateDetections: function(d) {
72997           if (!_mlyViewer || _mlyFallback) return;
72998
72999           var imageKey = d && d.key;
73000           if (!imageKey) return;
73001
73002           var detections = _mlyCache.image_detections.forImageKey[imageKey] || [];
73003           detections.forEach(function(data) {
73004               var tag = makeTag(data);
73005               if (tag) {
73006                   var tagComponent = _mlyViewer.getComponent('tag');
73007                   tagComponent.add([tag]);
73008               }
73009           });
73010
73011           function makeTag(data) {
73012               var valueParts = data.value.split('--');
73013               if (valueParts.length !== 3) return;
73014
73015               var text = valueParts[1].replace(/-/g, ' ');
73016               var tag;
73017
73018               // Currently only two shapes <Polygon|Point>
73019               if (data.shape.type === 'Polygon') {
73020                   var polygonGeometry = new Mapillary
73021                       .TagComponent
73022                       .PolygonGeometry(data.shape.coordinates[0]);
73023
73024                   tag = new Mapillary.TagComponent.OutlineTag(
73025                       data.key,
73026                       polygonGeometry,
73027                       {
73028                           text: text,
73029                           textColor: 0xffff00,
73030                           lineColor: 0xffff00,
73031                           lineWidth: 2,
73032                           fillColor: 0xffff00,
73033                           fillOpacity: 0.3,
73034                       }
73035                   );
73036
73037               } else if (data.shape.type === 'Point') {
73038                   var pointGeometry = new Mapillary
73039                       .TagComponent
73040                       .PointGeometry(data.shape.coordinates[0]);
73041
73042                   tag = new Mapillary.TagComponent.SpotTag(
73043                       data.key,
73044                       pointGeometry,
73045                       {
73046                           text: text,
73047                           color: 0xffff00,
73048                           textColor: 0xffff00
73049                       }
73050                   );
73051               }
73052
73053               return tag;
73054           }
73055       },
73056
73057
73058       cache: function() {
73059           return _mlyCache;
73060       }
73061
73062   };
73063
73064   /**
73065    * Performs a partial deep comparison between `object` and `source` to
73066    * determine if `object` contains equivalent property values.
73067    *
73068    * **Note:** This method is equivalent to `_.matches` when `source` is
73069    * partially applied.
73070    *
73071    * Partial comparisons will match empty array and empty object `source`
73072    * values against any array or object value, respectively. See `_.isEqual`
73073    * for a list of supported value comparisons.
73074    *
73075    * @static
73076    * @memberOf _
73077    * @since 3.0.0
73078    * @category Lang
73079    * @param {Object} object The object to inspect.
73080    * @param {Object} source The object of property values to match.
73081    * @returns {boolean} Returns `true` if `object` is a match, else `false`.
73082    * @example
73083    *
73084    * var object = { 'a': 1, 'b': 2 };
73085    *
73086    * _.isMatch(object, { 'b': 2 });
73087    * // => true
73088    *
73089    * _.isMatch(object, { 'b': 1 });
73090    * // => false
73091    */
73092   function isMatch(object, source) {
73093     return object === source || baseIsMatch(object, source, getMatchData(source));
73094   }
73095
73096   var buildRuleChecks = function() {
73097       return {
73098           equals: function (equals) {
73099               return function(tags) {
73100                   return isMatch(tags, equals);
73101               };
73102           },
73103           notEquals: function (notEquals) {
73104               return function(tags) {
73105                   return !isMatch(tags, notEquals);
73106               };
73107           },
73108           absence: function(absence) {
73109               return function(tags) {
73110                   return Object.keys(tags).indexOf(absence) === -1;
73111               };
73112           },
73113           presence: function(presence) {
73114               return function(tags) {
73115                   return Object.keys(tags).indexOf(presence) > -1;
73116               };
73117           },
73118           greaterThan: function(greaterThan) {
73119               var key = Object.keys(greaterThan)[0];
73120               var value = greaterThan[key];
73121
73122               return function(tags) {
73123                   return tags[key] > value;
73124               };
73125           },
73126           greaterThanEqual: function(greaterThanEqual) {
73127               var key = Object.keys(greaterThanEqual)[0];
73128               var value = greaterThanEqual[key];
73129
73130               return function(tags) {
73131                   return tags[key] >= value;
73132               };
73133           },
73134           lessThan: function(lessThan) {
73135               var key = Object.keys(lessThan)[0];
73136               var value = lessThan[key];
73137
73138               return function(tags) {
73139                   return tags[key] < value;
73140               };
73141           },
73142           lessThanEqual: function(lessThanEqual) {
73143               var key = Object.keys(lessThanEqual)[0];
73144               var value = lessThanEqual[key];
73145
73146               return function(tags) {
73147                   return tags[key] <= value;
73148               };
73149           },
73150           positiveRegex: function(positiveRegex) {
73151               var tagKey = Object.keys(positiveRegex)[0];
73152               var expression = positiveRegex[tagKey].join('|');
73153               var regex = new RegExp(expression);
73154
73155               return function(tags) {
73156                   return regex.test(tags[tagKey]);
73157               };
73158           },
73159           negativeRegex: function(negativeRegex) {
73160               var tagKey = Object.keys(negativeRegex)[0];
73161               var expression = negativeRegex[tagKey].join('|');
73162               var regex = new RegExp(expression);
73163
73164               return function(tags) {
73165                   return !regex.test(tags[tagKey]);
73166               };
73167           }
73168       };
73169   };
73170
73171   var buildLineKeys = function() {
73172       return {
73173           highway: {
73174               rest_area: true,
73175               services: true
73176           },
73177           railway: {
73178               roundhouse: true,
73179               station: true,
73180               traverser: true,
73181               turntable: true,
73182               wash: true
73183           }
73184       };
73185   };
73186
73187   var serviceMapRules = {
73188       init: function(areaKeys) {
73189           this._ruleChecks  = buildRuleChecks();
73190           this._validationRules = [];
73191           this._areaKeys = areaKeys;
73192           this._lineKeys = buildLineKeys();
73193       },
73194       // list of rules only relevant to tag checks...
73195       filterRuleChecks: function(selector) {
73196           var _ruleChecks = this._ruleChecks;
73197           return reduce(Object.keys(selector), function(rules, key) {
73198               if (['geometry', 'error', 'warning'].indexOf(key) === -1) {
73199                   rules.push(_ruleChecks[key](selector[key]));
73200               }
73201               return rules;
73202           }, []);
73203       },
73204       // builds tagMap from mapcss-parse selector object...
73205       buildTagMap: function(selector) {
73206           var getRegexValues = function(regexes) {
73207               return regexes.map(function(regex) {
73208                   return regex.replace(/\$|\^/g, '');
73209               });
73210           };
73211
73212           var selectorKeys = Object.keys(selector);
73213           var tagMap = reduce(selectorKeys, function (expectedTags, key) {
73214               var values;
73215               var isRegex = /regex/gi.test(key);
73216               var isEqual = /equals/gi.test(key);
73217
73218               if (isRegex || isEqual) {
73219                   Object.keys(selector[key]).forEach(function(selectorKey) {
73220                       values = isEqual ? [selector[key][selectorKey]] : getRegexValues(selector[key][selectorKey]);
73221
73222                       if (expectedTags.hasOwnProperty(selectorKey)) {
73223                           values = values.concat(expectedTags[selectorKey]);
73224                       }
73225
73226                       expectedTags[selectorKey] = values;
73227                   });
73228
73229               } else if (/(greater|less)Than(Equal)?|presence/g.test(key)) {
73230                   var tagKey = /presence/.test(key) ? selector[key] : Object.keys(selector[key])[0];
73231
73232                   values = [selector[key][tagKey]];
73233
73234                   if (expectedTags.hasOwnProperty(tagKey)) {
73235                       values = values.concat(expectedTags[tagKey]);
73236                   }
73237
73238                   expectedTags[tagKey] = values;
73239               }
73240
73241               return expectedTags;
73242           }, {});
73243
73244           return tagMap;
73245       },
73246       // inspired by osmWay#isArea()
73247       inferGeometry: function(tagMap) {
73248           var _lineKeys = this._lineKeys;
73249           var _areaKeys = this._areaKeys;
73250
73251           var isAreaKeyBlackList = function(key) {
73252               return intersection(tagMap[key], Object.keys(_areaKeys[key])).length > 0;
73253           };
73254           var isLineKeysWhiteList = function(key) {
73255               return intersection(tagMap[key], Object.keys(_lineKeys[key])).length > 0;
73256           };
73257
73258           if (tagMap.hasOwnProperty('area')) {
73259               if (tagMap.area.indexOf('yes') > -1) {
73260                   return 'area';
73261               }
73262               if (tagMap.area.indexOf('no') > -1) {
73263                   return 'line';
73264               }
73265           }
73266
73267           for (var key in tagMap) {
73268               if (key in _areaKeys && !isAreaKeyBlackList(key)) {
73269                   return 'area';
73270               }
73271               if (key in _lineKeys && isLineKeysWhiteList(key)) {
73272                   return 'area';
73273               }
73274           }
73275
73276           return 'line';
73277       },
73278       // adds from mapcss-parse selector check...
73279       addRule: function(selector) {
73280           var rule = {
73281               // checks relevant to mapcss-selector
73282               checks: this.filterRuleChecks(selector),
73283               // true if all conditions for a tag error are true..
73284               matches: function(entity) {
73285                   return every(this.checks, function(check) {
73286                       return check(entity.tags);
73287                   });
73288               },
73289               // borrowed from Way#isArea()
73290               inferredGeometry: this.inferGeometry(this.buildTagMap(selector), this._areaKeys),
73291               geometryMatches: function(entity, graph) {
73292                   if (entity.type === 'node' || entity.type === 'relation') {
73293                       return selector.geometry === entity.type;
73294                   } else if (entity.type === 'way') {
73295                       return this.inferredGeometry === entity.geometry(graph);
73296                   }
73297               },
73298               // when geometries match and tag matches are present, return a warning...
73299               findWarnings: function (entity, graph, warnings) {
73300                   if (this.geometryMatches(entity, graph) && this.matches(entity)) {
73301                       var type = Object.keys(selector).indexOf('error') > -1 ? 'error' : 'warning';
73302                       warnings.push({
73303                           severity: type,
73304                           message: selector[type],
73305                           entity: entity
73306                       });
73307                   }
73308               }
73309           };
73310           this._validationRules.push(rule);
73311       },
73312       clearRules: function() { this._validationRules = []; },
73313       // returns validationRules...
73314       validationRules: function() { return this._validationRules; },
73315       // returns ruleChecks
73316       ruleChecks: function() { return this._ruleChecks; }
73317   };
73318
73319   var apibase$1 = 'https://nominatim.openstreetmap.org/',
73320       inflight = {},
73321       nominatimCache;
73322
73323
73324   var serviceNominatim = {
73325
73326       init: function() {
73327           inflight = {};
73328           nominatimCache = rbush_1();
73329       },
73330
73331       reset: function() {
73332           forEach(inflight, function(req) { req.abort(); });
73333           inflight = {};
73334           nominatimCache = rbush_1();
73335       },
73336
73337
73338       countryCode: function (location, callback) {
73339           this.reverse(location, function(err, result) {
73340               if (err) {
73341                   return callback(err);
73342               } else if (result.address) {
73343                   return callback(null, result.address.country_code);
73344               } else {
73345                   return callback('Unable to geocode', null);
73346               }
73347           });
73348       },
73349
73350
73351       reverse: function (location, callback) {
73352           var cached = nominatimCache.search(
73353               { minX: location[0], minY: location[1], maxX: location[0], maxY: location[1] }
73354           );
73355
73356           if (cached.length > 0) {
73357               return callback(null, cached[0].data);
73358           }
73359
73360           var params = { zoom: 13, format: 'json', addressdetails: 1, lat: location[1], lon: location[0] };
73361           var url = apibase$1 + 'reverse?' + utilQsString(params);
73362           if (inflight[url]) return;
73363
73364           inflight[url] = d3_json(url, function(err, result) {
73365               delete inflight[url];
73366
73367               if (err) {
73368                   return callback(err);
73369               } else if (result && result.error) {
73370                   return callback(result.error);
73371               }
73372
73373               var extent = geoExtent$$1(location).padByMeters(200);
73374               nominatimCache.insert(assign(extent.bbox(), {data: result}));
73375
73376               callback(null, result);
73377           });
73378       },
73379
73380
73381       search: function (val, callback) {
73382           var searchVal = encodeURIComponent(val);
73383           var url = apibase$1 + 'search/' + searchVal + '?limit=10&format=json';
73384           if (inflight[url]) return;
73385
73386           inflight[url] = d3_json(url, function(err, result) {
73387               delete inflight[url];
73388               callback(err, result);
73389           });
73390       }
73391
73392   };
73393
73394   var apibase$2 = 'https://openstreetcam.org';
73395   var maxResults$1 = 1000;
73396   var tileZoom$1 = 14;
73397   var tiler$2 = utilTiler().zoomExtent([tileZoom$1, tileZoom$1]).skipNullIsland(true);
73398   var dispatch$3 = dispatch('loadedImages');
73399   var imgZoom = d3_zoom()
73400       .extent([[0, 0], [320, 240]])
73401       .translateExtent([[0, 0], [320, 240]])
73402       .scaleExtent([1, 15])
73403       .on('zoom', zoomPan);
73404   var _oscCache;
73405   var _oscSelectedImage;
73406
73407
73408   function abortRequest$2(i) {
73409       i.abort();
73410   }
73411
73412
73413   function maxPageAtZoom$1(z) {
73414       if (z < 15)   return 2;
73415       if (z === 15) return 5;
73416       if (z === 16) return 10;
73417       if (z === 17) return 20;
73418       if (z === 18) return 40;
73419       if (z > 18)   return 80;
73420   }
73421
73422
73423   function loadTiles$1(which, url, projection) {
73424       var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
73425       var tiles = tiler$2.getTiles(projection);
73426
73427       // abort inflight requests that are no longer needed
73428       var cache = _oscCache[which];
73429       forEach(cache.inflight, function(v, k) {
73430           var wanted = find$1(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; });
73431
73432           if (!wanted) {
73433               abortRequest$2(v);
73434               delete cache.inflight[k];
73435           }
73436       });
73437
73438       tiles.forEach(function(tile) {
73439           loadNextTilePage$1(which, currZoom, url, tile);
73440       });
73441   }
73442
73443
73444   function loadNextTilePage$1(which, currZoom, url, tile) {
73445       var cache = _oscCache[which];
73446       var bbox = tile.extent.bbox();
73447       var maxPages = maxPageAtZoom$1(currZoom);
73448       var nextPage = cache.nextPage[tile.id] || 1;
73449       var params = utilQsString({
73450           ipp: maxResults$1,
73451           page: nextPage,
73452           // client_id: clientId,
73453           bbTopLeft: [bbox.maxY, bbox.minX].join(','),
73454           bbBottomRight: [bbox.minY, bbox.maxX].join(',')
73455       }, true);
73456
73457       if (nextPage > maxPages) return;
73458
73459       var id = tile.id + ',' + String(nextPage);
73460       if (cache.loaded[id] || cache.inflight[id]) return;
73461
73462       cache.inflight[id] = request(url)
73463           .mimeType('application/json')
73464           .header('Content-type', 'application/x-www-form-urlencoded')
73465           .response(function(xhr) { return JSON.parse(xhr.responseText); })
73466           .post(params, function(err, data) {
73467               cache.loaded[id] = true;
73468               delete cache.inflight[id];
73469               if (err || !data.currentPageItems || !data.currentPageItems.length) return;
73470
73471               function localeDateString(s) {
73472                   if (!s) return null;
73473                   var detected = utilDetect();
73474                   var options = { day: 'numeric', month: 'short', year: 'numeric' };
73475                   var d = new Date(s);
73476                   if (isNaN(d.getTime())) return null;
73477                   return d.toLocaleDateString(detected.locale, options);
73478               }
73479
73480               var features = data.currentPageItems.map(function(item) {
73481                   var loc = [+item.lng, +item.lat];
73482                   var d;
73483
73484                   if (which === 'images') {
73485                       d = {
73486                           loc: loc,
73487                           key: item.id,
73488                           ca: +item.heading,
73489                           captured_at: localeDateString(item.shot_date || item.date_added),
73490                           captured_by: item.username,
73491                           imagePath: item.lth_name,
73492                           sequence_id: item.sequence_id,
73493                           sequence_index: +item.sequence_index
73494                       };
73495
73496                       // cache sequence info
73497                       var seq = _oscCache.sequences[d.sequence_id];
73498                       if (!seq) {
73499                           seq = { rotation: 0, images: [] };
73500                           _oscCache.sequences[d.sequence_id] = seq;
73501                       }
73502                       seq.images[d.sequence_index] = d;
73503                   }
73504
73505                   return {
73506                       minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
73507                   };
73508               });
73509
73510               cache.rtree.load(features);
73511
73512               if (which === 'images') {
73513                   dispatch$3.call('loadedImages');
73514               }
73515
73516               if (data.currentPageItems.length === maxResults$1) {  // more pages to load
73517                   cache.nextPage[tile.id] = nextPage + 1;
73518                   loadNextTilePage$1(which, currZoom, url, tile);
73519               } else {
73520                   cache.nextPage[tile.id] = Infinity;     // no more pages to load
73521               }
73522           });
73523   }
73524
73525
73526   // partition viewport into higher zoom tiles
73527   function partitionViewport$1(projection) {
73528       var z = geoScaleToZoom(projection.scale());
73529       var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
73530       var tiler = utilTiler().zoomExtent([z2, z2]);
73531
73532       return tiler.getTiles(projection)
73533           .map(function(tile) { return tile.extent; });
73534   }
73535
73536
73537   // no more than `limit` results per partition.
73538   function searchLimited$1(limit, projection, rtree) {
73539       limit = limit || 5;
73540
73541       return partitionViewport$1(projection)
73542           .reduce(function(result, extent) {
73543               var found = rtree.search(extent.bbox())
73544                   .slice(0, limit)
73545                   .map(function(d) { return d.data; });
73546
73547               return (found.length ? result.concat(found) : result);
73548           }, []);
73549   }
73550
73551
73552   function zoomPan() {
73553       var t = event.transform;
73554       select('#photoviewer .osc-image-wrap')
73555           .call(utilSetTransform, t.x, t.y, t.k);
73556   }
73557
73558
73559   var serviceOpenstreetcam = {
73560
73561       init: function() {
73562           if (!_oscCache) {
73563               this.reset();
73564           }
73565
73566           this.event = utilRebind(this, dispatch$3, 'on');
73567       },
73568
73569       reset: function() {
73570           var cache = _oscCache;
73571
73572           if (cache) {
73573               if (cache.images && cache.images.inflight) {
73574                   forEach(cache.images.inflight, abortRequest$2);
73575               }
73576           }
73577
73578           _oscCache = {
73579               images: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1() },
73580               sequences: {}
73581           };
73582
73583           _oscSelectedImage = null;
73584       },
73585
73586
73587       images: function(projection) {
73588           var limit = 5;
73589           return searchLimited$1(limit, projection, _oscCache.images.rtree);
73590       },
73591
73592
73593       sequences: function(projection) {
73594           var viewport = projection.clipExtent();
73595           var min = [viewport[0][0], viewport[1][1]];
73596           var max = [viewport[1][0], viewport[0][1]];
73597           var bbox = geoExtent$$1(projection.invert(min), projection.invert(max)).bbox();
73598           var sequenceKeys = {};
73599
73600           // all sequences for images in viewport
73601           _oscCache.images.rtree.search(bbox)
73602               .forEach(function(d) { sequenceKeys[d.data.sequence_id] = true; });
73603
73604           // make linestrings from those sequences
73605           var lineStrings = [];
73606           Object.keys(sequenceKeys)
73607               .forEach(function(sequenceKey) {
73608                   var seq = _oscCache.sequences[sequenceKey];
73609                   var images = seq && seq.images;
73610                   if (images) {
73611                       lineStrings.push({
73612                           type: 'LineString',
73613                           coordinates: images.map(function (d) { return d.loc; }).filter(Boolean),
73614                           properties: { key: sequenceKey }
73615                       });
73616                   }
73617               });
73618           return lineStrings;
73619       },
73620
73621
73622       loadImages: function(projection) {
73623           var url = apibase$2 + '/1.0/list/nearby-photos/';
73624           loadTiles$1('images', url, projection);
73625       },
73626
73627
73628       loadViewer: function(context) {
73629           var that = this;
73630
73631           // add osc-wrapper
73632           var wrap = select('#photoviewer').selectAll('.osc-wrapper')
73633               .data([0]);
73634
73635           var wrapEnter = wrap.enter()
73636               .append('div')
73637               .attr('class', 'photo-wrapper osc-wrapper')
73638               .classed('hide', true)
73639               .call(imgZoom)
73640               .on('dblclick.zoom', null);
73641
73642           wrapEnter
73643               .append('div')
73644               .attr('class', 'photo-attribution fillD');
73645
73646           var controlsEnter = wrapEnter
73647               .append('div')
73648               .attr('class', 'photo-controls-wrap')
73649               .append('div')
73650               .attr('class', 'photo-controls');
73651
73652           controlsEnter
73653               .append('button')
73654               .on('click.back', step(-1))
73655               .text('◄');
73656
73657           controlsEnter
73658               .append('button')
73659               .on('click.rotate-ccw', rotate(-90))
73660               .text('⤿');
73661
73662           controlsEnter
73663               .append('button')
73664               .on('click.rotate-cw', rotate(90))
73665               .text('⤾');
73666
73667           controlsEnter
73668               .append('button')
73669               .on('click.forward', step(1))
73670               .text('►');
73671
73672           wrapEnter
73673               .append('div')
73674               .attr('class', 'osc-image-wrap');
73675
73676
73677           // Register viewer resize handler
73678           context.ui().photoviewer.on('resize', function(dimensions) {
73679               imgZoom = d3_zoom()
73680                   .extent([[0, 0], dimensions])
73681                   .translateExtent([[0, 0], dimensions])
73682                   .scaleExtent([1, 15])
73683                   .on('zoom', zoomPan);
73684           });
73685
73686
73687           function rotate(deg) {
73688               return function() {
73689                   if (!_oscSelectedImage) return;
73690                   var sequenceKey = _oscSelectedImage.sequence_id;
73691                   var sequence = _oscCache.sequences[sequenceKey];
73692                   if (!sequence) return;
73693
73694                   var r = sequence.rotation || 0;
73695                   r += deg;
73696
73697                   if (r > 180) r -= 360;
73698                   if (r < -180) r += 360;
73699                   sequence.rotation = r;
73700
73701                   var wrap = select('#photoviewer .osc-wrapper');
73702
73703                   wrap
73704                       .transition()
73705                       .duration(100)
73706                       .call(imgZoom.transform, identity$7);
73707
73708                   wrap.selectAll('.osc-image')
73709                       .transition()
73710                       .duration(100)
73711                       .style('transform', 'rotate(' + r + 'deg)');
73712               };
73713           }
73714
73715           function step(stepBy) {
73716               return function() {
73717                   if (!_oscSelectedImage) return;
73718                   var sequenceKey = _oscSelectedImage.sequence_id;
73719                   var sequence = _oscCache.sequences[sequenceKey];
73720                   if (!sequence) return;
73721
73722                   var nextIndex = _oscSelectedImage.sequence_index + stepBy;
73723                   var nextImage = sequence.images[nextIndex];
73724                   if (!nextImage) return;
73725
73726                   context.map().centerEase(nextImage.loc);
73727
73728                   that
73729                       .selectImage(nextImage)
73730                       .updateViewer(nextImage);
73731               };
73732           }
73733       },
73734
73735
73736       showViewer: function() {
73737           var viewer = select('#photoviewer')
73738               .classed('hide', false);
73739
73740           var isHidden = viewer.selectAll('.photo-wrapper.osc-wrapper.hide').size();
73741
73742           if (isHidden) {
73743               viewer
73744                   .selectAll('.photo-wrapper:not(.osc-wrapper)')
73745                   .classed('hide', true);
73746
73747               viewer
73748                   .selectAll('.photo-wrapper.osc-wrapper')
73749                   .classed('hide', false);
73750           }
73751
73752           return this;
73753       },
73754
73755
73756       hideViewer: function() {
73757           _oscSelectedImage = null;
73758
73759           var viewer = select('#photoviewer');
73760           if (!viewer.empty()) viewer.datum(null);
73761
73762           viewer
73763               .classed('hide', true)
73764               .selectAll('.photo-wrapper')
73765               .classed('hide', true);
73766
73767           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
73768               .classed('selected', false);
73769
73770           return this.setStyles(null, true);
73771       },
73772
73773
73774       updateViewer: function(d) {
73775           var wrap = select('#photoviewer .osc-wrapper');
73776           var imageWrap = wrap.selectAll('.osc-image-wrap');
73777           var attribution = wrap.selectAll('.photo-attribution').html('');
73778
73779           wrap
73780               .transition()
73781               .duration(100)
73782               .call(imgZoom.transform, identity$7);
73783
73784           imageWrap
73785               .selectAll('.osc-image')
73786               .remove();
73787
73788           if (d) {
73789               var sequence = _oscCache.sequences[d.sequence_id];
73790               var r = (sequence && sequence.rotation) || 0;
73791
73792               imageWrap
73793                   .append('img')
73794                   .attr('class', 'osc-image')
73795                   .attr('src', apibase$2 + '/' + d.imagePath)
73796                   .style('transform', 'rotate(' + r + 'deg)');
73797
73798               if (d.captured_by) {
73799                   attribution
73800                       .append('a')
73801                       .attr('class', 'captured_by')
73802                       .attr('target', '_blank')
73803                       .attr('href', 'https://openstreetcam.org/user/' + encodeURIComponent(d.captured_by))
73804                       .text('@' + d.captured_by);
73805
73806                   attribution
73807                       .append('span')
73808                       .text('|');
73809               }
73810
73811               if (d.captured_at) {
73812                   attribution
73813                       .append('span')
73814                       .attr('class', 'captured_at')
73815                       .text(d.captured_at);
73816
73817                   attribution
73818                       .append('span')
73819                       .text('|');
73820               }
73821
73822               attribution
73823                   .append('a')
73824                   .attr('class', 'image-link')
73825                   .attr('target', '_blank')
73826                   .attr('href', 'https://openstreetcam.org/details/' + d.sequence_id + '/' + d.sequence_index)
73827                   .text('openstreetcam.org');
73828           }
73829           return this;
73830       },
73831
73832
73833       selectImage: function(d) {
73834           _oscSelectedImage = d;
73835           var viewer = select('#photoviewer');
73836           if (!viewer.empty()) viewer.datum(d);
73837
73838           this.setStyles(null, true);
73839
73840           d3_selectAll('.icon-sign')
73841               .classed('selected', false);
73842
73843           return this;
73844       },
73845
73846
73847       getSelectedImage: function() {
73848           return _oscSelectedImage;
73849       },
73850
73851
73852       getSequenceKeyForImage: function(d) {
73853           return d && d.sequence_id;
73854       },
73855
73856
73857       setStyles: function(hovered, reset) {
73858           if (reset) {  // reset all layers
73859               d3_selectAll('.viewfield-group')
73860                   .classed('highlighted', false)
73861                   .classed('hovered', false)
73862                   .classed('selected', false);
73863
73864               d3_selectAll('.sequence')
73865                   .classed('highlighted', false)
73866                   .classed('selected', false);
73867           }
73868
73869           var hoveredImageKey = hovered && hovered.key;
73870           var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
73871           var hoveredSequence = hoveredSequenceKey && _oscCache.sequences[hoveredSequenceKey];
73872           var hoveredImageKeys = (hoveredSequence && hoveredSequence.images.map(function (d) { return d.key; })) || [];
73873
73874           var viewer = select('#photoviewer');
73875           var selected = viewer.empty() ? undefined : viewer.datum();
73876           var selectedImageKey = selected && selected.key;
73877           var selectedSequenceKey = this.getSequenceKeyForImage(selected);
73878           var selectedSequence = selectedSequenceKey && _oscCache.sequences[selectedSequenceKey];
73879           var selectedImageKeys = (selectedSequence && selectedSequence.images.map(function (d) { return d.key; })) || [];
73880
73881           // highlight sibling viewfields on either the selected or the hovered sequences
73882           var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
73883
73884           d3_selectAll('.layer-openstreetcam-images .viewfield-group')
73885               .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
73886               .classed('hovered', function(d) { return d.key === hoveredImageKey; })
73887               .classed('selected', function(d) { return d.key === selectedImageKey; });
73888
73889           d3_selectAll('.layer-openstreetcam-images .sequence')
73890               .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
73891               .classed('selected', function(d) { return d.properties.key === selectedSequenceKey; });
73892
73893           // update viewfields if needed
73894           d3_selectAll('.viewfield-group .viewfield')
73895               .attr('d', viewfieldPath);
73896
73897           function viewfieldPath() {
73898               var d = this.parentNode.__data__;
73899               if (d.pano && d.key !== selectedImageKey) {
73900                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
73901               } else {
73902                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
73903               }
73904           }
73905
73906           return this;
73907       },
73908
73909
73910       cache: function() {
73911           return _oscCache;
73912       }
73913
73914   };
73915
73916   /* Built-in method references for those with the same name as other `lodash` methods. */
73917   var nativeCeil = Math.ceil,
73918       nativeMax$4 = Math.max;
73919
73920   /**
73921    * Creates an array of elements split into groups the length of `size`.
73922    * If `array` can't be split evenly, the final chunk will be the remaining
73923    * elements.
73924    *
73925    * @static
73926    * @memberOf _
73927    * @since 3.0.0
73928    * @category Array
73929    * @param {Array} array The array to process.
73930    * @param {number} [size=1] The length of each chunk
73931    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
73932    * @returns {Array} Returns the new array of chunks.
73933    * @example
73934    *
73935    * _.chunk(['a', 'b', 'c', 'd'], 2);
73936    * // => [['a', 'b'], ['c', 'd']]
73937    *
73938    * _.chunk(['a', 'b', 'c', 'd'], 3);
73939    * // => [['a', 'b', 'c'], ['d']]
73940    */
73941   function chunk(array, size, guard) {
73942     if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
73943       size = 1;
73944     } else {
73945       size = nativeMax$4(toInteger(size), 0);
73946     }
73947     var length = array == null ? 0 : array.length;
73948     if (!length || size < 1) {
73949       return [];
73950     }
73951     var index = 0,
73952         resIndex = 0,
73953         result = Array(nativeCeil(length / size));
73954
73955     while (index < length) {
73956       result[resIndex++] = baseSlice(array, index, (index += size));
73957     }
73958     return result;
73959   }
73960
73961   var hashes = createCommonjsModule(function (module, exports) {
73962   /**
73963    * jshashes - https://github.com/h2non/jshashes
73964    * Released under the "New BSD" license
73965    *
73966    * Algorithms specification:
73967    *
73968    * MD5 - http://www.ietf.org/rfc/rfc1321.txt
73969    * RIPEMD-160 - http://homes.esat.kuleuven.be/~bosselae/ripemd160.html
73970    * SHA1   - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
73971    * SHA256 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
73972    * SHA512 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
73973    * HMAC - http://www.ietf.org/rfc/rfc2104.txt
73974    */
73975   (function() {
73976     var Hashes;
73977
73978     function utf8Encode(str) {
73979       var x, y, output = '',
73980         i = -1,
73981         l;
73982
73983       if (str && str.length) {
73984         l = str.length;
73985         while ((i += 1) < l) {
73986           /* Decode utf-16 surrogate pairs */
73987           x = str.charCodeAt(i);
73988           y = i + 1 < l ? str.charCodeAt(i + 1) : 0;
73989           if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {
73990             x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
73991             i += 1;
73992           }
73993           /* Encode output as utf-8 */
73994           if (x <= 0x7F) {
73995             output += String.fromCharCode(x);
73996           } else if (x <= 0x7FF) {
73997             output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F),
73998               0x80 | (x & 0x3F));
73999           } else if (x <= 0xFFFF) {
74000             output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
74001               0x80 | ((x >>> 6) & 0x3F),
74002               0x80 | (x & 0x3F));
74003           } else if (x <= 0x1FFFFF) {
74004             output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
74005               0x80 | ((x >>> 12) & 0x3F),
74006               0x80 | ((x >>> 6) & 0x3F),
74007               0x80 | (x & 0x3F));
74008           }
74009         }
74010       }
74011       return output;
74012     }
74013
74014     function utf8Decode(str) {
74015       var i, ac, c1, c2, c3, arr = [],
74016         l;
74017       i = ac = c1 = c2 = c3 = 0;
74018
74019       if (str && str.length) {
74020         l = str.length;
74021         str += '';
74022
74023         while (i < l) {
74024           c1 = str.charCodeAt(i);
74025           ac += 1;
74026           if (c1 < 128) {
74027             arr[ac] = String.fromCharCode(c1);
74028             i += 1;
74029           } else if (c1 > 191 && c1 < 224) {
74030             c2 = str.charCodeAt(i + 1);
74031             arr[ac] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
74032             i += 2;
74033           } else {
74034             c2 = str.charCodeAt(i + 1);
74035             c3 = str.charCodeAt(i + 2);
74036             arr[ac] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
74037             i += 3;
74038           }
74039         }
74040       }
74041       return arr.join('');
74042     }
74043
74044     /**
74045      * Add integers, wrapping at 2^32. This uses 16-bit operations internally
74046      * to work around bugs in some JS interpreters.
74047      */
74048
74049     function safe_add(x, y) {
74050       var lsw = (x & 0xFFFF) + (y & 0xFFFF),
74051         msw = (x >> 16) + (y >> 16) + (lsw >> 16);
74052       return (msw << 16) | (lsw & 0xFFFF);
74053     }
74054
74055     /**
74056      * Bitwise rotate a 32-bit number to the left.
74057      */
74058
74059     function bit_rol(num, cnt) {
74060       return (num << cnt) | (num >>> (32 - cnt));
74061     }
74062
74063     /**
74064      * Convert a raw string to a hex string
74065      */
74066
74067     function rstr2hex(input, hexcase) {
74068       var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef',
74069         output = '',
74070         x, i = 0,
74071         l = input.length;
74072       for (; i < l; i += 1) {
74073         x = input.charCodeAt(i);
74074         output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F);
74075       }
74076       return output;
74077     }
74078
74079     /**
74080      * Convert an array of big-endian words to a string
74081      */
74082
74083     function binb2rstr(input) {
74084       var i, l = input.length * 32,
74085         output = '';
74086       for (i = 0; i < l; i += 8) {
74087         output += String.fromCharCode((input[i >> 5] >>> (24 - i % 32)) & 0xFF);
74088       }
74089       return output;
74090     }
74091
74092     /**
74093      * Convert an array of little-endian words to a string
74094      */
74095
74096     function binl2rstr(input) {
74097       var i, l = input.length * 32,
74098         output = '';
74099       for (i = 0; i < l; i += 8) {
74100         output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
74101       }
74102       return output;
74103     }
74104
74105     /**
74106      * Convert a raw string to an array of little-endian words
74107      * Characters >255 have their high-byte silently ignored.
74108      */
74109
74110     function rstr2binl(input) {
74111       var i, l = input.length * 8,
74112         output = Array(input.length >> 2),
74113         lo = output.length;
74114       for (i = 0; i < lo; i += 1) {
74115         output[i] = 0;
74116       }
74117       for (i = 0; i < l; i += 8) {
74118         output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
74119       }
74120       return output;
74121     }
74122
74123     /**
74124      * Convert a raw string to an array of big-endian words
74125      * Characters >255 have their high-byte silently ignored.
74126      */
74127
74128     function rstr2binb(input) {
74129       var i, l = input.length * 8,
74130         output = Array(input.length >> 2),
74131         lo = output.length;
74132       for (i = 0; i < lo; i += 1) {
74133         output[i] = 0;
74134       }
74135       for (i = 0; i < l; i += 8) {
74136         output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
74137       }
74138       return output;
74139     }
74140
74141     /**
74142      * Convert a raw string to an arbitrary string encoding
74143      */
74144
74145     function rstr2any(input, encoding) {
74146       var divisor = encoding.length,
74147         remainders = Array(),
74148         i, q, x, ld, quotient, dividend, output, full_length;
74149
74150       /* Convert to an array of 16-bit big-endian values, forming the dividend */
74151       dividend = Array(Math.ceil(input.length / 2));
74152       ld = dividend.length;
74153       for (i = 0; i < ld; i += 1) {
74154         dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
74155       }
74156
74157       /**
74158        * Repeatedly perform a long division. The binary array forms the dividend,
74159        * the length of the encoding is the divisor. Once computed, the quotient
74160        * forms the dividend for the next step. We stop when the dividend is zerHashes.
74161        * All remainders are stored for later use.
74162        */
74163       while (dividend.length > 0) {
74164         quotient = Array();
74165         x = 0;
74166         for (i = 0; i < dividend.length; i += 1) {
74167           x = (x << 16) + dividend[i];
74168           q = Math.floor(x / divisor);
74169           x -= q * divisor;
74170           if (quotient.length > 0 || q > 0) {
74171             quotient[quotient.length] = q;
74172           }
74173         }
74174         remainders[remainders.length] = x;
74175         dividend = quotient;
74176       }
74177
74178       /* Convert the remainders to the output string */
74179       output = '';
74180       for (i = remainders.length - 1; i >= 0; i--) {
74181         output += encoding.charAt(remainders[i]);
74182       }
74183
74184       /* Append leading zero equivalents */
74185       full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));
74186       for (i = output.length; i < full_length; i += 1) {
74187         output = encoding[0] + output;
74188       }
74189       return output;
74190     }
74191
74192     /**
74193      * Convert a raw string to a base-64 string
74194      */
74195
74196     function rstr2b64(input, b64pad) {
74197       var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
74198         output = '',
74199         len = input.length,
74200         i, j, triplet;
74201       b64pad = b64pad || '=';
74202       for (i = 0; i < len; i += 3) {
74203         triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
74204         for (j = 0; j < 4; j += 1) {
74205           if (i * 8 + j * 6 > input.length * 8) {
74206             output += b64pad;
74207           } else {
74208             output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
74209           }
74210         }
74211       }
74212       return output;
74213     }
74214
74215     Hashes = {
74216       /**
74217        * @property {String} version
74218        * @readonly
74219        */
74220       VERSION: '1.0.6',
74221       /**
74222        * @member Hashes
74223        * @class Base64
74224        * @constructor
74225        */
74226       Base64: function() {
74227         // private properties
74228         var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
74229           pad = '=', // default pad according with the RFC standard
74230           utf8 = true; // by default enable UTF-8 support encoding
74231
74232         // public method for encoding
74233         this.encode = function(input) {
74234           var i, j, triplet,
74235             output = '',
74236             len = input.length;
74237
74238           pad = pad || '=';
74239           input = (utf8) ? utf8Encode(input) : input;
74240
74241           for (i = 0; i < len; i += 3) {
74242             triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
74243             for (j = 0; j < 4; j += 1) {
74244               if (i * 8 + j * 6 > len * 8) {
74245                 output += pad;
74246               } else {
74247                 output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
74248               }
74249             }
74250           }
74251           return output;
74252         };
74253
74254         // public method for decoding
74255         this.decode = function(input) {
74256           // var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
74257           var i, o1, o2, o3, h1, h2, h3, h4, bits, ac,
74258             dec = '',
74259             arr = [];
74260           if (!input) {
74261             return input;
74262           }
74263
74264           i = ac = 0;
74265           input = input.replace(new RegExp('\\' + pad, 'gi'), ''); // use '='
74266           //input += '';
74267
74268           do { // unpack four hexets into three octets using index points in b64
74269             h1 = tab.indexOf(input.charAt(i += 1));
74270             h2 = tab.indexOf(input.charAt(i += 1));
74271             h3 = tab.indexOf(input.charAt(i += 1));
74272             h4 = tab.indexOf(input.charAt(i += 1));
74273
74274             bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
74275
74276             o1 = bits >> 16 & 0xff;
74277             o2 = bits >> 8 & 0xff;
74278             o3 = bits & 0xff;
74279             ac += 1;
74280
74281             if (h3 === 64) {
74282               arr[ac] = String.fromCharCode(o1);
74283             } else if (h4 === 64) {
74284               arr[ac] = String.fromCharCode(o1, o2);
74285             } else {
74286               arr[ac] = String.fromCharCode(o1, o2, o3);
74287             }
74288           } while (i < input.length);
74289
74290           dec = arr.join('');
74291           dec = (utf8) ? utf8Decode(dec) : dec;
74292
74293           return dec;
74294         };
74295
74296         // set custom pad string
74297         this.setPad = function(str) {
74298           pad = str || pad;
74299           return this;
74300         };
74301         // set custom tab string characters
74302         this.setTab = function(str) {
74303           tab = str || tab;
74304           return this;
74305         };
74306         this.setUTF8 = function(bool) {
74307           if (typeof bool === 'boolean') {
74308             utf8 = bool;
74309           }
74310           return this;
74311         };
74312       },
74313
74314       /**
74315        * CRC-32 calculation
74316        * @member Hashes
74317        * @method CRC32
74318        * @static
74319        * @param {String} str Input String
74320        * @return {String}
74321        */
74322       CRC32: function(str) {
74323         var crc = 0,
74324           x = 0,
74325           y = 0,
74326           table, i, iTop;
74327         str = utf8Encode(str);
74328
74329         table = [
74330           '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ',
74331           '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ',
74332           '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ',
74333           '63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD ',
74334           'A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC ',
74335           '51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 ',
74336           'B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 ',
74337           '06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 ',
74338           'E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 ',
74339           '12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 ',
74340           'D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 ',
74341           '33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 ',
74342           'CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 ',
74343           '9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E ',
74344           '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ',
74345           '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ',
74346           '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ',
74347           'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ',
74348           '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ',
74349           'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ',
74350           '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ',
74351           'F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA ',
74352           '11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 ',
74353           'D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F ',
74354           '30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E ',
74355           'C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D'
74356         ].join('');
74357
74358         crc = crc ^ (-1);
74359         for (i = 0, iTop = str.length; i < iTop; i += 1) {
74360           y = (crc ^ str.charCodeAt(i)) & 0xFF;
74361           x = '0x' + table.substr(y * 9, 8);
74362           crc = (crc >>> 8) ^ x;
74363         }
74364         // always return a positive number (that's what >>> 0 does)
74365         return (crc ^ (-1)) >>> 0;
74366       },
74367       /**
74368        * @member Hashes
74369        * @class MD5
74370        * @constructor
74371        * @param {Object} [config]
74372        *
74373        * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
74374        * Digest Algorithm, as defined in RFC 1321.
74375        * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
74376        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
74377        * See <http://pajhome.org.uk/crypt/md5> for more infHashes.
74378        */
74379       MD5: function(options) {
74380         /**
74381          * Private config properties. You may need to tweak these to be compatible with
74382          * the server-side, but the defaults work in most cases.
74383          * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
74384          */
74385         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
74386           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
74387           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
74388
74389         // privileged (public) methods
74390         this.hex = function(s) {
74391           return rstr2hex(rstr(s, utf8), hexcase);
74392         };
74393         this.b64 = function(s) {
74394           return rstr2b64(rstr(s), b64pad);
74395         };
74396         this.any = function(s, e) {
74397           return rstr2any(rstr(s, utf8), e);
74398         };
74399         this.raw = function(s) {
74400           return rstr(s, utf8);
74401         };
74402         this.hex_hmac = function(k, d) {
74403           return rstr2hex(rstr_hmac(k, d), hexcase);
74404         };
74405         this.b64_hmac = function(k, d) {
74406           return rstr2b64(rstr_hmac(k, d), b64pad);
74407         };
74408         this.any_hmac = function(k, d, e) {
74409           return rstr2any(rstr_hmac(k, d), e);
74410         };
74411         /**
74412          * Perform a simple self-test to see if the VM is working
74413          * @return {String} Hexadecimal hash sample
74414          */
74415         this.vm_test = function() {
74416           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
74417         };
74418         /**
74419          * Enable/disable uppercase hexadecimal returned string
74420          * @param {Boolean}
74421          * @return {Object} this
74422          */
74423         this.setUpperCase = function(a) {
74424           if (typeof a === 'boolean') {
74425             hexcase = a;
74426           }
74427           return this;
74428         };
74429         /**
74430          * Defines a base64 pad string
74431          * @param {String} Pad
74432          * @return {Object} this
74433          */
74434         this.setPad = function(a) {
74435           b64pad = a || b64pad;
74436           return this;
74437         };
74438         /**
74439          * Defines a base64 pad string
74440          * @param {Boolean}
74441          * @return {Object} [this]
74442          */
74443         this.setUTF8 = function(a) {
74444           if (typeof a === 'boolean') {
74445             utf8 = a;
74446           }
74447           return this;
74448         };
74449
74450         // private methods
74451
74452         /**
74453          * Calculate the MD5 of a raw string
74454          */
74455
74456         function rstr(s) {
74457           s = (utf8) ? utf8Encode(s) : s;
74458           return binl2rstr(binl(rstr2binl(s), s.length * 8));
74459         }
74460
74461         /**
74462          * Calculate the HMAC-MD5, of a key and some data (raw strings)
74463          */
74464
74465         function rstr_hmac(key, data) {
74466           var bkey, ipad, opad, hash, i;
74467
74468           key = (utf8) ? utf8Encode(key) : key;
74469           data = (utf8) ? utf8Encode(data) : data;
74470           bkey = rstr2binl(key);
74471           if (bkey.length > 16) {
74472             bkey = binl(bkey, key.length * 8);
74473           }
74474
74475           ipad = Array(16), opad = Array(16);
74476           for (i = 0; i < 16; i += 1) {
74477             ipad[i] = bkey[i] ^ 0x36363636;
74478             opad[i] = bkey[i] ^ 0x5C5C5C5C;
74479           }
74480           hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
74481           return binl2rstr(binl(opad.concat(hash), 512 + 128));
74482         }
74483
74484         /**
74485          * Calculate the MD5 of an array of little-endian words, and a bit length.
74486          */
74487
74488         function binl(x, len) {
74489           var i, olda, oldb, oldc, oldd,
74490             a = 1732584193,
74491             b = -271733879,
74492             c = -1732584194,
74493             d = 271733878;
74494
74495           /* append padding */
74496           x[len >> 5] |= 0x80 << ((len) % 32);
74497           x[(((len + 64) >>> 9) << 4) + 14] = len;
74498
74499           for (i = 0; i < x.length; i += 16) {
74500             olda = a;
74501             oldb = b;
74502             oldc = c;
74503             oldd = d;
74504
74505             a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
74506             d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
74507             c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
74508             b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
74509             a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
74510             d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
74511             c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
74512             b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
74513             a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
74514             d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
74515             c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
74516             b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
74517             a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
74518             d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
74519             c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
74520             b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
74521
74522             a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
74523             d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
74524             c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
74525             b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
74526             a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
74527             d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
74528             c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
74529             b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
74530             a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
74531             d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
74532             c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
74533             b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
74534             a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
74535             d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
74536             c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
74537             b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
74538
74539             a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
74540             d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
74541             c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
74542             b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
74543             a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
74544             d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
74545             c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
74546             b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
74547             a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
74548             d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
74549             c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
74550             b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
74551             a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
74552             d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
74553             c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
74554             b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
74555
74556             a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
74557             d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
74558             c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
74559             b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
74560             a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
74561             d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
74562             c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
74563             b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
74564             a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
74565             d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
74566             c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
74567             b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
74568             a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
74569             d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
74570             c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
74571             b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
74572
74573             a = safe_add(a, olda);
74574             b = safe_add(b, oldb);
74575             c = safe_add(c, oldc);
74576             d = safe_add(d, oldd);
74577           }
74578           return Array(a, b, c, d);
74579         }
74580
74581         /**
74582          * These functions implement the four basic operations the algorithm uses.
74583          */
74584
74585         function md5_cmn(q, a, b, x, s, t) {
74586           return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
74587         }
74588
74589         function md5_ff(a, b, c, d, x, s, t) {
74590           return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
74591         }
74592
74593         function md5_gg(a, b, c, d, x, s, t) {
74594           return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
74595         }
74596
74597         function md5_hh(a, b, c, d, x, s, t) {
74598           return md5_cmn(b ^ c ^ d, a, b, x, s, t);
74599         }
74600
74601         function md5_ii(a, b, c, d, x, s, t) {
74602           return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
74603         }
74604       },
74605       /**
74606        * @member Hashes
74607        * @class Hashes.SHA1
74608        * @param {Object} [config]
74609        * @constructor
74610        *
74611        * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1
74612        * Version 2.2 Copyright Paul Johnston 2000 - 2009.
74613        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
74614        * See http://pajhome.org.uk/crypt/md5 for details.
74615        */
74616       SHA1: function(options) {
74617         /**
74618          * Private config properties. You may need to tweak these to be compatible with
74619          * the server-side, but the defaults work in most cases.
74620          * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
74621          */
74622         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
74623           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
74624           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
74625
74626         // public methods
74627         this.hex = function(s) {
74628           return rstr2hex(rstr(s, utf8), hexcase);
74629         };
74630         this.b64 = function(s) {
74631           return rstr2b64(rstr(s, utf8), b64pad);
74632         };
74633         this.any = function(s, e) {
74634           return rstr2any(rstr(s, utf8), e);
74635         };
74636         this.raw = function(s) {
74637           return rstr(s, utf8);
74638         };
74639         this.hex_hmac = function(k, d) {
74640           return rstr2hex(rstr_hmac(k, d));
74641         };
74642         this.b64_hmac = function(k, d) {
74643           return rstr2b64(rstr_hmac(k, d), b64pad);
74644         };
74645         this.any_hmac = function(k, d, e) {
74646           return rstr2any(rstr_hmac(k, d), e);
74647         };
74648         /**
74649          * Perform a simple self-test to see if the VM is working
74650          * @return {String} Hexadecimal hash sample
74651          * @public
74652          */
74653         this.vm_test = function() {
74654           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
74655         };
74656         /**
74657          * @description Enable/disable uppercase hexadecimal returned string
74658          * @param {boolean}
74659          * @return {Object} this
74660          * @public
74661          */
74662         this.setUpperCase = function(a) {
74663           if (typeof a === 'boolean') {
74664             hexcase = a;
74665           }
74666           return this;
74667         };
74668         /**
74669          * @description Defines a base64 pad string
74670          * @param {string} Pad
74671          * @return {Object} this
74672          * @public
74673          */
74674         this.setPad = function(a) {
74675           b64pad = a || b64pad;
74676           return this;
74677         };
74678         /**
74679          * @description Defines a base64 pad string
74680          * @param {boolean}
74681          * @return {Object} this
74682          * @public
74683          */
74684         this.setUTF8 = function(a) {
74685           if (typeof a === 'boolean') {
74686             utf8 = a;
74687           }
74688           return this;
74689         };
74690
74691         // private methods
74692
74693         /**
74694          * Calculate the SHA-512 of a raw string
74695          */
74696
74697         function rstr(s) {
74698           s = (utf8) ? utf8Encode(s) : s;
74699           return binb2rstr(binb(rstr2binb(s), s.length * 8));
74700         }
74701
74702         /**
74703          * Calculate the HMAC-SHA1 of a key and some data (raw strings)
74704          */
74705
74706         function rstr_hmac(key, data) {
74707           var bkey, ipad, opad, i, hash;
74708           key = (utf8) ? utf8Encode(key) : key;
74709           data = (utf8) ? utf8Encode(data) : data;
74710           bkey = rstr2binb(key);
74711
74712           if (bkey.length > 16) {
74713             bkey = binb(bkey, key.length * 8);
74714           }
74715           ipad = Array(16), opad = Array(16);
74716           for (i = 0; i < 16; i += 1) {
74717             ipad[i] = bkey[i] ^ 0x36363636;
74718             opad[i] = bkey[i] ^ 0x5C5C5C5C;
74719           }
74720           hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
74721           return binb2rstr(binb(opad.concat(hash), 512 + 160));
74722         }
74723
74724         /**
74725          * Calculate the SHA-1 of an array of big-endian words, and a bit length
74726          */
74727
74728         function binb(x, len) {
74729           var i, j, t, olda, oldb, oldc, oldd, olde,
74730             w = Array(80),
74731             a = 1732584193,
74732             b = -271733879,
74733             c = -1732584194,
74734             d = 271733878,
74735             e = -1009589776;
74736
74737           /* append padding */
74738           x[len >> 5] |= 0x80 << (24 - len % 32);
74739           x[((len + 64 >> 9) << 4) + 15] = len;
74740
74741           for (i = 0; i < x.length; i += 16) {
74742             olda = a;
74743             oldb = b;
74744             oldc = c;
74745             oldd = d;
74746             olde = e;
74747
74748             for (j = 0; j < 80; j += 1) {
74749               if (j < 16) {
74750                 w[j] = x[i + j];
74751               } else {
74752                 w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
74753               }
74754               t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),
74755                 safe_add(safe_add(e, w[j]), sha1_kt(j)));
74756               e = d;
74757               d = c;
74758               c = bit_rol(b, 30);
74759               b = a;
74760               a = t;
74761             }
74762
74763             a = safe_add(a, olda);
74764             b = safe_add(b, oldb);
74765             c = safe_add(c, oldc);
74766             d = safe_add(d, oldd);
74767             e = safe_add(e, olde);
74768           }
74769           return Array(a, b, c, d, e);
74770         }
74771
74772         /**
74773          * Perform the appropriate triplet combination function for the current
74774          * iteration
74775          */
74776
74777         function sha1_ft(t, b, c, d) {
74778           if (t < 20) {
74779             return (b & c) | ((~b) & d);
74780           }
74781           if (t < 40) {
74782             return b ^ c ^ d;
74783           }
74784           if (t < 60) {
74785             return (b & c) | (b & d) | (c & d);
74786           }
74787           return b ^ c ^ d;
74788         }
74789
74790         /**
74791          * Determine the appropriate additive constant for the current iteration
74792          */
74793
74794         function sha1_kt(t) {
74795           return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
74796             (t < 60) ? -1894007588 : -899497514;
74797         }
74798       },
74799       /**
74800        * @class Hashes.SHA256
74801        * @param {config}
74802        *
74803        * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2
74804        * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.
74805        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
74806        * See http://pajhome.org.uk/crypt/md5 for details.
74807        * Also http://anmar.eu.org/projects/jssha2/
74808        */
74809       SHA256: function(options) {
74810         /**
74811          * Private properties configuration variables. You may need to tweak these to be compatible with
74812          * the server-side, but the defaults work in most cases.
74813          * @see this.setUpperCase() method
74814          * @see this.setPad() method
74815          */
74816         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase  */
74817           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
74818           /* base-64 pad character. Default '=' for strict RFC compliance   */
74819           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
74820           /* enable/disable utf8 encoding */
74821           sha256_K;
74822
74823         /* privileged (public) methods */
74824         this.hex = function(s) {
74825           return rstr2hex(rstr(s, utf8));
74826         };
74827         this.b64 = function(s) {
74828           return rstr2b64(rstr(s, utf8), b64pad);
74829         };
74830         this.any = function(s, e) {
74831           return rstr2any(rstr(s, utf8), e);
74832         };
74833         this.raw = function(s) {
74834           return rstr(s, utf8);
74835         };
74836         this.hex_hmac = function(k, d) {
74837           return rstr2hex(rstr_hmac(k, d));
74838         };
74839         this.b64_hmac = function(k, d) {
74840           return rstr2b64(rstr_hmac(k, d), b64pad);
74841         };
74842         this.any_hmac = function(k, d, e) {
74843           return rstr2any(rstr_hmac(k, d), e);
74844         };
74845         /**
74846          * Perform a simple self-test to see if the VM is working
74847          * @return {String} Hexadecimal hash sample
74848          * @public
74849          */
74850         this.vm_test = function() {
74851           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
74852         };
74853         /**
74854          * Enable/disable uppercase hexadecimal returned string
74855          * @param {boolean}
74856          * @return {Object} this
74857          * @public
74858          */
74859         this.setUpperCase = function(a) {
74860           if (typeof a === 'boolean') {
74861             hexcase = a;
74862           }
74863           return this;
74864         };
74865         /**
74866          * @description Defines a base64 pad string
74867          * @param {string} Pad
74868          * @return {Object} this
74869          * @public
74870          */
74871         this.setPad = function(a) {
74872           b64pad = a || b64pad;
74873           return this;
74874         };
74875         /**
74876          * Defines a base64 pad string
74877          * @param {boolean}
74878          * @return {Object} this
74879          * @public
74880          */
74881         this.setUTF8 = function(a) {
74882           if (typeof a === 'boolean') {
74883             utf8 = a;
74884           }
74885           return this;
74886         };
74887
74888         // private methods
74889
74890         /**
74891          * Calculate the SHA-512 of a raw string
74892          */
74893
74894         function rstr(s, utf8) {
74895           s = (utf8) ? utf8Encode(s) : s;
74896           return binb2rstr(binb(rstr2binb(s), s.length * 8));
74897         }
74898
74899         /**
74900          * Calculate the HMAC-sha256 of a key and some data (raw strings)
74901          */
74902
74903         function rstr_hmac(key, data) {
74904           key = (utf8) ? utf8Encode(key) : key;
74905           data = (utf8) ? utf8Encode(data) : data;
74906           var hash, i = 0,
74907             bkey = rstr2binb(key),
74908             ipad = Array(16),
74909             opad = Array(16);
74910
74911           if (bkey.length > 16) {
74912             bkey = binb(bkey, key.length * 8);
74913           }
74914
74915           for (; i < 16; i += 1) {
74916             ipad[i] = bkey[i] ^ 0x36363636;
74917             opad[i] = bkey[i] ^ 0x5C5C5C5C;
74918           }
74919
74920           hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
74921           return binb2rstr(binb(opad.concat(hash), 512 + 256));
74922         }
74923
74924         /*
74925          * Main sha256 function, with its support functions
74926          */
74927
74928         function sha256_S(X, n) {
74929           return (X >>> n) | (X << (32 - n));
74930         }
74931
74932         function sha256_R(X, n) {
74933           return (X >>> n);
74934         }
74935
74936         function sha256_Ch(x, y, z) {
74937           return ((x & y) ^ ((~x) & z));
74938         }
74939
74940         function sha256_Maj(x, y, z) {
74941           return ((x & y) ^ (x & z) ^ (y & z));
74942         }
74943
74944         function sha256_Sigma0256(x) {
74945           return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));
74946         }
74947
74948         function sha256_Sigma1256(x) {
74949           return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));
74950         }
74951
74952         function sha256_Gamma0256(x) {
74953           return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));
74954         }
74955
74956         function sha256_Gamma1256(x) {
74957           return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));
74958         }
74959
74960         sha256_K = [
74961           1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987,
74962           1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522,
74963           264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585,
74964           113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291,
74965           1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344,
74966           430227734, 506948616, 659060556, 883997877, 958139571, 1322822218,
74967           1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998
74968         ];
74969
74970         function binb(m, l) {
74971           var HASH = [1779033703, -1150833019, 1013904242, -1521486534,
74972             1359893119, -1694144372, 528734635, 1541459225
74973           ];
74974           var W = new Array(64);
74975           var a, b, c, d, e, f, g, h;
74976           var i, j, T1, T2;
74977
74978           /* append padding */
74979           m[l >> 5] |= 0x80 << (24 - l % 32);
74980           m[((l + 64 >> 9) << 4) + 15] = l;
74981
74982           for (i = 0; i < m.length; i += 16) {
74983             a = HASH[0];
74984             b = HASH[1];
74985             c = HASH[2];
74986             d = HASH[3];
74987             e = HASH[4];
74988             f = HASH[5];
74989             g = HASH[6];
74990             h = HASH[7];
74991
74992             for (j = 0; j < 64; j += 1) {
74993               if (j < 16) {
74994                 W[j] = m[j + i];
74995               } else {
74996                 W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),
74997                   sha256_Gamma0256(W[j - 15])), W[j - 16]);
74998               }
74999
75000               T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),
75001                 sha256_K[j]), W[j]);
75002               T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
75003               h = g;
75004               g = f;
75005               f = e;
75006               e = safe_add(d, T1);
75007               d = c;
75008               c = b;
75009               b = a;
75010               a = safe_add(T1, T2);
75011             }
75012
75013             HASH[0] = safe_add(a, HASH[0]);
75014             HASH[1] = safe_add(b, HASH[1]);
75015             HASH[2] = safe_add(c, HASH[2]);
75016             HASH[3] = safe_add(d, HASH[3]);
75017             HASH[4] = safe_add(e, HASH[4]);
75018             HASH[5] = safe_add(f, HASH[5]);
75019             HASH[6] = safe_add(g, HASH[6]);
75020             HASH[7] = safe_add(h, HASH[7]);
75021           }
75022           return HASH;
75023         }
75024
75025       },
75026
75027       /**
75028        * @class Hashes.SHA512
75029        * @param {config}
75030        *
75031        * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2
75032        * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.
75033        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
75034        * See http://pajhome.org.uk/crypt/md5 for details.
75035        */
75036       SHA512: function(options) {
75037         /**
75038          * Private properties configuration variables. You may need to tweak these to be compatible with
75039          * the server-side, but the defaults work in most cases.
75040          * @see this.setUpperCase() method
75041          * @see this.setPad() method
75042          */
75043         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
75044           /* hexadecimal output case format. false - lowercase; true - uppercase  */
75045           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
75046           /* base-64 pad character. Default '=' for strict RFC compliance   */
75047           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
75048           /* enable/disable utf8 encoding */
75049           sha512_k;
75050
75051         /* privileged (public) methods */
75052         this.hex = function(s) {
75053           return rstr2hex(rstr(s));
75054         };
75055         this.b64 = function(s) {
75056           return rstr2b64(rstr(s), b64pad);
75057         };
75058         this.any = function(s, e) {
75059           return rstr2any(rstr(s), e);
75060         };
75061         this.raw = function(s) {
75062           return rstr(s, utf8);
75063         };
75064         this.hex_hmac = function(k, d) {
75065           return rstr2hex(rstr_hmac(k, d));
75066         };
75067         this.b64_hmac = function(k, d) {
75068           return rstr2b64(rstr_hmac(k, d), b64pad);
75069         };
75070         this.any_hmac = function(k, d, e) {
75071           return rstr2any(rstr_hmac(k, d), e);
75072         };
75073         /**
75074          * Perform a simple self-test to see if the VM is working
75075          * @return {String} Hexadecimal hash sample
75076          * @public
75077          */
75078         this.vm_test = function() {
75079           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
75080         };
75081         /**
75082          * @description Enable/disable uppercase hexadecimal returned string
75083          * @param {boolean}
75084          * @return {Object} this
75085          * @public
75086          */
75087         this.setUpperCase = function(a) {
75088           if (typeof a === 'boolean') {
75089             hexcase = a;
75090           }
75091           return this;
75092         };
75093         /**
75094          * @description Defines a base64 pad string
75095          * @param {string} Pad
75096          * @return {Object} this
75097          * @public
75098          */
75099         this.setPad = function(a) {
75100           b64pad = a || b64pad;
75101           return this;
75102         };
75103         /**
75104          * @description Defines a base64 pad string
75105          * @param {boolean}
75106          * @return {Object} this
75107          * @public
75108          */
75109         this.setUTF8 = function(a) {
75110           if (typeof a === 'boolean') {
75111             utf8 = a;
75112           }
75113           return this;
75114         };
75115
75116         /* private methods */
75117
75118         /**
75119          * Calculate the SHA-512 of a raw string
75120          */
75121
75122         function rstr(s) {
75123           s = (utf8) ? utf8Encode(s) : s;
75124           return binb2rstr(binb(rstr2binb(s), s.length * 8));
75125         }
75126         /*
75127          * Calculate the HMAC-SHA-512 of a key and some data (raw strings)
75128          */
75129
75130         function rstr_hmac(key, data) {
75131           key = (utf8) ? utf8Encode(key) : key;
75132           data = (utf8) ? utf8Encode(data) : data;
75133
75134           var hash, i = 0,
75135             bkey = rstr2binb(key),
75136             ipad = Array(32),
75137             opad = Array(32);
75138
75139           if (bkey.length > 32) {
75140             bkey = binb(bkey, key.length * 8);
75141           }
75142
75143           for (; i < 32; i += 1) {
75144             ipad[i] = bkey[i] ^ 0x36363636;
75145             opad[i] = bkey[i] ^ 0x5C5C5C5C;
75146           }
75147
75148           hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
75149           return binb2rstr(binb(opad.concat(hash), 1024 + 512));
75150         }
75151
75152         /**
75153          * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
75154          */
75155
75156         function binb(x, len) {
75157           var j, i, l,
75158             W = new Array(80),
75159             hash = new Array(16),
75160             //Initial hash values
75161             H = [
75162               new int64(0x6a09e667, -205731576),
75163               new int64(-1150833019, -2067093701),
75164               new int64(0x3c6ef372, -23791573),
75165               new int64(-1521486534, 0x5f1d36f1),
75166               new int64(0x510e527f, -1377402159),
75167               new int64(-1694144372, 0x2b3e6c1f),
75168               new int64(0x1f83d9ab, -79577749),
75169               new int64(0x5be0cd19, 0x137e2179)
75170             ],
75171             T1 = new int64(0, 0),
75172             T2 = new int64(0, 0),
75173             a = new int64(0, 0),
75174             b = new int64(0, 0),
75175             c = new int64(0, 0),
75176             d = new int64(0, 0),
75177             e = new int64(0, 0),
75178             f = new int64(0, 0),
75179             g = new int64(0, 0),
75180             h = new int64(0, 0),
75181             //Temporary variables not specified by the document
75182             s0 = new int64(0, 0),
75183             s1 = new int64(0, 0),
75184             Ch = new int64(0, 0),
75185             Maj = new int64(0, 0),
75186             r1 = new int64(0, 0),
75187             r2 = new int64(0, 0),
75188             r3 = new int64(0, 0);
75189
75190           if (sha512_k === undefined) {
75191             //SHA512 constants
75192             sha512_k = [
75193               new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd),
75194               new int64(-1245643825, -330482897), new int64(-373957723, -2121671748),
75195               new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031),
75196               new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736),
75197               new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe),
75198               new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302),
75199               new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1),
75200               new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428),
75201               new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3),
75202               new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65),
75203               new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),
75204               new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459),
75205               new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210),
75206               new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340),
75207               new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395),
75208               new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70),
75209               new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),
75210               new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473),
75211               new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8),
75212               new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b),
75213               new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023),
75214               new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30),
75215               new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910),
75216               new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),
75217               new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53),
75218               new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016),
75219               new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893),
75220               new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397),
75221               new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),
75222               new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec),
75223               new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047),
75224               new int64(-1090935817, -1295615723), new int64(-965641998, -479046869),
75225               new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207),
75226               new int64(-354779690, -840897762), new int64(-176337025, -294727304),
75227               new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026),
75228               new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b),
75229               new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),
75230               new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620),
75231               new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430),
75232               new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)
75233             ];
75234           }
75235
75236           for (i = 0; i < 80; i += 1) {
75237             W[i] = new int64(0, 0);
75238           }
75239
75240           // append padding to the source string. The format is described in the FIPS.
75241           x[len >> 5] |= 0x80 << (24 - (len & 0x1f));
75242           x[((len + 128 >> 10) << 5) + 31] = len;
75243           l = x.length;
75244           for (i = 0; i < l; i += 32) { //32 dwords is the block size
75245             int64copy(a, H[0]);
75246             int64copy(b, H[1]);
75247             int64copy(c, H[2]);
75248             int64copy(d, H[3]);
75249             int64copy(e, H[4]);
75250             int64copy(f, H[5]);
75251             int64copy(g, H[6]);
75252             int64copy(h, H[7]);
75253
75254             for (j = 0; j < 16; j += 1) {
75255               W[j].h = x[i + 2 * j];
75256               W[j].l = x[i + 2 * j + 1];
75257             }
75258
75259             for (j = 16; j < 80; j += 1) {
75260               //sigma1
75261               int64rrot(r1, W[j - 2], 19);
75262               int64revrrot(r2, W[j - 2], 29);
75263               int64shr(r3, W[j - 2], 6);
75264               s1.l = r1.l ^ r2.l ^ r3.l;
75265               s1.h = r1.h ^ r2.h ^ r3.h;
75266               //sigma0
75267               int64rrot(r1, W[j - 15], 1);
75268               int64rrot(r2, W[j - 15], 8);
75269               int64shr(r3, W[j - 15], 7);
75270               s0.l = r1.l ^ r2.l ^ r3.l;
75271               s0.h = r1.h ^ r2.h ^ r3.h;
75272
75273               int64add4(W[j], s1, W[j - 7], s0, W[j - 16]);
75274             }
75275
75276             for (j = 0; j < 80; j += 1) {
75277               //Ch
75278               Ch.l = (e.l & f.l) ^ (~e.l & g.l);
75279               Ch.h = (e.h & f.h) ^ (~e.h & g.h);
75280
75281               //Sigma1
75282               int64rrot(r1, e, 14);
75283               int64rrot(r2, e, 18);
75284               int64revrrot(r3, e, 9);
75285               s1.l = r1.l ^ r2.l ^ r3.l;
75286               s1.h = r1.h ^ r2.h ^ r3.h;
75287
75288               //Sigma0
75289               int64rrot(r1, a, 28);
75290               int64revrrot(r2, a, 2);
75291               int64revrrot(r3, a, 7);
75292               s0.l = r1.l ^ r2.l ^ r3.l;
75293               s0.h = r1.h ^ r2.h ^ r3.h;
75294
75295               //Maj
75296               Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l);
75297               Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h);
75298
75299               int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
75300               int64add(T2, s0, Maj);
75301
75302               int64copy(h, g);
75303               int64copy(g, f);
75304               int64copy(f, e);
75305               int64add(e, d, T1);
75306               int64copy(d, c);
75307               int64copy(c, b);
75308               int64copy(b, a);
75309               int64add(a, T1, T2);
75310             }
75311             int64add(H[0], H[0], a);
75312             int64add(H[1], H[1], b);
75313             int64add(H[2], H[2], c);
75314             int64add(H[3], H[3], d);
75315             int64add(H[4], H[4], e);
75316             int64add(H[5], H[5], f);
75317             int64add(H[6], H[6], g);
75318             int64add(H[7], H[7], h);
75319           }
75320
75321           //represent the hash as an array of 32-bit dwords
75322           for (i = 0; i < 8; i += 1) {
75323             hash[2 * i] = H[i].h;
75324             hash[2 * i + 1] = H[i].l;
75325           }
75326           return hash;
75327         }
75328
75329         //A constructor for 64-bit numbers
75330
75331         function int64(h, l) {
75332           this.h = h;
75333           this.l = l;
75334           //this.toString = int64toString;
75335         }
75336
75337         //Copies src into dst, assuming both are 64-bit numbers
75338
75339         function int64copy(dst, src) {
75340           dst.h = src.h;
75341           dst.l = src.l;
75342         }
75343
75344         //Right-rotates a 64-bit number by shift
75345         //Won't handle cases of shift>=32
75346         //The function revrrot() is for that
75347
75348         function int64rrot(dst, x, shift) {
75349           dst.l = (x.l >>> shift) | (x.h << (32 - shift));
75350           dst.h = (x.h >>> shift) | (x.l << (32 - shift));
75351         }
75352
75353         //Reverses the dwords of the source and then rotates right by shift.
75354         //This is equivalent to rotation by 32+shift
75355
75356         function int64revrrot(dst, x, shift) {
75357           dst.l = (x.h >>> shift) | (x.l << (32 - shift));
75358           dst.h = (x.l >>> shift) | (x.h << (32 - shift));
75359         }
75360
75361         //Bitwise-shifts right a 64-bit number by shift
75362         //Won't handle shift>=32, but it's never needed in SHA512
75363
75364         function int64shr(dst, x, shift) {
75365           dst.l = (x.l >>> shift) | (x.h << (32 - shift));
75366           dst.h = (x.h >>> shift);
75367         }
75368
75369         //Adds two 64-bit numbers
75370         //Like the original implementation, does not rely on 32-bit operations
75371
75372         function int64add(dst, x, y) {
75373           var w0 = (x.l & 0xffff) + (y.l & 0xffff);
75374           var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);
75375           var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);
75376           var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16);
75377           dst.l = (w0 & 0xffff) | (w1 << 16);
75378           dst.h = (w2 & 0xffff) | (w3 << 16);
75379         }
75380
75381         //Same, except with 4 addends. Works faster than adding them one by one.
75382
75383         function int64add4(dst, a, b, c, d) {
75384           var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);
75385           var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16);
75386           var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16);
75387           var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16);
75388           dst.l = (w0 & 0xffff) | (w1 << 16);
75389           dst.h = (w2 & 0xffff) | (w3 << 16);
75390         }
75391
75392         //Same, except with 5 addends
75393
75394         function int64add5(dst, a, b, c, d, e) {
75395           var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff),
75396             w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16),
75397             w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16),
75398             w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16);
75399           dst.l = (w0 & 0xffff) | (w1 << 16);
75400           dst.h = (w2 & 0xffff) | (w3 << 16);
75401         }
75402       },
75403       /**
75404        * @class Hashes.RMD160
75405        * @constructor
75406        * @param {Object} [config]
75407        *
75408        * A JavaScript implementation of the RIPEMD-160 Algorithm
75409        * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
75410        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
75411        * See http://pajhome.org.uk/crypt/md5 for details.
75412        * Also http://www.ocf.berkeley.edu/~jjlin/jsotp/
75413        */
75414       RMD160: function(options) {
75415         /**
75416          * Private properties configuration variables. You may need to tweak these to be compatible with
75417          * the server-side, but the defaults work in most cases.
75418          * @see this.setUpperCase() method
75419          * @see this.setPad() method
75420          */
75421         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
75422           /* hexadecimal output case format. false - lowercase; true - uppercase  */
75423           b64pad = (options && typeof options.pad === 'string') ? options.pa : '=',
75424           /* base-64 pad character. Default '=' for strict RFC compliance   */
75425           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
75426           /* enable/disable utf8 encoding */
75427           rmd160_r1 = [
75428             0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
75429             7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
75430             3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
75431             1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
75432             4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
75433           ],
75434           rmd160_r2 = [
75435             5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
75436             6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
75437             15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
75438             8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
75439             12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
75440           ],
75441           rmd160_s1 = [
75442             11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
75443             7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
75444             11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
75445             11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
75446             9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
75447           ],
75448           rmd160_s2 = [
75449             8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
75450             9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
75451             9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
75452             15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
75453             8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
75454           ];
75455
75456         /* privileged (public) methods */
75457         this.hex = function(s) {
75458           return rstr2hex(rstr(s, utf8));
75459         };
75460         this.b64 = function(s) {
75461           return rstr2b64(rstr(s, utf8), b64pad);
75462         };
75463         this.any = function(s, e) {
75464           return rstr2any(rstr(s, utf8), e);
75465         };
75466         this.raw = function(s) {
75467           return rstr(s, utf8);
75468         };
75469         this.hex_hmac = function(k, d) {
75470           return rstr2hex(rstr_hmac(k, d));
75471         };
75472         this.b64_hmac = function(k, d) {
75473           return rstr2b64(rstr_hmac(k, d), b64pad);
75474         };
75475         this.any_hmac = function(k, d, e) {
75476           return rstr2any(rstr_hmac(k, d), e);
75477         };
75478         /**
75479          * Perform a simple self-test to see if the VM is working
75480          * @return {String} Hexadecimal hash sample
75481          * @public
75482          */
75483         this.vm_test = function() {
75484           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
75485         };
75486         /**
75487          * @description Enable/disable uppercase hexadecimal returned string
75488          * @param {boolean}
75489          * @return {Object} this
75490          * @public
75491          */
75492         this.setUpperCase = function(a) {
75493           if (typeof a === 'boolean') {
75494             hexcase = a;
75495           }
75496           return this;
75497         };
75498         /**
75499          * @description Defines a base64 pad string
75500          * @param {string} Pad
75501          * @return {Object} this
75502          * @public
75503          */
75504         this.setPad = function(a) {
75505           if (typeof a !== 'undefined') {
75506             b64pad = a;
75507           }
75508           return this;
75509         };
75510         /**
75511          * @description Defines a base64 pad string
75512          * @param {boolean}
75513          * @return {Object} this
75514          * @public
75515          */
75516         this.setUTF8 = function(a) {
75517           if (typeof a === 'boolean') {
75518             utf8 = a;
75519           }
75520           return this;
75521         };
75522
75523         /* private methods */
75524
75525         /**
75526          * Calculate the rmd160 of a raw string
75527          */
75528
75529         function rstr(s) {
75530           s = (utf8) ? utf8Encode(s) : s;
75531           return binl2rstr(binl(rstr2binl(s), s.length * 8));
75532         }
75533
75534         /**
75535          * Calculate the HMAC-rmd160 of a key and some data (raw strings)
75536          */
75537
75538         function rstr_hmac(key, data) {
75539           key = (utf8) ? utf8Encode(key) : key;
75540           data = (utf8) ? utf8Encode(data) : data;
75541           var i, hash,
75542             bkey = rstr2binl(key),
75543             ipad = Array(16),
75544             opad = Array(16);
75545
75546           if (bkey.length > 16) {
75547             bkey = binl(bkey, key.length * 8);
75548           }
75549
75550           for (i = 0; i < 16; i += 1) {
75551             ipad[i] = bkey[i] ^ 0x36363636;
75552             opad[i] = bkey[i] ^ 0x5C5C5C5C;
75553           }
75554           hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
75555           return binl2rstr(binl(opad.concat(hash), 512 + 160));
75556         }
75557
75558         /**
75559          * Convert an array of little-endian words to a string
75560          */
75561
75562         function binl2rstr(input) {
75563           var i, output = '',
75564             l = input.length * 32;
75565           for (i = 0; i < l; i += 8) {
75566             output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
75567           }
75568           return output;
75569         }
75570
75571         /**
75572          * Calculate the RIPE-MD160 of an array of little-endian words, and a bit length.
75573          */
75574
75575         function binl(x, len) {
75576           var T, j, i, l,
75577             h0 = 0x67452301,
75578             h1 = 0xefcdab89,
75579             h2 = 0x98badcfe,
75580             h3 = 0x10325476,
75581             h4 = 0xc3d2e1f0,
75582             A1, B1, C1, D1, E1,
75583             A2, B2, C2, D2, E2;
75584
75585           /* append padding */
75586           x[len >> 5] |= 0x80 << (len % 32);
75587           x[(((len + 64) >>> 9) << 4) + 14] = len;
75588           l = x.length;
75589
75590           for (i = 0; i < l; i += 16) {
75591             A1 = A2 = h0;
75592             B1 = B2 = h1;
75593             C1 = C2 = h2;
75594             D1 = D2 = h3;
75595             E1 = E2 = h4;
75596             for (j = 0; j <= 79; j += 1) {
75597               T = safe_add(A1, rmd160_f(j, B1, C1, D1));
75598               T = safe_add(T, x[i + rmd160_r1[j]]);
75599               T = safe_add(T, rmd160_K1(j));
75600               T = safe_add(bit_rol(T, rmd160_s1[j]), E1);
75601               A1 = E1;
75602               E1 = D1;
75603               D1 = bit_rol(C1, 10);
75604               C1 = B1;
75605               B1 = T;
75606               T = safe_add(A2, rmd160_f(79 - j, B2, C2, D2));
75607               T = safe_add(T, x[i + rmd160_r2[j]]);
75608               T = safe_add(T, rmd160_K2(j));
75609               T = safe_add(bit_rol(T, rmd160_s2[j]), E2);
75610               A2 = E2;
75611               E2 = D2;
75612               D2 = bit_rol(C2, 10);
75613               C2 = B2;
75614               B2 = T;
75615             }
75616
75617             T = safe_add(h1, safe_add(C1, D2));
75618             h1 = safe_add(h2, safe_add(D1, E2));
75619             h2 = safe_add(h3, safe_add(E1, A2));
75620             h3 = safe_add(h4, safe_add(A1, B2));
75621             h4 = safe_add(h0, safe_add(B1, C2));
75622             h0 = T;
75623           }
75624           return [h0, h1, h2, h3, h4];
75625         }
75626
75627         // specific algorithm methods
75628
75629         function rmd160_f(j, x, y, z) {
75630           return (0 <= j && j <= 15) ? (x ^ y ^ z) :
75631             (16 <= j && j <= 31) ? (x & y) | (~x & z) :
75632             (32 <= j && j <= 47) ? (x | ~y) ^ z :
75633             (48 <= j && j <= 63) ? (x & z) | (y & ~z) :
75634             (64 <= j && j <= 79) ? x ^ (y | ~z) :
75635             'rmd160_f: j out of range';
75636         }
75637
75638         function rmd160_K1(j) {
75639           return (0 <= j && j <= 15) ? 0x00000000 :
75640             (16 <= j && j <= 31) ? 0x5a827999 :
75641             (32 <= j && j <= 47) ? 0x6ed9eba1 :
75642             (48 <= j && j <= 63) ? 0x8f1bbcdc :
75643             (64 <= j && j <= 79) ? 0xa953fd4e :
75644             'rmd160_K1: j out of range';
75645         }
75646
75647         function rmd160_K2(j) {
75648           return (0 <= j && j <= 15) ? 0x50a28be6 :
75649             (16 <= j && j <= 31) ? 0x5c4dd124 :
75650             (32 <= j && j <= 47) ? 0x6d703ef3 :
75651             (48 <= j && j <= 63) ? 0x7a6d76e9 :
75652             (64 <= j && j <= 79) ? 0x00000000 :
75653             'rmd160_K2: j out of range';
75654         }
75655       }
75656     };
75657
75658     // exposes Hashes
75659     (function(window, undefined) {
75660       var freeExports = false;
75661       {
75662         freeExports = exports;
75663         if (exports && typeof commonjsGlobal === 'object' && commonjsGlobal && commonjsGlobal === commonjsGlobal.global) {
75664           window = commonjsGlobal;
75665         }
75666       }
75667
75668       if (typeof undefined === 'function' && typeof undefined.amd === 'object' && undefined.amd) {
75669         // define as an anonymous module, so, through path mapping, it can be aliased
75670         undefined(function() {
75671           return Hashes;
75672         });
75673       } else if (freeExports) {
75674         // in Node.js or RingoJS v0.8.0+
75675         if (module && module.exports === freeExports) {
75676           module.exports = Hashes;
75677         }
75678         // in Narwhal or RingoJS v0.7.0-
75679         else {
75680           freeExports.Hashes = Hashes;
75681         }
75682       } else {
75683         // in a browser or Rhino
75684         window.Hashes = Hashes;
75685       }
75686     }(this));
75687   }()); // IIFE
75688   });
75689
75690   var immutable = extend$2;
75691
75692   var hasOwnProperty$g = Object.prototype.hasOwnProperty;
75693
75694   function extend$2() {
75695       var target = {};
75696
75697       for (var i = 0; i < arguments.length; i++) {
75698           var source = arguments[i];
75699
75700           for (var key in source) {
75701               if (hasOwnProperty$g.call(source, key)) {
75702                   target[key] = source[key];
75703               }
75704           }
75705       }
75706
75707       return target
75708   }
75709
75710   var sha1 = new hashes.SHA1();
75711
75712   var ohauth = {};
75713
75714   ohauth.qsString = function(obj) {
75715       return Object.keys(obj).sort().map(function(key) {
75716           return ohauth.percentEncode(key) + '=' +
75717               ohauth.percentEncode(obj[key]);
75718       }).join('&');
75719   };
75720
75721   ohauth.stringQs = function(str) {
75722       return str.split('&').filter(function (pair) {
75723           return pair !== '';
75724       }).reduce(function(obj, pair){
75725           var parts = pair.split('=');
75726           obj[decodeURIComponent(parts[0])] = (null === parts[1]) ?
75727               '' : decodeURIComponent(parts[1]);
75728           return obj;
75729       }, {});
75730   };
75731
75732   ohauth.rawxhr = function(method, url, data, headers, callback) {
75733       var xhr = new XMLHttpRequest(),
75734           twoHundred = /^20\d$/;
75735       xhr.onreadystatechange = function() {
75736           if (4 === xhr.readyState && 0 !== xhr.status) {
75737               if (twoHundred.test(xhr.status)) callback(null, xhr);
75738               else return callback(xhr, null);
75739           }
75740       };
75741       xhr.onerror = function(e) { return callback(e, null); };
75742       xhr.open(method, url, true);
75743       for (var h in headers) xhr.setRequestHeader(h, headers[h]);
75744       xhr.send(data);
75745       return xhr;
75746   };
75747
75748   ohauth.xhr = function(method, url, auth, data, options, callback) {
75749       var headers = (options && options.header) || {
75750           'Content-Type': 'application/x-www-form-urlencoded'
75751       };
75752       headers.Authorization = 'OAuth ' + ohauth.authHeader(auth);
75753       return ohauth.rawxhr(method, url, data, headers, callback);
75754   };
75755
75756   ohauth.nonce = function() {
75757       for (var o = ''; o.length < 6;) {
75758           o += '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'[Math.floor(Math.random() * 61)];
75759       }
75760       return o;
75761   };
75762
75763   ohauth.authHeader = function(obj) {
75764       return Object.keys(obj).sort().map(function(key) {
75765           return encodeURIComponent(key) + '="' + encodeURIComponent(obj[key]) + '"';
75766       }).join(', ');
75767   };
75768
75769   ohauth.timestamp = function() { return ~~((+new Date()) / 1000); };
75770
75771   ohauth.percentEncode = function(s) {
75772       return encodeURIComponent(s)
75773           .replace(/\!/g, '%21').replace(/\'/g, '%27')
75774           .replace(/\*/g, '%2A').replace(/\(/g, '%28').replace(/\)/g, '%29');
75775   };
75776
75777   ohauth.baseString = function(method, url, params) {
75778       if (params.oauth_signature) delete params.oauth_signature;
75779       return [
75780           method,
75781           ohauth.percentEncode(url),
75782           ohauth.percentEncode(ohauth.qsString(params))].join('&');
75783   };
75784
75785   ohauth.signature = function(oauth_secret, token_secret, baseString) {
75786       return sha1.b64_hmac(
75787           ohauth.percentEncode(oauth_secret) + '&' +
75788           ohauth.percentEncode(token_secret),
75789           baseString);
75790   };
75791
75792   /**
75793    * Takes an options object for configuration (consumer_key,
75794    * consumer_secret, version, signature_method, token, token_secret)
75795    * and returns a function that generates the Authorization header
75796    * for given data.
75797    *
75798    * The returned function takes these parameters:
75799    * - method: GET/POST/...
75800    * - uri: full URI with protocol, port, path and query string
75801    * - extra_params: any extra parameters (that are passed in the POST data),
75802    *   can be an object or a from-urlencoded string.
75803    *
75804    * Returned function returns full OAuth header with "OAuth" string in it.
75805    */
75806
75807   ohauth.headerGenerator = function(options) {
75808       options = options || {};
75809       var consumer_key = options.consumer_key || '',
75810           consumer_secret = options.consumer_secret || '',
75811           signature_method = options.signature_method || 'HMAC-SHA1',
75812           version = options.version || '1.0',
75813           token = options.token || '',
75814           token_secret = options.token_secret || '';
75815
75816       return function(method, uri, extra_params) {
75817           method = method.toUpperCase();
75818           if (typeof extra_params === 'string' && extra_params.length > 0) {
75819               extra_params = ohauth.stringQs(extra_params);
75820           }
75821
75822           var uri_parts = uri.split('?', 2),
75823           base_uri = uri_parts[0];
75824
75825           var query_params = uri_parts.length === 2 ?
75826               ohauth.stringQs(uri_parts[1]) : {};
75827
75828           var oauth_params = {
75829               oauth_consumer_key: consumer_key,
75830               oauth_signature_method: signature_method,
75831               oauth_version: version,
75832               oauth_timestamp: ohauth.timestamp(),
75833               oauth_nonce: ohauth.nonce()
75834           };
75835
75836           if (token) oauth_params.oauth_token = token;
75837
75838           var all_params = immutable({}, oauth_params, query_params, extra_params),
75839               base_str = ohauth.baseString(method, base_uri, all_params);
75840
75841           oauth_params.oauth_signature = ohauth.signature(consumer_secret, token_secret, base_str);
75842
75843           return 'OAuth ' + ohauth.authHeader(oauth_params);
75844       };
75845   };
75846
75847   var ohauth_1 = ohauth;
75848
75849   var resolveUrl = createCommonjsModule(function (module, exports) {
75850   // Copyright 2014 Simon Lydell
75851   // X11 (“MIT”) Licensed. (See LICENSE.)
75852
75853   void (function(root, factory) {
75854     {
75855       module.exports = factory();
75856     }
75857   }(commonjsGlobal, function() {
75858
75859     function resolveUrl(/* ...urls */) {
75860       var numUrls = arguments.length;
75861
75862       if (numUrls === 0) {
75863         throw new Error("resolveUrl requires at least one argument; got none.")
75864       }
75865
75866       var base = document.createElement("base");
75867       base.href = arguments[0];
75868
75869       if (numUrls === 1) {
75870         return base.href
75871       }
75872
75873       var head = document.getElementsByTagName("head")[0];
75874       head.insertBefore(base, head.firstChild);
75875
75876       var a = document.createElement("a");
75877       var resolved;
75878
75879       for (var index = 1; index < numUrls; index++) {
75880         a.href = arguments[index];
75881         resolved = a.href;
75882         base.href = resolved;
75883       }
75884
75885       head.removeChild(base);
75886
75887       return resolved
75888     }
75889
75890     return resolveUrl
75891
75892   }));
75893   });
75894
75895   var assign$1 = make_assign();
75896   var create$2 = make_create();
75897   var trim = make_trim();
75898   var Global = (typeof window !== 'undefined' ? window : commonjsGlobal);
75899
75900   var util = {
75901         assign: assign$1,
75902         create: create$2,
75903         trim: trim,
75904         bind: bind,
75905         slice: slice$7,
75906         each: each,
75907         map: map$4,
75908         pluck: pluck,
75909         isList: isList,
75910         isFunction: isFunction$1,
75911         isObject: isObject$1,
75912         Global: Global
75913   };
75914
75915   function make_assign() {
75916         if (Object.assign) {
75917                 return Object.assign
75918         } else {
75919                 return function shimAssign(obj, props1, props2, etc) {
75920                         for (var i = 1; i < arguments.length; i++) {
75921                                 each(Object(arguments[i]), function(val, key) {
75922                                         obj[key] = val;
75923                                 });
75924                         }                       
75925                         return obj
75926                 }
75927         }
75928   }
75929
75930   function make_create() {
75931         if (Object.create) {
75932                 return function create(obj, assignProps1, assignProps2, etc) {
75933                         var assignArgsList = slice$7(arguments, 1);
75934                         return assign$1.apply(this, [Object.create(obj)].concat(assignArgsList))
75935                 }
75936         } else {
75937                 function F() {} // eslint-disable-line no-inner-declarations
75938                 return function create(obj, assignProps1, assignProps2, etc) {
75939                         var assignArgsList = slice$7(arguments, 1);
75940                         F.prototype = obj;
75941                         return assign$1.apply(this, [new F()].concat(assignArgsList))
75942                 }
75943         }
75944   }
75945
75946   function make_trim() {
75947         if (String.prototype.trim) {
75948                 return function trim(str) {
75949                         return String.prototype.trim.call(str)
75950                 }
75951         } else {
75952                 return function trim(str) {
75953                         return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '')
75954                 }
75955         }
75956   }
75957
75958   function bind(obj, fn) {
75959         return function() {
75960                 return fn.apply(obj, Array.prototype.slice.call(arguments, 0))
75961         }
75962   }
75963
75964   function slice$7(arr, index) {
75965         return Array.prototype.slice.call(arr, index || 0)
75966   }
75967
75968   function each(obj, fn) {
75969         pluck(obj, function(val, key) {
75970                 fn(val, key);
75971                 return false
75972         });
75973   }
75974
75975   function map$4(obj, fn) {
75976         var res = (isList(obj) ? [] : {});
75977         pluck(obj, function(v, k) {
75978                 res[k] = fn(v, k);
75979                 return false
75980         });
75981         return res
75982   }
75983
75984   function pluck(obj, fn) {
75985         if (isList(obj)) {
75986                 for (var i=0; i<obj.length; i++) {
75987                         if (fn(obj[i], i)) {
75988                                 return obj[i]
75989                         }
75990                 }
75991         } else {
75992                 for (var key in obj) {
75993                         if (obj.hasOwnProperty(key)) {
75994                                 if (fn(obj[key], key)) {
75995                                         return obj[key]
75996                                 }
75997                         }
75998                 }
75999         }
76000   }
76001
76002   function isList(val) {
76003         return (val != null && typeof val != 'function' && typeof val.length == 'number')
76004   }
76005
76006   function isFunction$1(val) {
76007         return val && {}.toString.call(val) === '[object Function]'
76008   }
76009
76010   function isObject$1(val) {
76011         return val && {}.toString.call(val) === '[object Object]'
76012   }
76013
76014   var slice$8 = util.slice;
76015   var pluck$1 = util.pluck;
76016   var each$1 = util.each;
76017   var bind$1 = util.bind;
76018   var create$3 = util.create;
76019   var isList$1 = util.isList;
76020   var isFunction$2 = util.isFunction;
76021   var isObject$2 = util.isObject;
76022
76023   var storeEngine = {
76024         createStore: createStore
76025   };
76026
76027   var storeAPI = {
76028         version: '2.0.12',
76029         enabled: false,
76030         
76031         // get returns the value of the given key. If that value
76032         // is undefined, it returns optionalDefaultValue instead.
76033         get: function(key, optionalDefaultValue) {
76034                 var data = this.storage.read(this._namespacePrefix + key);
76035                 return this._deserialize(data, optionalDefaultValue)
76036         },
76037
76038         // set will store the given value at key and returns value.
76039         // Calling set with value === undefined is equivalent to calling remove.
76040         set: function(key, value) {
76041                 if (value === undefined) {
76042                         return this.remove(key)
76043                 }
76044                 this.storage.write(this._namespacePrefix + key, this._serialize(value));
76045                 return value
76046         },
76047
76048         // remove deletes the key and value stored at the given key.
76049         remove: function(key) {
76050                 this.storage.remove(this._namespacePrefix + key);
76051         },
76052
76053         // each will call the given callback once for each key-value pair
76054         // in this store.
76055         each: function(callback) {
76056                 var self = this;
76057                 this.storage.each(function(val, namespacedKey) {
76058                         callback.call(self, self._deserialize(val), (namespacedKey || '').replace(self._namespaceRegexp, ''));
76059                 });
76060         },
76061
76062         // clearAll will remove all the stored key-value pairs in this store.
76063         clearAll: function() {
76064                 this.storage.clearAll();
76065         },
76066
76067         // additional functionality that can't live in plugins
76068         // ---------------------------------------------------
76069
76070         // hasNamespace returns true if this store instance has the given namespace.
76071         hasNamespace: function(namespace) {
76072                 return (this._namespacePrefix == '__storejs_'+namespace+'_')
76073         },
76074
76075         // createStore creates a store.js instance with the first
76076         // functioning storage in the list of storage candidates,
76077         // and applies the the given mixins to the instance.
76078         createStore: function() {
76079                 return createStore.apply(this, arguments)
76080         },
76081         
76082         addPlugin: function(plugin) {
76083                 this._addPlugin(plugin);
76084         },
76085         
76086         namespace: function(namespace) {
76087                 return createStore(this.storage, this.plugins, namespace)
76088         }
76089   };
76090
76091   function _warn() {
76092         var _console = (typeof console == 'undefined' ? null : console);
76093         if (!_console) { return }
76094         var fn = (_console.warn ? _console.warn : _console.log);
76095         fn.apply(_console, arguments);
76096   }
76097
76098   function createStore(storages, plugins, namespace) {
76099         if (!namespace) {
76100                 namespace = '';
76101         }
76102         if (storages && !isList$1(storages)) {
76103                 storages = [storages];
76104         }
76105         if (plugins && !isList$1(plugins)) {
76106                 plugins = [plugins];
76107         }
76108
76109         var namespacePrefix = (namespace ? '__storejs_'+namespace+'_' : '');
76110         var namespaceRegexp = (namespace ? new RegExp('^'+namespacePrefix) : null);
76111         var legalNamespaces = /^[a-zA-Z0-9_\-]*$/; // alpha-numeric + underscore and dash
76112         if (!legalNamespaces.test(namespace)) {
76113                 throw new Error('store.js namespaces can only have alphanumerics + underscores and dashes')
76114         }
76115         
76116         var _privateStoreProps = {
76117                 _namespacePrefix: namespacePrefix,
76118                 _namespaceRegexp: namespaceRegexp,
76119
76120                 _testStorage: function(storage) {
76121                         try {
76122                                 var testStr = '__storejs__test__';
76123                                 storage.write(testStr, testStr);
76124                                 var ok = (storage.read(testStr) === testStr);
76125                                 storage.remove(testStr);
76126                                 return ok
76127                         } catch(e) {
76128                                 return false
76129                         }
76130                 },
76131
76132                 _assignPluginFnProp: function(pluginFnProp, propName) {
76133                         var oldFn = this[propName];
76134                         this[propName] = function pluginFn() {
76135                                 var args = slice$8(arguments, 0);
76136                                 var self = this;
76137
76138                                 // super_fn calls the old function which was overwritten by
76139                                 // this mixin.
76140                                 function super_fn() {
76141                                         if (!oldFn) { return }
76142                                         each$1(arguments, function(arg, i) {
76143                                                 args[i] = arg;
76144                                         });
76145                                         return oldFn.apply(self, args)
76146                                 }
76147
76148                                 // Give mixing function access to super_fn by prefixing all mixin function
76149                                 // arguments with super_fn.
76150                                 var newFnArgs = [super_fn].concat(args);
76151
76152                                 return pluginFnProp.apply(self, newFnArgs)
76153                         };
76154                 },
76155
76156                 _serialize: function(obj) {
76157                         return JSON.stringify(obj)
76158                 },
76159
76160                 _deserialize: function(strVal, defaultVal) {
76161                         if (!strVal) { return defaultVal }
76162                         // It is possible that a raw string value has been previously stored
76163                         // in a storage without using store.js, meaning it will be a raw
76164                         // string value instead of a JSON serialized string. By defaulting
76165                         // to the raw string value in case of a JSON parse error, we allow
76166                         // for past stored values to be forwards-compatible with store.js
76167                         var val = '';
76168                         try { val = JSON.parse(strVal); }
76169                         catch(e) { val = strVal; }
76170
76171                         return (val !== undefined ? val : defaultVal)
76172                 },
76173                 
76174                 _addStorage: function(storage) {
76175                         if (this.enabled) { return }
76176                         if (this._testStorage(storage)) {
76177                                 this.storage = storage;
76178                                 this.enabled = true;
76179                         }
76180                 },
76181
76182                 _addPlugin: function(plugin) {
76183                         var self = this;
76184
76185                         // If the plugin is an array, then add all plugins in the array.
76186                         // This allows for a plugin to depend on other plugins.
76187                         if (isList$1(plugin)) {
76188                                 each$1(plugin, function(plugin) {
76189                                         self._addPlugin(plugin);
76190                                 });
76191                                 return
76192                         }
76193
76194                         // Keep track of all plugins we've seen so far, so that we
76195                         // don't add any of them twice.
76196                         var seenPlugin = pluck$1(this.plugins, function(seenPlugin) {
76197                                 return (plugin === seenPlugin)
76198                         });
76199                         if (seenPlugin) {
76200                                 return
76201                         }
76202                         this.plugins.push(plugin);
76203
76204                         // Check that the plugin is properly formed
76205                         if (!isFunction$2(plugin)) {
76206                                 throw new Error('Plugins must be function values that return objects')
76207                         }
76208
76209                         var pluginProperties = plugin.call(this);
76210                         if (!isObject$2(pluginProperties)) {
76211                                 throw new Error('Plugins must return an object of function properties')
76212                         }
76213
76214                         // Add the plugin function properties to this store instance.
76215                         each$1(pluginProperties, function(pluginFnProp, propName) {
76216                                 if (!isFunction$2(pluginFnProp)) {
76217                                         throw new Error('Bad plugin property: '+propName+' from plugin '+plugin.name+'. Plugins should only return functions.')
76218                                 }
76219                                 self._assignPluginFnProp(pluginFnProp, propName);
76220                         });
76221                 },
76222                 
76223                 // Put deprecated properties in the private API, so as to not expose it to accidential
76224                 // discovery through inspection of the store object.
76225                 
76226                 // Deprecated: addStorage
76227                 addStorage: function(storage) {
76228                         _warn('store.addStorage(storage) is deprecated. Use createStore([storages])');
76229                         this._addStorage(storage);
76230                 }
76231         };
76232
76233         var store = create$3(_privateStoreProps, storeAPI, {
76234                 plugins: []
76235         });
76236         store.raw = {};
76237         each$1(store, function(prop, propName) {
76238                 if (isFunction$2(prop)) {
76239                         store.raw[propName] = bind$1(store, prop);                      
76240                 }
76241         });
76242         each$1(storages, function(storage) {
76243                 store._addStorage(storage);
76244         });
76245         each$1(plugins, function(plugin) {
76246                 store._addPlugin(plugin);
76247         });
76248         return store
76249   }
76250
76251   var Global$1 = util.Global;
76252
76253   var localStorage_1 = {
76254         name: 'localStorage',
76255         read: read,
76256         write: write,
76257         each: each$2,
76258         remove: remove$3,
76259         clearAll: clearAll,
76260   };
76261
76262   function localStorage$1() {
76263         return Global$1.localStorage
76264   }
76265
76266   function read(key) {
76267         return localStorage$1().getItem(key)
76268   }
76269
76270   function write(key, data) {
76271         return localStorage$1().setItem(key, data)
76272   }
76273
76274   function each$2(fn) {
76275         for (var i = localStorage$1().length - 1; i >= 0; i--) {
76276                 var key = localStorage$1().key(i);
76277                 fn(read(key), key);
76278         }
76279   }
76280
76281   function remove$3(key) {
76282         return localStorage$1().removeItem(key)
76283   }
76284
76285   function clearAll() {
76286         return localStorage$1().clear()
76287   }
76288
76289   // oldFF-globalStorage provides storage for Firefox
76290   // versions 6 and 7, where no localStorage, etc
76291   // is available.
76292
76293
76294   var Global$2 = util.Global;
76295
76296   var oldFFGlobalStorage = {
76297         name: 'oldFF-globalStorage',
76298         read: read$1,
76299         write: write$1,
76300         each: each$3,
76301         remove: remove$4,
76302         clearAll: clearAll$1,
76303   };
76304
76305   var globalStorage = Global$2.globalStorage;
76306
76307   function read$1(key) {
76308         return globalStorage[key]
76309   }
76310
76311   function write$1(key, data) {
76312         globalStorage[key] = data;
76313   }
76314
76315   function each$3(fn) {
76316         for (var i = globalStorage.length - 1; i >= 0; i--) {
76317                 var key = globalStorage.key(i);
76318                 fn(globalStorage[key], key);
76319         }
76320   }
76321
76322   function remove$4(key) {
76323         return globalStorage.removeItem(key)
76324   }
76325
76326   function clearAll$1() {
76327         each$3(function(key, _) {
76328                 delete globalStorage[key];
76329         });
76330   }
76331
76332   // oldIE-userDataStorage provides storage for Internet Explorer
76333   // versions 6 and 7, where no localStorage, sessionStorage, etc
76334   // is available.
76335
76336
76337   var Global$3 = util.Global;
76338
76339   var oldIEUserDataStorage = {
76340         name: 'oldIE-userDataStorage',
76341         write: write$2,
76342         read: read$2,
76343         each: each$4,
76344         remove: remove$5,
76345         clearAll: clearAll$2,
76346   };
76347
76348   var storageName = 'storejs';
76349   var doc = Global$3.document;
76350   var _withStorageEl = _makeIEStorageElFunction();
76351   var disable = (Global$3.navigator ? Global$3.navigator.userAgent : '').match(/ (MSIE 8|MSIE 9|MSIE 10)\./); // MSIE 9.x, MSIE 10.x
76352
76353   function write$2(unfixedKey, data) {
76354         if (disable) { return }
76355         var fixedKey = fixKey(unfixedKey);
76356         _withStorageEl(function(storageEl) {
76357                 storageEl.setAttribute(fixedKey, data);
76358                 storageEl.save(storageName);
76359         });
76360   }
76361
76362   function read$2(unfixedKey) {
76363         if (disable) { return }
76364         var fixedKey = fixKey(unfixedKey);
76365         var res = null;
76366         _withStorageEl(function(storageEl) {
76367                 res = storageEl.getAttribute(fixedKey);
76368         });
76369         return res
76370   }
76371
76372   function each$4(callback) {
76373         _withStorageEl(function(storageEl) {
76374                 var attributes = storageEl.XMLDocument.documentElement.attributes;
76375                 for (var i=attributes.length-1; i>=0; i--) {
76376                         var attr = attributes[i];
76377                         callback(storageEl.getAttribute(attr.name), attr.name);
76378                 }
76379         });
76380   }
76381
76382   function remove$5(unfixedKey) {
76383         var fixedKey = fixKey(unfixedKey);
76384         _withStorageEl(function(storageEl) {
76385                 storageEl.removeAttribute(fixedKey);
76386                 storageEl.save(storageName);
76387         });
76388   }
76389
76390   function clearAll$2() {
76391         _withStorageEl(function(storageEl) {
76392                 var attributes = storageEl.XMLDocument.documentElement.attributes;
76393                 storageEl.load(storageName);
76394                 for (var i=attributes.length-1; i>=0; i--) {
76395                         storageEl.removeAttribute(attributes[i].name);
76396                 }
76397                 storageEl.save(storageName);
76398         });
76399   }
76400
76401   // Helpers
76402   //////////
76403
76404   // In IE7, keys cannot start with a digit or contain certain chars.
76405   // See https://github.com/marcuswestin/store.js/issues/40
76406   // See https://github.com/marcuswestin/store.js/issues/83
76407   var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g");
76408   function fixKey(key) {
76409         return key.replace(/^\d/, '___$&').replace(forbiddenCharsRegex, '___')
76410   }
76411
76412   function _makeIEStorageElFunction() {
76413         if (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {
76414                 return null
76415         }
76416         var scriptTag = 'script',
76417                 storageOwner,
76418                 storageContainer,
76419                 storageEl;
76420
76421         // Since #userData storage applies only to specific paths, we need to
76422         // somehow link our data to a specific path.  We choose /favicon.ico
76423         // as a pretty safe option, since all browsers already make a request to
76424         // this URL anyway and being a 404 will not hurt us here.  We wrap an
76425         // iframe pointing to the favicon in an ActiveXObject(htmlfile) object
76426         // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)
76427         // since the iframe access rules appear to allow direct access and
76428         // manipulation of the document element, even for a 404 page.  This
76429         // document can be used instead of the current document (which would
76430         // have been limited to the current path) to perform #userData storage.
76431         try {
76432                 /* global ActiveXObject */
76433                 storageContainer = new ActiveXObject('htmlfile');
76434                 storageContainer.open();
76435                 storageContainer.write('<'+scriptTag+'>document.w=window</'+scriptTag+'><iframe src="/favicon.ico"></iframe>');
76436                 storageContainer.close();
76437                 storageOwner = storageContainer.w.frames[0].document;
76438                 storageEl = storageOwner.createElement('div');
76439         } catch(e) {
76440                 // somehow ActiveXObject instantiation failed (perhaps some special
76441                 // security settings or otherwse), fall back to per-path storage
76442                 storageEl = doc.createElement('div');
76443                 storageOwner = doc.body;
76444         }
76445
76446         return function(storeFunction) {
76447                 var args = [].slice.call(arguments, 0);
76448                 args.unshift(storageEl);
76449                 // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx
76450                 // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx
76451                 storageOwner.appendChild(storageEl);
76452                 storageEl.addBehavior('#default#userData');
76453                 storageEl.load(storageName);
76454                 storeFunction.apply(this, args);
76455                 storageOwner.removeChild(storageEl);
76456                 return
76457         }
76458   }
76459
76460   // cookieStorage is useful Safari private browser mode, where localStorage
76461   // doesn't work but cookies do. This implementation is adopted from
76462   // https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage
76463
76464
76465   var Global$4 = util.Global;
76466   var trim$1 = util.trim;
76467
76468   var cookieStorage = {
76469         name: 'cookieStorage',
76470         read: read$3,
76471         write: write$3,
76472         each: each$5,
76473         remove: remove$6,
76474         clearAll: clearAll$3,
76475   };
76476
76477   var doc$1 = Global$4.document;
76478
76479   function read$3(key) {
76480         if (!key || !_has(key)) { return null }
76481         var regexpStr = "(?:^|.*;\\s*)" +
76482                 escape(key).replace(/[\-\.\+\*]/g, "\\$&") +
76483                 "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*";
76484         return unescape(doc$1.cookie.replace(new RegExp(regexpStr), "$1"))
76485   }
76486
76487   function each$5(callback) {
76488         var cookies = doc$1.cookie.split(/; ?/g);
76489         for (var i = cookies.length - 1; i >= 0; i--) {
76490                 if (!trim$1(cookies[i])) {
76491                         continue
76492                 }
76493                 var kvp = cookies[i].split('=');
76494                 var key = unescape(kvp[0]);
76495                 var val = unescape(kvp[1]);
76496                 callback(val, key);
76497         }
76498   }
76499
76500   function write$3(key, data) {
76501         if(!key) { return }
76502         doc$1.cookie = escape(key) + "=" + escape(data) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
76503   }
76504
76505   function remove$6(key) {
76506         if (!key || !_has(key)) {
76507                 return
76508         }
76509         doc$1.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
76510   }
76511
76512   function clearAll$3() {
76513         each$5(function(_, key) {
76514                 remove$6(key);
76515         });
76516   }
76517
76518   function _has(key) {
76519         return (new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(doc$1.cookie)
76520   }
76521
76522   var Global$5 = util.Global;
76523
76524   var sessionStorage_1 = {
76525         name: 'sessionStorage',
76526         read: read$4,
76527         write: write$4,
76528         each: each$6,
76529         remove: remove$7,
76530         clearAll: clearAll$4
76531   };
76532
76533   function sessionStorage() {
76534         return Global$5.sessionStorage
76535   }
76536
76537   function read$4(key) {
76538         return sessionStorage().getItem(key)
76539   }
76540
76541   function write$4(key, data) {
76542         return sessionStorage().setItem(key, data)
76543   }
76544
76545   function each$6(fn) {
76546         for (var i = sessionStorage().length - 1; i >= 0; i--) {
76547                 var key = sessionStorage().key(i);
76548                 fn(read$4(key), key);
76549         }
76550   }
76551
76552   function remove$7(key) {
76553         return sessionStorage().removeItem(key)
76554   }
76555
76556   function clearAll$4() {
76557         return sessionStorage().clear()
76558   }
76559
76560   // memoryStorage is a useful last fallback to ensure that the store
76561   // is functions (meaning store.get(), store.set(), etc will all function).
76562   // However, stored values will not persist when the browser navigates to
76563   // a new page or reloads the current page.
76564
76565   var memoryStorage_1 = {
76566         name: 'memoryStorage',
76567         read: read$5,
76568         write: write$5,
76569         each: each$7,
76570         remove: remove$8,
76571         clearAll: clearAll$5,
76572   };
76573
76574   var memoryStorage = {};
76575
76576   function read$5(key) {
76577         return memoryStorage[key]
76578   }
76579
76580   function write$5(key, data) {
76581         memoryStorage[key] = data;
76582   }
76583
76584   function each$7(callback) {
76585         for (var key in memoryStorage) {
76586                 if (memoryStorage.hasOwnProperty(key)) {
76587                         callback(memoryStorage[key], key);
76588                 }
76589         }
76590   }
76591
76592   function remove$8(key) {
76593         delete memoryStorage[key];
76594   }
76595
76596   function clearAll$5(key) {
76597         memoryStorage = {};
76598   }
76599
76600   var all = [
76601         // Listed in order of usage preference
76602         localStorage_1,
76603         oldFFGlobalStorage,
76604         oldIEUserDataStorage,
76605         cookieStorage,
76606         sessionStorage_1,
76607         memoryStorage_1
76608   ];
76609
76610   /* eslint-disable */
76611
76612   //  json2.js
76613   //  2016-10-28
76614   //  Public Domain.
76615   //  NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
76616   //  See http://www.JSON.org/js.html
76617   //  This code should be minified before deployment.
76618   //  See http://javascript.crockford.com/jsmin.html
76619
76620   //  USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
76621   //  NOT CONTROL.
76622
76623   //  This file creates a global JSON object containing two methods: stringify
76624   //  and parse. This file provides the ES5 JSON capability to ES3 systems.
76625   //  If a project might run on IE8 or earlier, then this file should be included.
76626   //  This file does nothing on ES5 systems.
76627
76628   //      JSON.stringify(value, replacer, space)
76629   //          value       any JavaScript value, usually an object or array.
76630   //          replacer    an optional parameter that determines how object
76631   //                      values are stringified for objects. It can be a
76632   //                      function or an array of strings.
76633   //          space       an optional parameter that specifies the indentation
76634   //                      of nested structures. If it is omitted, the text will
76635   //                      be packed without extra whitespace. If it is a number,
76636   //                      it will specify the number of spaces to indent at each
76637   //                      level. If it is a string (such as "\t" or "&nbsp;"),
76638   //                      it contains the characters used to indent at each level.
76639   //          This method produces a JSON text from a JavaScript value.
76640   //          When an object value is found, if the object contains a toJSON
76641   //          method, its toJSON method will be called and the result will be
76642   //          stringified. A toJSON method does not serialize: it returns the
76643   //          value represented by the name/value pair that should be serialized,
76644   //          or undefined if nothing should be serialized. The toJSON method
76645   //          will be passed the key associated with the value, and this will be
76646   //          bound to the value.
76647
76648   //          For example, this would serialize Dates as ISO strings.
76649
76650   //              Date.prototype.toJSON = function (key) {
76651   //                  function f(n) {
76652   //                      // Format integers to have at least two digits.
76653   //                      return (n < 10)
76654   //                          ? "0" + n
76655   //                          : n;
76656   //                  }
76657   //                  return this.getUTCFullYear()   + "-" +
76658   //                       f(this.getUTCMonth() + 1) + "-" +
76659   //                       f(this.getUTCDate())      + "T" +
76660   //                       f(this.getUTCHours())     + ":" +
76661   //                       f(this.getUTCMinutes())   + ":" +
76662   //                       f(this.getUTCSeconds())   + "Z";
76663   //              };
76664
76665   //          You can provide an optional replacer method. It will be passed the
76666   //          key and value of each member, with this bound to the containing
76667   //          object. The value that is returned from your method will be
76668   //          serialized. If your method returns undefined, then the member will
76669   //          be excluded from the serialization.
76670
76671   //          If the replacer parameter is an array of strings, then it will be
76672   //          used to select the members to be serialized. It filters the results
76673   //          such that only members with keys listed in the replacer array are
76674   //          stringified.
76675
76676   //          Values that do not have JSON representations, such as undefined or
76677   //          functions, will not be serialized. Such values in objects will be
76678   //          dropped; in arrays they will be replaced with null. You can use
76679   //          a replacer function to replace those with JSON values.
76680
76681   //          JSON.stringify(undefined) returns undefined.
76682
76683   //          The optional space parameter produces a stringification of the
76684   //          value that is filled with line breaks and indentation to make it
76685   //          easier to read.
76686
76687   //          If the space parameter is a non-empty string, then that string will
76688   //          be used for indentation. If the space parameter is a number, then
76689   //          the indentation will be that many spaces.
76690
76691   //          Example:
76692
76693   //          text = JSON.stringify(["e", {pluribus: "unum"}]);
76694   //          // text is '["e",{"pluribus":"unum"}]'
76695
76696   //          text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
76697   //          // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
76698
76699   //          text = JSON.stringify([new Date()], function (key, value) {
76700   //              return this[key] instanceof Date
76701   //                  ? "Date(" + this[key] + ")"
76702   //                  : value;
76703   //          });
76704   //          // text is '["Date(---current time---)"]'
76705
76706   //      JSON.parse(text, reviver)
76707   //          This method parses a JSON text to produce an object or array.
76708   //          It can throw a SyntaxError exception.
76709
76710   //          The optional reviver parameter is a function that can filter and
76711   //          transform the results. It receives each of the keys and values,
76712   //          and its return value is used instead of the original value.
76713   //          If it returns what it received, then the structure is not modified.
76714   //          If it returns undefined then the member is deleted.
76715
76716   //          Example:
76717
76718   //          // Parse the text. Values that look like ISO date strings will
76719   //          // be converted to Date objects.
76720
76721   //          myData = JSON.parse(text, function (key, value) {
76722   //              var a;
76723   //              if (typeof value === "string") {
76724   //                  a =
76725   //   /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
76726   //                  if (a) {
76727   //                      return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
76728   //                          +a[5], +a[6]));
76729   //                  }
76730   //              }
76731   //              return value;
76732   //          });
76733
76734   //          myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
76735   //              var d;
76736   //              if (typeof value === "string" &&
76737   //                      value.slice(0, 5) === "Date(" &&
76738   //                      value.slice(-1) === ")") {
76739   //                  d = new Date(value.slice(5, -1));
76740   //                  if (d) {
76741   //                      return d;
76742   //                  }
76743   //              }
76744   //              return value;
76745   //          });
76746
76747   //  This is a reference implementation. You are free to copy, modify, or
76748   //  redistribute.
76749
76750   /*jslint
76751       eval, for, this
76752   */
76753
76754   /*property
76755       JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
76756       getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
76757       lastIndex, length, parse, prototype, push, replace, slice, stringify,
76758       test, toJSON, toString, valueOf
76759   */
76760
76761
76762   // Create a JSON object only if one does not already exist. We create the
76763   // methods in a closure to avoid creating global variables.
76764
76765   if (typeof JSON !== "object") {
76766       JSON = {};
76767   }
76768
76769   (function () {
76770
76771       var rx_one = /^[\],:{}\s]*$/;
76772       var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
76773       var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
76774       var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
76775       var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
76776       var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
76777
76778       function f(n) {
76779           // Format integers to have at least two digits.
76780           return n < 10
76781               ? "0" + n
76782               : n;
76783       }
76784
76785       function this_value() {
76786           return this.valueOf();
76787       }
76788
76789       if (typeof Date.prototype.toJSON !== "function") {
76790
76791           Date.prototype.toJSON = function () {
76792
76793               return isFinite(this.valueOf())
76794                   ? this.getUTCFullYear() + "-" +
76795                           f(this.getUTCMonth() + 1) + "-" +
76796                           f(this.getUTCDate()) + "T" +
76797                           f(this.getUTCHours()) + ":" +
76798                           f(this.getUTCMinutes()) + ":" +
76799                           f(this.getUTCSeconds()) + "Z"
76800                   : null;
76801           };
76802
76803           Boolean.prototype.toJSON = this_value;
76804           Number.prototype.toJSON = this_value;
76805           String.prototype.toJSON = this_value;
76806       }
76807
76808       var gap;
76809       var indent;
76810       var meta;
76811       var rep;
76812
76813
76814       function quote(string) {
76815
76816   // If the string contains no control characters, no quote characters, and no
76817   // backslash characters, then we can safely slap some quotes around it.
76818   // Otherwise we must also replace the offending characters with safe escape
76819   // sequences.
76820
76821           rx_escapable.lastIndex = 0;
76822           return rx_escapable.test(string)
76823               ? "\"" + string.replace(rx_escapable, function (a) {
76824                   var c = meta[a];
76825                   return typeof c === "string"
76826                       ? c
76827                       : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
76828               }) + "\""
76829               : "\"" + string + "\"";
76830       }
76831
76832
76833       function str(key, holder) {
76834
76835   // Produce a string from holder[key].
76836
76837           var i;          // The loop counter.
76838           var k;          // The member key.
76839           var v;          // The member value.
76840           var length;
76841           var mind = gap;
76842           var partial;
76843           var value = holder[key];
76844
76845   // If the value has a toJSON method, call it to obtain a replacement value.
76846
76847           if (value && typeof value === "object" &&
76848                   typeof value.toJSON === "function") {
76849               value = value.toJSON(key);
76850           }
76851
76852   // If we were called with a replacer function, then call the replacer to
76853   // obtain a replacement value.
76854
76855           if (typeof rep === "function") {
76856               value = rep.call(holder, key, value);
76857           }
76858
76859   // What happens next depends on the value's type.
76860
76861           switch (typeof value) {
76862           case "string":
76863               return quote(value);
76864
76865           case "number":
76866
76867   // JSON numbers must be finite. Encode non-finite numbers as null.
76868
76869               return isFinite(value)
76870                   ? String(value)
76871                   : "null";
76872
76873           case "boolean":
76874           case "null":
76875
76876   // If the value is a boolean or null, convert it to a string. Note:
76877   // typeof null does not produce "null". The case is included here in
76878   // the remote chance that this gets fixed someday.
76879
76880               return String(value);
76881
76882   // If the type is "object", we might be dealing with an object or an array or
76883   // null.
76884
76885           case "object":
76886
76887   // Due to a specification blunder in ECMAScript, typeof null is "object",
76888   // so watch out for that case.
76889
76890               if (!value) {
76891                   return "null";
76892               }
76893
76894   // Make an array to hold the partial results of stringifying this object value.
76895
76896               gap += indent;
76897               partial = [];
76898
76899   // Is the value an array?
76900
76901               if (Object.prototype.toString.apply(value) === "[object Array]") {
76902
76903   // The value is an array. Stringify every element. Use null as a placeholder
76904   // for non-JSON values.
76905
76906                   length = value.length;
76907                   for (i = 0; i < length; i += 1) {
76908                       partial[i] = str(i, value) || "null";
76909                   }
76910
76911   // Join all of the elements together, separated with commas, and wrap them in
76912   // brackets.
76913
76914                   v = partial.length === 0
76915                       ? "[]"
76916                       : gap
76917                           ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]"
76918                           : "[" + partial.join(",") + "]";
76919                   gap = mind;
76920                   return v;
76921               }
76922
76923   // If the replacer is an array, use it to select the members to be stringified.
76924
76925               if (rep && typeof rep === "object") {
76926                   length = rep.length;
76927                   for (i = 0; i < length; i += 1) {
76928                       if (typeof rep[i] === "string") {
76929                           k = rep[i];
76930                           v = str(k, value);
76931                           if (v) {
76932                               partial.push(quote(k) + (
76933                                   gap
76934                                       ? ": "
76935                                       : ":"
76936                               ) + v);
76937                           }
76938                       }
76939                   }
76940               } else {
76941
76942   // Otherwise, iterate through all of the keys in the object.
76943
76944                   for (k in value) {
76945                       if (Object.prototype.hasOwnProperty.call(value, k)) {
76946                           v = str(k, value);
76947                           if (v) {
76948                               partial.push(quote(k) + (
76949                                   gap
76950                                       ? ": "
76951                                       : ":"
76952                               ) + v);
76953                           }
76954                       }
76955                   }
76956               }
76957
76958   // Join all of the member texts together, separated with commas,
76959   // and wrap them in braces.
76960
76961               v = partial.length === 0
76962                   ? "{}"
76963                   : gap
76964                       ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
76965                       : "{" + partial.join(",") + "}";
76966               gap = mind;
76967               return v;
76968           }
76969       }
76970
76971   // If the JSON object does not yet have a stringify method, give it one.
76972
76973       if (typeof JSON.stringify !== "function") {
76974           meta = {    // table of character substitutions
76975               "\b": "\\b",
76976               "\t": "\\t",
76977               "\n": "\\n",
76978               "\f": "\\f",
76979               "\r": "\\r",
76980               "\"": "\\\"",
76981               "\\": "\\\\"
76982           };
76983           JSON.stringify = function (value, replacer, space) {
76984
76985   // The stringify method takes a value and an optional replacer, and an optional
76986   // space parameter, and returns a JSON text. The replacer can be a function
76987   // that can replace values, or an array of strings that will select the keys.
76988   // A default replacer method can be provided. Use of the space parameter can
76989   // produce text that is more easily readable.
76990
76991               var i;
76992               gap = "";
76993               indent = "";
76994
76995   // If the space parameter is a number, make an indent string containing that
76996   // many spaces.
76997
76998               if (typeof space === "number") {
76999                   for (i = 0; i < space; i += 1) {
77000                       indent += " ";
77001                   }
77002
77003   // If the space parameter is a string, it will be used as the indent string.
77004
77005               } else if (typeof space === "string") {
77006                   indent = space;
77007               }
77008
77009   // If there is a replacer, it must be a function or an array.
77010   // Otherwise, throw an error.
77011
77012               rep = replacer;
77013               if (replacer && typeof replacer !== "function" &&
77014                       (typeof replacer !== "object" ||
77015                       typeof replacer.length !== "number")) {
77016                   throw new Error("JSON.stringify");
77017               }
77018
77019   // Make a fake root object containing our value under the key of "".
77020   // Return the result of stringifying the value.
77021
77022               return str("", {"": value});
77023           };
77024       }
77025
77026
77027   // If the JSON object does not yet have a parse method, give it one.
77028
77029       if (typeof JSON.parse !== "function") {
77030           JSON.parse = function (text, reviver) {
77031
77032   // The parse method takes a text and an optional reviver function, and returns
77033   // a JavaScript value if the text is a valid JSON text.
77034
77035               var j;
77036
77037               function walk(holder, key) {
77038
77039   // The walk method is used to recursively walk the resulting structure so
77040   // that modifications can be made.
77041
77042                   var k;
77043                   var v;
77044                   var value = holder[key];
77045                   if (value && typeof value === "object") {
77046                       for (k in value) {
77047                           if (Object.prototype.hasOwnProperty.call(value, k)) {
77048                               v = walk(value, k);
77049                               if (v !== undefined) {
77050                                   value[k] = v;
77051                               } else {
77052                                   delete value[k];
77053                               }
77054                           }
77055                       }
77056                   }
77057                   return reviver.call(holder, key, value);
77058               }
77059
77060
77061   // Parsing happens in four stages. In the first stage, we replace certain
77062   // Unicode characters with escape sequences. JavaScript handles many characters
77063   // incorrectly, either silently deleting them, or treating them as line endings.
77064
77065               text = String(text);
77066               rx_dangerous.lastIndex = 0;
77067               if (rx_dangerous.test(text)) {
77068                   text = text.replace(rx_dangerous, function (a) {
77069                       return "\\u" +
77070                               ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
77071                   });
77072               }
77073
77074   // In the second stage, we run the text against regular expressions that look
77075   // for non-JSON patterns. We are especially concerned with "()" and "new"
77076   // because they can cause invocation, and "=" because it can cause mutation.
77077   // But just to be safe, we want to reject all unexpected forms.
77078
77079   // We split the second stage into 4 regexp operations in order to work around
77080   // crippling inefficiencies in IE's and Safari's regexp engines. First we
77081   // replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
77082   // replace all simple value tokens with "]" characters. Third, we delete all
77083   // open brackets that follow a colon or comma or that begin the text. Finally,
77084   // we look to see that the remaining characters are only whitespace or "]" or
77085   // "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
77086
77087               if (
77088                   rx_one.test(
77089                       text
77090                           .replace(rx_two, "@")
77091                           .replace(rx_three, "]")
77092                           .replace(rx_four, "")
77093                   )
77094               ) {
77095
77096   // In the third stage we use the eval function to compile the text into a
77097   // JavaScript structure. The "{" operator is subject to a syntactic ambiguity
77098   // in JavaScript: it can begin a block or an object literal. We wrap the text
77099   // in parens to eliminate the ambiguity.
77100
77101                   j = eval("(" + text + ")");
77102
77103   // In the optional fourth stage, we recursively walk the new structure, passing
77104   // each name/value pair to a reviver function for possible transformation.
77105
77106                   return (typeof reviver === "function")
77107                       ? walk({"": j}, "")
77108                       : j;
77109               }
77110
77111   // If the text is not JSON parseable, then a SyntaxError is thrown.
77112
77113               throw new SyntaxError("JSON.parse");
77114           };
77115       }
77116   }());
77117
77118   var json2 = json2Plugin;
77119
77120   function json2Plugin() {
77121         
77122         return {}
77123   }
77124
77125   var plugins = [json2];
77126
77127   var store_legacy = storeEngine.createStore(all, plugins);
77128
77129   // # osm-auth
77130   //
77131   // This code is only compatible with IE10+ because the [XDomainRequest](http://bit.ly/LfO7xo)
77132   // object, IE<10's idea of [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing),
77133   // does not support custom headers, which this uses everywhere.
77134   var osmAuth = function(o) {
77135
77136       var oauth = {};
77137
77138       // authenticated users will also have a request token secret, but it's
77139       // not used in transactions with the server
77140       oauth.authenticated = function() {
77141           return !!(token('oauth_token') && token('oauth_token_secret'));
77142       };
77143
77144       oauth.logout = function() {
77145           token('oauth_token', '');
77146           token('oauth_token_secret', '');
77147           token('oauth_request_token_secret', '');
77148           return oauth;
77149       };
77150
77151       // TODO: detect lack of click event
77152       oauth.authenticate = function(callback) {
77153           if (oauth.authenticated()) return callback();
77154
77155           oauth.logout();
77156
77157           // ## Getting a request token
77158           var params = timenonce(getAuth(o)),
77159               url = o.url + '/oauth/request_token';
77160
77161           params.oauth_signature = ohauth_1.signature(
77162               o.oauth_secret, '',
77163               ohauth_1.baseString('POST', url, params));
77164
77165           if (!o.singlepage) {
77166               // Create a 600x550 popup window in the center of the screen
77167               var w = 600, h = 550,
77168                   settings = [
77169                       ['width', w], ['height', h],
77170                       ['left', screen.width / 2 - w / 2],
77171                       ['top', screen.height / 2 - h / 2]].map(function(x) {
77172                           return x.join('=');
77173                       }).join(','),
77174                   popup = window.open('about:blank', 'oauth_window', settings);
77175           }
77176
77177           // Request a request token. When this is complete, the popup
77178           // window is redirected to OSM's authorization page.
77179           ohauth_1.xhr('POST', url, params, null, {}, reqTokenDone);
77180           o.loading();
77181
77182           function reqTokenDone(err, xhr) {
77183               o.done();
77184               if (err) return callback(err);
77185               var resp = ohauth_1.stringQs(xhr.response);
77186               token('oauth_request_token_secret', resp.oauth_token_secret);
77187               var authorize_url = o.url + '/oauth/authorize?' + ohauth_1.qsString({
77188                   oauth_token: resp.oauth_token,
77189                   oauth_callback: resolveUrl(o.landing)
77190               });
77191
77192               if (o.singlepage) {
77193                   location.href = authorize_url;
77194               } else {
77195                   popup.location = authorize_url;
77196               }
77197           }
77198
77199           // Called by a function in a landing page, in the popup window. The
77200           // window closes itself.
77201           window.authComplete = function(token) {
77202               var oauth_token = ohauth_1.stringQs(token.split('?')[1]);
77203               get_access_token(oauth_token.oauth_token);
77204               delete window.authComplete;
77205           };
77206
77207           // ## Getting an request token
77208           //
77209           // At this point we have an `oauth_token`, brought in from a function
77210           // call on a landing page popup.
77211           function get_access_token(oauth_token) {
77212               var url = o.url + '/oauth/access_token',
77213                   params = timenonce(getAuth(o)),
77214                   request_token_secret = token('oauth_request_token_secret');
77215               params.oauth_token = oauth_token;
77216               params.oauth_signature = ohauth_1.signature(
77217                   o.oauth_secret,
77218                   request_token_secret,
77219                   ohauth_1.baseString('POST', url, params));
77220
77221               // ## Getting an access token
77222               //
77223               // The final token required for authentication. At this point
77224               // we have a `request token secret`
77225               ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
77226               o.loading();
77227           }
77228
77229           function accessTokenDone(err, xhr) {
77230               o.done();
77231               if (err) return callback(err);
77232               var access_token = ohauth_1.stringQs(xhr.response);
77233               token('oauth_token', access_token.oauth_token);
77234               token('oauth_token_secret', access_token.oauth_token_secret);
77235               callback(null, oauth);
77236           }
77237       };
77238
77239       oauth.bootstrapToken = function(oauth_token, callback) {
77240           // ## Getting an request token
77241           // At this point we have an `oauth_token`, brought in from a function
77242           // call on a landing page popup.
77243           function get_access_token(oauth_token) {
77244               var url = o.url + '/oauth/access_token',
77245                   params = timenonce(getAuth(o)),
77246                   request_token_secret = token('oauth_request_token_secret');
77247               params.oauth_token = oauth_token;
77248               params.oauth_signature = ohauth_1.signature(
77249                   o.oauth_secret,
77250                   request_token_secret,
77251                   ohauth_1.baseString('POST', url, params));
77252
77253               // ## Getting an access token
77254               // The final token required for authentication. At this point
77255               // we have a `request token secret`
77256               ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
77257               o.loading();
77258           }
77259
77260           function accessTokenDone(err, xhr) {
77261               o.done();
77262               if (err) return callback(err);
77263               var access_token = ohauth_1.stringQs(xhr.response);
77264               token('oauth_token', access_token.oauth_token);
77265               token('oauth_token_secret', access_token.oauth_token_secret);
77266               callback(null, oauth);
77267           }
77268
77269           get_access_token(oauth_token);
77270       };
77271
77272       // # xhr
77273       //
77274       // A single XMLHttpRequest wrapper that does authenticated calls if the
77275       // user has logged in.
77276       oauth.xhr = function(options, callback) {
77277           if (!oauth.authenticated()) {
77278               if (o.auto) {
77279                   return oauth.authenticate(run);
77280               } else {
77281                   callback('not authenticated', null);
77282                   return;
77283               }
77284           } else {
77285               return run();
77286           }
77287
77288           function run() {
77289               var params = timenonce(getAuth(o)),
77290                   oauth_token_secret = token('oauth_token_secret'),
77291                   url = (options.prefix !== false) ? o.url + options.path : options.path,
77292                   url_parts = url.replace(/#.*$/, '').split('?', 2),
77293                   base_url = url_parts[0],
77294                   query = (url_parts.length === 2) ? url_parts[1] : '';
77295
77296               // https://tools.ietf.org/html/rfc5849#section-3.4.1.3.1
77297               if ((!options.options || !options.options.header ||
77298                   options.options.header['Content-Type'] === 'application/x-www-form-urlencoded') &&
77299                   options.content) {
77300                   params = immutable(params, ohauth_1.stringQs(options.content));
77301               }
77302
77303               params.oauth_token = token('oauth_token');
77304               params.oauth_signature = ohauth_1.signature(
77305                   o.oauth_secret,
77306                   oauth_token_secret,
77307                   ohauth_1.baseString(options.method, base_url, immutable(params, ohauth_1.stringQs(query)))
77308               );
77309
77310               return ohauth_1.xhr(options.method, url, params, options.content, options.options, done);
77311           }
77312
77313           function done(err, xhr) {
77314               if (err) return callback(err);
77315               else if (xhr.responseXML) return callback(err, xhr.responseXML);
77316               else return callback(err, xhr.response);
77317           }
77318       };
77319
77320       // pre-authorize this object, if we can just get a token and token_secret
77321       // from the start
77322       oauth.preauth = function(c) {
77323           if (!c) return;
77324           if (c.oauth_token) token('oauth_token', c.oauth_token);
77325           if (c.oauth_token_secret) token('oauth_token_secret', c.oauth_token_secret);
77326           return oauth;
77327       };
77328
77329       oauth.options = function(_) {
77330           if (!arguments.length) return o;
77331
77332           o = _;
77333           o.url = o.url || 'https://www.openstreetmap.org';
77334           o.landing = o.landing || 'land.html';
77335           o.singlepage = o.singlepage || false;
77336
77337           // Optional loading and loading-done functions for nice UI feedback.
77338           // by default, no-ops
77339           o.loading = o.loading || function() {};
77340           o.done = o.done || function() {};
77341
77342           return oauth.preauth(o);
77343       };
77344
77345       // 'stamp' an authentication object from `getAuth()`
77346       // with a [nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)
77347       // and timestamp
77348       function timenonce(o) {
77349           o.oauth_timestamp = ohauth_1.timestamp();
77350           o.oauth_nonce = ohauth_1.nonce();
77351           return o;
77352       }
77353
77354       // get/set tokens. These are prefixed with the base URL so that `osm-auth`
77355       // can be used with multiple APIs and the keys in `localStorage`
77356       // will not clash
77357       var token;
77358
77359       if (store_legacy.enabled) {
77360           token = function (x, y) {
77361               if (arguments.length === 1) return store_legacy.get(o.url + x);
77362               else if (arguments.length === 2) return store_legacy.set(o.url + x, y);
77363           };
77364       } else {
77365           var storage = {};
77366           token = function (x, y) {
77367               if (arguments.length === 1) return storage[o.url + x];
77368               else if (arguments.length === 2) return storage[o.url + x] = y;
77369           };
77370       }
77371
77372       // Get an authentication object. If you just add and remove properties
77373       // from a single object, you'll need to use `delete` to make sure that
77374       // it doesn't contain undesired properties for authentication
77375       function getAuth(o) {
77376           return {
77377               oauth_consumer_key: o.oauth_consumer_key,
77378               oauth_signature_method: 'HMAC-SHA1'
77379           };
77380       }
77381
77382       // potentially pre-authorize
77383       oauth.options(o);
77384
77385       return oauth;
77386   };
77387
77388   var tiler$3 = utilTiler();
77389   var dispatch$4 = dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded', 'loadedNotes');
77390   var urlroot = 'https://www.openstreetmap.org';
77391   var oauth = osmAuth({
77392       url: urlroot,
77393       oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT',
77394       oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL',
77395       loading: authLoading,
77396       done: authDone
77397   });
77398
77399   var _blacklists = ['.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*'];
77400   var _tileCache = { loaded: {}, inflight: {}, seen: {} };
77401   var _noteCache = { loaded: {}, inflight: {}, inflightPost: {}, note: {}, closed: {}, rtree: rbush_1() };
77402   var _userCache = { toLoad: {}, user: {} };
77403   var _changeset$1 = {};
77404
77405   var _connectionID = 1;
77406   var _tileZoom = 16;
77407   var _noteZoom = 12;
77408   var _rateLimitError;
77409   var _userChangesets;
77410   var _userDetails;
77411   var _off;
77412
77413
77414   function authLoading() {
77415       dispatch$4.call('authLoading');
77416   }
77417
77418
77419   function authDone() {
77420       dispatch$4.call('authDone');
77421   }
77422
77423
77424   function abortRequest$3(i) {
77425       if (i) {
77426           i.abort();
77427       }
77428   }
77429
77430
77431   function abortUnwantedRequests$1(cache, tiles) {
77432       forEach(cache.inflight, function(v, k) {
77433           var wanted = find$1(tiles, function(tile) { return k === tile.id; });
77434           if (!wanted) {
77435               abortRequest$3(v);
77436               delete cache.inflight[k];
77437           }
77438       });
77439   }
77440
77441
77442   function getLoc(attrs) {
77443       var lon = attrs.lon && attrs.lon.value;
77444       var lat = attrs.lat && attrs.lat.value;
77445       return [parseFloat(lon), parseFloat(lat)];
77446   }
77447
77448
77449   function getNodes(obj) {
77450       var elems = obj.getElementsByTagName('nd');
77451       var nodes = new Array(elems.length);
77452       for (var i = 0, l = elems.length; i < l; i++) {
77453           nodes[i] = 'n' + elems[i].attributes.ref.value;
77454       }
77455       return nodes;
77456   }
77457
77458
77459   function getTags(obj) {
77460       var elems = obj.getElementsByTagName('tag');
77461       var tags = {};
77462       for (var i = 0, l = elems.length; i < l; i++) {
77463           var attrs = elems[i].attributes;
77464           tags[attrs.k.value] = attrs.v.value;
77465       }
77466
77467       return tags;
77468   }
77469
77470
77471   function getMembers(obj) {
77472       var elems = obj.getElementsByTagName('member');
77473       var members = new Array(elems.length);
77474       for (var i = 0, l = elems.length; i < l; i++) {
77475           var attrs = elems[i].attributes;
77476           members[i] = {
77477               id: attrs.type.value[0] + attrs.ref.value,
77478               type: attrs.type.value,
77479               role: attrs.role.value
77480           };
77481       }
77482       return members;
77483   }
77484
77485
77486   function getVisible(attrs) {
77487       return (!attrs.visible || attrs.visible.value !== 'false');
77488   }
77489
77490
77491   function parseComments(comments) {
77492       var parsedComments = [];
77493
77494       // for each comment
77495       for (var i = 0; i < comments.length; i++) {
77496           var comment = comments[i];
77497           if (comment.nodeName === 'comment') {
77498               var childNodes = comment.childNodes;
77499               var parsedComment = {};
77500
77501               for (var j = 0; j < childNodes.length; j++) {
77502                   var node = childNodes[j];
77503                   var nodeName = node.nodeName;
77504                   if (nodeName === '#text') continue;
77505                   parsedComment[nodeName] = node.textContent;
77506
77507                   if (nodeName === 'uid') {
77508                       var uid = node.textContent;
77509                       if (uid && !_userCache.user[uid]) {
77510                           _userCache.toLoad[uid] = true;
77511                       }
77512                   }
77513               }
77514
77515               if (parsedComment) {
77516                   parsedComments.push(parsedComment);
77517               }
77518           }
77519       }
77520       return parsedComments;
77521   }
77522
77523
77524   function encodeNoteRtree(note) {
77525       return {
77526           minX: note.loc[0],
77527           minY: note.loc[1],
77528           maxX: note.loc[0],
77529           maxY: note.loc[1],
77530           data: note
77531       };
77532   }
77533
77534
77535   var parsers = {
77536       node: function nodeData(obj, uid) {
77537           var attrs = obj.attributes;
77538           return new osmNode({
77539               id: uid,
77540               visible: getVisible(attrs),
77541               version: attrs.version.value,
77542               changeset: attrs.changeset && attrs.changeset.value,
77543               timestamp: attrs.timestamp && attrs.timestamp.value,
77544               user: attrs.user && attrs.user.value,
77545               uid: attrs.uid && attrs.uid.value,
77546               loc: getLoc(attrs),
77547               tags: getTags(obj)
77548           });
77549       },
77550
77551       way: function wayData(obj, uid) {
77552           var attrs = obj.attributes;
77553           return new osmWay({
77554               id: uid,
77555               visible: getVisible(attrs),
77556               version: attrs.version.value,
77557               changeset: attrs.changeset && attrs.changeset.value,
77558               timestamp: attrs.timestamp && attrs.timestamp.value,
77559               user: attrs.user && attrs.user.value,
77560               uid: attrs.uid && attrs.uid.value,
77561               tags: getTags(obj),
77562               nodes: getNodes(obj),
77563           });
77564       },
77565
77566       relation: function relationData(obj, uid) {
77567           var attrs = obj.attributes;
77568           return new osmRelation({
77569               id: uid,
77570               visible: getVisible(attrs),
77571               version: attrs.version.value,
77572               changeset: attrs.changeset && attrs.changeset.value,
77573               timestamp: attrs.timestamp && attrs.timestamp.value,
77574               user: attrs.user && attrs.user.value,
77575               uid: attrs.uid && attrs.uid.value,
77576               tags: getTags(obj),
77577               members: getMembers(obj)
77578           });
77579       },
77580
77581       note: function parseNote(obj, uid) {
77582           var attrs = obj.attributes;
77583           var childNodes = obj.childNodes;
77584           var props = {};
77585
77586           props.id = uid;
77587           props.loc = getLoc(attrs);
77588
77589           // if notes are coincident, move them apart slightly
77590           var coincident = false;
77591           var epsilon = 0.00001;
77592           do {
77593               if (coincident) {
77594                   props.loc = geoVecAdd(props.loc, [epsilon, epsilon]);
77595               }
77596               var bbox = geoExtent$$1(props.loc).bbox();
77597               coincident = _noteCache.rtree.search(bbox).length;
77598           } while (coincident);
77599
77600           // parse note contents
77601           for (var i = 0; i < childNodes.length; i++) {
77602               var node = childNodes[i];
77603               var nodeName = node.nodeName;
77604               if (nodeName === '#text') continue;
77605
77606               // if the element is comments, parse the comments
77607               if (nodeName === 'comments') {
77608                   props[nodeName] = parseComments(node.childNodes);
77609               } else {
77610                   props[nodeName] = node.textContent;
77611               }
77612           }
77613
77614           var note = new osmNote(props);
77615           var item = encodeNoteRtree(note);
77616           _noteCache.note[note.id] = note;
77617           _noteCache.rtree.insert(item);
77618
77619           return note;
77620       },
77621
77622       user: function parseUser(obj, uid) {
77623           var attrs = obj.attributes;
77624           var user = {
77625               id: uid,
77626               display_name: attrs.display_name && attrs.display_name.value,
77627               account_created: attrs.account_created && attrs.account_created.value,
77628               changesets_count: 0
77629           };
77630
77631           var img = obj.getElementsByTagName('img');
77632           if (img && img[0] && img[0].getAttribute('href')) {
77633               user.image_url = img[0].getAttribute('href');
77634           }
77635
77636           var changesets = obj.getElementsByTagName('changesets');
77637           if (changesets && changesets[0] && changesets[0].getAttribute('count')) {
77638               user.changesets_count = changesets[0].getAttribute('count');
77639           }
77640
77641           _userCache.user[uid] = user;
77642           delete _userCache.toLoad[uid];
77643           return user;
77644       }
77645   };
77646
77647
77648   function parseXML(xml$$1, callback, options) {
77649       options = assignIn({ skipSeen: true }, options);
77650       if (!xml$$1 || !xml$$1.childNodes) {
77651           return callback({ message: 'No XML', status: -1 });
77652       }
77653
77654       var root = xml$$1.childNodes[0];
77655       var children = root.childNodes;
77656       utilIdleWorker(children, parseChild, done);
77657
77658
77659       function done(results) {
77660           callback(null, results);
77661       }
77662
77663       function parseChild(child) {
77664           var parser = parsers[child.nodeName];
77665           if (!parser) return null;
77666
77667           var uid;
77668           if (child.nodeName === 'user') {
77669               uid = child.attributes.id.value;
77670               if (options.skipSeen && _userCache.user[uid]) {
77671                   delete _userCache.toLoad[uid];
77672                   return null;
77673               }
77674
77675           } else if (child.nodeName === 'note') {
77676               uid = child.getElementsByTagName('id')[0].textContent;
77677
77678           } else {
77679               uid = osmEntity$$1.id.fromOSM(child.nodeName, child.attributes.id.value);
77680               if (options.skipSeen) {
77681                   if (_tileCache.seen[uid]) return null;  // avoid reparsing a "seen" entity
77682                   _tileCache.seen[uid] = true;
77683               }
77684           }
77685
77686           return parser(child, uid);
77687       }
77688   }
77689
77690
77691   // replace or remove note from rtree
77692   function updateRtree$1(item, replace) {
77693       _noteCache.rtree.remove(item, function isEql(a, b) { return a.data.id === b.data.id; });
77694
77695       if (replace) {
77696           _noteCache.rtree.insert(item);
77697       }
77698   }
77699
77700
77701   function wrapcb(thisArg, callback, cid) {
77702       return function(err, result) {
77703           if (err) {
77704               // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
77705               if (err.status === 400 || err.status === 401 || err.status === 403) {
77706                   thisArg.logout();
77707               }
77708               return callback.call(thisArg, err);
77709
77710           } else if (thisArg.getConnectionId() !== cid) {
77711               return callback.call(thisArg, { message: 'Connection Switched', status: -1 });
77712
77713           } else {
77714               return callback.call(thisArg, err, result);
77715           }
77716       };
77717   }
77718
77719
77720   var serviceOsm = {
77721
77722       init: function() {
77723           utilRebind(this, dispatch$4, 'on');
77724       },
77725
77726
77727       reset: function() {
77728           _connectionID++;
77729           _userChangesets = undefined;
77730           _userDetails = undefined;
77731           _rateLimitError = undefined;
77732
77733           forEach(_tileCache.inflight, abortRequest$3);
77734           forEach(_noteCache.inflight, abortRequest$3);
77735           forEach(_noteCache.inflightPost, abortRequest$3);
77736           if (_changeset$1.inflight) abortRequest$3(_changeset$1.inflight);
77737
77738           _tileCache = { loaded: {}, inflight: {}, seen: {} };
77739           _noteCache = { loaded: {}, inflight: {}, inflightPost: {}, note: {}, closed: {}, rtree: rbush_1() };
77740           _userCache = { toLoad: {}, user: {} };
77741           _changeset$1 = {};
77742
77743           return this;
77744       },
77745
77746
77747       getConnectionId: function() {
77748           return _connectionID;
77749       },
77750
77751
77752       changesetURL: function(changesetID) {
77753           return urlroot + '/changeset/' + changesetID;
77754       },
77755
77756
77757       changesetsURL: function(center, zoom) {
77758           var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
77759           return urlroot + '/history#map=' +
77760               Math.floor(zoom) + '/' +
77761               center[1].toFixed(precision) + '/' +
77762               center[0].toFixed(precision);
77763       },
77764
77765
77766       entityURL: function(entity) {
77767           return urlroot + '/' + entity.type + '/' + entity.osmId();
77768       },
77769
77770
77771       historyURL: function(entity) {
77772           return urlroot + '/' + entity.type + '/' + entity.osmId() + '/history';
77773       },
77774
77775
77776       userURL: function(username) {
77777           return urlroot + '/user/' + username;
77778       },
77779
77780
77781       noteURL: function(note) {
77782           return urlroot + '/note/' + note.id;
77783       },
77784
77785
77786       noteReportURL: function(note) {
77787           return urlroot + '/reports/new?reportable_type=Note&reportable_id=' + note.id;
77788       },
77789
77790
77791       // Generic method to load data from the OSM API
77792       // Can handle either auth or unauth calls.
77793       loadFromAPI: function(path, callback, options) {
77794           options = assignIn({ skipSeen: true }, options);
77795           var that = this;
77796           var cid = _connectionID;
77797
77798           function done(err, xml$$1) {
77799               if (that.getConnectionId() !== cid) {
77800                   if (callback) callback({ message: 'Connection Switched', status: -1 });
77801                   return;
77802               }
77803
77804               var isAuthenticated = that.authenticated();
77805
77806               // 400 Bad Request, 401 Unauthorized, 403 Forbidden
77807               // Logout and retry the request..
77808               if (isAuthenticated && err && (err.status === 400 || err.status === 401 || err.status === 403)) {
77809                   that.logout();
77810                   that.loadFromAPI(path, callback, options);
77811
77812               // else, no retry..
77813               } else {
77814                   // 509 Bandwidth Limit Exceeded, 429 Too Many Requests
77815                   // Set the rateLimitError flag and trigger a warning..
77816                   if (!isAuthenticated && !_rateLimitError && err &&
77817                           (err.status === 509 || err.status === 429)) {
77818                       _rateLimitError = err;
77819                       dispatch$4.call('change');
77820                   }
77821
77822                   if (callback) {
77823                       if (err) {
77824                           return callback(err);
77825                       } else {
77826                           return parseXML(xml$$1, callback, options);
77827                       }
77828                   }
77829               }
77830           }
77831
77832           if (this.authenticated()) {
77833               return oauth.xhr({ method: 'GET', path: path }, done);
77834           } else {
77835               var url = urlroot + path;
77836               return d3_xml(url).get(done);
77837           }
77838       },
77839
77840
77841       // Load a single entity by id (ways and relations use the `/full` call)
77842       // GET /api/0.6/node/#id
77843       // GET /api/0.6/[way|relation]/#id/full
77844       loadEntity: function(id, callback) {
77845           var type = osmEntity$$1.id.type(id);
77846           var osmID = osmEntity$$1.id.toOSM(id);
77847           var options = { skipSeen: false };
77848
77849           this.loadFromAPI(
77850               '/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : ''),
77851               function(err, entities) {
77852                   if (callback) callback(err, { data: entities });
77853               },
77854               options
77855           );
77856       },
77857
77858
77859       // Load a single entity with a specific version
77860       // GET /api/0.6/[node|way|relation]/#id/#version
77861       loadEntityVersion: function(id, version, callback) {
77862           var type = osmEntity$$1.id.type(id);
77863           var osmID = osmEntity$$1.id.toOSM(id);
77864           var options = { skipSeen: false };
77865
77866           this.loadFromAPI(
77867               '/api/0.6/' + type + '/' + osmID + '/' + version,
77868               function(err, entities) {
77869                   if (callback) callback(err, { data: entities });
77870               },
77871               options
77872           );
77873       },
77874
77875
77876       // Load multiple entities in chunks
77877       // (note: callback may be called multiple times)
77878       // GET /api/0.6/[nodes|ways|relations]?#parameters
77879       loadMultiple: function(ids, callback) {
77880           var that = this;
77881
77882           forEach(groupBy(uniq(ids), osmEntity$$1.id.type), function(v, k) {
77883               var type = k + 's';
77884               var osmIDs = map$3(v, osmEntity$$1.id.toOSM);
77885               var options = { skipSeen: false };
77886
77887               forEach(chunk(osmIDs, 150), function(arr) {
77888                   that.loadFromAPI(
77889                       '/api/0.6/' + type + '?' + type + '=' + arr.join(),
77890                       function(err, entities) {
77891                           if (callback) callback(err, { data: entities });
77892                       },
77893                       options
77894                   );
77895               });
77896           });
77897       },
77898
77899
77900       // Create, upload, and close a changeset
77901       // PUT /api/0.6/changeset/create
77902       // POST /api/0.6/changeset/#id/upload
77903       // PUT /api/0.6/changeset/#id/close
77904       putChangeset: function(changeset, changes, callback) {
77905           var cid = _connectionID;
77906
77907           if (_changeset$1.inflight) {
77908               return callback({ message: 'Changeset already inflight', status: -2 }, changeset);
77909
77910           } else if (_changeset$1.open) {   // reuse existing open changeset..
77911               return createdChangeset.call(this, null, _changeset$1.open);
77912
77913           } else {   // Open a new changeset..
77914               var options = {
77915                   method: 'PUT',
77916                   path: '/api/0.6/changeset/create',
77917                   options: { header: { 'Content-Type': 'text/xml' } },
77918                   content: JXON.stringify(changeset.asJXON())
77919               };
77920               _changeset$1.inflight = oauth.xhr(
77921                   options,
77922                   wrapcb(this, createdChangeset, cid)
77923               );
77924           }
77925
77926
77927           function createdChangeset(err, changesetID) {
77928               _changeset$1.inflight = null;
77929               if (err) { return callback(err, changeset); }
77930
77931               _changeset$1.open = changesetID;
77932               changeset = changeset.update({ id: changesetID });
77933
77934               // Upload the changeset..
77935               var options = {
77936                   method: 'POST',
77937                   path: '/api/0.6/changeset/' + changesetID + '/upload',
77938                   options: { header: { 'Content-Type': 'text/xml' } },
77939                   content: JXON.stringify(changeset.osmChangeJXON(changes))
77940               };
77941               _changeset$1.inflight = oauth.xhr(
77942                   options,
77943                   wrapcb(this, uploadedChangeset, cid)
77944               );
77945           }
77946
77947
77948           function uploadedChangeset(err) {
77949               _changeset$1.inflight = null;
77950               if (err) return callback(err, changeset);
77951
77952               // Upload was successful, safe to call the callback.
77953               // Add delay to allow for postgres replication #1646 #2678
77954               window.setTimeout(function() { callback(null, changeset); }, 2500);
77955               _changeset$1.open = null;
77956
77957               // At this point, we don't really care if the connection was switched..
77958               // Only try to close the changeset if we're still talking to the same server.
77959               if (this.getConnectionId() === cid) {
77960                   // Still attempt to close changeset, but ignore response because #2667
77961                   oauth.xhr({
77962                       method: 'PUT',
77963                       path: '/api/0.6/changeset/' + changeset.id + '/close',
77964                       options: { header: { 'Content-Type': 'text/xml' } }
77965                   }, function() { return true; });
77966               }
77967           }
77968       },
77969
77970
77971       // Load multiple users in chunks
77972       // (note: callback may be called multiple times)
77973       // GET /api/0.6/users?users=#id1,#id2,...,#idn
77974       loadUsers: function(uids, callback) {
77975           var toLoad = [];
77976           var cached = [];
77977
77978           uniq(uids).forEach(function(uid) {
77979               if (_userCache.user[uid]) {
77980                   delete _userCache.toLoad[uid];
77981                   cached.push(_userCache.user[uid]);
77982               } else {
77983                   toLoad.push(uid);
77984               }
77985           });
77986
77987           if (cached.length || !this.authenticated()) {
77988               callback(undefined, cached);
77989               if (!this.authenticated()) return;  // require auth
77990           }
77991
77992           chunk(toLoad, 150).forEach(function(arr) {
77993               oauth.xhr(
77994                   { method: 'GET', path: '/api/0.6/users?users=' + arr.join() },
77995                   wrapcb(this, done, _connectionID)
77996               );
77997           }.bind(this));
77998
77999           function done(err, xml$$1) {
78000               if (err) { return callback(err); }
78001
78002               var options = { skipSeen: true };
78003               return parseXML(xml$$1, function(err, results) {
78004                   if (err) {
78005                       return callback(err);
78006                   } else {
78007                       return callback(undefined, results);
78008                   }
78009               }, options);
78010           }
78011       },
78012
78013
78014       // Load a given user by id
78015       // GET /api/0.6/user/#id
78016       loadUser: function(uid, callback) {
78017           if (_userCache.user[uid] || !this.authenticated()) {   // require auth
78018               delete _userCache.toLoad[uid];
78019               return callback(undefined, _userCache.user[uid]);
78020           }
78021
78022           oauth.xhr(
78023               { method: 'GET', path: '/api/0.6/user/' + uid },
78024               wrapcb(this, done, _connectionID)
78025           );
78026
78027           function done(err, xml$$1) {
78028               if (err) { return callback(err); }
78029
78030               var options = { skipSeen: true };
78031               return parseXML(xml$$1, function(err, results) {
78032                   if (err) {
78033                       return callback(err);
78034                   } else {
78035                       return callback(undefined, results[0]);
78036                   }
78037               }, options);
78038           }
78039       },
78040
78041
78042       // Load the details of the logged-in user
78043       // GET /api/0.6/user/details
78044       userDetails: function(callback) {
78045           if (_userDetails) {    // retrieve cached
78046               return callback(undefined, _userDetails);
78047           }
78048
78049           oauth.xhr(
78050               { method: 'GET', path: '/api/0.6/user/details' },
78051               wrapcb(this, done, _connectionID)
78052           );
78053
78054           function done(err, xml$$1) {
78055               if (err) { return callback(err); }
78056
78057               var options = { skipSeen: false };
78058               return parseXML(xml$$1, function(err, results) {
78059                   if (err) {
78060                       return callback(err);
78061                   } else {
78062                       _userDetails = results[0];
78063                       return callback(undefined, _userDetails);
78064                   }
78065               }, options);
78066           }
78067       },
78068
78069
78070       // Load previous changesets for the logged in user
78071       // GET /api/0.6/changesets?user=#id
78072       userChangesets: function(callback) {
78073           if (_userChangesets) {    // retrieve cached
78074               return callback(undefined, _userChangesets);
78075           }
78076
78077           this.userDetails(
78078               wrapcb(this, gotDetails, _connectionID)
78079           );
78080
78081
78082           function gotDetails(err, user) {
78083               if (err) { return callback(err); }
78084
78085               oauth.xhr(
78086                   { method: 'GET', path: '/api/0.6/changesets?user=' + user.id },
78087                   wrapcb(this, done, _connectionID)
78088               );
78089           }
78090
78091           function done(err, xml$$1) {
78092               if (err) { return callback(err); }
78093
78094               _userChangesets = Array.prototype.map.call(
78095                   xml$$1.getElementsByTagName('changeset'),
78096                   function (changeset) { return { tags: getTags(changeset) }; }
78097               ).filter(function (changeset) {
78098                   var comment = changeset.tags.comment;
78099                   return comment && comment !== '';
78100               });
78101
78102               return callback(undefined, _userChangesets);
78103           }
78104       },
78105
78106
78107       // Fetch the status of the OSM API
78108       // GET /api/capabilities
78109       status: function(callback) {
78110           d3_xml(urlroot + '/api/capabilities').get(
78111               wrapcb(this, done, _connectionID)
78112           );
78113
78114           function done(err, xml$$1) {
78115               if (err) { return callback(err); }
78116
78117               // update blacklists
78118               var elements = xml$$1.getElementsByTagName('blacklist');
78119               var regexes = [];
78120               for (var i = 0; i < elements.length; i++) {
78121                   var regex = elements[i].getAttribute('regex');  // needs unencode?
78122                   if (regex) {
78123                       regexes.push(regex);
78124                   }
78125               }
78126               if (regexes.length) {
78127                   _blacklists = regexes;
78128               }
78129
78130               if (_rateLimitError) {
78131                   return callback(_rateLimitError, 'rateLimited');
78132               } else {
78133                   var apiStatus = xml$$1.getElementsByTagName('status');
78134                   var val = apiStatus[0].getAttribute('api');
78135                   return callback(undefined, val);
78136               }
78137           }
78138       },
78139
78140
78141       // Load data (entities) from the API in tiles
78142       // GET /api/0.6/map?bbox=
78143       loadTiles: function(projection, callback) {
78144           if (_off) return;
78145
78146           var that = this;
78147           var path = '/api/0.6/map?bbox=';
78148
78149           // determine the needed tiles to cover the view
78150           var tiles = tiler$3.zoomExtent([_tileZoom, _tileZoom]).getTiles(projection);
78151
78152           // abort inflight requests that are no longer needed
78153           var hadRequests = !isEmpty(_tileCache.inflight);
78154           abortUnwantedRequests$1(_tileCache, tiles);
78155           if (hadRequests && isEmpty(_tileCache.inflight)) {
78156               dispatch$4.call('loaded');    // stop the spinner
78157           }
78158
78159           // issue new requests..
78160           tiles.forEach(function(tile) {
78161               if (_tileCache.loaded[tile.id] || _tileCache.inflight[tile.id]) return;
78162               if (isEmpty(_tileCache.inflight)) {
78163                   dispatch$4.call('loading');   // start the spinner
78164               }
78165
78166               var options = { skipSeen: true };
78167               _tileCache.inflight[tile.id] = that.loadFromAPI(
78168                   path + tile.extent.toParam(),
78169                   function(err, parsed) {
78170                       delete _tileCache.inflight[tile.id];
78171                       if (!err) {
78172                           _tileCache.loaded[tile.id] = true;
78173                       }
78174                       if (callback) {
78175                           callback(err, assignIn({ data: parsed }, tile));
78176                       }
78177                       if (isEmpty(_tileCache.inflight)) {
78178                           dispatch$4.call('loaded');     // stop the spinner
78179                       }
78180                   },
78181                   options
78182               );
78183           });
78184       },
78185
78186
78187       // Load notes from the API in tiles
78188       // GET /api/0.6/notes?bbox=
78189       loadNotes: function(projection, noteOptions) {
78190           noteOptions = assignIn({ limit: 10000, closed: 7 }, noteOptions);
78191           if (_off) return;
78192
78193           var that = this;
78194           var path = '/api/0.6/notes?limit=' + noteOptions.limit + '&closed=' + noteOptions.closed + '&bbox=';
78195           var throttleLoadUsers = throttle(function() {
78196               var uids = Object.keys(_userCache.toLoad);
78197               if (!uids.length) return;
78198               that.loadUsers(uids, function() {});  // eagerly load user details
78199           }, 750);
78200
78201           // determine the needed tiles to cover the view
78202           var tiles = tiler$3.zoomExtent([_noteZoom, _noteZoom]).getTiles(projection);
78203
78204           // abort inflight requests that are no longer needed
78205           abortUnwantedRequests$1(_noteCache, tiles);
78206
78207           // issue new requests..
78208           tiles.forEach(function(tile) {
78209               if (_noteCache.loaded[tile.id] || _noteCache.inflight[tile.id]) return;
78210
78211               var options = { skipSeen: false };
78212               _noteCache.inflight[tile.id] = that.loadFromAPI(
78213                   path + tile.extent.toParam(),
78214                   function(err) {
78215                       delete _noteCache.inflight[tile.id];
78216                       if (!err) {
78217                           _noteCache.loaded[tile.id] = true;
78218                       }
78219                       throttleLoadUsers();
78220                       dispatch$4.call('loadedNotes');
78221                   },
78222                   options
78223               );
78224           });
78225       },
78226
78227
78228       // Create a note
78229       // POST /api/0.6/notes?params
78230       postNoteCreate: function(note, callback) {
78231           if (!this.authenticated()) {
78232               return callback({ message: 'Not Authenticated', status: -3 }, note);
78233           }
78234           if (_noteCache.inflightPost[note.id]) {
78235               return callback({ message: 'Note update already inflight', status: -2 }, note);
78236           }
78237
78238           if (!note.loc[0] || !note.loc[1] || !note.newComment) return; // location & description required
78239
78240           var comment = note.newComment;
78241           if (note.newCategory && note.newCategory !== 'None') { comment += ' #' + note.newCategory; }
78242
78243           var path = '/api/0.6/notes?' + utilQsString({ lon: note.loc[0], lat: note.loc[1], text: comment });
78244
78245           _noteCache.inflightPost[note.id] = oauth.xhr(
78246               { method: 'POST', path: path },
78247               wrapcb(this, done, _connectionID)
78248           );
78249
78250
78251           function done(err, xml$$1) {
78252               delete _noteCache.inflightPost[note.id];
78253               if (err) { return callback(err); }
78254
78255               // we get the updated note back, remove from caches and reparse..
78256               this.removeNote(note);
78257
78258               var options = { skipSeen: false };
78259               return parseXML(xml$$1, function(err, results) {
78260                   if (err) {
78261                       return callback(err);
78262                   } else {
78263                       return callback(undefined, results[0]);
78264                   }
78265               }, options);
78266           }
78267       },
78268
78269
78270       // Update a note
78271       // POST /api/0.6/notes/#id/comment?text=comment
78272       // POST /api/0.6/notes/#id/close?text=comment
78273       // POST /api/0.6/notes/#id/reopen?text=comment
78274       postNoteUpdate: function(note, newStatus, callback) {
78275           if (!this.authenticated()) {
78276               return callback({ message: 'Not Authenticated', status: -3 }, note);
78277           }
78278           if (_noteCache.inflightPost[note.id]) {
78279               return callback({ message: 'Note update already inflight', status: -2 }, note);
78280           }
78281
78282           var action;
78283           if (note.status !== 'closed' && newStatus === 'closed') {
78284               action = 'close';
78285           } else if (note.status !== 'open' && newStatus === 'open') {
78286               action = 'reopen';
78287           } else {
78288               action = 'comment';
78289               if (!note.newComment) return; // when commenting, comment required
78290           }
78291
78292           var path = '/api/0.6/notes/' + note.id + '/' + action;
78293           if (note.newComment) {
78294               path += '?' + utilQsString({ text: note.newComment });
78295           }
78296
78297           _noteCache.inflightPost[note.id] = oauth.xhr(
78298               { method: 'POST', path: path },
78299               wrapcb(this, done, _connectionID)
78300           );
78301
78302
78303           function done(err, xml$$1) {
78304               delete _noteCache.inflightPost[note.id];
78305               if (err) { return callback(err); }
78306
78307               // we get the updated note back, remove from caches and reparse..
78308               this.removeNote(note);
78309
78310               // update closed note cache - used to populate `closed:note` changeset tag
78311               if (action === 'close') {
78312                   _noteCache.closed[note.id] = true;
78313               } else if (action === 'reopen') {
78314                   delete _noteCache.closed[note.id];
78315               }
78316
78317               var options = { skipSeen: false };
78318               return parseXML(xml$$1, function(err, results) {
78319                   if (err) {
78320                       return callback(err);
78321                   } else {
78322                       return callback(undefined, results[0]);
78323                   }
78324               }, options);
78325           }
78326       },
78327
78328
78329       switch: function(options) {
78330           urlroot = options.urlroot;
78331
78332           oauth.options(assignIn({
78333               url: urlroot,
78334               loading: authLoading,
78335               done: authDone
78336           }, options));
78337
78338           this.reset();
78339           this.userChangesets(function() {});  // eagerly load user details/changesets
78340           dispatch$4.call('change');
78341           return this;
78342       },
78343
78344
78345       toggle: function(_) {
78346           _off = !_;
78347           return this;
78348       },
78349
78350
78351       isChangesetInflight: function() {
78352           return !!_changeset$1.inflight;
78353       },
78354
78355
78356       // get/set cached data
78357       // This is used to save/restore the state when entering/exiting the walkthrough
78358       // Also used for testing purposes.
78359       caches: function(obj) {
78360           if (!arguments.length) {
78361               return {
78362                   tile: cloneDeep(_tileCache),
78363                   note: cloneDeep(_noteCache),
78364                   user: cloneDeep(_userCache)
78365               };
78366           }
78367
78368           // access caches directly for testing (e.g., loading notes rtree)
78369           if (obj === 'get') {
78370               return {
78371                   tile: _tileCache,
78372                   note: _noteCache,
78373                   user: _userCache
78374               };
78375           }
78376
78377           if (obj.tile) {
78378               _tileCache = obj.tile;
78379               _tileCache.inflight = {};
78380           }
78381           if (obj.note) {
78382               _noteCache = obj.note;
78383               _noteCache.inflight = {};
78384               _noteCache.inflightPost = {};
78385           }
78386           if (obj.user) {
78387               _userCache = obj.user;
78388           }
78389
78390           return this;
78391       },
78392
78393
78394       logout: function() {
78395           _userChangesets = undefined;
78396           _userDetails = undefined;
78397           oauth.logout();
78398           dispatch$4.call('change');
78399           return this;
78400       },
78401
78402
78403       authenticated: function() {
78404           return oauth.authenticated();
78405       },
78406
78407
78408       authenticate: function(callback) {
78409           var that = this;
78410           var cid = _connectionID;
78411           _userChangesets = undefined;
78412           _userDetails = undefined;
78413
78414           function done(err, res) {
78415               if (err) {
78416                   if (callback) callback(err);
78417                   return;
78418               }
78419               if (that.getConnectionId() !== cid) {
78420                   if (callback) callback({ message: 'Connection Switched', status: -1 });
78421                   return;
78422               }
78423               _rateLimitError = undefined;
78424               dispatch$4.call('change');
78425               if (callback) callback(err, res);
78426               that.userChangesets(function() {});  // eagerly load user details/changesets
78427           }
78428
78429           return oauth.authenticate(done);
78430       },
78431
78432
78433       imageryBlacklists: function() {
78434           return _blacklists;
78435       },
78436
78437
78438       tileZoom: function(_) {
78439           if (!arguments.length) return _tileZoom;
78440           _tileZoom = _;
78441           return this;
78442       },
78443
78444
78445       // get all cached notes covering the viewport
78446       notes: function(projection) {
78447           var viewport = projection.clipExtent();
78448           var min = [viewport[0][0], viewport[1][1]];
78449           var max = [viewport[1][0], viewport[0][1]];
78450           var bbox = geoExtent$$1(projection.invert(min), projection.invert(max)).bbox();
78451
78452           return _noteCache.rtree.search(bbox)
78453               .map(function(d) { return d.data; });
78454       },
78455
78456
78457       // get a single note from the cache
78458       getNote: function(id) {
78459           return _noteCache.note[id];
78460       },
78461
78462
78463       // remove a single note from the cache
78464       removeNote: function(note) {
78465           if (!(note instanceof osmNote) || !note.id) return;
78466
78467           delete _noteCache.note[note.id];
78468           updateRtree$1(encodeNoteRtree(note), false);  // false = remove
78469       },
78470
78471
78472       // replace a single note in the cache
78473       replaceNote: function(note) {
78474           if (!(note instanceof osmNote) || !note.id) return;
78475
78476           _noteCache.note[note.id] = note;
78477           updateRtree$1(encodeNoteRtree(note), true);  // true = replace
78478           return note;
78479       },
78480
78481
78482       // Get an array of note IDs closed during this session.
78483       // Used to populate `closed:note` changeset tag
78484       getClosedIDs: function() {
78485           return Object.keys(_noteCache.closed).sort();
78486       }
78487
78488   };
78489
78490   var apibase$3 = 'https://wiki.openstreetmap.org/w/api.php';
78491   var _inflight = {};
78492   var _wikibaseCache = {};
78493   var _localeIDs = { en: false };
78494
78495
78496   var debouncedRequest = debounce(request$1, 500, { leading: false });
78497
78498   function request$1(url, callback) {
78499       if (_inflight[url]) return;
78500
78501       _inflight[url] = d3_json(url, function (err, data) {
78502           delete _inflight[url];
78503           callback(err, data);
78504       });
78505   }
78506
78507
78508   /**
78509    * Get the best string value from the descriptions/labels result
78510    * Note that if mediawiki doesn't recognize language code, it will return all values.
78511    * In that case, fallback to use English.
78512    * @param values object - either descriptions or labels
78513    * @param langCode String
78514    * @returns localized string
78515    */
78516   function localizedToString(values, langCode) {
78517       if (values) {
78518           values = values[langCode] || values.en;
78519       }
78520       return values ? values.value : '';
78521   }
78522
78523
78524   var serviceOsmWikibase = {
78525
78526       init: function() {
78527           _inflight = {};
78528           _wikibaseCache = {};
78529           _localeIDs = {};
78530       },
78531
78532
78533       reset: function() {
78534           forEach(_inflight, function(req) { req.abort(); });
78535           _inflight = {};
78536       },
78537
78538
78539       /**
78540        * Get the best value for the property, or undefined if not found
78541        * @param entity object from wikibase
78542        * @param property string e.g. 'P4' for image
78543        * @param langCode string e.g. 'fr' for French
78544        */
78545       claimToValue: function(entity, property, langCode) {
78546           if (!entity.claims[property]) return undefined;
78547           var locale = _localeIDs[langCode];
78548           var preferredPick, localePick;
78549           forEach(entity.claims[property], function(stmt) {
78550               // If exists, use value limited to the needed language (has a qualifier P26 = locale)
78551               // Or if not found, use the first value with the "preferred" rank
78552               if (!preferredPick && stmt.rank === 'preferred') {
78553                   preferredPick = stmt;
78554               }
78555               if (locale && stmt.qualifiers && stmt.qualifiers.P26 &&
78556                   stmt.qualifiers.P26[0].datavalue.value.id === locale
78557               ) {
78558                   localePick = stmt;
78559               }
78560           });
78561           var result = localePick || preferredPick;
78562
78563           if (result) {
78564               var datavalue = result.mainsnak.datavalue;
78565               return datavalue.type === 'wikibase-entityid' ? datavalue.value.id : datavalue.value;
78566           } else {
78567               return undefined;
78568           }
78569       },
78570
78571
78572       /**
78573        * Convert monolingual property into a key-value object (language -> value)
78574        * @param entity object from wikibase
78575        * @param property string e.g. 'P31' for monolingual wiki page title
78576        */
78577       monolingualClaimToValueObj: function(entity, property) {
78578           if (!entity || !entity.claims[property]) return undefined;
78579           return entity.claims[property].reduce(function(acc, obj) {
78580               var value = obj.mainsnak.datavalue.value;
78581               acc[value.language] = value.text;
78582               return acc;
78583           }, {});
78584       },
78585
78586
78587       toSitelink: function(key, value) {
78588           var result = value ? 'Tag:' + key + '=' + value : 'Key:' + key;
78589           return result.replace(/_/g, ' ').trim();
78590       },
78591
78592
78593       getEntity: function(params, callback) {
78594           var doRequest = params.debounce ? debouncedRequest : request$1;
78595           var self = this;
78596           var titles = [];
78597           var result = {};
78598           var keySitelink = this.toSitelink(params.key);
78599           var tagSitelink = params.value ? this.toSitelink(params.key, params.value) : false;
78600           var localeSitelink;
78601
78602           if (params.langCode && _localeIDs[params.langCode] === undefined) {
78603               // If this is the first time we are asking about this locale,
78604               // fetch corresponding entity (if it exists), and cache it.
78605               // If there is no such entry, cache `false` value to avoid re-requesting it.
78606               localeSitelink = ('Locale:' + params.langCode).replace(/_/g, ' ').trim();
78607               titles.push(localeSitelink);
78608           }
78609
78610           if (_wikibaseCache[keySitelink]) {
78611               result.key = _wikibaseCache[keySitelink];
78612           } else {
78613               titles.push(keySitelink);
78614           }
78615
78616           if (tagSitelink) {
78617               if (_wikibaseCache[tagSitelink]) {
78618                   result.tag = _wikibaseCache[tagSitelink];
78619               } else {
78620                   titles.push(tagSitelink);
78621               }
78622           }
78623
78624           if (!titles.length) {
78625               // Nothing to do, we already had everything in the cache
78626               return callback(null, result);
78627           }
78628
78629           // Requesting just the user language code
78630           // If backend recognizes the code, it will perform proper fallbacks,
78631           // and the result will contain the requested code. If not, all values are returned:
78632           // {"zh-tw":{"value":"...","language":"zh-tw","source-language":"zh-hant"}
78633           // {"pt-br":{"value":"...","language":"pt","for-language":"pt-br"}}
78634           var obj = {
78635               action: 'wbgetentities',
78636               sites: 'wiki',
78637               titles: titles.join('|'),
78638               languages: params.langCode,
78639               languagefallback: 1,
78640               origin: '*',
78641               format: 'json',
78642               // There is an MW Wikibase API bug https://phabricator.wikimedia.org/T212069
78643               // We shouldn't use v1 until it gets fixed, but should switch to it afterwards
78644               // formatversion: 2,
78645           };
78646
78647           var url = apibase$3 + '?' + utilQsString(obj);
78648           doRequest(url, function(err, d) {
78649               if (err) {
78650                   callback(err);
78651               } else if (!d.success || d.error) {
78652                   callback(d.error.messages.map(function(v) { return v.html['*']; }).join('<br>'));
78653               } else {
78654                   var localeID = false;
78655                   forEach(d.entities, function(res) {
78656                       if (res.missing !== '') {
78657                           var title = res.sitelinks.wiki.title;
78658                           // Simplify access to the localized values
78659                           res.description = localizedToString(res.descriptions, params.langCode);
78660                           res.label = localizedToString(res.labels, params.langCode);
78661                           if (title === keySitelink) {
78662                               _wikibaseCache[keySitelink] = res;
78663                               result.key = res;
78664                           } else if (title === tagSitelink) {
78665                               _wikibaseCache[tagSitelink] = res;
78666                               result.tag = res;
78667                           } else if (title === localeSitelink) {
78668                               localeID = res.id;
78669                           } else {
78670                               console.log('Unexpected title ' + title);  // eslint-disable-line no-console
78671                           }
78672                       }
78673                   });
78674
78675                   if (localeSitelink) {
78676                       // If locale ID is not found, store false to prevent repeated queries
78677                       self.addLocale(params.langCode, localeID);
78678                   }
78679
78680                   callback(null, result);
78681               }
78682           });
78683       },
78684
78685
78686       addLocale: function(langCode, qid) {
78687           // Makes it easier to unit test
78688           _localeIDs[langCode] = qid;
78689       },
78690
78691       apibase: function(val) {
78692           if (!arguments.length) return apibase$3;
78693           apibase$3 = val;
78694           return this;
78695       }
78696
78697   };
78698
78699   var jsonpCache = {};
78700   window.jsonpCache = jsonpCache;
78701
78702   function jsonpRequest(url, callback) {
78703       var request = {
78704           abort: function() {}
78705       };
78706
78707       if (window.JSONP_FIX) {
78708           if (window.JSONP_DELAY === 0) {
78709               callback(window.JSONP_FIX);
78710           } else {
78711               var t = window.setTimeout(function() {
78712                   callback(window.JSONP_FIX);
78713               }, window.JSONP_DELAY || 0);
78714
78715               request.abort = function() { window.clearTimeout(t); };
78716           }
78717
78718           return request;
78719       }
78720
78721       function rand() {
78722           var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
78723           var c = '';
78724           var i = -1;
78725           while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
78726           return c;
78727       }
78728
78729       function create$$1(url) {
78730           var e = url.match(/callback=(\w+)/);
78731           var c = e ? e[1] : rand();
78732
78733           jsonpCache[c] = function(data) {
78734               if (jsonpCache[c]) {
78735                   callback(data);
78736               }
78737               finalize();
78738           };
78739
78740           function finalize() {
78741               delete jsonpCache[c];
78742               script.remove();
78743           }
78744
78745           request.abort = finalize;
78746           return 'jsonpCache.' + c;
78747       }
78748
78749       var cb = create$$1(url);
78750
78751       var script = select('head')
78752           .append('script')
78753           .attr('type', 'text/javascript')
78754           .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
78755
78756       return request;
78757   }
78758
78759   var q = createCommonjsModule(function (module, exports) {
78760   // vim:ts=4:sts=4:sw=4:
78761   /*!
78762    *
78763    * Copyright 2009-2017 Kris Kowal under the terms of the MIT
78764    * license found at https://github.com/kriskowal/q/blob/v1/LICENSE
78765    *
78766    * With parts by Tyler Close
78767    * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found
78768    * at http://www.opensource.org/licenses/mit-license.html
78769    * Forked at ref_send.js version: 2009-05-11
78770    *
78771    * With parts by Mark Miller
78772    * Copyright (C) 2011 Google Inc.
78773    *
78774    * Licensed under the Apache License, Version 2.0 (the "License");
78775    * you may not use this file except in compliance with the License.
78776    * You may obtain a copy of the License at
78777    *
78778    * http://www.apache.org/licenses/LICENSE-2.0
78779    *
78780    * Unless required by applicable law or agreed to in writing, software
78781    * distributed under the License is distributed on an "AS IS" BASIS,
78782    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
78783    * See the License for the specific language governing permissions and
78784    * limitations under the License.
78785    *
78786    */
78787
78788   (function (definition) {
78789
78790       // This file will function properly as a <script> tag, or a module
78791       // using CommonJS and NodeJS or RequireJS module formats.  In
78792       // Common/Node/RequireJS, the module exports the Q API and when
78793       // executed as a simple <script>, it creates a Q global instead.
78794
78795       // Montage Require
78796       if (typeof bootstrap === "function") {
78797           bootstrap("promise", definition);
78798
78799       // CommonJS
78800       } else {
78801           module.exports = definition();
78802
78803       // RequireJS
78804       }
78805
78806   })(function () {
78807
78808   var hasStacks = false;
78809   try {
78810       throw new Error();
78811   } catch (e) {
78812       hasStacks = !!e.stack;
78813   }
78814
78815   // All code after this point will be filtered from stack traces reported
78816   // by Q.
78817   var qStartingLine = captureLine();
78818   var qFileName;
78819
78820   // shims
78821
78822   // used for fallback in "allResolved"
78823   var noop = function () {};
78824
78825   // Use the fastest possible means to execute a task in a future turn
78826   // of the event loop.
78827   var nextTick =(function () {
78828       // linked list of tasks (single, with head node)
78829       var head = {task: void 0, next: null};
78830       var tail = head;
78831       var flushing = false;
78832       var requestTick = void 0;
78833       var isNodeJS = false;
78834       // queue for late tasks, used by unhandled rejection tracking
78835       var laterQueue = [];
78836
78837       function flush() {
78838           /* jshint loopfunc: true */
78839           var task, domain;
78840
78841           while (head.next) {
78842               head = head.next;
78843               task = head.task;
78844               head.task = void 0;
78845               domain = head.domain;
78846
78847               if (domain) {
78848                   head.domain = void 0;
78849                   domain.enter();
78850               }
78851               runSingle(task, domain);
78852
78853           }
78854           while (laterQueue.length) {
78855               task = laterQueue.pop();
78856               runSingle(task);
78857           }
78858           flushing = false;
78859       }
78860       // runs a single function in the async queue
78861       function runSingle(task, domain) {
78862           try {
78863               task();
78864
78865           } catch (e) {
78866               if (isNodeJS) {
78867                   // In node, uncaught exceptions are considered fatal errors.
78868                   // Re-throw them synchronously to interrupt flushing!
78869
78870                   // Ensure continuation if the uncaught exception is suppressed
78871                   // listening "uncaughtException" events (as domains does).
78872                   // Continue in next event to avoid tick recursion.
78873                   if (domain) {
78874                       domain.exit();
78875                   }
78876                   setTimeout(flush, 0);
78877                   if (domain) {
78878                       domain.enter();
78879                   }
78880
78881                   throw e;
78882
78883               } else {
78884                   // In browsers, uncaught exceptions are not fatal.
78885                   // Re-throw them asynchronously to avoid slow-downs.
78886                   setTimeout(function () {
78887                       throw e;
78888                   }, 0);
78889               }
78890           }
78891
78892           if (domain) {
78893               domain.exit();
78894           }
78895       }
78896
78897       nextTick = function (task) {
78898           tail = tail.next = {
78899               task: task,
78900               domain: isNodeJS && process.domain,
78901               next: null
78902           };
78903
78904           if (!flushing) {
78905               flushing = true;
78906               requestTick();
78907           }
78908       };
78909
78910       if (typeof process === "object" &&
78911           process.toString() === "[object process]" && process.nextTick) {
78912           // Ensure Q is in a real Node environment, with a `process.nextTick`.
78913           // To see through fake Node environments:
78914           // * Mocha test runner - exposes a `process` global without a `nextTick`
78915           // * Browserify - exposes a `process.nexTick` function that uses
78916           //   `setTimeout`. In this case `setImmediate` is preferred because
78917           //    it is faster. Browserify's `process.toString()` yields
78918           //   "[object Object]", while in a real Node environment
78919           //   `process.toString()` yields "[object process]".
78920           isNodeJS = true;
78921
78922           requestTick = function () {
78923               process.nextTick(flush);
78924           };
78925
78926       } else if (typeof setImmediate === "function") {
78927           // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate
78928           if (typeof window !== "undefined") {
78929               requestTick = setImmediate.bind(window, flush);
78930           } else {
78931               requestTick = function () {
78932                   setImmediate(flush);
78933               };
78934           }
78935
78936       } else if (typeof MessageChannel !== "undefined") {
78937           // modern browsers
78938           // http://www.nonblocking.io/2011/06/windownexttick.html
78939           var channel = new MessageChannel();
78940           // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create
78941           // working message ports the first time a page loads.
78942           channel.port1.onmessage = function () {
78943               requestTick = requestPortTick;
78944               channel.port1.onmessage = flush;
78945               flush();
78946           };
78947           var requestPortTick = function () {
78948               // Opera requires us to provide a message payload, regardless of
78949               // whether we use it.
78950               channel.port2.postMessage(0);
78951           };
78952           requestTick = function () {
78953               setTimeout(flush, 0);
78954               requestPortTick();
78955           };
78956
78957       } else {
78958           // old browsers
78959           requestTick = function () {
78960               setTimeout(flush, 0);
78961           };
78962       }
78963       // runs a task after all other tasks have been run
78964       // this is useful for unhandled rejection tracking that needs to happen
78965       // after all `then`d tasks have been run.
78966       nextTick.runAfter = function (task) {
78967           laterQueue.push(task);
78968           if (!flushing) {
78969               flushing = true;
78970               requestTick();
78971           }
78972       };
78973       return nextTick;
78974   })();
78975
78976   // Attempt to make generics safe in the face of downstream
78977   // modifications.
78978   // There is no situation where this is necessary.
78979   // If you need a security guarantee, these primordials need to be
78980   // deeply frozen anyway, and if you don’t need a security guarantee,
78981   // this is just plain paranoid.
78982   // However, this **might** have the nice side-effect of reducing the size of
78983   // the minified code by reducing x.call() to merely x()
78984   // See Mark Miller’s explanation of what this does.
78985   // http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming
78986   var call = Function.call;
78987   function uncurryThis(f) {
78988       return function () {
78989           return call.apply(f, arguments);
78990       };
78991   }
78992   // This is equivalent, but slower:
78993   // uncurryThis = Function_bind.bind(Function_bind.call);
78994   // http://jsperf.com/uncurrythis
78995
78996   var array_slice = uncurryThis(Array.prototype.slice);
78997
78998   var array_reduce = uncurryThis(
78999       Array.prototype.reduce || function (callback, basis) {
79000           var index = 0,
79001               length = this.length;
79002           // concerning the initial value, if one is not provided
79003           if (arguments.length === 1) {
79004               // seek to the first value in the array, accounting
79005               // for the possibility that is is a sparse array
79006               do {
79007                   if (index in this) {
79008                       basis = this[index++];
79009                       break;
79010                   }
79011                   if (++index >= length) {
79012                       throw new TypeError();
79013                   }
79014               } while (1);
79015           }
79016           // reduce
79017           for (; index < length; index++) {
79018               // account for the possibility that the array is sparse
79019               if (index in this) {
79020                   basis = callback(basis, this[index], index);
79021               }
79022           }
79023           return basis;
79024       }
79025   );
79026
79027   var array_indexOf = uncurryThis(
79028       Array.prototype.indexOf || function (value) {
79029           // not a very good shim, but good enough for our one use of it
79030           for (var i = 0; i < this.length; i++) {
79031               if (this[i] === value) {
79032                   return i;
79033               }
79034           }
79035           return -1;
79036       }
79037   );
79038
79039   var array_map = uncurryThis(
79040       Array.prototype.map || function (callback, thisp) {
79041           var self = this;
79042           var collect = [];
79043           array_reduce(self, function (undefined, value, index) {
79044               collect.push(callback.call(thisp, value, index, self));
79045           }, void 0);
79046           return collect;
79047       }
79048   );
79049
79050   var object_create = Object.create || function (prototype) {
79051       function Type() { }
79052       Type.prototype = prototype;
79053       return new Type();
79054   };
79055
79056   var object_defineProperty = Object.defineProperty || function (obj, prop, descriptor) {
79057       obj[prop] = descriptor.value;
79058       return obj;
79059   };
79060
79061   var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);
79062
79063   var object_keys = Object.keys || function (object) {
79064       var keys = [];
79065       for (var key in object) {
79066           if (object_hasOwnProperty(object, key)) {
79067               keys.push(key);
79068           }
79069       }
79070       return keys;
79071   };
79072
79073   var object_toString = uncurryThis(Object.prototype.toString);
79074
79075   function isObject(value) {
79076       return value === Object(value);
79077   }
79078
79079   // generator related shims
79080
79081   // FIXME: Remove this function once ES6 generators are in SpiderMonkey.
79082   function isStopIteration(exception) {
79083       return (
79084           object_toString(exception) === "[object StopIteration]" ||
79085           exception instanceof QReturnValue
79086       );
79087   }
79088
79089   // FIXME: Remove this helper and Q.return once ES6 generators are in
79090   // SpiderMonkey.
79091   var QReturnValue;
79092   if (typeof ReturnValue !== "undefined") {
79093       QReturnValue = ReturnValue;
79094   } else {
79095       QReturnValue = function (value) {
79096           this.value = value;
79097       };
79098   }
79099
79100   // long stack traces
79101
79102   var STACK_JUMP_SEPARATOR = "From previous event:";
79103
79104   function makeStackTraceLong(error, promise) {
79105       // If possible, transform the error stack trace by removing Node and Q
79106       // cruft, then concatenating with the stack trace of `promise`. See #57.
79107       if (hasStacks &&
79108           promise.stack &&
79109           typeof error === "object" &&
79110           error !== null &&
79111           error.stack
79112       ) {
79113           var stacks = [];
79114           for (var p = promise; !!p; p = p.source) {
79115               if (p.stack && (!error.__minimumStackCounter__ || error.__minimumStackCounter__ > p.stackCounter)) {
79116                   object_defineProperty(error, "__minimumStackCounter__", {value: p.stackCounter, configurable: true});
79117                   stacks.unshift(p.stack);
79118               }
79119           }
79120           stacks.unshift(error.stack);
79121
79122           var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
79123           var stack = filterStackString(concatedStacks);
79124           object_defineProperty(error, "stack", {value: stack, configurable: true});
79125       }
79126   }
79127
79128   function filterStackString(stackString) {
79129       var lines = stackString.split("\n");
79130       var desiredLines = [];
79131       for (var i = 0; i < lines.length; ++i) {
79132           var line = lines[i];
79133
79134           if (!isInternalFrame(line) && !isNodeFrame(line) && line) {
79135               desiredLines.push(line);
79136           }
79137       }
79138       return desiredLines.join("\n");
79139   }
79140
79141   function isNodeFrame(stackLine) {
79142       return stackLine.indexOf("(module.js:") !== -1 ||
79143              stackLine.indexOf("(node.js:") !== -1;
79144   }
79145
79146   function getFileNameAndLineNumber(stackLine) {
79147       // Named functions: "at functionName (filename:lineNumber:columnNumber)"
79148       // In IE10 function name can have spaces ("Anonymous function") O_o
79149       var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine);
79150       if (attempt1) {
79151           return [attempt1[1], Number(attempt1[2])];
79152       }
79153
79154       // Anonymous functions: "at filename:lineNumber:columnNumber"
79155       var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);
79156       if (attempt2) {
79157           return [attempt2[1], Number(attempt2[2])];
79158       }
79159
79160       // Firefox style: "function@filename:lineNumber or @filename:lineNumber"
79161       var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);
79162       if (attempt3) {
79163           return [attempt3[1], Number(attempt3[2])];
79164       }
79165   }
79166
79167   function isInternalFrame(stackLine) {
79168       var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);
79169
79170       if (!fileNameAndLineNumber) {
79171           return false;
79172       }
79173
79174       var fileName = fileNameAndLineNumber[0];
79175       var lineNumber = fileNameAndLineNumber[1];
79176
79177       return fileName === qFileName &&
79178           lineNumber >= qStartingLine &&
79179           lineNumber <= qEndingLine;
79180   }
79181
79182   // discover own file name and line number range for filtering stack
79183   // traces
79184   function captureLine() {
79185       if (!hasStacks) {
79186           return;
79187       }
79188
79189       try {
79190           throw new Error();
79191       } catch (e) {
79192           var lines = e.stack.split("\n");
79193           var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
79194           var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
79195           if (!fileNameAndLineNumber) {
79196               return;
79197           }
79198
79199           qFileName = fileNameAndLineNumber[0];
79200           return fileNameAndLineNumber[1];
79201       }
79202   }
79203
79204   function deprecate(callback, name, alternative) {
79205       return function () {
79206           if (typeof console !== "undefined" &&
79207               typeof console.warn === "function") {
79208               console.warn(name + " is deprecated, use " + alternative +
79209                            " instead.", new Error("").stack);
79210           }
79211           return callback.apply(callback, arguments);
79212       };
79213   }
79214
79215   // end of shims
79216   // beginning of real work
79217
79218   /**
79219    * Constructs a promise for an immediate reference, passes promises through, or
79220    * coerces promises from different systems.
79221    * @param value immediate reference or promise
79222    */
79223   function Q(value) {
79224       // If the object is already a Promise, return it directly.  This enables
79225       // the resolve function to both be used to created references from objects,
79226       // but to tolerably coerce non-promises to promises.
79227       if (value instanceof Promise) {
79228           return value;
79229       }
79230
79231       // assimilate thenables
79232       if (isPromiseAlike(value)) {
79233           return coerce(value);
79234       } else {
79235           return fulfill(value);
79236       }
79237   }
79238   Q.resolve = Q;
79239
79240   /**
79241    * Performs a task in a future turn of the event loop.
79242    * @param {Function} task
79243    */
79244   Q.nextTick = nextTick;
79245
79246   /**
79247    * Controls whether or not long stack traces will be on
79248    */
79249   Q.longStackSupport = false;
79250
79251   /**
79252    * The counter is used to determine the stopping point for building
79253    * long stack traces. In makeStackTraceLong we walk backwards through
79254    * the linked list of promises, only stacks which were created before
79255    * the rejection are concatenated.
79256    */
79257   var longStackCounter = 1;
79258
79259   // enable long stacks if Q_DEBUG is set
79260   if (typeof process === "object" && process && process.env && process.env.Q_DEBUG) {
79261       Q.longStackSupport = true;
79262   }
79263
79264   /**
79265    * Constructs a {promise, resolve, reject} object.
79266    *
79267    * `resolve` is a callback to invoke with a more resolved value for the
79268    * promise. To fulfill the promise, invoke `resolve` with any value that is
79269    * not a thenable. To reject the promise, invoke `resolve` with a rejected
79270    * thenable, or invoke `reject` with the reason directly. To resolve the
79271    * promise to another thenable, thus putting it in the same state, invoke
79272    * `resolve` with that other thenable.
79273    */
79274   Q.defer = defer;
79275   function defer() {
79276       // if "messages" is an "Array", that indicates that the promise has not yet
79277       // been resolved.  If it is "undefined", it has been resolved.  Each
79278       // element of the messages array is itself an array of complete arguments to
79279       // forward to the resolved promise.  We coerce the resolution value to a
79280       // promise using the `resolve` function because it handles both fully
79281       // non-thenable values and other thenables gracefully.
79282       var messages = [], progressListeners = [], resolvedPromise;
79283
79284       var deferred = object_create(defer.prototype);
79285       var promise = object_create(Promise.prototype);
79286
79287       promise.promiseDispatch = function (resolve, op, operands) {
79288           var args = array_slice(arguments);
79289           if (messages) {
79290               messages.push(args);
79291               if (op === "when" && operands[1]) { // progress operand
79292                   progressListeners.push(operands[1]);
79293               }
79294           } else {
79295               Q.nextTick(function () {
79296                   resolvedPromise.promiseDispatch.apply(resolvedPromise, args);
79297               });
79298           }
79299       };
79300
79301       // XXX deprecated
79302       promise.valueOf = function () {
79303           if (messages) {
79304               return promise;
79305           }
79306           var nearerValue = nearer(resolvedPromise);
79307           if (isPromise(nearerValue)) {
79308               resolvedPromise = nearerValue; // shorten chain
79309           }
79310           return nearerValue;
79311       };
79312
79313       promise.inspect = function () {
79314           if (!resolvedPromise) {
79315               return { state: "pending" };
79316           }
79317           return resolvedPromise.inspect();
79318       };
79319
79320       if (Q.longStackSupport && hasStacks) {
79321           try {
79322               throw new Error();
79323           } catch (e) {
79324               // NOTE: don't try to use `Error.captureStackTrace` or transfer the
79325               // accessor around; that causes memory leaks as per GH-111. Just
79326               // reify the stack trace as a string ASAP.
79327               //
79328               // At the same time, cut off the first line; it's always just
79329               // "[object Promise]\n", as per the `toString`.
79330               promise.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
79331               promise.stackCounter = longStackCounter++;
79332           }
79333       }
79334
79335       // NOTE: we do the checks for `resolvedPromise` in each method, instead of
79336       // consolidating them into `become`, since otherwise we'd create new
79337       // promises with the lines `become(whatever(value))`. See e.g. GH-252.
79338
79339       function become(newPromise) {
79340           resolvedPromise = newPromise;
79341
79342           if (Q.longStackSupport && hasStacks) {
79343               // Only hold a reference to the new promise if long stacks
79344               // are enabled to reduce memory usage
79345               promise.source = newPromise;
79346           }
79347
79348           array_reduce(messages, function (undefined, message) {
79349               Q.nextTick(function () {
79350                   newPromise.promiseDispatch.apply(newPromise, message);
79351               });
79352           }, void 0);
79353
79354           messages = void 0;
79355           progressListeners = void 0;
79356       }
79357
79358       deferred.promise = promise;
79359       deferred.resolve = function (value) {
79360           if (resolvedPromise) {
79361               return;
79362           }
79363
79364           become(Q(value));
79365       };
79366
79367       deferred.fulfill = function (value) {
79368           if (resolvedPromise) {
79369               return;
79370           }
79371
79372           become(fulfill(value));
79373       };
79374       deferred.reject = function (reason) {
79375           if (resolvedPromise) {
79376               return;
79377           }
79378
79379           become(reject(reason));
79380       };
79381       deferred.notify = function (progress) {
79382           if (resolvedPromise) {
79383               return;
79384           }
79385
79386           array_reduce(progressListeners, function (undefined, progressListener) {
79387               Q.nextTick(function () {
79388                   progressListener(progress);
79389               });
79390           }, void 0);
79391       };
79392
79393       return deferred;
79394   }
79395
79396   /**
79397    * Creates a Node-style callback that will resolve or reject the deferred
79398    * promise.
79399    * @returns a nodeback
79400    */
79401   defer.prototype.makeNodeResolver = function () {
79402       var self = this;
79403       return function (error, value) {
79404           if (error) {
79405               self.reject(error);
79406           } else if (arguments.length > 2) {
79407               self.resolve(array_slice(arguments, 1));
79408           } else {
79409               self.resolve(value);
79410           }
79411       };
79412   };
79413
79414   /**
79415    * @param resolver {Function} a function that returns nothing and accepts
79416    * the resolve, reject, and notify functions for a deferred.
79417    * @returns a promise that may be resolved with the given resolve and reject
79418    * functions, or rejected by a thrown exception in resolver
79419    */
79420   Q.Promise = promise; // ES6
79421   Q.promise = promise;
79422   function promise(resolver) {
79423       if (typeof resolver !== "function") {
79424           throw new TypeError("resolver must be a function.");
79425       }
79426       var deferred = defer();
79427       try {
79428           resolver(deferred.resolve, deferred.reject, deferred.notify);
79429       } catch (reason) {
79430           deferred.reject(reason);
79431       }
79432       return deferred.promise;
79433   }
79434
79435   promise.race = race; // ES6
79436   promise.all = all; // ES6
79437   promise.reject = reject; // ES6
79438   promise.resolve = Q; // ES6
79439
79440   // XXX experimental.  This method is a way to denote that a local value is
79441   // serializable and should be immediately dispatched to a remote upon request,
79442   // instead of passing a reference.
79443   Q.passByCopy = function (object) {
79444       //freeze(object);
79445       //passByCopies.set(object, true);
79446       return object;
79447   };
79448
79449   Promise.prototype.passByCopy = function () {
79450       //freeze(object);
79451       //passByCopies.set(object, true);
79452       return this;
79453   };
79454
79455   /**
79456    * If two promises eventually fulfill to the same value, promises that value,
79457    * but otherwise rejects.
79458    * @param x {Any*}
79459    * @param y {Any*}
79460    * @returns {Any*} a promise for x and y if they are the same, but a rejection
79461    * otherwise.
79462    *
79463    */
79464   Q.join = function (x, y) {
79465       return Q(x).join(y);
79466   };
79467
79468   Promise.prototype.join = function (that) {
79469       return Q([this, that]).spread(function (x, y) {
79470           if (x === y) {
79471               // TODO: "===" should be Object.is or equiv
79472               return x;
79473           } else {
79474               throw new Error("Q can't join: not the same: " + x + " " + y);
79475           }
79476       });
79477   };
79478
79479   /**
79480    * Returns a promise for the first of an array of promises to become settled.
79481    * @param answers {Array[Any*]} promises to race
79482    * @returns {Any*} the first promise to be settled
79483    */
79484   Q.race = race;
79485   function race(answerPs) {
79486       return promise(function (resolve, reject) {
79487           // Switch to this once we can assume at least ES5
79488           // answerPs.forEach(function (answerP) {
79489           //     Q(answerP).then(resolve, reject);
79490           // });
79491           // Use this in the meantime
79492           for (var i = 0, len = answerPs.length; i < len; i++) {
79493               Q(answerPs[i]).then(resolve, reject);
79494           }
79495       });
79496   }
79497
79498   Promise.prototype.race = function () {
79499       return this.then(Q.race);
79500   };
79501
79502   /**
79503    * Constructs a Promise with a promise descriptor object and optional fallback
79504    * function.  The descriptor contains methods like when(rejected), get(name),
79505    * set(name, value), post(name, args), and delete(name), which all
79506    * return either a value, a promise for a value, or a rejection.  The fallback
79507    * accepts the operation name, a resolver, and any further arguments that would
79508    * have been forwarded to the appropriate method above had a method been
79509    * provided with the proper name.  The API makes no guarantees about the nature
79510    * of the returned object, apart from that it is usable whereever promises are
79511    * bought and sold.
79512    */
79513   Q.makePromise = Promise;
79514   function Promise(descriptor, fallback, inspect) {
79515       if (fallback === void 0) {
79516           fallback = function (op) {
79517               return reject(new Error(
79518                   "Promise does not support operation: " + op
79519               ));
79520           };
79521       }
79522       if (inspect === void 0) {
79523           inspect = function () {
79524               return {state: "unknown"};
79525           };
79526       }
79527
79528       var promise = object_create(Promise.prototype);
79529
79530       promise.promiseDispatch = function (resolve, op, args) {
79531           var result;
79532           try {
79533               if (descriptor[op]) {
79534                   result = descriptor[op].apply(promise, args);
79535               } else {
79536                   result = fallback.call(promise, op, args);
79537               }
79538           } catch (exception) {
79539               result = reject(exception);
79540           }
79541           if (resolve) {
79542               resolve(result);
79543           }
79544       };
79545
79546       promise.inspect = inspect;
79547
79548       // XXX deprecated `valueOf` and `exception` support
79549       if (inspect) {
79550           var inspected = inspect();
79551           if (inspected.state === "rejected") {
79552               promise.exception = inspected.reason;
79553           }
79554
79555           promise.valueOf = function () {
79556               var inspected = inspect();
79557               if (inspected.state === "pending" ||
79558                   inspected.state === "rejected") {
79559                   return promise;
79560               }
79561               return inspected.value;
79562           };
79563       }
79564
79565       return promise;
79566   }
79567
79568   Promise.prototype.toString = function () {
79569       return "[object Promise]";
79570   };
79571
79572   Promise.prototype.then = function (fulfilled, rejected, progressed) {
79573       var self = this;
79574       var deferred = defer();
79575       var done = false;   // ensure the untrusted promise makes at most a
79576                           // single call to one of the callbacks
79577
79578       function _fulfilled(value) {
79579           try {
79580               return typeof fulfilled === "function" ? fulfilled(value) : value;
79581           } catch (exception) {
79582               return reject(exception);
79583           }
79584       }
79585
79586       function _rejected(exception) {
79587           if (typeof rejected === "function") {
79588               makeStackTraceLong(exception, self);
79589               try {
79590                   return rejected(exception);
79591               } catch (newException) {
79592                   return reject(newException);
79593               }
79594           }
79595           return reject(exception);
79596       }
79597
79598       function _progressed(value) {
79599           return typeof progressed === "function" ? progressed(value) : value;
79600       }
79601
79602       Q.nextTick(function () {
79603           self.promiseDispatch(function (value) {
79604               if (done) {
79605                   return;
79606               }
79607               done = true;
79608
79609               deferred.resolve(_fulfilled(value));
79610           }, "when", [function (exception) {
79611               if (done) {
79612                   return;
79613               }
79614               done = true;
79615
79616               deferred.resolve(_rejected(exception));
79617           }]);
79618       });
79619
79620       // Progress propagator need to be attached in the current tick.
79621       self.promiseDispatch(void 0, "when", [void 0, function (value) {
79622           var newValue;
79623           var threw = false;
79624           try {
79625               newValue = _progressed(value);
79626           } catch (e) {
79627               threw = true;
79628               if (Q.onerror) {
79629                   Q.onerror(e);
79630               } else {
79631                   throw e;
79632               }
79633           }
79634
79635           if (!threw) {
79636               deferred.notify(newValue);
79637           }
79638       }]);
79639
79640       return deferred.promise;
79641   };
79642
79643   Q.tap = function (promise, callback) {
79644       return Q(promise).tap(callback);
79645   };
79646
79647   /**
79648    * Works almost like "finally", but not called for rejections.
79649    * Original resolution value is passed through callback unaffected.
79650    * Callback may return a promise that will be awaited for.
79651    * @param {Function} callback
79652    * @returns {Q.Promise}
79653    * @example
79654    * doSomething()
79655    *   .then(...)
79656    *   .tap(console.log)
79657    *   .then(...);
79658    */
79659   Promise.prototype.tap = function (callback) {
79660       callback = Q(callback);
79661
79662       return this.then(function (value) {
79663           return callback.fcall(value).thenResolve(value);
79664       });
79665   };
79666
79667   /**
79668    * Registers an observer on a promise.
79669    *
79670    * Guarantees:
79671    *
79672    * 1. that fulfilled and rejected will be called only once.
79673    * 2. that either the fulfilled callback or the rejected callback will be
79674    *    called, but not both.
79675    * 3. that fulfilled and rejected will not be called in this turn.
79676    *
79677    * @param value      promise or immediate reference to observe
79678    * @param fulfilled  function to be called with the fulfilled value
79679    * @param rejected   function to be called with the rejection exception
79680    * @param progressed function to be called on any progress notifications
79681    * @return promise for the return value from the invoked callback
79682    */
79683   Q.when = when;
79684   function when(value, fulfilled, rejected, progressed) {
79685       return Q(value).then(fulfilled, rejected, progressed);
79686   }
79687
79688   Promise.prototype.thenResolve = function (value) {
79689       return this.then(function () { return value; });
79690   };
79691
79692   Q.thenResolve = function (promise, value) {
79693       return Q(promise).thenResolve(value);
79694   };
79695
79696   Promise.prototype.thenReject = function (reason) {
79697       return this.then(function () { throw reason; });
79698   };
79699
79700   Q.thenReject = function (promise, reason) {
79701       return Q(promise).thenReject(reason);
79702   };
79703
79704   /**
79705    * If an object is not a promise, it is as "near" as possible.
79706    * If a promise is rejected, it is as "near" as possible too.
79707    * If it’s a fulfilled promise, the fulfillment value is nearer.
79708    * If it’s a deferred promise and the deferred has been resolved, the
79709    * resolution is "nearer".
79710    * @param object
79711    * @returns most resolved (nearest) form of the object
79712    */
79713
79714   // XXX should we re-do this?
79715   Q.nearer = nearer;
79716   function nearer(value) {
79717       if (isPromise(value)) {
79718           var inspected = value.inspect();
79719           if (inspected.state === "fulfilled") {
79720               return inspected.value;
79721           }
79722       }
79723       return value;
79724   }
79725
79726   /**
79727    * @returns whether the given object is a promise.
79728    * Otherwise it is a fulfilled value.
79729    */
79730   Q.isPromise = isPromise;
79731   function isPromise(object) {
79732       return object instanceof Promise;
79733   }
79734
79735   Q.isPromiseAlike = isPromiseAlike;
79736   function isPromiseAlike(object) {
79737       return isObject(object) && typeof object.then === "function";
79738   }
79739
79740   /**
79741    * @returns whether the given object is a pending promise, meaning not
79742    * fulfilled or rejected.
79743    */
79744   Q.isPending = isPending;
79745   function isPending(object) {
79746       return isPromise(object) && object.inspect().state === "pending";
79747   }
79748
79749   Promise.prototype.isPending = function () {
79750       return this.inspect().state === "pending";
79751   };
79752
79753   /**
79754    * @returns whether the given object is a value or fulfilled
79755    * promise.
79756    */
79757   Q.isFulfilled = isFulfilled;
79758   function isFulfilled(object) {
79759       return !isPromise(object) || object.inspect().state === "fulfilled";
79760   }
79761
79762   Promise.prototype.isFulfilled = function () {
79763       return this.inspect().state === "fulfilled";
79764   };
79765
79766   /**
79767    * @returns whether the given object is a rejected promise.
79768    */
79769   Q.isRejected = isRejected;
79770   function isRejected(object) {
79771       return isPromise(object) && object.inspect().state === "rejected";
79772   }
79773
79774   Promise.prototype.isRejected = function () {
79775       return this.inspect().state === "rejected";
79776   };
79777
79778   //// BEGIN UNHANDLED REJECTION TRACKING
79779
79780   // This promise library consumes exceptions thrown in handlers so they can be
79781   // handled by a subsequent promise.  The exceptions get added to this array when
79782   // they are created, and removed when they are handled.  Note that in ES6 or
79783   // shimmed environments, this would naturally be a `Set`.
79784   var unhandledReasons = [];
79785   var unhandledRejections = [];
79786   var reportedUnhandledRejections = [];
79787   var trackUnhandledRejections = true;
79788
79789   function resetUnhandledRejections() {
79790       unhandledReasons.length = 0;
79791       unhandledRejections.length = 0;
79792
79793       if (!trackUnhandledRejections) {
79794           trackUnhandledRejections = true;
79795       }
79796   }
79797
79798   function trackRejection(promise, reason) {
79799       if (!trackUnhandledRejections) {
79800           return;
79801       }
79802       if (typeof process === "object" && typeof process.emit === "function") {
79803           Q.nextTick.runAfter(function () {
79804               if (array_indexOf(unhandledRejections, promise) !== -1) {
79805                   process.emit("unhandledRejection", reason, promise);
79806                   reportedUnhandledRejections.push(promise);
79807               }
79808           });
79809       }
79810
79811       unhandledRejections.push(promise);
79812       if (reason && typeof reason.stack !== "undefined") {
79813           unhandledReasons.push(reason.stack);
79814       } else {
79815           unhandledReasons.push("(no stack) " + reason);
79816       }
79817   }
79818
79819   function untrackRejection(promise) {
79820       if (!trackUnhandledRejections) {
79821           return;
79822       }
79823
79824       var at = array_indexOf(unhandledRejections, promise);
79825       if (at !== -1) {
79826           if (typeof process === "object" && typeof process.emit === "function") {
79827               Q.nextTick.runAfter(function () {
79828                   var atReport = array_indexOf(reportedUnhandledRejections, promise);
79829                   if (atReport !== -1) {
79830                       process.emit("rejectionHandled", unhandledReasons[at], promise);
79831                       reportedUnhandledRejections.splice(atReport, 1);
79832                   }
79833               });
79834           }
79835           unhandledRejections.splice(at, 1);
79836           unhandledReasons.splice(at, 1);
79837       }
79838   }
79839
79840   Q.resetUnhandledRejections = resetUnhandledRejections;
79841
79842   Q.getUnhandledReasons = function () {
79843       // Make a copy so that consumers can't interfere with our internal state.
79844       return unhandledReasons.slice();
79845   };
79846
79847   Q.stopUnhandledRejectionTracking = function () {
79848       resetUnhandledRejections();
79849       trackUnhandledRejections = false;
79850   };
79851
79852   resetUnhandledRejections();
79853
79854   //// END UNHANDLED REJECTION TRACKING
79855
79856   /**
79857    * Constructs a rejected promise.
79858    * @param reason value describing the failure
79859    */
79860   Q.reject = reject;
79861   function reject(reason) {
79862       var rejection = Promise({
79863           "when": function (rejected) {
79864               // note that the error has been handled
79865               if (rejected) {
79866                   untrackRejection(this);
79867               }
79868               return rejected ? rejected(reason) : this;
79869           }
79870       }, function fallback() {
79871           return this;
79872       }, function inspect() {
79873           return { state: "rejected", reason: reason };
79874       });
79875
79876       // Note that the reason has not been handled.
79877       trackRejection(rejection, reason);
79878
79879       return rejection;
79880   }
79881
79882   /**
79883    * Constructs a fulfilled promise for an immediate reference.
79884    * @param value immediate reference
79885    */
79886   Q.fulfill = fulfill;
79887   function fulfill(value) {
79888       return Promise({
79889           "when": function () {
79890               return value;
79891           },
79892           "get": function (name) {
79893               return value[name];
79894           },
79895           "set": function (name, rhs) {
79896               value[name] = rhs;
79897           },
79898           "delete": function (name) {
79899               delete value[name];
79900           },
79901           "post": function (name, args) {
79902               // Mark Miller proposes that post with no name should apply a
79903               // promised function.
79904               if (name === null || name === void 0) {
79905                   return value.apply(void 0, args);
79906               } else {
79907                   return value[name].apply(value, args);
79908               }
79909           },
79910           "apply": function (thisp, args) {
79911               return value.apply(thisp, args);
79912           },
79913           "keys": function () {
79914               return object_keys(value);
79915           }
79916       }, void 0, function inspect() {
79917           return { state: "fulfilled", value: value };
79918       });
79919   }
79920
79921   /**
79922    * Converts thenables to Q promises.
79923    * @param promise thenable promise
79924    * @returns a Q promise
79925    */
79926   function coerce(promise) {
79927       var deferred = defer();
79928       Q.nextTick(function () {
79929           try {
79930               promise.then(deferred.resolve, deferred.reject, deferred.notify);
79931           } catch (exception) {
79932               deferred.reject(exception);
79933           }
79934       });
79935       return deferred.promise;
79936   }
79937
79938   /**
79939    * Annotates an object such that it will never be
79940    * transferred away from this process over any promise
79941    * communication channel.
79942    * @param object
79943    * @returns promise a wrapping of that object that
79944    * additionally responds to the "isDef" message
79945    * without a rejection.
79946    */
79947   Q.master = master;
79948   function master(object) {
79949       return Promise({
79950           "isDef": function () {}
79951       }, function fallback(op, args) {
79952           return dispatch(object, op, args);
79953       }, function () {
79954           return Q(object).inspect();
79955       });
79956   }
79957
79958   /**
79959    * Spreads the values of a promised array of arguments into the
79960    * fulfillment callback.
79961    * @param fulfilled callback that receives variadic arguments from the
79962    * promised array
79963    * @param rejected callback that receives the exception if the promise
79964    * is rejected.
79965    * @returns a promise for the return value or thrown exception of
79966    * either callback.
79967    */
79968   Q.spread = spread;
79969   function spread(value, fulfilled, rejected) {
79970       return Q(value).spread(fulfilled, rejected);
79971   }
79972
79973   Promise.prototype.spread = function (fulfilled, rejected) {
79974       return this.all().then(function (array) {
79975           return fulfilled.apply(void 0, array);
79976       }, rejected);
79977   };
79978
79979   /**
79980    * The async function is a decorator for generator functions, turning
79981    * them into asynchronous generators.  Although generators are only part
79982    * of the newest ECMAScript 6 drafts, this code does not cause syntax
79983    * errors in older engines.  This code should continue to work and will
79984    * in fact improve over time as the language improves.
79985    *
79986    * ES6 generators are currently part of V8 version 3.19 with the
79987    * --harmony-generators runtime flag enabled.  SpiderMonkey has had them
79988    * for longer, but under an older Python-inspired form.  This function
79989    * works on both kinds of generators.
79990    *
79991    * Decorates a generator function such that:
79992    *  - it may yield promises
79993    *  - execution will continue when that promise is fulfilled
79994    *  - the value of the yield expression will be the fulfilled value
79995    *  - it returns a promise for the return value (when the generator
79996    *    stops iterating)
79997    *  - the decorated function returns a promise for the return value
79998    *    of the generator or the first rejected promise among those
79999    *    yielded.
80000    *  - if an error is thrown in the generator, it propagates through
80001    *    every following yield until it is caught, or until it escapes
80002    *    the generator function altogether, and is translated into a
80003    *    rejection for the promise returned by the decorated generator.
80004    */
80005   Q.async = async;
80006   function async(makeGenerator) {
80007       return function () {
80008           // when verb is "send", arg is a value
80009           // when verb is "throw", arg is an exception
80010           function continuer(verb, arg) {
80011               var result;
80012
80013               // Until V8 3.19 / Chromium 29 is released, SpiderMonkey is the only
80014               // engine that has a deployed base of browsers that support generators.
80015               // However, SM's generators use the Python-inspired semantics of
80016               // outdated ES6 drafts.  We would like to support ES6, but we'd also
80017               // like to make it possible to use generators in deployed browsers, so
80018               // we also support Python-style generators.  At some point we can remove
80019               // this block.
80020
80021               if (typeof StopIteration === "undefined") {
80022                   // ES6 Generators
80023                   try {
80024                       result = generator[verb](arg);
80025                   } catch (exception) {
80026                       return reject(exception);
80027                   }
80028                   if (result.done) {
80029                       return Q(result.value);
80030                   } else {
80031                       return when(result.value, callback, errback);
80032                   }
80033               } else {
80034                   // SpiderMonkey Generators
80035                   // FIXME: Remove this case when SM does ES6 generators.
80036                   try {
80037                       result = generator[verb](arg);
80038                   } catch (exception) {
80039                       if (isStopIteration(exception)) {
80040                           return Q(exception.value);
80041                       } else {
80042                           return reject(exception);
80043                       }
80044                   }
80045                   return when(result, callback, errback);
80046               }
80047           }
80048           var generator = makeGenerator.apply(this, arguments);
80049           var callback = continuer.bind(continuer, "next");
80050           var errback = continuer.bind(continuer, "throw");
80051           return callback();
80052       };
80053   }
80054
80055   /**
80056    * The spawn function is a small wrapper around async that immediately
80057    * calls the generator and also ends the promise chain, so that any
80058    * unhandled errors are thrown instead of forwarded to the error
80059    * handler. This is useful because it's extremely common to run
80060    * generators at the top-level to work with libraries.
80061    */
80062   Q.spawn = spawn;
80063   function spawn(makeGenerator) {
80064       Q.done(Q.async(makeGenerator)());
80065   }
80066
80067   // FIXME: Remove this interface once ES6 generators are in SpiderMonkey.
80068   /**
80069    * Throws a ReturnValue exception to stop an asynchronous generator.
80070    *
80071    * This interface is a stop-gap measure to support generator return
80072    * values in older Firefox/SpiderMonkey.  In browsers that support ES6
80073    * generators like Chromium 29, just use "return" in your generator
80074    * functions.
80075    *
80076    * @param value the return value for the surrounding generator
80077    * @throws ReturnValue exception with the value.
80078    * @example
80079    * // ES6 style
80080    * Q.async(function* () {
80081    *      var foo = yield getFooPromise();
80082    *      var bar = yield getBarPromise();
80083    *      return foo + bar;
80084    * })
80085    * // Older SpiderMonkey style
80086    * Q.async(function () {
80087    *      var foo = yield getFooPromise();
80088    *      var bar = yield getBarPromise();
80089    *      Q.return(foo + bar);
80090    * })
80091    */
80092   Q["return"] = _return;
80093   function _return(value) {
80094       throw new QReturnValue(value);
80095   }
80096
80097   /**
80098    * The promised function decorator ensures that any promise arguments
80099    * are settled and passed as values (`this` is also settled and passed
80100    * as a value).  It will also ensure that the result of a function is
80101    * always a promise.
80102    *
80103    * @example
80104    * var add = Q.promised(function (a, b) {
80105    *     return a + b;
80106    * });
80107    * add(Q(a), Q(B));
80108    *
80109    * @param {function} callback The function to decorate
80110    * @returns {function} a function that has been decorated.
80111    */
80112   Q.promised = promised;
80113   function promised(callback) {
80114       return function () {
80115           return spread([this, all(arguments)], function (self, args) {
80116               return callback.apply(self, args);
80117           });
80118       };
80119   }
80120
80121   /**
80122    * sends a message to a value in a future turn
80123    * @param object* the recipient
80124    * @param op the name of the message operation, e.g., "when",
80125    * @param args further arguments to be forwarded to the operation
80126    * @returns result {Promise} a promise for the result of the operation
80127    */
80128   Q.dispatch = dispatch;
80129   function dispatch(object, op, args) {
80130       return Q(object).dispatch(op, args);
80131   }
80132
80133   Promise.prototype.dispatch = function (op, args) {
80134       var self = this;
80135       var deferred = defer();
80136       Q.nextTick(function () {
80137           self.promiseDispatch(deferred.resolve, op, args);
80138       });
80139       return deferred.promise;
80140   };
80141
80142   /**
80143    * Gets the value of a property in a future turn.
80144    * @param object    promise or immediate reference for target object
80145    * @param name      name of property to get
80146    * @return promise for the property value
80147    */
80148   Q.get = function (object, key) {
80149       return Q(object).dispatch("get", [key]);
80150   };
80151
80152   Promise.prototype.get = function (key) {
80153       return this.dispatch("get", [key]);
80154   };
80155
80156   /**
80157    * Sets the value of a property in a future turn.
80158    * @param object    promise or immediate reference for object object
80159    * @param name      name of property to set
80160    * @param value     new value of property
80161    * @return promise for the return value
80162    */
80163   Q.set = function (object, key, value) {
80164       return Q(object).dispatch("set", [key, value]);
80165   };
80166
80167   Promise.prototype.set = function (key, value) {
80168       return this.dispatch("set", [key, value]);
80169   };
80170
80171   /**
80172    * Deletes a property in a future turn.
80173    * @param object    promise or immediate reference for target object
80174    * @param name      name of property to delete
80175    * @return promise for the return value
80176    */
80177   Q.del = // XXX legacy
80178   Q["delete"] = function (object, key) {
80179       return Q(object).dispatch("delete", [key]);
80180   };
80181
80182   Promise.prototype.del = // XXX legacy
80183   Promise.prototype["delete"] = function (key) {
80184       return this.dispatch("delete", [key]);
80185   };
80186
80187   /**
80188    * Invokes a method in a future turn.
80189    * @param object    promise or immediate reference for target object
80190    * @param name      name of method to invoke
80191    * @param value     a value to post, typically an array of
80192    *                  invocation arguments for promises that
80193    *                  are ultimately backed with `resolve` values,
80194    *                  as opposed to those backed with URLs
80195    *                  wherein the posted value can be any
80196    *                  JSON serializable object.
80197    * @return promise for the return value
80198    */
80199   // bound locally because it is used by other methods
80200   Q.mapply = // XXX As proposed by "Redsandro"
80201   Q.post = function (object, name, args) {
80202       return Q(object).dispatch("post", [name, args]);
80203   };
80204
80205   Promise.prototype.mapply = // XXX As proposed by "Redsandro"
80206   Promise.prototype.post = function (name, args) {
80207       return this.dispatch("post", [name, args]);
80208   };
80209
80210   /**
80211    * Invokes a method in a future turn.
80212    * @param object    promise or immediate reference for target object
80213    * @param name      name of method to invoke
80214    * @param ...args   array of invocation arguments
80215    * @return promise for the return value
80216    */
80217   Q.send = // XXX Mark Miller's proposed parlance
80218   Q.mcall = // XXX As proposed by "Redsandro"
80219   Q.invoke = function (object, name /*...args*/) {
80220       return Q(object).dispatch("post", [name, array_slice(arguments, 2)]);
80221   };
80222
80223   Promise.prototype.send = // XXX Mark Miller's proposed parlance
80224   Promise.prototype.mcall = // XXX As proposed by "Redsandro"
80225   Promise.prototype.invoke = function (name /*...args*/) {
80226       return this.dispatch("post", [name, array_slice(arguments, 1)]);
80227   };
80228
80229   /**
80230    * Applies the promised function in a future turn.
80231    * @param object    promise or immediate reference for target function
80232    * @param args      array of application arguments
80233    */
80234   Q.fapply = function (object, args) {
80235       return Q(object).dispatch("apply", [void 0, args]);
80236   };
80237
80238   Promise.prototype.fapply = function (args) {
80239       return this.dispatch("apply", [void 0, args]);
80240   };
80241
80242   /**
80243    * Calls the promised function in a future turn.
80244    * @param object    promise or immediate reference for target function
80245    * @param ...args   array of application arguments
80246    */
80247   Q["try"] =
80248   Q.fcall = function (object /* ...args*/) {
80249       return Q(object).dispatch("apply", [void 0, array_slice(arguments, 1)]);
80250   };
80251
80252   Promise.prototype.fcall = function (/*...args*/) {
80253       return this.dispatch("apply", [void 0, array_slice(arguments)]);
80254   };
80255
80256   /**
80257    * Binds the promised function, transforming return values into a fulfilled
80258    * promise and thrown errors into a rejected one.
80259    * @param object    promise or immediate reference for target function
80260    * @param ...args   array of application arguments
80261    */
80262   Q.fbind = function (object /*...args*/) {
80263       var promise = Q(object);
80264       var args = array_slice(arguments, 1);
80265       return function fbound() {
80266           return promise.dispatch("apply", [
80267               this,
80268               args.concat(array_slice(arguments))
80269           ]);
80270       };
80271   };
80272   Promise.prototype.fbind = function (/*...args*/) {
80273       var promise = this;
80274       var args = array_slice(arguments);
80275       return function fbound() {
80276           return promise.dispatch("apply", [
80277               this,
80278               args.concat(array_slice(arguments))
80279           ]);
80280       };
80281   };
80282
80283   /**
80284    * Requests the names of the owned properties of a promised
80285    * object in a future turn.
80286    * @param object    promise or immediate reference for target object
80287    * @return promise for the keys of the eventually settled object
80288    */
80289   Q.keys = function (object) {
80290       return Q(object).dispatch("keys", []);
80291   };
80292
80293   Promise.prototype.keys = function () {
80294       return this.dispatch("keys", []);
80295   };
80296
80297   /**
80298    * Turns an array of promises into a promise for an array.  If any of
80299    * the promises gets rejected, the whole array is rejected immediately.
80300    * @param {Array*} an array (or promise for an array) of values (or
80301    * promises for values)
80302    * @returns a promise for an array of the corresponding values
80303    */
80304   // By Mark Miller
80305   // http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled
80306   Q.all = all;
80307   function all(promises) {
80308       return when(promises, function (promises) {
80309           var pendingCount = 0;
80310           var deferred = defer();
80311           array_reduce(promises, function (undefined, promise, index) {
80312               var snapshot;
80313               if (
80314                   isPromise(promise) &&
80315                   (snapshot = promise.inspect()).state === "fulfilled"
80316               ) {
80317                   promises[index] = snapshot.value;
80318               } else {
80319                   ++pendingCount;
80320                   when(
80321                       promise,
80322                       function (value) {
80323                           promises[index] = value;
80324                           if (--pendingCount === 0) {
80325                               deferred.resolve(promises);
80326                           }
80327                       },
80328                       deferred.reject,
80329                       function (progress) {
80330                           deferred.notify({ index: index, value: progress });
80331                       }
80332                   );
80333               }
80334           }, void 0);
80335           if (pendingCount === 0) {
80336               deferred.resolve(promises);
80337           }
80338           return deferred.promise;
80339       });
80340   }
80341
80342   Promise.prototype.all = function () {
80343       return all(this);
80344   };
80345
80346   /**
80347    * Returns the first resolved promise of an array. Prior rejected promises are
80348    * ignored.  Rejects only if all promises are rejected.
80349    * @param {Array*} an array containing values or promises for values
80350    * @returns a promise fulfilled with the value of the first resolved promise,
80351    * or a rejected promise if all promises are rejected.
80352    */
80353   Q.any = any;
80354
80355   function any(promises) {
80356       if (promises.length === 0) {
80357           return Q.resolve();
80358       }
80359
80360       var deferred = Q.defer();
80361       var pendingCount = 0;
80362       array_reduce(promises, function (prev, current, index) {
80363           var promise = promises[index];
80364
80365           pendingCount++;
80366
80367           when(promise, onFulfilled, onRejected, onProgress);
80368           function onFulfilled(result) {
80369               deferred.resolve(result);
80370           }
80371           function onRejected(err) {
80372               pendingCount--;
80373               if (pendingCount === 0) {
80374                   var rejection = err || new Error("" + err);
80375
80376                   rejection.message = ("Q can't get fulfillment value from any promise, all " +
80377                       "promises were rejected. Last error message: " + rejection.message);
80378
80379                   deferred.reject(rejection);
80380               }
80381           }
80382           function onProgress(progress) {
80383               deferred.notify({
80384                   index: index,
80385                   value: progress
80386               });
80387           }
80388       }, undefined);
80389
80390       return deferred.promise;
80391   }
80392
80393   Promise.prototype.any = function () {
80394       return any(this);
80395   };
80396
80397   /**
80398    * Waits for all promises to be settled, either fulfilled or
80399    * rejected.  This is distinct from `all` since that would stop
80400    * waiting at the first rejection.  The promise returned by
80401    * `allResolved` will never be rejected.
80402    * @param promises a promise for an array (or an array) of promises
80403    * (or values)
80404    * @return a promise for an array of promises
80405    */
80406   Q.allResolved = deprecate(allResolved, "allResolved", "allSettled");
80407   function allResolved(promises) {
80408       return when(promises, function (promises) {
80409           promises = array_map(promises, Q);
80410           return when(all(array_map(promises, function (promise) {
80411               return when(promise, noop, noop);
80412           })), function () {
80413               return promises;
80414           });
80415       });
80416   }
80417
80418   Promise.prototype.allResolved = function () {
80419       return allResolved(this);
80420   };
80421
80422   /**
80423    * @see Promise#allSettled
80424    */
80425   Q.allSettled = allSettled;
80426   function allSettled(promises) {
80427       return Q(promises).allSettled();
80428   }
80429
80430   /**
80431    * Turns an array of promises into a promise for an array of their states (as
80432    * returned by `inspect`) when they have all settled.
80433    * @param {Array[Any*]} values an array (or promise for an array) of values (or
80434    * promises for values)
80435    * @returns {Array[State]} an array of states for the respective values.
80436    */
80437   Promise.prototype.allSettled = function () {
80438       return this.then(function (promises) {
80439           return all(array_map(promises, function (promise) {
80440               promise = Q(promise);
80441               function regardless() {
80442                   return promise.inspect();
80443               }
80444               return promise.then(regardless, regardless);
80445           }));
80446       });
80447   };
80448
80449   /**
80450    * Captures the failure of a promise, giving an oportunity to recover
80451    * with a callback.  If the given promise is fulfilled, the returned
80452    * promise is fulfilled.
80453    * @param {Any*} promise for something
80454    * @param {Function} callback to fulfill the returned promise if the
80455    * given promise is rejected
80456    * @returns a promise for the return value of the callback
80457    */
80458   Q.fail = // XXX legacy
80459   Q["catch"] = function (object, rejected) {
80460       return Q(object).then(void 0, rejected);
80461   };
80462
80463   Promise.prototype.fail = // XXX legacy
80464   Promise.prototype["catch"] = function (rejected) {
80465       return this.then(void 0, rejected);
80466   };
80467
80468   /**
80469    * Attaches a listener that can respond to progress notifications from a
80470    * promise's originating deferred. This listener receives the exact arguments
80471    * passed to ``deferred.notify``.
80472    * @param {Any*} promise for something
80473    * @param {Function} callback to receive any progress notifications
80474    * @returns the given promise, unchanged
80475    */
80476   Q.progress = progress;
80477   function progress(object, progressed) {
80478       return Q(object).then(void 0, void 0, progressed);
80479   }
80480
80481   Promise.prototype.progress = function (progressed) {
80482       return this.then(void 0, void 0, progressed);
80483   };
80484
80485   /**
80486    * Provides an opportunity to observe the settling of a promise,
80487    * regardless of whether the promise is fulfilled or rejected.  Forwards
80488    * the resolution to the returned promise when the callback is done.
80489    * The callback can return a promise to defer completion.
80490    * @param {Any*} promise
80491    * @param {Function} callback to observe the resolution of the given
80492    * promise, takes no arguments.
80493    * @returns a promise for the resolution of the given promise when
80494    * ``fin`` is done.
80495    */
80496   Q.fin = // XXX legacy
80497   Q["finally"] = function (object, callback) {
80498       return Q(object)["finally"](callback);
80499   };
80500
80501   Promise.prototype.fin = // XXX legacy
80502   Promise.prototype["finally"] = function (callback) {
80503       if (!callback || typeof callback.apply !== "function") {
80504           throw new Error("Q can't apply finally callback");
80505       }
80506       callback = Q(callback);
80507       return this.then(function (value) {
80508           return callback.fcall().then(function () {
80509               return value;
80510           });
80511       }, function (reason) {
80512           // TODO attempt to recycle the rejection with "this".
80513           return callback.fcall().then(function () {
80514               throw reason;
80515           });
80516       });
80517   };
80518
80519   /**
80520    * Terminates a chain of promises, forcing rejections to be
80521    * thrown as exceptions.
80522    * @param {Any*} promise at the end of a chain of promises
80523    * @returns nothing
80524    */
80525   Q.done = function (object, fulfilled, rejected, progress) {
80526       return Q(object).done(fulfilled, rejected, progress);
80527   };
80528
80529   Promise.prototype.done = function (fulfilled, rejected, progress) {
80530       var onUnhandledError = function (error) {
80531           // forward to a future turn so that ``when``
80532           // does not catch it and turn it into a rejection.
80533           Q.nextTick(function () {
80534               makeStackTraceLong(error, promise);
80535               if (Q.onerror) {
80536                   Q.onerror(error);
80537               } else {
80538                   throw error;
80539               }
80540           });
80541       };
80542
80543       // Avoid unnecessary `nextTick`ing via an unnecessary `when`.
80544       var promise = fulfilled || rejected || progress ?
80545           this.then(fulfilled, rejected, progress) :
80546           this;
80547
80548       if (typeof process === "object" && process && process.domain) {
80549           onUnhandledError = process.domain.bind(onUnhandledError);
80550       }
80551
80552       promise.then(void 0, onUnhandledError);
80553   };
80554
80555   /**
80556    * Causes a promise to be rejected if it does not get fulfilled before
80557    * some milliseconds time out.
80558    * @param {Any*} promise
80559    * @param {Number} milliseconds timeout
80560    * @param {Any*} custom error message or Error object (optional)
80561    * @returns a promise for the resolution of the given promise if it is
80562    * fulfilled before the timeout, otherwise rejected.
80563    */
80564   Q.timeout = function (object, ms, error) {
80565       return Q(object).timeout(ms, error);
80566   };
80567
80568   Promise.prototype.timeout = function (ms, error) {
80569       var deferred = defer();
80570       var timeoutId = setTimeout(function () {
80571           if (!error || "string" === typeof error) {
80572               error = new Error(error || "Timed out after " + ms + " ms");
80573               error.code = "ETIMEDOUT";
80574           }
80575           deferred.reject(error);
80576       }, ms);
80577
80578       this.then(function (value) {
80579           clearTimeout(timeoutId);
80580           deferred.resolve(value);
80581       }, function (exception) {
80582           clearTimeout(timeoutId);
80583           deferred.reject(exception);
80584       }, deferred.notify);
80585
80586       return deferred.promise;
80587   };
80588
80589   /**
80590    * Returns a promise for the given value (or promised value), some
80591    * milliseconds after it resolved. Passes rejections immediately.
80592    * @param {Any*} promise
80593    * @param {Number} milliseconds
80594    * @returns a promise for the resolution of the given promise after milliseconds
80595    * time has elapsed since the resolution of the given promise.
80596    * If the given promise rejects, that is passed immediately.
80597    */
80598   Q.delay = function (object, timeout) {
80599       if (timeout === void 0) {
80600           timeout = object;
80601           object = void 0;
80602       }
80603       return Q(object).delay(timeout);
80604   };
80605
80606   Promise.prototype.delay = function (timeout) {
80607       return this.then(function (value) {
80608           var deferred = defer();
80609           setTimeout(function () {
80610               deferred.resolve(value);
80611           }, timeout);
80612           return deferred.promise;
80613       });
80614   };
80615
80616   /**
80617    * Passes a continuation to a Node function, which is called with the given
80618    * arguments provided as an array, and returns a promise.
80619    *
80620    *      Q.nfapply(FS.readFile, [__filename])
80621    *      .then(function (content) {
80622    *      })
80623    *
80624    */
80625   Q.nfapply = function (callback, args) {
80626       return Q(callback).nfapply(args);
80627   };
80628
80629   Promise.prototype.nfapply = function (args) {
80630       var deferred = defer();
80631       var nodeArgs = array_slice(args);
80632       nodeArgs.push(deferred.makeNodeResolver());
80633       this.fapply(nodeArgs).fail(deferred.reject);
80634       return deferred.promise;
80635   };
80636
80637   /**
80638    * Passes a continuation to a Node function, which is called with the given
80639    * arguments provided individually, and returns a promise.
80640    * @example
80641    * Q.nfcall(FS.readFile, __filename)
80642    * .then(function (content) {
80643    * })
80644    *
80645    */
80646   Q.nfcall = function (callback /*...args*/) {
80647       var args = array_slice(arguments, 1);
80648       return Q(callback).nfapply(args);
80649   };
80650
80651   Promise.prototype.nfcall = function (/*...args*/) {
80652       var nodeArgs = array_slice(arguments);
80653       var deferred = defer();
80654       nodeArgs.push(deferred.makeNodeResolver());
80655       this.fapply(nodeArgs).fail(deferred.reject);
80656       return deferred.promise;
80657   };
80658
80659   /**
80660    * Wraps a NodeJS continuation passing function and returns an equivalent
80661    * version that returns a promise.
80662    * @example
80663    * Q.nfbind(FS.readFile, __filename)("utf-8")
80664    * .then(console.log)
80665    * .done()
80666    */
80667   Q.nfbind =
80668   Q.denodeify = function (callback /*...args*/) {
80669       if (callback === undefined) {
80670           throw new Error("Q can't wrap an undefined function");
80671       }
80672       var baseArgs = array_slice(arguments, 1);
80673       return function () {
80674           var nodeArgs = baseArgs.concat(array_slice(arguments));
80675           var deferred = defer();
80676           nodeArgs.push(deferred.makeNodeResolver());
80677           Q(callback).fapply(nodeArgs).fail(deferred.reject);
80678           return deferred.promise;
80679       };
80680   };
80681
80682   Promise.prototype.nfbind =
80683   Promise.prototype.denodeify = function (/*...args*/) {
80684       var args = array_slice(arguments);
80685       args.unshift(this);
80686       return Q.denodeify.apply(void 0, args);
80687   };
80688
80689   Q.nbind = function (callback, thisp /*...args*/) {
80690       var baseArgs = array_slice(arguments, 2);
80691       return function () {
80692           var nodeArgs = baseArgs.concat(array_slice(arguments));
80693           var deferred = defer();
80694           nodeArgs.push(deferred.makeNodeResolver());
80695           function bound() {
80696               return callback.apply(thisp, arguments);
80697           }
80698           Q(bound).fapply(nodeArgs).fail(deferred.reject);
80699           return deferred.promise;
80700       };
80701   };
80702
80703   Promise.prototype.nbind = function (/*thisp, ...args*/) {
80704       var args = array_slice(arguments, 0);
80705       args.unshift(this);
80706       return Q.nbind.apply(void 0, args);
80707   };
80708
80709   /**
80710    * Calls a method of a Node-style object that accepts a Node-style
80711    * callback with a given array of arguments, plus a provided callback.
80712    * @param object an object that has the named method
80713    * @param {String} name name of the method of object
80714    * @param {Array} args arguments to pass to the method; the callback
80715    * will be provided by Q and appended to these arguments.
80716    * @returns a promise for the value or error
80717    */
80718   Q.nmapply = // XXX As proposed by "Redsandro"
80719   Q.npost = function (object, name, args) {
80720       return Q(object).npost(name, args);
80721   };
80722
80723   Promise.prototype.nmapply = // XXX As proposed by "Redsandro"
80724   Promise.prototype.npost = function (name, args) {
80725       var nodeArgs = array_slice(args || []);
80726       var deferred = defer();
80727       nodeArgs.push(deferred.makeNodeResolver());
80728       this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
80729       return deferred.promise;
80730   };
80731
80732   /**
80733    * Calls a method of a Node-style object that accepts a Node-style
80734    * callback, forwarding the given variadic arguments, plus a provided
80735    * callback argument.
80736    * @param object an object that has the named method
80737    * @param {String} name name of the method of object
80738    * @param ...args arguments to pass to the method; the callback will
80739    * be provided by Q and appended to these arguments.
80740    * @returns a promise for the value or error
80741    */
80742   Q.nsend = // XXX Based on Mark Miller's proposed "send"
80743   Q.nmcall = // XXX Based on "Redsandro's" proposal
80744   Q.ninvoke = function (object, name /*...args*/) {
80745       var nodeArgs = array_slice(arguments, 2);
80746       var deferred = defer();
80747       nodeArgs.push(deferred.makeNodeResolver());
80748       Q(object).dispatch("post", [name, nodeArgs]).fail(deferred.reject);
80749       return deferred.promise;
80750   };
80751
80752   Promise.prototype.nsend = // XXX Based on Mark Miller's proposed "send"
80753   Promise.prototype.nmcall = // XXX Based on "Redsandro's" proposal
80754   Promise.prototype.ninvoke = function (name /*...args*/) {
80755       var nodeArgs = array_slice(arguments, 1);
80756       var deferred = defer();
80757       nodeArgs.push(deferred.makeNodeResolver());
80758       this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
80759       return deferred.promise;
80760   };
80761
80762   /**
80763    * If a function would like to support both Node continuation-passing-style and
80764    * promise-returning-style, it can end its internal promise chain with
80765    * `nodeify(nodeback)`, forwarding the optional nodeback argument.  If the user
80766    * elects to use a nodeback, the result will be sent there.  If they do not
80767    * pass a nodeback, they will receive the result promise.
80768    * @param object a result (or a promise for a result)
80769    * @param {Function} nodeback a Node.js-style callback
80770    * @returns either the promise or nothing
80771    */
80772   Q.nodeify = nodeify;
80773   function nodeify(object, nodeback) {
80774       return Q(object).nodeify(nodeback);
80775   }
80776
80777   Promise.prototype.nodeify = function (nodeback) {
80778       if (nodeback) {
80779           this.then(function (value) {
80780               Q.nextTick(function () {
80781                   nodeback(null, value);
80782               });
80783           }, function (error) {
80784               Q.nextTick(function () {
80785                   nodeback(error);
80786               });
80787           });
80788       } else {
80789           return this;
80790       }
80791   };
80792
80793   Q.noConflict = function() {
80794       throw new Error("Q.noConflict only works when Q is used as a global");
80795   };
80796
80797   // All code before this point will be filtered from stack traces.
80798   var qEndingLine = captureLine();
80799
80800   return Q;
80801
80802   });
80803   });
80804
80805   var bubbleApi = 'https://dev.virtualearth.net/mapcontrol/HumanScaleServices/GetBubbles.ashx?';
80806   var streetsideImagesApi = 'https://t.ssl.ak.tiles.virtualearth.net/tiles/';
80807   var bubbleAppKey = 'AuftgJsO0Xs8Ts4M1xZUQJQXJNsvmh3IV8DkNieCiy3tCwCUMq76-WpkrBtNAuEm';
80808   var pannellumViewerCSS = 'pannellum-streetside/pannellum.css';
80809   var pannellumViewerJS = 'pannellum-streetside/pannellum.js';
80810   var maxResults$2 = 2000;
80811   var tileZoom$2 = 16.5;
80812   var tiler$4 = utilTiler().zoomExtent([tileZoom$2, tileZoom$2]).skipNullIsland(true);
80813   var dispatch$5 = dispatch('loadedBubbles', 'viewerChanged');
80814   var minHfov = 10;         // zoom in degrees:  20, 10, 5
80815   var maxHfov = 90;         // zoom out degrees
80816   var defaultHfov = 45;
80817
80818   var _hires = false;
80819   var _resolution = 512;    // higher numbers are slower - 512, 1024, 2048, 4096
80820   var _currScene = 0;
80821   var _ssCache;
80822   var _pannellumViewer;
80823   var _sceneOptions;
80824   var _dataUrlArray = [];
80825
80826
80827   /**
80828    * abortRequest().
80829    */
80830   function abortRequest$4(i) {
80831       i.abort();
80832   }
80833
80834
80835   /**
80836    * localeTimeStamp().
80837    */
80838   function localeTimestamp(s) {
80839       if (!s) return null;
80840       var detected = utilDetect();
80841       var options = { day: 'numeric', month: 'short', year: 'numeric' };
80842       var d = new Date(s);
80843       if (isNaN(d.getTime())) return null;
80844       return d.toLocaleString(detected.locale, options);
80845   }
80846
80847
80848   /**
80849    * loadTiles() wraps the process of generating tiles and then fetching image points for each tile.
80850    */
80851   function loadTiles$2(which, url, projection, margin) {
80852       var tiles = tiler$4.margin(margin).getTiles(projection);
80853
80854       // abort inflight requests that are no longer needed
80855       var cache = _ssCache[which];
80856       forEach(cache.inflight, function(v, k) {
80857           var wanted = find$1(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; });
80858
80859           if (!wanted) {
80860               abortRequest$4(v);
80861               delete cache.inflight[k];
80862           }
80863       });
80864
80865       tiles.forEach(function (tile) {
80866          loadNextTilePage$2(which, url, tile);
80867       });
80868   }
80869
80870   /**
80871    * loadNextTilePage() load data for the next tile page in line.
80872    */
80873   function loadNextTilePage$2(which, url, tile) {
80874       var cache = _ssCache[which];
80875       var nextPage = cache.nextPage[tile.id] || 0;
80876       var id = tile.id + ',' + String(nextPage);
80877       if (cache.loaded[id] || cache.inflight[id]) return;
80878
80879       cache.inflight[id] = getBubbles(url, tile, function(bubbles) {
80880           cache.loaded[id] = true;
80881           delete cache.inflight[id];
80882           if (!bubbles) return;
80883
80884           // [].shift() removes the first element, some statistics info, not a bubble point
80885           bubbles.shift();
80886
80887           var features = bubbles.map(function(bubble) {
80888               if (cache.points[bubble.id]) return null;  // skip duplicates
80889
80890               var loc = [bubble.lo, bubble.la];
80891               var d = {
80892                   loc: loc,
80893                   key: bubble.id,
80894                   ca: bubble.he,
80895                   captured_at: bubble.cd,
80896                   captured_by: 'microsoft',
80897                   // nbn: bubble.nbn,
80898                   // pbn: bubble.pbn,
80899                   // ad: bubble.ad,
80900                   // rn: bubble.rn,
80901                   pr: bubble.pr,  // previous
80902                   ne: bubble.ne,  // next
80903                   pano: true,
80904                   sequenceKey: null
80905               };
80906
80907               cache.points[bubble.id] = d;
80908
80909               // a sequence starts here
80910               if (bubble.pr === undefined) {
80911                   cache.leaders.push(bubble.id);
80912               }
80913
80914               return {
80915                   minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
80916               };
80917
80918           }).filter(Boolean);
80919
80920           cache.rtree.load(features);
80921
80922           connectSequences();
80923
80924           if (which === 'bubbles') {
80925               dispatch$5.call('loadedBubbles');
80926           }
80927       });
80928   }
80929
80930
80931   // call this sometimes to connect the bubbles into sequences
80932   function connectSequences() {
80933       var cache = _ssCache.bubbles;
80934       var keepLeaders = [];
80935
80936       for (var i = 0; i < cache.leaders.length; i++) {
80937           var bubble = cache.points[cache.leaders[i]];
80938           var seen = {};
80939
80940           // try to make a sequence.. use the key of the leader bubble.
80941           var sequence = { key: bubble.key, bubbles: [] };
80942           var complete = false;
80943
80944           do {
80945               sequence.bubbles.push(bubble);
80946               seen[bubble.key] = true;
80947
80948               if (bubble.ne === undefined) {
80949                   complete = true;
80950               } else {
80951                   bubble = cache.points[bubble.ne];  // advance to next
80952               }
80953           } while (bubble && !seen[bubble.key] && !complete);
80954
80955
80956           if (complete) {
80957               _ssCache.sequences[sequence.key] = sequence;
80958
80959               // assign bubbles to the sequence
80960               for (var j = 0; j < sequence.bubbles.length; j++) {
80961                   sequence.bubbles[j].sequenceKey = sequence.key;
80962               }
80963
80964               // create a GeoJSON LineString
80965               sequence.geojson = {
80966                   type: 'LineString',
80967                   properties: { key: sequence.key },
80968                   coordinates: sequence.bubbles.map(function (d) { return d.loc; })
80969               };
80970
80971           } else {
80972               keepLeaders.push(cache.leaders[i]);
80973           }
80974       }
80975
80976       // couldn't complete these, save for later
80977       cache.leaders = keepLeaders;
80978   }
80979
80980   /**
80981    * getBubbles() handles the request to the server for a tile extent of 'bubbles' (streetside image locations).
80982    */
80983   function getBubbles(url, tile, callback) {
80984       var rect = tile.extent.rectangle();
80985       var urlForRequest = url + utilQsString({
80986           n: rect[3],
80987           s: rect[1],
80988           e: rect[2],
80989           w: rect[0],
80990           c: maxResults$2,
80991           appkey: bubbleAppKey,
80992           jsCallback: '{callback}'
80993       });
80994
80995       return jsonpRequest(urlForRequest, function (data) {
80996           if (!data || data.error) {
80997               callback(null);
80998           } else {
80999               callback(data);
81000           }
81001       });
81002   }
81003
81004
81005   // partition viewport into higher zoom tiles
81006   function partitionViewport$2(projection) {
81007       var z = geoScaleToZoom(projection.scale());
81008       var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
81009       var tiler = utilTiler().zoomExtent([z2, z2]);
81010
81011       return tiler.getTiles(projection)
81012           .map(function(tile) { return tile.extent; });
81013   }
81014
81015
81016   // no more than `limit` results per partition.
81017   function searchLimited$2(limit, projection, rtree) {
81018       limit = limit || 5;
81019
81020       return partitionViewport$2(projection)
81021           .reduce(function(result, extent) {
81022               var found = rtree.search(extent.bbox())
81023                   .slice(0, limit)
81024                   .map(function(d) { return d.data; });
81025
81026               return (found.length ? result.concat(found) : result);
81027           }, []);
81028   }
81029
81030
81031   /**
81032    * getImage()
81033    */
81034   function getImage(imgInfo) {
81035       var response = q.defer();
81036       var img = new Image();
81037
81038       img.onload = function() {
81039           var canvas = document.getElementById('canvas' + imgInfo.face);
81040           var ctx = canvas.getContext('2d');
81041           ctx.drawImage(img, imgInfo.x, imgInfo.y);
81042           response.resolve({imgInfo:imgInfo, status: 'ok'});
81043       };
81044       img.onerror = function() {
81045           response.resolve({data: imgInfo, status: 'error'});
81046       };
81047       img.setAttribute('crossorigin', '');
81048       img.src = imgInfo.url;
81049
81050       return response.promise;
81051   }
81052
81053
81054   /**
81055    * loadCanvas()
81056    */
81057   function loadCanvas(imgInfoGroup) {
81058       var response = q.defer();
81059       var getImagePromises = imgInfoGroup.map(function(imgInfo) {
81060           return getImage(imgInfo);
81061       });
81062
81063       q.all(getImagePromises).then(function(data) {
81064           var canvas = document.getElementById('canvas' + data[0].imgInfo.face);
81065           switch (data[0].imgInfo.face) {
81066               case '01':
81067                   _dataUrlArray[0] = canvas.toDataURL('image/jpeg', 1.0);
81068                   break;
81069               case '02':
81070                   _dataUrlArray[1] = canvas.toDataURL('image/jpeg', 1.0);
81071                   break;
81072               case '03':
81073                   _dataUrlArray[2] = canvas.toDataURL('image/jpeg', 1.0);
81074                   break;
81075               case '10':
81076                   _dataUrlArray[3] = canvas.toDataURL('image/jpeg', 1.0);
81077                   break;
81078               case '11':
81079                   _dataUrlArray[4] = canvas.toDataURL('image/jpeg', 1.0);
81080                   break;
81081               case '12':
81082                   _dataUrlArray[5] = canvas.toDataURL('image/jpeg', 1.0);
81083                   break;
81084           }
81085           response.resolve({status:'loadCanvas for face ' + data[0].imgInfo.face + 'ok'});
81086       });
81087
81088       return response.promise;
81089   }
81090
81091
81092   function setupCanvas(selection$$1, reset) {
81093       if (reset) {
81094           selection$$1.selectAll('#divForCanvasWork')
81095               .remove();
81096       }
81097
81098       // Add the Streetside working canvases. These are used for 'stitching', or combining,
81099       // multiple images for each of the six faces, before passing to the Pannellum control as DataUrls
81100       selection$$1.selectAll('#divForCanvasWork')
81101           .data([0])
81102           .enter()
81103           .append('div')
81104           .attr('id', 'divForCanvasWork')
81105           .attr('display', 'none')
81106           .selectAll('canvas')
81107           .data(['canvas01', 'canvas02', 'canvas03', 'canvas10', 'canvas11', 'canvas12'])
81108           .enter()
81109           .append('canvas')
81110           .attr('id', function(d) { return d; })
81111           .attr('width', _resolution)
81112           .attr('height', _resolution);
81113   }
81114
81115
81116   /**
81117    * processFaces()
81118    */
81119   function processFaces(imgFaceInfoGroups) {
81120       var response = q.defer();
81121       var loadCanvasPromises = imgFaceInfoGroups.map(function(faceImgGroup) {
81122           return loadCanvas(faceImgGroup);
81123       });
81124
81125       q.all(loadCanvasPromises).then(function() {
81126           response.resolve({status: 'processFaces done'});
81127       });
81128
81129       return response.promise;
81130   }
81131
81132
81133
81134   function qkToXY(qk) {
81135       var x = 0;
81136       var y = 0;
81137       var scale = 256;
81138       for (var i = qk.length; i > 0; i--) {
81139           var key = qk[i-1];
81140           x += (+(key === '1' || key === '3')) * scale;
81141           y += (+(key === '2' || key === '3')) * scale;
81142           scale *= 2;
81143       }
81144       return [x, y];
81145   }
81146
81147
81148   function getQuadKeys() {
81149       var dim = _resolution / 256;
81150       var quadKeys;
81151
81152       if (dim === 16) {
81153           quadKeys = [
81154               '0000','0001','0010','0011','0100','0101','0110','0111',  '1000','1001','1010','1011','1100','1101','1110','1111',
81155               '0002','0003','0012','0013','0102','0103','0112','0113',  '1002','1003','1012','1013','1102','1103','1112','1113',
81156               '0020','0021','0030','0031','0120','0121','0130','0131',  '1020','1021','1030','1031','1120','1121','1130','1131',
81157               '0022','0023','0032','0033','0122','0123','0132','0133',  '1022','1023','1032','1033','1122','1123','1132','1133',
81158               '0200','0201','0210','0211','0300','0301','0310','0311',  '1200','1201','1210','1211','1300','1301','1310','1311',
81159               '0202','0203','0212','0213','0302','0303','0312','0313',  '1202','1203','1212','1213','1302','1303','1312','1313',
81160               '0220','0221','0230','0231','0320','0321','0330','0331',  '1220','1221','1230','1231','1320','1321','1330','1331',
81161               '0222','0223','0232','0233','0322','0323','0332','0333',  '1222','1223','1232','1233','1322','1323','1332','1333',
81162
81163               '2000','2001','2010','2011','2100','2101','2110','2111',  '3000','3001','3010','3011','3100','3101','3110','3111',
81164               '2002','2003','2012','2013','2102','2103','2112','2113',  '3002','3003','3012','3013','3102','3103','3112','3113',
81165               '2020','2021','2030','2031','2120','2121','2130','2131',  '3020','3021','3030','3031','3120','3121','3130','3131',
81166               '2022','2023','2032','2033','2122','2123','2132','2133',  '3022','3023','3032','3033','3122','3123','3132','3133',
81167               '2200','2201','2210','2211','2300','2301','2310','2311',  '3200','3201','3210','3211','3300','3301','3310','3311',
81168               '2202','2203','2212','2213','2302','2303','2312','2313',  '3202','3203','3212','3213','3302','3303','3312','3313',
81169               '2220','2221','2230','2231','2320','2321','2330','2331',  '3220','3221','3230','3231','3320','3321','3330','3331',
81170               '2222','2223','2232','2233','2322','2323','2332','2333',  '3222','3223','3232','3233','3322','3323','3332','3333'
81171           ];
81172
81173       } else if (dim === 8) {
81174           quadKeys = [
81175               '000','001','010','011',  '100','101','110','111',
81176               '002','003','012','013',  '102','103','112','113',
81177               '020','021','030','031',  '120','121','130','131',
81178               '022','023','032','033',  '122','123','132','133',
81179
81180               '200','201','210','211',  '300','301','310','311',
81181               '202','203','212','213',  '302','303','312','313',
81182               '220','221','230','231',  '320','321','330','331',
81183               '222','223','232','233',  '322','323','332','333'
81184           ];
81185
81186       } else if (dim === 4) {
81187           quadKeys = [
81188               '00','01',  '10','11',
81189               '02','03',  '12','13',
81190
81191               '20','21',  '30','31',
81192               '22','23',  '32','33'
81193           ];
81194
81195       } else {  // dim === 2
81196           quadKeys = [
81197               '0', '1',
81198               '2', '3'
81199           ];
81200       }
81201
81202       return quadKeys;
81203   }
81204
81205
81206
81207   var serviceStreetside = {
81208       /**
81209        * init() initialize streetside.
81210        */
81211       init: function () {
81212           if (!_ssCache) {
81213               this.reset();
81214           }
81215
81216           this.event = utilRebind(this, dispatch$5, 'on');
81217       },
81218
81219       /**
81220        * reset() reset the cache.
81221        */
81222       reset: function () {
81223           var cache = _ssCache;
81224
81225           if (cache) {
81226               if (cache.bubbles && cache.bubbles.inflight) {
81227                   forEach(cache.bubbles.inflight, abortRequest$4);
81228               }
81229           }
81230
81231           _ssCache = {
81232               bubbles: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1(), points: {}, leaders: [] },
81233               sequences: {}
81234           };
81235       },
81236
81237       /**
81238        * bubbles()
81239        */
81240       bubbles: function (projection) {
81241           var limit = 5;
81242           return searchLimited$2(limit, projection, _ssCache.bubbles.rtree);
81243       },
81244
81245
81246       sequences: function(projection) {
81247           var viewport = projection.clipExtent();
81248           var min = [viewport[0][0], viewport[1][1]];
81249           var max = [viewport[1][0], viewport[0][1]];
81250           var bbox = geoExtent$$1(projection.invert(min), projection.invert(max)).bbox();
81251           var seen = {};
81252           var results = [];
81253
81254           // all sequences for bubbles in viewport
81255           _ssCache.bubbles.rtree.search(bbox)
81256               .forEach(function(d) {
81257                   var key = d.data.sequenceKey;
81258                   if (key && !seen[key]) {
81259                       seen[key] = true;
81260                       results.push(_ssCache.sequences[key].geojson);
81261                   }
81262               });
81263
81264           return results;
81265       },
81266
81267
81268       /**
81269        * loadBubbles()
81270        */
81271       loadBubbles: function (projection, margin) {
81272           // by default: request 2 nearby tiles so we can connect sequences.
81273           if (margin === undefined) margin = 2;
81274
81275           loadTiles$2('bubbles', bubbleApi, projection, margin);
81276       },
81277
81278
81279       viewer: function() {
81280           return _pannellumViewer;
81281       },
81282
81283
81284       initViewer: function () {
81285           if (!window.pannellum) return;
81286           if (_pannellumViewer) return;
81287
81288           var sceneID = ++_currScene + '';
81289           var options = {
81290               'default': { firstScene: sceneID },
81291               scenes: {}
81292           };
81293           options.scenes[sceneID] = _sceneOptions;
81294
81295           _pannellumViewer = window.pannellum.viewer('viewer-streetside', options);
81296
81297           _pannellumViewer
81298               .on('mousedown', function() {
81299                   select(window).on('mousemove.pannellum', function() {
81300                       dispatch$5.call('viewerChanged');
81301                   });
81302               })
81303               .on('mouseup', function() {
81304                   select(window).on('mousemove.pannellum', null);
81305                   // continue dispatching events for a few seconds, in case viewer has inertia.
81306                   var t$$1 = timer(function(elapsed) {
81307                       dispatch$5.call('viewerChanged');
81308                       if (elapsed > 2000) {
81309                           t$$1.stop();
81310                       }
81311                   });
81312               });
81313       },
81314
81315
81316       /**
81317        * loadViewer() create the streeside viewer.
81318        */
81319       loadViewer: function (context) {
81320           var that = this;
81321
81322           // create ms-wrapper, a photo wrapper class
81323           var wrap = select('#photoviewer').selectAll('.ms-wrapper')
81324               .data([0]);
81325
81326           // inject ms-wrapper into the photoviewer div
81327           // (used by all to house each custom photo viewer)
81328           var wrapEnter = wrap.enter()
81329               .append('div')
81330               .attr('id', 'ms')
81331               .attr('class', 'photo-wrapper ms-wrapper')
81332               .classed('hide', true);
81333
81334           // inject div to support streetside viewer (pannellum) and attribution line
81335           wrapEnter
81336               .append('div')
81337               .attr('id', 'viewer-streetside')
81338               .append('div')
81339               .attr('class', 'photo-attribution fillD');
81340
81341           var controlsEnter = wrapEnter
81342               .append('div')
81343               .attr('class', 'photo-controls-wrap')
81344               .append('div')
81345               .attr('class', 'photo-controls');
81346
81347           controlsEnter
81348               .append('button')
81349               .on('click.back', step(-1))
81350               .text('◄');
81351
81352           controlsEnter
81353               .append('button')
81354               .on('click.forward', step(1))
81355               .text('►');
81356
81357
81358           // create working canvas for stitching together images
81359           wrap = wrap
81360               .merge(wrapEnter)
81361               .call(setupCanvas, true);
81362
81363           // load streetside pannellum viewer css
81364           select('head').selectAll('#streetside-viewercss')
81365               .data([0])
81366               .enter()
81367               .append('link')
81368               .attr('id', 'streetside-viewercss')
81369               .attr('rel', 'stylesheet')
81370               .attr('href', context.asset(pannellumViewerCSS));
81371
81372           // load streetside pannellum viewer js
81373           select('head').selectAll('#streetside-viewerjs')
81374               .data([0])
81375               .enter()
81376               .append('script')
81377               .attr('id', 'streetside-viewerjs')
81378               .attr('src', context.asset(pannellumViewerJS));
81379
81380
81381           // Register viewer resize handler
81382           context.ui().photoviewer.on('resize', function() {
81383               if (_pannellumViewer) {
81384                   _pannellumViewer.resize();
81385               }
81386           });
81387
81388
81389           function step(stepBy) {
81390               return function() {
81391                   var viewer = select('#photoviewer');
81392                   var selected = viewer.empty() ? undefined : viewer.datum();
81393                   if (!selected) return;
81394
81395                   var nextID = (stepBy === 1 ? selected.ne : selected.pr);
81396                   var yaw = _pannellumViewer.getYaw();
81397                   var ca = selected.ca + yaw;
81398                   var origin = selected.loc;
81399
81400                   // construct a search trapezoid pointing out from current bubble
81401                   var meters = 35;
81402                   var p1 = [
81403                       origin[0] + geoMetersToLon(meters / 5, origin[1]),
81404                       origin[1]
81405                   ];
81406                   var p2 = [
81407                       origin[0] + geoMetersToLon(meters / 2, origin[1]),
81408                       origin[1] + geoMetersToLat(meters)
81409                   ];
81410                   var p3 = [
81411                       origin[0] - geoMetersToLon(meters / 2, origin[1]),
81412                       origin[1] + geoMetersToLat(meters)
81413                   ];
81414                   var p4 = [
81415                       origin[0] - geoMetersToLon(meters / 5, origin[1]),
81416                       origin[1]
81417                   ];
81418
81419                   var poly = [p1, p2, p3, p4, p1];
81420
81421                   // rotate it to face forward/backward
81422                   var angle = (stepBy === 1 ? ca : ca + 180) * (Math.PI / 180);
81423                   poly = geoRotate(poly, -angle, origin);
81424
81425                   var extent = poly.reduce(function(extent, point$$1) {
81426                       return extent.extend(geoExtent$$1(point$$1));
81427                   }, geoExtent$$1());
81428
81429                   // find nearest other bubble in the search polygon
81430                   var minDist = Infinity;
81431                   _ssCache.bubbles.rtree.search(extent.bbox())
81432                       .forEach(function(d) {
81433                           if (d.data.key === selected.key) return;
81434                           if (!geoPointInPolygon(d.data.loc, poly)) return;
81435
81436                           var dist = geoVecLength(d.data.loc, selected.loc);
81437                           var theta = selected.ca - d.data.ca;
81438                           var minTheta = Math.min(Math.abs(theta), 360 - Math.abs(theta));
81439                           if (minTheta > 20) {
81440                               dist += 5;  // penalize distance if camera angles don't match
81441                           }
81442
81443                           if (dist < minDist) {
81444                               nextID = d.data.key;
81445                               minDist = dist;
81446                           }
81447                       });
81448
81449                   var nextBubble = nextID && _ssCache.bubbles.points[nextID];
81450                   if (!nextBubble) return;
81451
81452                   context.map().centerEase(nextBubble.loc);
81453
81454                   that.selectImage(nextBubble)
81455                       .then(function(r) {
81456                           if (r.status === 'ok') {
81457                               _sceneOptions.yaw = yaw;
81458                               that.showViewer();
81459                           }
81460                       });
81461               };
81462           }
81463       },
81464
81465       /**
81466        * showViewer()
81467        */
81468       showViewer: function (yaw) {
81469           if (!_sceneOptions) return;
81470
81471           if (yaw !== undefined) {
81472               _sceneOptions.yaw = yaw;
81473           }
81474
81475           if (!_pannellumViewer) {
81476               this.initViewer();
81477           } else {
81478               // make a new scene
81479               var sceneID = ++_currScene + '';
81480               _pannellumViewer
81481                   .addScene(sceneID, _sceneOptions)
81482                   .loadScene(sceneID);
81483
81484               // remove previous scene
81485               if (_currScene > 2) {
81486                   sceneID = (_currScene - 1) + '';
81487                   _pannellumViewer
81488                       .removeScene(sceneID);
81489               }
81490           }
81491
81492           var wrap = select('#photoviewer')
81493               .classed('hide', false);
81494
81495           var isHidden = wrap.selectAll('.photo-wrapper.ms-wrapper.hide').size();
81496
81497           if (isHidden) {
81498               wrap
81499                   .selectAll('.photo-wrapper:not(.ms-wrapper)')
81500                   .classed('hide', true);
81501
81502               wrap
81503                   .selectAll('.photo-wrapper.ms-wrapper')
81504                   .classed('hide', false);
81505           }
81506
81507           return this;
81508       },
81509
81510       /**
81511        * hideViewer()
81512        */
81513       hideViewer: function () {
81514           var viewer = select('#photoviewer');
81515           if (!viewer.empty()) viewer.datum(null);
81516
81517           viewer
81518               .classed('hide', true)
81519               .selectAll('.photo-wrapper')
81520               .classed('hide', true);
81521
81522           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
81523               .classed('selected', false);
81524
81525           return this.setStyles(null, true);
81526       },
81527
81528       /**
81529        * selectImage().
81530        */
81531       selectImage: function (d) {
81532           var response = q.defer();
81533           var that = this;
81534
81535           var viewer = select('#photoviewer');
81536           if (!viewer.empty()) viewer.datum(d);
81537
81538           this.setStyles(null, true);
81539
81540           var wrap = select('#photoviewer .ms-wrapper');
81541           var attribution = wrap.selectAll('.photo-attribution').html('');
81542
81543           wrap.selectAll('.pnlm-load-box')   // display "loading.."
81544               .style('display', 'block');
81545
81546           if (!d) {
81547               response.resolve({status: 'ok'});
81548               return response.promise;
81549           }
81550
81551           var line1 = attribution
81552               .append('div')
81553               .attr('class', 'attribution-row');
81554
81555           // Add hires checkbox
81556           var label = line1
81557               .append('label')
81558               .attr('class', 'streetside-hires');
81559
81560           label
81561               .append('input')
81562               .attr('type', 'checkbox')
81563               .attr('id', 'streetside-hires-input')
81564               .property('checked', _hires)
81565               .on('click', function() {
81566                   event.stopPropagation();
81567
81568                   _hires = !_hires;
81569                   _resolution = _hires ? 1024 : 512;
81570                   wrap.call(setupCanvas, true);
81571
81572                   var viewstate = {
81573                       yaw: _pannellumViewer.getYaw(),
81574                       pitch: _pannellumViewer.getPitch(),
81575                       hfov: _pannellumViewer.getHfov()
81576                   };
81577
81578                   that.selectImage(d)
81579                       .then(function(r) {
81580                           if (r.status === 'ok') {
81581                               _sceneOptions = assignIn(_sceneOptions, viewstate);
81582                               that.showViewer();
81583                           }
81584                       });
81585               });
81586
81587           label
81588               .append('span')
81589               .text(t('streetside.hires'));
81590
81591
81592           var captureInfo = line1
81593               .append('div')
81594               .attr('class', 'attribution-capture-info');
81595
81596           // Add capture date
81597           if (d.captured_by) {
81598               var yyyy = (new Date()).getFullYear();
81599
81600               captureInfo
81601                   .append('a')
81602                   .attr('class', 'captured_by')
81603                   .attr('target', '_blank')
81604                   .attr('href', 'https://www.microsoft.com/en-us/maps/streetside')
81605                   .text('©' + yyyy + ' Microsoft');
81606
81607               captureInfo
81608                   .append('span')
81609                   .text('|');
81610           }
81611
81612           if (d.captured_at) {
81613               captureInfo
81614                   .append('span')
81615                   .attr('class', 'captured_at')
81616                   .text(localeTimestamp(d.captured_at));
81617           }
81618
81619           // Add image links
81620           var line2 = attribution
81621               .append('div')
81622               .attr('class', 'attribution-row');
81623
81624           line2
81625               .append('a')
81626               .attr('class', 'image-view-link')
81627               .attr('target', '_blank')
81628               .attr('href', 'https://www.bing.com/maps?cp=' + d.loc[1] + '~' + d.loc[0] +
81629                   '&lvl=17&dir=' + d.ca + '&style=x&v=2&sV=1')
81630               .text(t('streetside.view_on_bing'));
81631
81632           line2
81633               .append('a')
81634               .attr('class', 'image-report-link')
81635               .attr('target', '_blank')
81636               .attr('href', 'https://www.bing.com/maps/privacyreport/streetsideprivacyreport?bubbleid=' + encodeURIComponent(d.key) +
81637                   '&focus=photo&lat=' + d.loc[1] + '&lng=' + d.loc[0] + '&z=17')
81638               .text(t('streetside.report'));
81639
81640
81641           var bubbleIdQuadKey = d.key.toString(4);
81642           var paddingNeeded = 16 - bubbleIdQuadKey.length;
81643           for (var i = 0; i < paddingNeeded; i++) {
81644               bubbleIdQuadKey = '0' + bubbleIdQuadKey;
81645           }
81646           var imgUrlPrefix = streetsideImagesApi + 'hs' + bubbleIdQuadKey;
81647           var imgUrlSuffix = '.jpg?g=6338&n=z';
81648
81649           // Cubemap face code order matters here: front=01, right=02, back=03, left=10, up=11, down=12
81650           var faceKeys = ['01','02','03','10','11','12'];
81651
81652           // Map images to cube faces
81653           var quadKeys = getQuadKeys();
81654           var faces = faceKeys.map(function(faceKey) {
81655               return quadKeys.map(function(quadKey) {
81656                   var xy = qkToXY(quadKey);
81657                   return {
81658                       face: faceKey,
81659                       url: imgUrlPrefix + faceKey + quadKey + imgUrlSuffix,
81660                       x: xy[0],
81661                       y: xy[1]
81662                   };
81663               });
81664           });
81665
81666           processFaces(faces).then(function() {
81667               _sceneOptions = {
81668                   showFullscreenCtrl: false,
81669                   autoLoad: true,
81670                   compass: true,
81671                   northOffset: d.ca,
81672                   yaw: 0,
81673                   minHfov: minHfov,
81674                   maxHfov: maxHfov,
81675                   hfov: defaultHfov,
81676                   type: 'cubemap',
81677                   cubeMap: [
81678                       _dataUrlArray[0],
81679                       _dataUrlArray[1],
81680                       _dataUrlArray[2],
81681                       _dataUrlArray[3],
81682                       _dataUrlArray[4],
81683                       _dataUrlArray[5]
81684                   ]
81685               };
81686               response.resolve({status: 'ok'});
81687           });
81688
81689           return response.promise;
81690       },
81691
81692
81693       getSequenceKeyForBubble: function(d) {
81694           return d && d.sequenceKey;
81695       },
81696
81697
81698       /**
81699        * setStyles().
81700        */
81701       setStyles: function (hovered, reset) {
81702           if (reset) {  // reset all layers
81703               d3_selectAll('.viewfield-group')
81704                   .classed('highlighted', false)
81705                   .classed('hovered', false)
81706                   .classed('selected', false);
81707
81708               d3_selectAll('.sequence')
81709                   .classed('highlighted', false)
81710                   .classed('selected', false);
81711           }
81712
81713           var hoveredBubbleKey = hovered && hovered.key;
81714           var hoveredSequenceKey = this.getSequenceKeyForBubble(hovered);
81715           var hoveredSequence = hoveredSequenceKey && _ssCache.sequences[hoveredSequenceKey];
81716           var hoveredBubbleKeys =  (hoveredSequence && hoveredSequence.bubbles.map(function (d) { return d.key; })) || [];
81717
81718           var viewer = select('#photoviewer');
81719           var selected = viewer.empty() ? undefined : viewer.datum();
81720           var selectedBubbleKey = selected && selected.key;
81721           var selectedSequenceKey = this.getSequenceKeyForBubble(selected);
81722           var selectedSequence = selectedSequenceKey && _ssCache.sequences[selectedSequenceKey];
81723           var selectedBubbleKeys = (selectedSequence && selectedSequence.bubbles.map(function (d) { return d.key; })) || [];
81724
81725           // highlight sibling viewfields on either the selected or the hovered sequences
81726           var highlightedBubbleKeys = union(hoveredBubbleKeys, selectedBubbleKeys);
81727
81728           d3_selectAll('.layer-streetside-images .viewfield-group')
81729               .classed('highlighted', function (d) { return highlightedBubbleKeys.indexOf(d.key) !== -1; })
81730               .classed('hovered', function (d) { return d.key === hoveredBubbleKey; })
81731               .classed('selected', function (d) { return d.key === selectedBubbleKey; });
81732
81733           d3_selectAll('.layer-streetside-images .sequence')
81734               .classed('highlighted', function (d) { return d.properties.key === hoveredSequenceKey; })
81735               .classed('selected', function (d) { return d.properties.key === selectedSequenceKey; });
81736
81737           // update viewfields if needed
81738           d3_selectAll('.viewfield-group .viewfield')
81739               .attr('d', viewfieldPath);
81740
81741           function viewfieldPath() {
81742               var d = this.parentNode.__data__;
81743               if (d.pano && d.key !== selectedBubbleKey) {
81744                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
81745               } else {
81746                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
81747               }
81748           }
81749
81750           return this;
81751       },
81752
81753       /**
81754        * cache().
81755        */
81756       cache: function () {
81757           return _ssCache;
81758       }
81759   };
81760
81761   var apibase$4 = 'https://taginfo.openstreetmap.org/api/4/';
81762   var _inflight$1 = {};
81763   var _popularKeys = {};
81764   var _taginfoCache = {};
81765
81766   var tag_sorts = {
81767       point: 'count_nodes',
81768       vertex: 'count_nodes',
81769       area: 'count_ways',
81770       line: 'count_ways'
81771   };
81772   var tag_sort_members = {
81773       point: 'count_node_members',
81774       vertex: 'count_node_members',
81775       area: 'count_way_members',
81776       line: 'count_way_members',
81777       relation: 'count_relation_members'
81778   };
81779   var tag_filters = {
81780       point: 'nodes',
81781       vertex: 'nodes',
81782       area: 'ways',
81783       line: 'ways'
81784   };
81785   var tag_members_fractions = {
81786       point: 'count_node_members_fraction',
81787       vertex: 'count_node_members_fraction',
81788       area: 'count_way_members_fraction',
81789       line: 'count_way_members_fraction',
81790       relation: 'count_relation_members_fraction'
81791   };
81792
81793
81794   function sets(params, n, o) {
81795       if (params.geometry && o[params.geometry]) {
81796           params[n] = o[params.geometry];
81797       }
81798       return params;
81799   }
81800
81801
81802   function setFilter(params) {
81803       return sets(params, 'filter', tag_filters);
81804   }
81805
81806
81807   function setSort(params) {
81808       return sets(params, 'sortname', tag_sorts);
81809   }
81810
81811
81812   function setSortMembers(params) {
81813       return sets(params, 'sortname', tag_sort_members);
81814   }
81815
81816
81817   function clean(params) {
81818       return omit(params, ['geometry', 'debounce']);
81819   }
81820
81821
81822   function filterKeys(type) {
81823       var count_type = type ? 'count_' + type : 'count_all';
81824       return function(d) {
81825           return parseFloat(d[count_type]) > 2500 || d.in_wiki;
81826       };
81827   }
81828
81829
81830   function filterMultikeys(prefix) {
81831       return function(d) {
81832           // d.key begins with prefix, and d.key contains no additional ':'s
81833           var re = new RegExp('^' + prefix + '(.*)$');
81834           var matches = d.key.match(re) || [];
81835           return (matches.length === 2 && matches[1].indexOf(':') === -1);
81836       };
81837   }
81838
81839
81840   function filterValues(allowUpperCase) {
81841       return function(d) {
81842           if (d.value.match(/[;,]/) !== null) return false;  // exclude some punctuation
81843           if (!allowUpperCase && d.value.match(/[A-Z*]/) !== null) return false;  // exclude uppercase letters
81844           return parseFloat(d.fraction) > 0.0;
81845       };
81846   }
81847
81848
81849   function filterRoles(geometry) {
81850       return function(d) {
81851           if (d.role === '') return false; // exclude empty role
81852           if (d.role.match(/[A-Z*;,]/) !== null) return false;  // exclude uppercase letters and some punctuation
81853           return parseFloat(d[tag_members_fractions[geometry]]) > 0.0;
81854       };
81855   }
81856
81857
81858   function valKey(d) {
81859       return {
81860           value: d.key,
81861           title: d.key
81862       };
81863   }
81864
81865
81866   function valKeyDescription(d) {
81867       return {
81868           value: d.value,
81869           title: d.description || d.value
81870       };
81871   }
81872
81873
81874   function roleKey(d) {
81875       return {
81876           value: d.role,
81877           title: d.role
81878       };
81879   }
81880
81881
81882   // sort keys with ':' lower than keys without ':'
81883   function sortKeys(a, b) {
81884       return (a.key.indexOf(':') === -1 && b.key.indexOf(':') !== -1) ? -1
81885           : (a.key.indexOf(':') !== -1 && b.key.indexOf(':') === -1) ? 1
81886           : 0;
81887   }
81888
81889
81890   var debouncedRequest$1 = debounce(request$2, 300, { leading: false });
81891
81892   function request$2(url, params, exactMatch, callback, loaded) {
81893       if (_inflight$1[url]) return;
81894
81895       if (checkCache(url, params, exactMatch, callback)) return;
81896
81897       _inflight$1[url] = d3_json(url, function (err, data) {
81898           delete _inflight$1[url];
81899           loaded(err, data);
81900       });
81901   }
81902
81903
81904   function checkCache(url, params, exactMatch, callback) {
81905       var rp = params.rp || 25;
81906       var testQuery = params.query || '';
81907       var testUrl = url;
81908
81909       do {
81910           var hit = _taginfoCache[testUrl];
81911
81912           // exact match, or shorter match yielding fewer than max results (rp)
81913           if (hit && (url === testUrl || hit.length < rp)) {
81914               callback(null, hit);
81915               return true;
81916           }
81917
81918           // don't try to shorten the query
81919           if (exactMatch || !testQuery.length) return false;
81920
81921           // do shorten the query to see if we already have a cached result
81922           // that has returned fewer than max results (rp)
81923           testQuery = testQuery.slice(0, -1);
81924           testUrl = url.replace(/&query=(.*?)&/, '&query=' + testQuery + '&');
81925       } while (testQuery.length >= 0);
81926
81927       return false;
81928   }
81929
81930
81931   var serviceTaginfo = {
81932
81933       init: function() {
81934           _inflight$1 = {};
81935           _taginfoCache = {};
81936           _popularKeys = {
81937               postal_code: true   // #5377
81938           };
81939
81940           // Fetch popular keys.  We'll exclude these from `values`
81941           // lookups because they stress taginfo, and they aren't likely
81942           // to yield meaningful autocomplete results.. see #3955
81943           var params = {
81944               rp: 100,
81945               sortname: 'values_all',
81946               sortorder: 'desc',
81947               page: 1,
81948               debounce: false,
81949               lang: currentLocale
81950           };
81951           this.keys(params, function(err, data) {
81952               if (err) return;
81953               data.forEach(function(d) {
81954                   if (d.value === 'opening_hours') return;  // exception
81955                   _popularKeys[d.value] = true;
81956               });
81957           });
81958       },
81959
81960
81961       reset: function() {
81962           forEach(_inflight$1, function(req) { req.abort(); });
81963           _inflight$1 = {};
81964       },
81965
81966
81967       keys: function(params, callback) {
81968           var doRequest = params.debounce ? debouncedRequest$1 : request$2;
81969           params = clean(setSort(params));
81970           params = assignIn({
81971               rp: 10,
81972               sortname: 'count_all',
81973               sortorder: 'desc',
81974               page: 1,
81975               lang: currentLocale
81976           }, params);
81977
81978           var url = apibase$4 + 'keys/all?' + utilQsString(params);
81979           doRequest(url, params, false, callback, function(err, d) {
81980               if (err) {
81981                   callback(err);
81982               } else {
81983                   var f = filterKeys(params.filter);
81984                   var result = d.data.filter(f).sort(sortKeys).map(valKey);
81985                   _taginfoCache[url] = result;
81986                   callback(null, result);
81987               }
81988           });
81989       },
81990
81991
81992       multikeys: function(params, callback) {
81993           var doRequest = params.debounce ? debouncedRequest$1 : request$2;
81994           params = clean(setSort(params));
81995           params = assignIn({
81996               rp: 25,
81997               sortname: 'count_all',
81998               sortorder: 'desc',
81999               page: 1,
82000               lang: currentLocale
82001           }, params);
82002
82003           var prefix = params.query;
82004           var url = apibase$4 + 'keys/all?' + utilQsString(params);
82005           doRequest(url, params, true, callback, function(err, d) {
82006               if (err) {
82007                   callback(err);
82008               } else {
82009                   var f = filterMultikeys(prefix);
82010                   var result = d.data.filter(f).map(valKey);
82011                   _taginfoCache[url] = result;
82012                   callback(null, result);
82013               }
82014           });
82015       },
82016
82017
82018       values: function(params, callback) {
82019           // Exclude popular keys from values lookups.. see #3955
82020           var key = params.key;
82021           if (key && _popularKeys[key]) {
82022               callback(null, []);
82023               return;
82024           }
82025
82026           var doRequest = params.debounce ? debouncedRequest$1 : request$2;
82027           params = clean(setSort(setFilter(params)));
82028           params = assignIn({
82029               rp: 25,
82030               sortname: 'count_all',
82031               sortorder: 'desc',
82032               page: 1,
82033               lang: currentLocale
82034           }, params);
82035
82036           var url = apibase$4 + 'key/values?' + utilQsString(params);
82037           doRequest(url, params, false, callback, function(err, d) {
82038               if (err) {
82039                   callback(err);
82040               } else {
82041                   // In most cases we prefer taginfo value results with lowercase letters.
82042                   // A few OSM keys expect values to contain uppercase values (see #3377).
82043                   // This is not an exhaustive list (e.g. `name` also has uppercase values)
82044                   // but these are the fields where taginfo value lookup is most useful.
82045                   var re = /network|taxon|genus|species|brand|grape_variety|royal_cypher|listed_status|booth|rating|stars|:output|_hours|_times/;
82046                   var allowUpperCase = (params.key.match(re) !== null);
82047                   var f = filterValues(allowUpperCase);
82048
82049                   var result = d.data.filter(f).map(valKeyDescription);
82050                   _taginfoCache[url] = result;
82051                   callback(null, result);
82052               }
82053           });
82054       },
82055
82056
82057       roles: function(params, callback) {
82058           var doRequest = params.debounce ? debouncedRequest$1 : request$2;
82059           var geometry = params.geometry;
82060           params = clean(setSortMembers(params));
82061           params = assignIn({
82062               rp: 25,
82063               sortname: 'count_all_members',
82064               sortorder: 'desc',
82065               page: 1,
82066               lang: currentLocale
82067           }, params);
82068
82069           var url = apibase$4 + 'relation/roles?' + utilQsString(params);
82070           doRequest(url, params, true, callback, function(err, d) {
82071               if (err) {
82072                   callback(err);
82073               } else {
82074                   var f = filterRoles(geometry);
82075                   var result = d.data.filter(f).map(roleKey);
82076                   _taginfoCache[url] = result;
82077                   callback(null, result);
82078               }
82079           });
82080       },
82081
82082
82083       docs: function(params, callback) {
82084           var doRequest = params.debounce ? debouncedRequest$1 : request$2;
82085           params = clean(setSort(params));
82086
82087           var path = 'key/wiki_pages?';
82088           if (params.value) {
82089               path = 'tag/wiki_pages?';
82090           } else if (params.rtype) {
82091               path = 'relation/wiki_pages?';
82092           }
82093
82094           var url = apibase$4 + path + utilQsString(params);
82095           doRequest(url, params, true, callback, function(err, d) {
82096               if (err) {
82097                   callback(err);
82098               } else {
82099                   _taginfoCache[url] = d.data;
82100                   callback(null, d.data);
82101               }
82102           });
82103       },
82104
82105
82106       apibase: function(_) {
82107           if (!arguments.length) return apibase$4;
82108           apibase$4 = _;
82109           return this;
82110       }
82111
82112   };
82113
82114   var helpers = createCommonjsModule(function (module, exports) {
82115   Object.defineProperty(exports, "__esModule", { value: true });
82116   /**
82117    * @module helpers
82118    */
82119   /**
82120    * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
82121    *
82122    * @memberof helpers
82123    * @type {number}
82124    */
82125   exports.earthRadius = 6371008.8;
82126   /**
82127    * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
82128    *
82129    * @memberof helpers
82130    * @type {Object}
82131    */
82132   exports.factors = {
82133       centimeters: exports.earthRadius * 100,
82134       centimetres: exports.earthRadius * 100,
82135       degrees: exports.earthRadius / 111325,
82136       feet: exports.earthRadius * 3.28084,
82137       inches: exports.earthRadius * 39.370,
82138       kilometers: exports.earthRadius / 1000,
82139       kilometres: exports.earthRadius / 1000,
82140       meters: exports.earthRadius,
82141       metres: exports.earthRadius,
82142       miles: exports.earthRadius / 1609.344,
82143       millimeters: exports.earthRadius * 1000,
82144       millimetres: exports.earthRadius * 1000,
82145       nauticalmiles: exports.earthRadius / 1852,
82146       radians: 1,
82147       yards: exports.earthRadius / 1.0936,
82148   };
82149   /**
82150    * Units of measurement factors based on 1 meter.
82151    *
82152    * @memberof helpers
82153    * @type {Object}
82154    */
82155   exports.unitsFactors = {
82156       centimeters: 100,
82157       centimetres: 100,
82158       degrees: 1 / 111325,
82159       feet: 3.28084,
82160       inches: 39.370,
82161       kilometers: 1 / 1000,
82162       kilometres: 1 / 1000,
82163       meters: 1,
82164       metres: 1,
82165       miles: 1 / 1609.344,
82166       millimeters: 1000,
82167       millimetres: 1000,
82168       nauticalmiles: 1 / 1852,
82169       radians: 1 / exports.earthRadius,
82170       yards: 1 / 1.0936,
82171   };
82172   /**
82173    * Area of measurement factors based on 1 square meter.
82174    *
82175    * @memberof helpers
82176    * @type {Object}
82177    */
82178   exports.areaFactors = {
82179       acres: 0.000247105,
82180       centimeters: 10000,
82181       centimetres: 10000,
82182       feet: 10.763910417,
82183       inches: 1550.003100006,
82184       kilometers: 0.000001,
82185       kilometres: 0.000001,
82186       meters: 1,
82187       metres: 1,
82188       miles: 3.86e-7,
82189       millimeters: 1000000,
82190       millimetres: 1000000,
82191       yards: 1.195990046,
82192   };
82193   /**
82194    * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
82195    *
82196    * @name feature
82197    * @param {Geometry} geometry input geometry
82198    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
82199    * @param {Object} [options={}] Optional Parameters
82200    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
82201    * @param {string|number} [options.id] Identifier associated with the Feature
82202    * @returns {Feature} a GeoJSON Feature
82203    * @example
82204    * var geometry = {
82205    *   "type": "Point",
82206    *   "coordinates": [110, 50]
82207    * };
82208    *
82209    * var feature = turf.feature(geometry);
82210    *
82211    * //=feature
82212    */
82213   function feature(geom, properties, options) {
82214       if (options === void 0) { options = {}; }
82215       var feat = { type: "Feature" };
82216       if (options.id === 0 || options.id) {
82217           feat.id = options.id;
82218       }
82219       if (options.bbox) {
82220           feat.bbox = options.bbox;
82221       }
82222       feat.properties = properties || {};
82223       feat.geometry = geom;
82224       return feat;
82225   }
82226   exports.feature = feature;
82227   /**
82228    * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
82229    * For GeometryCollection type use `helpers.geometryCollection`
82230    *
82231    * @name geometry
82232    * @param {string} type Geometry Type
82233    * @param {Array<any>} coordinates Coordinates
82234    * @param {Object} [options={}] Optional Parameters
82235    * @returns {Geometry} a GeoJSON Geometry
82236    * @example
82237    * var type = "Point";
82238    * var coordinates = [110, 50];
82239    * var geometry = turf.geometry(type, coordinates);
82240    * // => geometry
82241    */
82242   function geometry(type, coordinates, options) {
82243       if (options === void 0) { options = {}; }
82244       switch (type) {
82245           case "Point": return point(coordinates).geometry;
82246           case "LineString": return lineString(coordinates).geometry;
82247           case "Polygon": return polygon(coordinates).geometry;
82248           case "MultiPoint": return multiPoint(coordinates).geometry;
82249           case "MultiLineString": return multiLineString(coordinates).geometry;
82250           case "MultiPolygon": return multiPolygon(coordinates).geometry;
82251           default: throw new Error(type + " is invalid");
82252       }
82253   }
82254   exports.geometry = geometry;
82255   /**
82256    * Creates a {@link Point} {@link Feature} from a Position.
82257    *
82258    * @name point
82259    * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
82260    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
82261    * @param {Object} [options={}] Optional Parameters
82262    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
82263    * @param {string|number} [options.id] Identifier associated with the Feature
82264    * @returns {Feature<Point>} a Point feature
82265    * @example
82266    * var point = turf.point([-75.343, 39.984]);
82267    *
82268    * //=point
82269    */
82270   function point(coordinates, properties, options) {
82271       if (options === void 0) { options = {}; }
82272       var geom = {
82273           type: "Point",
82274           coordinates: coordinates,
82275       };
82276       return feature(geom, properties, options);
82277   }
82278   exports.point = point;
82279   /**
82280    * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
82281    *
82282    * @name points
82283    * @param {Array<Array<number>>} coordinates an array of Points
82284    * @param {Object} [properties={}] Translate these properties to each Feature
82285    * @param {Object} [options={}] Optional Parameters
82286    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
82287    * associated with the FeatureCollection
82288    * @param {string|number} [options.id] Identifier associated with the FeatureCollection
82289    * @returns {FeatureCollection<Point>} Point Feature
82290    * @example
82291    * var points = turf.points([
82292    *   [-75, 39],
82293    *   [-80, 45],
82294    *   [-78, 50]
82295    * ]);
82296    *
82297    * //=points
82298    */
82299   function points(coordinates, properties, options) {
82300       if (options === void 0) { options = {}; }
82301       return featureCollection(coordinates.map(function (coords) {
82302           return point(coords, properties);
82303       }), options);
82304   }
82305   exports.points = points;
82306   /**
82307    * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
82308    *
82309    * @name polygon
82310    * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
82311    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
82312    * @param {Object} [options={}] Optional Parameters
82313    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
82314    * @param {string|number} [options.id] Identifier associated with the Feature
82315    * @returns {Feature<Polygon>} Polygon Feature
82316    * @example
82317    * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
82318    *
82319    * //=polygon
82320    */
82321   function polygon(coordinates, properties, options) {
82322       if (options === void 0) { options = {}; }
82323       for (var _i = 0, coordinates_1 = coordinates; _i < coordinates_1.length; _i++) {
82324           var ring = coordinates_1[_i];
82325           if (ring.length < 4) {
82326               throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");
82327           }
82328           for (var j = 0; j < ring[ring.length - 1].length; j++) {
82329               // Check if first point of Polygon contains two numbers
82330               if (ring[ring.length - 1][j] !== ring[0][j]) {
82331                   throw new Error("First and last Position are not equivalent.");
82332               }
82333           }
82334       }
82335       var geom = {
82336           type: "Polygon",
82337           coordinates: coordinates,
82338       };
82339       return feature(geom, properties, options);
82340   }
82341   exports.polygon = polygon;
82342   /**
82343    * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
82344    *
82345    * @name polygons
82346    * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
82347    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
82348    * @param {Object} [options={}] Optional Parameters
82349    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
82350    * @param {string|number} [options.id] Identifier associated with the FeatureCollection
82351    * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
82352    * @example
82353    * var polygons = turf.polygons([
82354    *   [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
82355    *   [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
82356    * ]);
82357    *
82358    * //=polygons
82359    */
82360   function polygons(coordinates, properties, options) {
82361       if (options === void 0) { options = {}; }
82362       return featureCollection(coordinates.map(function (coords) {
82363           return polygon(coords, properties);
82364       }), options);
82365   }
82366   exports.polygons = polygons;
82367   /**
82368    * Creates a {@link LineString} {@link Feature} from an Array of Positions.
82369    *
82370    * @name lineString
82371    * @param {Array<Array<number>>} coordinates an array of Positions
82372    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
82373    * @param {Object} [options={}] Optional Parameters
82374    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
82375    * @param {string|number} [options.id] Identifier associated with the Feature
82376    * @returns {Feature<LineString>} LineString Feature
82377    * @example
82378    * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
82379    * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
82380    *
82381    * //=linestring1
82382    * //=linestring2
82383    */
82384   function lineString(coordinates, properties, options) {
82385       if (options === void 0) { options = {}; }
82386       if (coordinates.length < 2) {
82387           throw new Error("coordinates must be an array of two or more positions");
82388       }
82389       var geom = {
82390           type: "LineString",
82391           coordinates: coordinates,
82392       };
82393       return feature(geom, properties, options);
82394   }
82395   exports.lineString = lineString;
82396   /**
82397    * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
82398    *
82399    * @name lineStrings
82400    * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
82401    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
82402    * @param {Object} [options={}] Optional Parameters
82403    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
82404    * associated with the FeatureCollection
82405    * @param {string|number} [options.id] Identifier associated with the FeatureCollection
82406    * @returns {FeatureCollection<LineString>} LineString FeatureCollection
82407    * @example
82408    * var linestrings = turf.lineStrings([
82409    *   [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
82410    *   [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
82411    * ]);
82412    *
82413    * //=linestrings
82414    */
82415   function lineStrings(coordinates, properties, options) {
82416       if (options === void 0) { options = {}; }
82417       return featureCollection(coordinates.map(function (coords) {
82418           return lineString(coords, properties);
82419       }), options);
82420   }
82421   exports.lineStrings = lineStrings;
82422   /**
82423    * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
82424    *
82425    * @name featureCollection
82426    * @param {Feature[]} features input features
82427    * @param {Object} [options={}] Optional Parameters
82428    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
82429    * @param {string|number} [options.id] Identifier associated with the Feature
82430    * @returns {FeatureCollection} FeatureCollection of Features
82431    * @example
82432    * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
82433    * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
82434    * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
82435    *
82436    * var collection = turf.featureCollection([
82437    *   locationA,
82438    *   locationB,
82439    *   locationC
82440    * ]);
82441    *
82442    * //=collection
82443    */
82444   function featureCollection(features, options) {
82445       if (options === void 0) { options = {}; }
82446       var fc = { type: "FeatureCollection" };
82447       if (options.id) {
82448           fc.id = options.id;
82449       }
82450       if (options.bbox) {
82451           fc.bbox = options.bbox;
82452       }
82453       fc.features = features;
82454       return fc;
82455   }
82456   exports.featureCollection = featureCollection;
82457   /**
82458    * Creates a {@link Feature<MultiLineString>} based on a
82459    * coordinate array. Properties can be added optionally.
82460    *
82461    * @name multiLineString
82462    * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
82463    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
82464    * @param {Object} [options={}] Optional Parameters
82465    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
82466    * @param {string|number} [options.id] Identifier associated with the Feature
82467    * @returns {Feature<MultiLineString>} a MultiLineString feature
82468    * @throws {Error} if no coordinates are passed
82469    * @example
82470    * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
82471    *
82472    * //=multiLine
82473    */
82474   function multiLineString(coordinates, properties, options) {
82475       if (options === void 0) { options = {}; }
82476       var geom = {
82477           type: "MultiLineString",
82478           coordinates: coordinates,
82479       };
82480       return feature(geom, properties, options);
82481   }
82482   exports.multiLineString = multiLineString;
82483   /**
82484    * Creates a {@link Feature<MultiPoint>} based on a
82485    * coordinate array. Properties can be added optionally.
82486    *
82487    * @name multiPoint
82488    * @param {Array<Array<number>>} coordinates an array of Positions
82489    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
82490    * @param {Object} [options={}] Optional Parameters
82491    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
82492    * @param {string|number} [options.id] Identifier associated with the Feature
82493    * @returns {Feature<MultiPoint>} a MultiPoint feature
82494    * @throws {Error} if no coordinates are passed
82495    * @example
82496    * var multiPt = turf.multiPoint([[0,0],[10,10]]);
82497    *
82498    * //=multiPt
82499    */
82500   function multiPoint(coordinates, properties, options) {
82501       if (options === void 0) { options = {}; }
82502       var geom = {
82503           type: "MultiPoint",
82504           coordinates: coordinates,
82505       };
82506       return feature(geom, properties, options);
82507   }
82508   exports.multiPoint = multiPoint;
82509   /**
82510    * Creates a {@link Feature<MultiPolygon>} based on a
82511    * coordinate array. Properties can be added optionally.
82512    *
82513    * @name multiPolygon
82514    * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
82515    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
82516    * @param {Object} [options={}] Optional Parameters
82517    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
82518    * @param {string|number} [options.id] Identifier associated with the Feature
82519    * @returns {Feature<MultiPolygon>} a multipolygon feature
82520    * @throws {Error} if no coordinates are passed
82521    * @example
82522    * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
82523    *
82524    * //=multiPoly
82525    *
82526    */
82527   function multiPolygon(coordinates, properties, options) {
82528       if (options === void 0) { options = {}; }
82529       var geom = {
82530           type: "MultiPolygon",
82531           coordinates: coordinates,
82532       };
82533       return feature(geom, properties, options);
82534   }
82535   exports.multiPolygon = multiPolygon;
82536   /**
82537    * Creates a {@link Feature<GeometryCollection>} based on a
82538    * coordinate array. Properties can be added optionally.
82539    *
82540    * @name geometryCollection
82541    * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
82542    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
82543    * @param {Object} [options={}] Optional Parameters
82544    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
82545    * @param {string|number} [options.id] Identifier associated with the Feature
82546    * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
82547    * @example
82548    * var pt = turf.geometry("Point", [100, 0]);
82549    * var line = turf.geometry("LineString", [[101, 0], [102, 1]]);
82550    * var collection = turf.geometryCollection([pt, line]);
82551    *
82552    * // => collection
82553    */
82554   function geometryCollection(geometries, properties, options) {
82555       if (options === void 0) { options = {}; }
82556       var geom = {
82557           type: "GeometryCollection",
82558           geometries: geometries,
82559       };
82560       return feature(geom, properties, options);
82561   }
82562   exports.geometryCollection = geometryCollection;
82563   /**
82564    * Round number to precision
82565    *
82566    * @param {number} num Number
82567    * @param {number} [precision=0] Precision
82568    * @returns {number} rounded number
82569    * @example
82570    * turf.round(120.4321)
82571    * //=120
82572    *
82573    * turf.round(120.4321, 2)
82574    * //=120.43
82575    */
82576   function round(num, precision) {
82577       if (precision === void 0) { precision = 0; }
82578       if (precision && !(precision >= 0)) {
82579           throw new Error("precision must be a positive number");
82580       }
82581       var multiplier = Math.pow(10, precision || 0);
82582       return Math.round(num * multiplier) / multiplier;
82583   }
82584   exports.round = round;
82585   /**
82586    * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
82587    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
82588    *
82589    * @name radiansToLength
82590    * @param {number} radians in radians across the sphere
82591    * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
82592    * meters, kilometres, kilometers.
82593    * @returns {number} distance
82594    */
82595   function radiansToLength(radians, units) {
82596       if (units === void 0) { units = "kilometers"; }
82597       var factor = exports.factors[units];
82598       if (!factor) {
82599           throw new Error(units + " units is invalid");
82600       }
82601       return radians * factor;
82602   }
82603   exports.radiansToLength = radiansToLength;
82604   /**
82605    * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
82606    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
82607    *
82608    * @name lengthToRadians
82609    * @param {number} distance in real units
82610    * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
82611    * meters, kilometres, kilometers.
82612    * @returns {number} radians
82613    */
82614   function lengthToRadians(distance, units) {
82615       if (units === void 0) { units = "kilometers"; }
82616       var factor = exports.factors[units];
82617       if (!factor) {
82618           throw new Error(units + " units is invalid");
82619       }
82620       return distance / factor;
82621   }
82622   exports.lengthToRadians = lengthToRadians;
82623   /**
82624    * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
82625    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
82626    *
82627    * @name lengthToDegrees
82628    * @param {number} distance in real units
82629    * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
82630    * meters, kilometres, kilometers.
82631    * @returns {number} degrees
82632    */
82633   function lengthToDegrees(distance, units) {
82634       return radiansToDegrees(lengthToRadians(distance, units));
82635   }
82636   exports.lengthToDegrees = lengthToDegrees;
82637   /**
82638    * Converts any bearing angle from the north line direction (positive clockwise)
82639    * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
82640    *
82641    * @name bearingToAzimuth
82642    * @param {number} bearing angle, between -180 and +180 degrees
82643    * @returns {number} angle between 0 and 360 degrees
82644    */
82645   function bearingToAzimuth(bearing) {
82646       var angle = bearing % 360;
82647       if (angle < 0) {
82648           angle += 360;
82649       }
82650       return angle;
82651   }
82652   exports.bearingToAzimuth = bearingToAzimuth;
82653   /**
82654    * Converts an angle in radians to degrees
82655    *
82656    * @name radiansToDegrees
82657    * @param {number} radians angle in radians
82658    * @returns {number} degrees between 0 and 360 degrees
82659    */
82660   function radiansToDegrees(radians) {
82661       var degrees = radians % (2 * Math.PI);
82662       return degrees * 180 / Math.PI;
82663   }
82664   exports.radiansToDegrees = radiansToDegrees;
82665   /**
82666    * Converts an angle in degrees to radians
82667    *
82668    * @name degreesToRadians
82669    * @param {number} degrees angle between 0 and 360 degrees
82670    * @returns {number} angle in radians
82671    */
82672   function degreesToRadians(degrees) {
82673       var radians = degrees % 360;
82674       return radians * Math.PI / 180;
82675   }
82676   exports.degreesToRadians = degreesToRadians;
82677   /**
82678    * Converts a length to the requested unit.
82679    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
82680    *
82681    * @param {number} length to be converted
82682    * @param {Units} [originalUnit="kilometers"] of the length
82683    * @param {Units} [finalUnit="kilometers"] returned unit
82684    * @returns {number} the converted length
82685    */
82686   function convertLength(length, originalUnit, finalUnit) {
82687       if (originalUnit === void 0) { originalUnit = "kilometers"; }
82688       if (finalUnit === void 0) { finalUnit = "kilometers"; }
82689       if (!(length >= 0)) {
82690           throw new Error("length must be a positive number");
82691       }
82692       return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);
82693   }
82694   exports.convertLength = convertLength;
82695   /**
82696    * Converts a area to the requested unit.
82697    * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
82698    * @param {number} area to be converted
82699    * @param {Units} [originalUnit="meters"] of the distance
82700    * @param {Units} [finalUnit="kilometers"] returned unit
82701    * @returns {number} the converted distance
82702    */
82703   function convertArea(area, originalUnit, finalUnit) {
82704       if (originalUnit === void 0) { originalUnit = "meters"; }
82705       if (finalUnit === void 0) { finalUnit = "kilometers"; }
82706       if (!(area >= 0)) {
82707           throw new Error("area must be a positive number");
82708       }
82709       var startFactor = exports.areaFactors[originalUnit];
82710       if (!startFactor) {
82711           throw new Error("invalid original units");
82712       }
82713       var finalFactor = exports.areaFactors[finalUnit];
82714       if (!finalFactor) {
82715           throw new Error("invalid final units");
82716       }
82717       return (area / startFactor) * finalFactor;
82718   }
82719   exports.convertArea = convertArea;
82720   /**
82721    * isNumber
82722    *
82723    * @param {*} num Number to validate
82724    * @returns {boolean} true/false
82725    * @example
82726    * turf.isNumber(123)
82727    * //=true
82728    * turf.isNumber('foo')
82729    * //=false
82730    */
82731   function isNumber(num) {
82732       return !isNaN(num) && num !== null && !Array.isArray(num) && !/^\s*$/.test(num);
82733   }
82734   exports.isNumber = isNumber;
82735   /**
82736    * isObject
82737    *
82738    * @param {*} input variable to validate
82739    * @returns {boolean} true/false
82740    * @example
82741    * turf.isObject({elevation: 10})
82742    * //=true
82743    * turf.isObject('foo')
82744    * //=false
82745    */
82746   function isObject(input) {
82747       return (!!input) && (input.constructor === Object);
82748   }
82749   exports.isObject = isObject;
82750   /**
82751    * Validate BBox
82752    *
82753    * @private
82754    * @param {Array<number>} bbox BBox to validate
82755    * @returns {void}
82756    * @throws Error if BBox is not valid
82757    * @example
82758    * validateBBox([-180, -40, 110, 50])
82759    * //=OK
82760    * validateBBox([-180, -40])
82761    * //=Error
82762    * validateBBox('Foo')
82763    * //=Error
82764    * validateBBox(5)
82765    * //=Error
82766    * validateBBox(null)
82767    * //=Error
82768    * validateBBox(undefined)
82769    * //=Error
82770    */
82771   function validateBBox(bbox) {
82772       if (!bbox) {
82773           throw new Error("bbox is required");
82774       }
82775       if (!Array.isArray(bbox)) {
82776           throw new Error("bbox must be an Array");
82777       }
82778       if (bbox.length !== 4 && bbox.length !== 6) {
82779           throw new Error("bbox must be an Array of 4 or 6 numbers");
82780       }
82781       bbox.forEach(function (num) {
82782           if (!isNumber(num)) {
82783               throw new Error("bbox must only contain numbers");
82784           }
82785       });
82786   }
82787   exports.validateBBox = validateBBox;
82788   /**
82789    * Validate Id
82790    *
82791    * @private
82792    * @param {string|number} id Id to validate
82793    * @returns {void}
82794    * @throws Error if Id is not valid
82795    * @example
82796    * validateId([-180, -40, 110, 50])
82797    * //=Error
82798    * validateId([-180, -40])
82799    * //=Error
82800    * validateId('Foo')
82801    * //=OK
82802    * validateId(5)
82803    * //=OK
82804    * validateId(null)
82805    * //=Error
82806    * validateId(undefined)
82807    * //=Error
82808    */
82809   function validateId(id) {
82810       if (!id) {
82811           throw new Error("id is required");
82812       }
82813       if (["string", "number"].indexOf(typeof id) === -1) {
82814           throw new Error("id must be a number or a string");
82815       }
82816   }
82817   exports.validateId = validateId;
82818   // Deprecated methods
82819   function radians2degrees() {
82820       throw new Error("method has been renamed to `radiansToDegrees`");
82821   }
82822   exports.radians2degrees = radians2degrees;
82823   function degrees2radians() {
82824       throw new Error("method has been renamed to `degreesToRadians`");
82825   }
82826   exports.degrees2radians = degrees2radians;
82827   function distanceToDegrees() {
82828       throw new Error("method has been renamed to `lengthToDegrees`");
82829   }
82830   exports.distanceToDegrees = distanceToDegrees;
82831   function distanceToRadians() {
82832       throw new Error("method has been renamed to `lengthToRadians`");
82833   }
82834   exports.distanceToRadians = distanceToRadians;
82835   function radiansToDistance() {
82836       throw new Error("method has been renamed to `radiansToLength`");
82837   }
82838   exports.radiansToDistance = radiansToDistance;
82839   function bearingToAngle() {
82840       throw new Error("method has been renamed to `bearingToAzimuth`");
82841   }
82842   exports.bearingToAngle = bearingToAngle;
82843   function convertDistance() {
82844       throw new Error("method has been renamed to `convertLength`");
82845   }
82846   exports.convertDistance = convertDistance;
82847   });
82848
82849   unwrapExports(helpers);
82850   var helpers_1 = helpers.earthRadius;
82851   var helpers_2 = helpers.factors;
82852   var helpers_3 = helpers.unitsFactors;
82853   var helpers_4 = helpers.areaFactors;
82854   var helpers_5 = helpers.feature;
82855   var helpers_6 = helpers.geometry;
82856   var helpers_7 = helpers.point;
82857   var helpers_8 = helpers.points;
82858   var helpers_9 = helpers.polygon;
82859   var helpers_10 = helpers.polygons;
82860   var helpers_11 = helpers.lineString;
82861   var helpers_12 = helpers.lineStrings;
82862   var helpers_13 = helpers.featureCollection;
82863   var helpers_14 = helpers.multiLineString;
82864   var helpers_15 = helpers.multiPoint;
82865   var helpers_16 = helpers.multiPolygon;
82866   var helpers_17 = helpers.geometryCollection;
82867   var helpers_18 = helpers.round;
82868   var helpers_19 = helpers.radiansToLength;
82869   var helpers_20 = helpers.lengthToRadians;
82870   var helpers_21 = helpers.lengthToDegrees;
82871   var helpers_22 = helpers.bearingToAzimuth;
82872   var helpers_23 = helpers.radiansToDegrees;
82873   var helpers_24 = helpers.degreesToRadians;
82874   var helpers_25 = helpers.convertLength;
82875   var helpers_26 = helpers.convertArea;
82876   var helpers_27 = helpers.isNumber;
82877   var helpers_28 = helpers.isObject;
82878   var helpers_29 = helpers.validateBBox;
82879   var helpers_30 = helpers.validateId;
82880   var helpers_31 = helpers.radians2degrees;
82881   var helpers_32 = helpers.degrees2radians;
82882   var helpers_33 = helpers.distanceToDegrees;
82883   var helpers_34 = helpers.distanceToRadians;
82884   var helpers_35 = helpers.radiansToDistance;
82885   var helpers_36 = helpers.bearingToAngle;
82886   var helpers_37 = helpers.convertDistance;
82887
82888   var invariant = createCommonjsModule(function (module, exports) {
82889   Object.defineProperty(exports, "__esModule", { value: true });
82890
82891   /**
82892    * Unwrap a coordinate from a Point Feature, Geometry or a single coordinate.
82893    *
82894    * @name getCoord
82895    * @param {Array<number>|Geometry<Point>|Feature<Point>} coord GeoJSON Point or an Array of numbers
82896    * @returns {Array<number>} coordinates
82897    * @example
82898    * var pt = turf.point([10, 10]);
82899    *
82900    * var coord = turf.getCoord(pt);
82901    * //= [10, 10]
82902    */
82903   function getCoord(coord) {
82904       if (!coord) {
82905           throw new Error("coord is required");
82906       }
82907       if (!Array.isArray(coord)) {
82908           if (coord.type === "Feature" && coord.geometry !== null && coord.geometry.type === "Point") {
82909               return coord.geometry.coordinates;
82910           }
82911           if (coord.type === "Point") {
82912               return coord.coordinates;
82913           }
82914       }
82915       if (Array.isArray(coord) && coord.length >= 2 && !Array.isArray(coord[0]) && !Array.isArray(coord[1])) {
82916           return coord;
82917       }
82918       throw new Error("coord must be GeoJSON Point or an Array of numbers");
82919   }
82920   exports.getCoord = getCoord;
82921   /**
82922    * Unwrap coordinates from a Feature, Geometry Object or an Array
82923    *
82924    * @name getCoords
82925    * @param {Array<any>|Geometry|Feature} coords Feature, Geometry Object or an Array
82926    * @returns {Array<any>} coordinates
82927    * @example
82928    * var poly = turf.polygon([[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]);
82929    *
82930    * var coords = turf.getCoords(poly);
82931    * //= [[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]
82932    */
82933   function getCoords(coords) {
82934       if (Array.isArray(coords)) {
82935           return coords;
82936       }
82937       // Feature
82938       if (coords.type === "Feature") {
82939           if (coords.geometry !== null) {
82940               return coords.geometry.coordinates;
82941           }
82942       }
82943       else {
82944           // Geometry
82945           if (coords.coordinates) {
82946               return coords.coordinates;
82947           }
82948       }
82949       throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array");
82950   }
82951   exports.getCoords = getCoords;
82952   /**
82953    * Checks if coordinates contains a number
82954    *
82955    * @name containsNumber
82956    * @param {Array<any>} coordinates GeoJSON Coordinates
82957    * @returns {boolean} true if Array contains a number
82958    */
82959   function containsNumber(coordinates) {
82960       if (coordinates.length > 1 && helpers.isNumber(coordinates[0]) && helpers.isNumber(coordinates[1])) {
82961           return true;
82962       }
82963       if (Array.isArray(coordinates[0]) && coordinates[0].length) {
82964           return containsNumber(coordinates[0]);
82965       }
82966       throw new Error("coordinates must only contain numbers");
82967   }
82968   exports.containsNumber = containsNumber;
82969   /**
82970    * Enforce expectations about types of GeoJSON objects for Turf.
82971    *
82972    * @name geojsonType
82973    * @param {GeoJSON} value any GeoJSON object
82974    * @param {string} type expected GeoJSON type
82975    * @param {string} name name of calling function
82976    * @throws {Error} if value is not the expected type.
82977    */
82978   function geojsonType(value, type, name) {
82979       if (!type || !name) {
82980           throw new Error("type and name required");
82981       }
82982       if (!value || value.type !== type) {
82983           throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + value.type);
82984       }
82985   }
82986   exports.geojsonType = geojsonType;
82987   /**
82988    * Enforce expectations about types of {@link Feature} inputs for Turf.
82989    * Internally this uses {@link geojsonType} to judge geometry types.
82990    *
82991    * @name featureOf
82992    * @param {Feature} feature a feature with an expected geometry type
82993    * @param {string} type expected GeoJSON type
82994    * @param {string} name name of calling function
82995    * @throws {Error} error if value is not the expected type.
82996    */
82997   function featureOf(feature, type, name) {
82998       if (!feature) {
82999           throw new Error("No feature passed");
83000       }
83001       if (!name) {
83002           throw new Error(".featureOf() requires a name");
83003       }
83004       if (!feature || feature.type !== "Feature" || !feature.geometry) {
83005           throw new Error("Invalid input to " + name + ", Feature with geometry required");
83006       }
83007       if (!feature.geometry || feature.geometry.type !== type) {
83008           throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type);
83009       }
83010   }
83011   exports.featureOf = featureOf;
83012   /**
83013    * Enforce expectations about types of {@link FeatureCollection} inputs for Turf.
83014    * Internally this uses {@link geojsonType} to judge geometry types.
83015    *
83016    * @name collectionOf
83017    * @param {FeatureCollection} featureCollection a FeatureCollection for which features will be judged
83018    * @param {string} type expected GeoJSON type
83019    * @param {string} name name of calling function
83020    * @throws {Error} if value is not the expected type.
83021    */
83022   function collectionOf(featureCollection, type, name) {
83023       if (!featureCollection) {
83024           throw new Error("No featureCollection passed");
83025       }
83026       if (!name) {
83027           throw new Error(".collectionOf() requires a name");
83028       }
83029       if (!featureCollection || featureCollection.type !== "FeatureCollection") {
83030           throw new Error("Invalid input to " + name + ", FeatureCollection required");
83031       }
83032       for (var _i = 0, _a = featureCollection.features; _i < _a.length; _i++) {
83033           var feature = _a[_i];
83034           if (!feature || feature.type !== "Feature" || !feature.geometry) {
83035               throw new Error("Invalid input to " + name + ", Feature with geometry required");
83036           }
83037           if (!feature.geometry || feature.geometry.type !== type) {
83038               throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type);
83039           }
83040       }
83041   }
83042   exports.collectionOf = collectionOf;
83043   /**
83044    * Get Geometry from Feature or Geometry Object
83045    *
83046    * @param {Feature|Geometry} geojson GeoJSON Feature or Geometry Object
83047    * @returns {Geometry|null} GeoJSON Geometry Object
83048    * @throws {Error} if geojson is not a Feature or Geometry Object
83049    * @example
83050    * var point = {
83051    *   "type": "Feature",
83052    *   "properties": {},
83053    *   "geometry": {
83054    *     "type": "Point",
83055    *     "coordinates": [110, 40]
83056    *   }
83057    * }
83058    * var geom = turf.getGeom(point)
83059    * //={"type": "Point", "coordinates": [110, 40]}
83060    */
83061   function getGeom(geojson) {
83062       if (geojson.type === "Feature") {
83063           return geojson.geometry;
83064       }
83065       return geojson;
83066   }
83067   exports.getGeom = getGeom;
83068   /**
83069    * Get GeoJSON object's type, Geometry type is prioritize.
83070    *
83071    * @param {GeoJSON} geojson GeoJSON object
83072    * @param {string} [name="geojson"] name of the variable to display in error message
83073    * @returns {string} GeoJSON type
83074    * @example
83075    * var point = {
83076    *   "type": "Feature",
83077    *   "properties": {},
83078    *   "geometry": {
83079    *     "type": "Point",
83080    *     "coordinates": [110, 40]
83081    *   }
83082    * }
83083    * var geom = turf.getType(point)
83084    * //="Point"
83085    */
83086   function getType(geojson, name) {
83087       if (geojson.type === "FeatureCollection") {
83088           return "FeatureCollection";
83089       }
83090       if (geojson.type === "GeometryCollection") {
83091           return "GeometryCollection";
83092       }
83093       if (geojson.type === "Feature" && geojson.geometry !== null) {
83094           return geojson.geometry.type;
83095       }
83096       return geojson.type;
83097   }
83098   exports.getType = getType;
83099   });
83100
83101   unwrapExports(invariant);
83102   var invariant_1 = invariant.getCoord;
83103   var invariant_2 = invariant.getCoords;
83104   var invariant_3 = invariant.containsNumber;
83105   var invariant_4 = invariant.geojsonType;
83106   var invariant_5 = invariant.featureOf;
83107   var invariant_6 = invariant.collectionOf;
83108   var invariant_7 = invariant.getGeom;
83109   var invariant_8 = invariant.getType;
83110
83111   var lineclip_1$1 = lineclip$1;
83112   var default_1$1 = lineclip$1;
83113
83114   lineclip$1.polyline = lineclip$1;
83115   lineclip$1.polygon = polygonclip$1;
83116
83117
83118   // Cohen-Sutherland line clippign algorithm, adapted to efficiently
83119   // handle polylines rather than just segments
83120
83121   function lineclip$1(points, bbox, result) {
83122
83123       var len = points.length,
83124           codeA = bitCode$1(points[0], bbox),
83125           part = [],
83126           i, a, b, codeB, lastCode;
83127
83128       if (!result) result = [];
83129
83130       for (i = 1; i < len; i++) {
83131           a = points[i - 1];
83132           b = points[i];
83133           codeB = lastCode = bitCode$1(b, bbox);
83134
83135           while (true) {
83136
83137               if (!(codeA | codeB)) { // accept
83138                   part.push(a);
83139
83140                   if (codeB !== lastCode) { // segment went outside
83141                       part.push(b);
83142
83143                       if (i < len - 1) { // start a new line
83144                           result.push(part);
83145                           part = [];
83146                       }
83147                   } else if (i === len - 1) {
83148                       part.push(b);
83149                   }
83150                   break;
83151
83152               } else if (codeA & codeB) { // trivial reject
83153                   break;
83154
83155               } else if (codeA) { // a outside, intersect with clip edge
83156                   a = intersect$2(a, b, codeA, bbox);
83157                   codeA = bitCode$1(a, bbox);
83158
83159               } else { // b outside
83160                   b = intersect$2(a, b, codeB, bbox);
83161                   codeB = bitCode$1(b, bbox);
83162               }
83163           }
83164
83165           codeA = lastCode;
83166       }
83167
83168       if (part.length) result.push(part);
83169
83170       return result;
83171   }
83172
83173   // Sutherland-Hodgeman polygon clipping algorithm
83174
83175   function polygonclip$1(points, bbox) {
83176
83177       var result, edge, prev, prevInside, i, p, inside;
83178
83179       // clip against each side of the clip rectangle
83180       for (edge = 1; edge <= 8; edge *= 2) {
83181           result = [];
83182           prev = points[points.length - 1];
83183           prevInside = !(bitCode$1(prev, bbox) & edge);
83184
83185           for (i = 0; i < points.length; i++) {
83186               p = points[i];
83187               inside = !(bitCode$1(p, bbox) & edge);
83188
83189               // if segment goes through the clip window, add an intersection
83190               if (inside !== prevInside) result.push(intersect$2(prev, p, edge, bbox));
83191
83192               if (inside) result.push(p); // add a point if it's inside
83193
83194               prev = p;
83195               prevInside = inside;
83196           }
83197
83198           points = result;
83199
83200           if (!points.length) break;
83201       }
83202
83203       return result;
83204   }
83205
83206   // intersect a segment against one of the 4 lines that make up the bbox
83207
83208   function intersect$2(a, b, edge, bbox) {
83209       return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
83210              edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
83211              edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
83212              edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
83213              null;
83214   }
83215
83216   // bit code reflects the point position relative to the bbox:
83217
83218   //         left  mid  right
83219   //    top  1001  1000  1010
83220   //    mid  0001  0000  0010
83221   // bottom  0101  0100  0110
83222
83223   function bitCode$1(p, bbox) {
83224       var code = 0;
83225
83226       if (p[0] < bbox[0]) code |= 1; // left
83227       else if (p[0] > bbox[2]) code |= 2; // right
83228
83229       if (p[1] < bbox[1]) code |= 4; // bottom
83230       else if (p[1] > bbox[3]) code |= 8; // top
83231
83232       return code;
83233   }
83234   lineclip_1$1.default = default_1$1;
83235
83236   var bboxClip_1 = createCommonjsModule(function (module, exports) {
83237   var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) {
83238       if (mod && mod.__esModule) return mod;
83239       var result = {};
83240       if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
83241       result["default"] = mod;
83242       return result;
83243   };
83244   Object.defineProperty(exports, "__esModule", { value: true });
83245
83246
83247   var lineclip = __importStar(lineclip_1$1);
83248   /**
83249    * Takes a {@link Feature} and a bbox and clips the feature to the bbox using
83250    * [lineclip](https://github.com/mapbox/lineclip).
83251    * May result in degenerate edges when clipping Polygons.
83252    *
83253    * @name bboxClip
83254    * @param {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} feature feature to clip to the bbox
83255    * @param {BBox} bbox extent in [minX, minY, maxX, maxY] order
83256    * @returns {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} clipped Feature
83257    * @example
83258    * var bbox = [0, 0, 10, 10];
83259    * var poly = turf.polygon([[[2, 2], [8, 4], [12, 8], [3, 7], [2, 2]]]);
83260    *
83261    * var clipped = turf.bboxClip(poly, bbox);
83262    *
83263    * //addToMap
83264    * var addToMap = [bbox, poly, clipped]
83265    */
83266   function bboxClip(feature, bbox) {
83267       var geom = invariant.getGeom(feature);
83268       var type = geom.type;
83269       var properties = feature.type === "Feature" ? feature.properties : {};
83270       var coords = geom.coordinates;
83271       switch (type) {
83272           case "LineString":
83273           case "MultiLineString":
83274               var lines_1 = [];
83275               if (type === "LineString") {
83276                   coords = [coords];
83277               }
83278               coords.forEach(function (line) {
83279                   lineclip.polyline(line, bbox, lines_1);
83280               });
83281               if (lines_1.length === 1) {
83282                   return helpers.lineString(lines_1[0], properties);
83283               }
83284               return helpers.multiLineString(lines_1, properties);
83285           case "Polygon":
83286               return helpers.polygon(clipPolygon(coords, bbox), properties);
83287           case "MultiPolygon":
83288               return helpers.multiPolygon(coords.map(function (poly) {
83289                   return clipPolygon(poly, bbox);
83290               }), properties);
83291           default:
83292               throw new Error("geometry " + type + " not supported");
83293       }
83294   }
83295   exports.default = bboxClip;
83296   function clipPolygon(rings, bbox) {
83297       var outRings = [];
83298       for (var _i = 0, rings_1 = rings; _i < rings_1.length; _i++) {
83299           var ring = rings_1[_i];
83300           var clipped = lineclip.polygon(ring, bbox);
83301           if (clipped.length > 0) {
83302               if (clipped[0][0] !== clipped[clipped.length - 1][0] || clipped[0][1] !== clipped[clipped.length - 1][1]) {
83303                   clipped.push(clipped[0]);
83304               }
83305               if (clipped.length >= 4) {
83306                   outRings.push(clipped);
83307               }
83308           }
83309       }
83310       return outRings;
83311   }
83312   });
83313
83314   var turf_bboxClip = unwrapExports(bboxClip_1);
83315
83316   var martinez_umd = createCommonjsModule(function (module, exports) {
83317   /**
83318    * martinez v0.5.0
83319    * Martinez polygon clipping algorithm, does boolean operation on polygons (multipolygons, polygons with holes etc): intersection, union, difference, xor
83320    *
83321    * @author Alex Milevski <info@w8r.name>
83322    * @license MIT
83323    * @preserve
83324    */
83325
83326   (function (global, factory) {
83327     factory(exports);
83328   }(commonjsGlobal, (function (exports) {
83329     function DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }
83330
83331     var SplayTree = function SplayTree(compare, noDuplicates) {
83332       if ( compare === void 0 ) compare = DEFAULT_COMPARE;
83333       if ( noDuplicates === void 0 ) noDuplicates = false;
83334
83335       this._compare = compare;
83336       this._root = null;
83337       this._size = 0;
83338       this._noDuplicates = !!noDuplicates;
83339     };
83340
83341     var prototypeAccessors = { size: { configurable: true } };
83342
83343
83344     SplayTree.prototype.rotateLeft = function rotateLeft (x) {
83345       var y = x.right;
83346       if (y) {
83347         x.right = y.left;
83348         if (y.left) { y.left.parent = x; }
83349         y.parent = x.parent;
83350       }
83351
83352       if (!x.parent)              { this._root = y; }
83353       else if (x === x.parent.left) { x.parent.left = y; }
83354       else                        { x.parent.right = y; }
83355       if (y) { y.left = x; }
83356       x.parent = y;
83357     };
83358
83359
83360     SplayTree.prototype.rotateRight = function rotateRight (x) {
83361       var y = x.left;
83362       if (y) {
83363         x.left = y.right;
83364         if (y.right) { y.right.parent = x; }
83365         y.parent = x.parent;
83366       }
83367
83368       if (!x.parent)             { this._root = y; }
83369       else if(x === x.parent.left) { x.parent.left = y; }
83370       else                       { x.parent.right = y; }
83371       if (y) { y.right = x; }
83372       x.parent = y;
83373     };
83374
83375
83376     SplayTree.prototype._splay = function _splay (x) {
83377         var this$1 = this;
83378
83379       while (x.parent) {
83380         var p = x.parent;
83381         if (!p.parent) {
83382           if (p.left === x) { this$1.rotateRight(p); }
83383           else            { this$1.rotateLeft(p); }
83384         } else if (p.left === x && p.parent.left === p) {
83385           this$1.rotateRight(p.parent);
83386           this$1.rotateRight(p);
83387         } else if (p.right === x && p.parent.right === p) {
83388           this$1.rotateLeft(p.parent);
83389           this$1.rotateLeft(p);
83390         } else if (p.left === x && p.parent.right === p) {
83391           this$1.rotateRight(p);
83392           this$1.rotateLeft(p);
83393         } else {
83394           this$1.rotateLeft(p);
83395           this$1.rotateRight(p);
83396         }
83397       }
83398     };
83399
83400
83401     SplayTree.prototype.splay = function splay (x) {
83402         var this$1 = this;
83403
83404       var p, gp, ggp, l, r;
83405
83406       while (x.parent) {
83407         p = x.parent;
83408         gp = p.parent;
83409
83410         if (gp && gp.parent) {
83411           ggp = gp.parent;
83412           if (ggp.left === gp) { ggp.left= x; }
83413           else               { ggp.right = x; }
83414           x.parent = ggp;
83415         } else {
83416           x.parent = null;
83417           this$1._root = x;
83418         }
83419
83420         l = x.left; r = x.right;
83421
83422         if (x === p.left) { // left
83423           if (gp) {
83424             if (gp.left === p) {
83425               /* zig-zig */
83426               if (p.right) {
83427                 gp.left = p.right;
83428                 gp.left.parent = gp;
83429               } else { gp.left = null; }
83430
83431               p.right = gp;
83432               gp.parent = p;
83433             } else {
83434               /* zig-zag */
83435               if (l) {
83436                 gp.right = l;
83437                 l.parent = gp;
83438               } else { gp.right = null; }
83439
83440               x.left  = gp;
83441               gp.parent = x;
83442             }
83443           }
83444           if (r) {
83445             p.left = r;
83446             r.parent = p;
83447           } else { p.left = null; }
83448
83449           x.right= p;
83450           p.parent = x;
83451         } else { // right
83452           if (gp) {
83453             if (gp.right === p) {
83454               /* zig-zig */
83455               if (p.left) {
83456                 gp.right = p.left;
83457                 gp.right.parent = gp;
83458               } else { gp.right = null; }
83459
83460               p.left = gp;
83461               gp.parent = p;
83462             } else {
83463               /* zig-zag */
83464               if (r) {
83465                 gp.left = r;
83466                 r.parent = gp;
83467               } else { gp.left = null; }
83468
83469               x.right = gp;
83470               gp.parent = x;
83471             }
83472           }
83473           if (l) {
83474             p.right = l;
83475             l.parent = p;
83476           } else { p.right = null; }
83477
83478           x.left = p;
83479           p.parent = x;
83480         }
83481       }
83482     };
83483
83484
83485     SplayTree.prototype.replace = function replace (u, v) {
83486       if (!u.parent) { this._root = v; }
83487       else if (u === u.parent.left) { u.parent.left = v; }
83488       else { u.parent.right = v; }
83489       if (v) { v.parent = u.parent; }
83490     };
83491
83492
83493     SplayTree.prototype.minNode = function minNode (u) {
83494         if ( u === void 0 ) u = this._root;
83495
83496       if (u) { while (u.left) { u = u.left; } }
83497       return u;
83498     };
83499
83500
83501     SplayTree.prototype.maxNode = function maxNode (u) {
83502         if ( u === void 0 ) u = this._root;
83503
83504       if (u) { while (u.right) { u = u.right; } }
83505       return u;
83506     };
83507
83508
83509     SplayTree.prototype.insert = function insert (key, data) {
83510       var z = this._root;
83511       var p = null;
83512       var comp = this._compare;
83513       var cmp;
83514
83515       if (this._noDuplicates) {
83516         while (z) {
83517           p = z;
83518           cmp = comp(z.key, key);
83519           if (cmp === 0) { return; }
83520           else if (comp(z.key, key) < 0) { z = z.right; }
83521           else { z = z.left; }
83522         }
83523       } else {
83524         while (z) {
83525           p = z;
83526           if (comp(z.key, key) < 0) { z = z.right; }
83527           else { z = z.left; }
83528         }
83529       }
83530
83531       z = { key: key, data: data, left: null, right: null, parent: p };
83532
83533       if (!p)                        { this._root = z; }
83534       else if (comp(p.key, z.key) < 0) { p.right = z; }
83535       else                           { p.left= z; }
83536
83537       this.splay(z);
83538       this._size++;
83539       return z;
83540     };
83541
83542
83543     SplayTree.prototype.find = function find (key) {
83544       var z  = this._root;
83545       var comp = this._compare;
83546       while (z) {
83547         var cmp = comp(z.key, key);
83548         if    (cmp < 0) { z = z.right; }
83549         else if (cmp > 0) { z = z.left; }
83550         else            { return z; }
83551       }
83552       return null;
83553     };
83554
83555     /**
83556      * Whether the tree contains a node with the given key
83557      * @param{Key} key
83558      * @return {boolean} true/false
83559      */
83560     SplayTree.prototype.contains = function contains (key) {
83561       var node     = this._root;
83562       var comparator = this._compare;
83563       while (node){
83564         var cmp = comparator(key, node.key);
83565         if    (cmp === 0) { return true; }
83566         else if (cmp < 0) { node = node.left; }
83567         else              { node = node.right; }
83568       }
83569
83570       return false;
83571     };
83572
83573
83574     SplayTree.prototype.remove = function remove (key) {
83575       var z = this.find(key);
83576
83577       if (!z) { return false; }
83578
83579       this.splay(z);
83580
83581       if (!z.left) { this.replace(z, z.right); }
83582       else if (!z.right) { this.replace(z, z.left); }
83583       else {
83584         var y = this.minNode(z.right);
83585         if (y.parent !== z) {
83586           this.replace(y, y.right);
83587           y.right = z.right;
83588           y.right.parent = y;
83589         }
83590         this.replace(z, y);
83591         y.left = z.left;
83592         y.left.parent = y;
83593       }
83594
83595       this._size--;
83596       return true;
83597     };
83598
83599
83600     SplayTree.prototype.removeNode = function removeNode (z) {
83601       if (!z) { return false; }
83602
83603       this.splay(z);
83604
83605       if (!z.left) { this.replace(z, z.right); }
83606       else if (!z.right) { this.replace(z, z.left); }
83607       else {
83608         var y = this.minNode(z.right);
83609         if (y.parent !== z) {
83610           this.replace(y, y.right);
83611           y.right = z.right;
83612           y.right.parent = y;
83613         }
83614         this.replace(z, y);
83615         y.left = z.left;
83616         y.left.parent = y;
83617       }
83618
83619       this._size--;
83620       return true;
83621     };
83622
83623
83624     SplayTree.prototype.erase = function erase (key) {
83625       var z = this.find(key);
83626       if (!z) { return; }
83627
83628       this.splay(z);
83629
83630       var s = z.left;
83631       var t = z.right;
83632
83633       var sMax = null;
83634       if (s) {
83635         s.parent = null;
83636         sMax = this.maxNode(s);
83637         this.splay(sMax);
83638         this._root = sMax;
83639       }
83640       if (t) {
83641         if (s) { sMax.right = t; }
83642         else { this._root = t; }
83643         t.parent = sMax;
83644       }
83645
83646       this._size--;
83647     };
83648
83649     /**
83650      * Removes and returns the node with smallest key
83651      * @return {?Node}
83652      */
83653     SplayTree.prototype.pop = function pop () {
83654       var node = this._root, returnValue = null;
83655       if (node) {
83656         while (node.left) { node = node.left; }
83657         returnValue = { key: node.key, data: node.data };
83658         this.remove(node.key);
83659       }
83660       return returnValue;
83661     };
83662
83663
83664     /* eslint-disable class-methods-use-this */
83665
83666     /**
83667      * Successor node
83668      * @param{Node} node
83669      * @return {?Node}
83670      */
83671     SplayTree.prototype.next = function next (node) {
83672       var successor = node;
83673       if (successor) {
83674         if (successor.right) {
83675           successor = successor.right;
83676           while (successor && successor.left) { successor = successor.left; }
83677         } else {
83678           successor = node.parent;
83679           while (successor && successor.right === node) {
83680             node = successor; successor = successor.parent;
83681           }
83682         }
83683       }
83684       return successor;
83685     };
83686
83687
83688     /**
83689      * Predecessor node
83690      * @param{Node} node
83691      * @return {?Node}
83692      */
83693     SplayTree.prototype.prev = function prev (node) {
83694       var predecessor = node;
83695       if (predecessor) {
83696         if (predecessor.left) {
83697           predecessor = predecessor.left;
83698           while (predecessor && predecessor.right) { predecessor = predecessor.right; }
83699         } else {
83700           predecessor = node.parent;
83701           while (predecessor && predecessor.left === node) {
83702             node = predecessor;
83703             predecessor = predecessor.parent;
83704           }
83705         }
83706       }
83707       return predecessor;
83708     };
83709     /* eslint-enable class-methods-use-this */
83710
83711
83712     /**
83713      * @param{forEachCallback} callback
83714      * @return {SplayTree}
83715      */
83716     SplayTree.prototype.forEach = function forEach (callback) {
83717       var current = this._root;
83718       var s = [], done = false, i = 0;
83719
83720       while (!done) {
83721         // Reach the left most Node of the current Node
83722         if (current) {
83723           // Place pointer to a tree node on the stack
83724           // before traversing the node's left subtree
83725           s.push(current);
83726           current = current.left;
83727         } else {
83728           // BackTrack from the empty subtree and visit the Node
83729           // at the top of the stack; however, if the stack is
83730           // empty you are done
83731           if (s.length > 0) {
83732             current = s.pop();
83733             callback(current, i++);
83734
83735             // We have visited the node and its left
83736             // subtree. Now, it's right subtree's turn
83737             current = current.right;
83738           } else { done = true; }
83739         }
83740       }
83741       return this;
83742     };
83743
83744
83745     /**
83746      * Walk key range from `low` to `high`. Stops if `fn` returns a value.
83747      * @param{Key}    low
83748      * @param{Key}    high
83749      * @param{Function} fn
83750      * @param{*?}     ctx
83751      * @return {SplayTree}
83752      */
83753     SplayTree.prototype.range = function range (low, high, fn, ctx) {
83754         var this$1 = this;
83755
83756       var Q = [];
83757       var compare = this._compare;
83758       var node = this._root, cmp;
83759
83760       while (Q.length !== 0 || node) {
83761         if (node) {
83762           Q.push(node);
83763           node = node.left;
83764         } else {
83765           node = Q.pop();
83766           cmp = compare(node.key, high);
83767           if (cmp > 0) {
83768             break;
83769           } else if (compare(node.key, low) >= 0) {
83770             if (fn.call(ctx, node)) { return this$1; } // stop if smth is returned
83771           }
83772           node = node.right;
83773         }
83774       }
83775       return this;
83776     };
83777
83778     /**
83779      * Returns all keys in order
83780      * @return {Array<Key>}
83781      */
83782     SplayTree.prototype.keys = function keys () {
83783       var current = this._root;
83784       var s = [], r = [], done = false;
83785
83786       while (!done) {
83787         if (current) {
83788           s.push(current);
83789           current = current.left;
83790         } else {
83791           if (s.length > 0) {
83792             current = s.pop();
83793             r.push(current.key);
83794             current = current.right;
83795           } else { done = true; }
83796         }
83797       }
83798       return r;
83799     };
83800
83801
83802     /**
83803      * Returns `data` fields of all nodes in order.
83804      * @return {Array<Value>}
83805      */
83806     SplayTree.prototype.values = function values () {
83807       var current = this._root;
83808       var s = [], r = [], done = false;
83809
83810       while (!done) {
83811         if (current) {
83812           s.push(current);
83813           current = current.left;
83814         } else {
83815           if (s.length > 0) {
83816             current = s.pop();
83817             r.push(current.data);
83818             current = current.right;
83819           } else { done = true; }
83820         }
83821       }
83822       return r;
83823     };
83824
83825
83826     /**
83827      * Returns node at given index
83828      * @param{number} index
83829      * @return {?Node}
83830      */
83831     SplayTree.prototype.at = function at (index) {
83832       // removed after a consideration, more misleading than useful
83833       // index = index % this.size;
83834       // if (index < 0) index = this.size - index;
83835
83836       var current = this._root;
83837       var s = [], done = false, i = 0;
83838
83839       while (!done) {
83840         if (current) {
83841           s.push(current);
83842           current = current.left;
83843         } else {
83844           if (s.length > 0) {
83845             current = s.pop();
83846             if (i === index) { return current; }
83847             i++;
83848             current = current.right;
83849           } else { done = true; }
83850         }
83851       }
83852       return null;
83853     };
83854
83855     /**
83856      * Bulk-load items. Both array have to be same size
83857      * @param{Array<Key>}  keys
83858      * @param{Array<Value>}[values]
83859      * @param{Boolean}     [presort=false] Pre-sort keys and values, using
83860      *                                       tree's comparator. Sorting is done
83861      *                                       in-place
83862      * @return {AVLTree}
83863      */
83864     SplayTree.prototype.load = function load (keys, values, presort) {
83865         if ( keys === void 0 ) keys = [];
83866         if ( values === void 0 ) values = [];
83867         if ( presort === void 0 ) presort = false;
83868
83869       if (this._size !== 0) { throw new Error('bulk-load: tree is not empty'); }
83870       var size = keys.length;
83871       if (presort) { sort(keys, values, 0, size - 1, this._compare); }
83872       this._root = loadRecursive(null, keys, values, 0, size);
83873       this._size = size;
83874       return this;
83875     };
83876
83877
83878     SplayTree.prototype.min = function min () {
83879       var node = this.minNode(this._root);
83880       if (node) { return node.key; }
83881       else    { return null; }
83882     };
83883
83884
83885     SplayTree.prototype.max = function max () {
83886       var node = this.maxNode(this._root);
83887       if (node) { return node.key; }
83888       else    { return null; }
83889     };
83890
83891     SplayTree.prototype.isEmpty = function isEmpty () { return this._root === null; };
83892     prototypeAccessors.size.get = function () { return this._size; };
83893
83894
83895     /**
83896      * Create a tree and load it with items
83897      * @param{Array<Key>}        keys
83898      * @param{Array<Value>?}      [values]
83899
83900      * @param{Function?}          [comparator]
83901      * @param{Boolean?}           [presort=false] Pre-sort keys and values, using
83902      *                                             tree's comparator. Sorting is done
83903      *                                             in-place
83904      * @param{Boolean?}           [noDuplicates=false] Allow duplicates
83905      * @return {SplayTree}
83906      */
83907     SplayTree.createTree = function createTree (keys, values, comparator, presort, noDuplicates) {
83908       return new SplayTree(comparator, noDuplicates).load(keys, values, presort);
83909     };
83910
83911     Object.defineProperties( SplayTree.prototype, prototypeAccessors );
83912
83913
83914     function loadRecursive (parent, keys, values, start, end) {
83915       var size = end - start;
83916       if (size > 0) {
83917         var middle = start + Math.floor(size / 2);
83918         var key    = keys[middle];
83919         var data   = values[middle];
83920         var node   = { key: key, data: data, parent: parent };
83921         node.left    = loadRecursive(node, keys, values, start, middle);
83922         node.right   = loadRecursive(node, keys, values, middle + 1, end);
83923         return node;
83924       }
83925       return null;
83926     }
83927
83928
83929     function sort(keys, values, left, right, compare) {
83930       if (left >= right) { return; }
83931
83932       var pivot = keys[(left + right) >> 1];
83933       var i = left - 1;
83934       var j = right + 1;
83935
83936       while (true) {
83937         do { i++; } while (compare(keys[i], pivot) < 0);
83938         do { j--; } while (compare(keys[j], pivot) > 0);
83939         if (i >= j) { break; }
83940
83941         var tmp = keys[i];
83942         keys[i] = keys[j];
83943         keys[j] = tmp;
83944
83945         tmp = values[i];
83946         values[i] = values[j];
83947         values[j] = tmp;
83948       }
83949
83950       sort(keys, values,  left,     j, compare);
83951       sort(keys, values, j + 1, right, compare);
83952     }
83953
83954     var NORMAL               = 0;
83955     var NON_CONTRIBUTING     = 1;
83956     var SAME_TRANSITION      = 2;
83957     var DIFFERENT_TRANSITION = 3;
83958
83959     var INTERSECTION = 0;
83960     var UNION        = 1;
83961     var DIFFERENCE   = 2;
83962     var XOR          = 3;
83963
83964     /**
83965      * @param  {SweepEvent} event
83966      * @param  {SweepEvent} prev
83967      * @param  {Operation} operation
83968      */
83969     function computeFields (event, prev, operation) {
83970       // compute inOut and otherInOut fields
83971       if (prev === null) {
83972         event.inOut      = false;
83973         event.otherInOut = true;
83974
83975       // previous line segment in sweepline belongs to the same polygon
83976       } else {
83977         if (event.isSubject === prev.isSubject) {
83978           event.inOut      = !prev.inOut;
83979           event.otherInOut = prev.otherInOut;
83980
83981         // previous line segment in sweepline belongs to the clipping polygon
83982         } else {
83983           event.inOut      = !prev.otherInOut;
83984           event.otherInOut = prev.isVertical() ? !prev.inOut : prev.inOut;
83985         }
83986
83987         // compute prevInResult field
83988         if (prev) {
83989           event.prevInResult = (!inResult(prev, operation) || prev.isVertical())
83990             ? prev.prevInResult : prev;
83991         }
83992       }
83993
83994       // check if the line segment belongs to the Boolean operation
83995       event.inResult = inResult(event, operation);
83996     }
83997
83998
83999     /* eslint-disable indent */
84000     function inResult(event, operation) {
84001       switch (event.type) {
84002         case NORMAL:
84003           switch (operation) {
84004             case INTERSECTION:
84005               return !event.otherInOut;
84006             case UNION:
84007               return event.otherInOut;
84008             case DIFFERENCE:
84009               // return (event.isSubject && !event.otherInOut) ||
84010               //         (!event.isSubject && event.otherInOut);
84011               return (event.isSubject && event.otherInOut) ||
84012                       (!event.isSubject && !event.otherInOut);
84013             case XOR:
84014               return true;
84015           }
84016           break;
84017         case SAME_TRANSITION:
84018           return operation === INTERSECTION || operation === UNION;
84019         case DIFFERENT_TRANSITION:
84020           return operation === DIFFERENCE;
84021         case NON_CONTRIBUTING:
84022           return false;
84023       }
84024       return false;
84025     }
84026     /* eslint-enable indent */
84027
84028     var SweepEvent = function SweepEvent (point, left, otherEvent, isSubject, edgeType) {
84029
84030       /**
84031        * Is left endpoint?
84032        * @type {Boolean}
84033        */
84034       this.left = left;
84035
84036       /**
84037        * @type {Array.<Number>}
84038        */
84039       this.point = point;
84040
84041       /**
84042        * Other edge reference
84043        * @type {SweepEvent}
84044        */
84045       this.otherEvent = otherEvent;
84046
84047       /**
84048        * Belongs to source or clipping polygon
84049        * @type {Boolean}
84050        */
84051       this.isSubject = isSubject;
84052
84053       /**
84054        * Edge contribution type
84055        * @type {Number}
84056        */
84057       this.type = edgeType || NORMAL;
84058
84059
84060       /**
84061        * In-out transition for the sweepline crossing polygon
84062        * @type {Boolean}
84063        */
84064       this.inOut = false;
84065
84066
84067       /**
84068        * @type {Boolean}
84069        */
84070       this.otherInOut = false;
84071
84072       /**
84073        * Previous event in result?
84074        * @type {SweepEvent}
84075        */
84076       this.prevInResult = null;
84077
84078       /**
84079        * Does event belong to result?
84080        * @type {Boolean}
84081        */
84082       this.inResult = false;
84083
84084
84085       // connection step
84086
84087       /**
84088        * @type {Boolean}
84089        */
84090       this.resultInOut = false;
84091
84092       this.isExteriorRing = true;
84093     };
84094
84095
84096     /**
84097      * @param{Array.<Number>}p
84098      * @return {Boolean}
84099      */
84100     SweepEvent.prototype.isBelow = function isBelow (p) {
84101       var p0 = this.point, p1 = this.otherEvent.point;
84102       return this.left
84103         ? (p0[0] - p[0]) * (p1[1] - p[1]) - (p1[0] - p[0]) * (p0[1] - p[1]) > 0
84104         // signedArea(this.point, this.otherEvent.point, p) > 0 :
84105         : (p1[0] - p[0]) * (p0[1] - p[1]) - (p0[0] - p[0]) * (p1[1] - p[1]) > 0;
84106         //signedArea(this.otherEvent.point, this.point, p) > 0;
84107     };
84108
84109
84110     /**
84111      * @param{Array.<Number>}p
84112      * @return {Boolean}
84113      */
84114     SweepEvent.prototype.isAbove = function isAbove (p) {
84115       return !this.isBelow(p);
84116     };
84117
84118
84119     /**
84120      * @return {Boolean}
84121      */
84122     SweepEvent.prototype.isVertical = function isVertical () {
84123       return this.point[0] === this.otherEvent.point[0];
84124     };
84125
84126
84127     SweepEvent.prototype.clone = function clone () {
84128       var copy = new SweepEvent(
84129         this.point, this.left, this.otherEvent, this.isSubject, this.type);
84130
84131       copy.inResult     = this.inResult;
84132       copy.prevInResult = this.prevInResult;
84133       copy.isExteriorRing = this.isExteriorRing;
84134       copy.inOut        = this.inOut;
84135       copy.otherInOut   = this.otherInOut;
84136
84137       return copy;
84138     };
84139
84140     function equals(p1, p2) {
84141       if (p1[0] === p2[0]) {
84142         if (p1[1] === p2[1]) {
84143           return true;
84144         } else {
84145           return false;
84146         }
84147       }
84148       return false;
84149     }
84150
84151     // const EPSILON = 1e-9;
84152     // const abs = Math.abs;
84153     // TODO https://github.com/w8r/martinez/issues/6#issuecomment-262847164
84154     // Precision problem.
84155     //
84156     // module.exports = function equals(p1, p2) {
84157     //   return abs(p1[0] - p2[0]) <= EPSILON && abs(p1[1] - p2[1]) <= EPSILON;
84158     // };
84159
84160     /**
84161      * Signed area of the triangle (p0, p1, p2)
84162      * @param  {Array.<Number>} p0
84163      * @param  {Array.<Number>} p1
84164      * @param  {Array.<Number>} p2
84165      * @return {Number}
84166      */
84167     function signedArea(p0, p1, p2) {
84168       return (p0[0] - p2[0]) * (p1[1] - p2[1]) - (p1[0] - p2[0]) * (p0[1] - p2[1]);
84169     }
84170
84171     /**
84172      * @param  {SweepEvent} e1
84173      * @param  {SweepEvent} e2
84174      * @return {Number}
84175      */
84176     function compareEvents(e1, e2) {
84177       var p1 = e1.point;
84178       var p2 = e2.point;
84179
84180       // Different x-coordinate
84181       if (p1[0] > p2[0]) { return 1; }
84182       if (p1[0] < p2[0]) { return -1; }
84183
84184       // Different points, but same x-coordinate
84185       // Event with lower y-coordinate is processed first
84186       if (p1[1] !== p2[1]) { return p1[1] > p2[1] ? 1 : -1; }
84187
84188       return specialCases(e1, e2, p1, p2);
84189     }
84190
84191
84192     /* eslint-disable no-unused-vars */
84193     function specialCases(e1, e2, p1, p2) {
84194       // Same coordinates, but one is a left endpoint and the other is
84195       // a right endpoint. The right endpoint is processed first
84196       if (e1.left !== e2.left)
84197         { return e1.left ? 1 : -1; }
84198
84199       // const p2 = e1.otherEvent.point, p3 = e2.otherEvent.point;
84200       // const sa = (p1[0] - p3[0]) * (p2[1] - p3[1]) - (p2[0] - p3[0]) * (p1[1] - p3[1])
84201       // Same coordinates, both events
84202       // are left endpoints or right endpoints.
84203       // not collinear
84204       if (signedArea(p1, e1.otherEvent.point, e2.otherEvent.point) !== 0) {
84205         // the event associate to the bottom segment is processed first
84206         return (!e1.isBelow(e2.otherEvent.point)) ? 1 : -1;
84207       }
84208
84209       return (!e1.isSubject && e2.isSubject) ? 1 : -1;
84210     }
84211     /* eslint-enable no-unused-vars */
84212
84213     /**
84214      * @param  {SweepEvent} se
84215      * @param  {Array.<Number>} p
84216      * @param  {Queue} queue
84217      * @return {Queue}
84218      */
84219     function divideSegment(se, p, queue)  {
84220       var r = new SweepEvent(p, false, se,            se.isSubject);
84221       var l = new SweepEvent(p, true,  se.otherEvent, se.isSubject);
84222
84223       /* eslint-disable no-console */
84224       if (equals(se.point, se.otherEvent.point)) {
84225
84226         console.warn('what is that, a collapsed segment?', se);
84227       }
84228       /* eslint-enable no-console */
84229
84230       r.contourId = l.contourId = se.contourId;
84231
84232       // avoid a rounding error. The left event would be processed after the right event
84233       if (compareEvents(l, se.otherEvent) > 0) {
84234         se.otherEvent.left = true;
84235         l.left = false;
84236       }
84237
84238       // avoid a rounding error. The left event would be processed after the right event
84239       // if (compareEvents(se, r) > 0) {}
84240
84241       se.otherEvent.otherEvent = l;
84242       se.otherEvent = r;
84243
84244       queue.push(l);
84245       queue.push(r);
84246
84247       return queue;
84248     }
84249
84250     //const EPS = 1e-9;
84251
84252     /**
84253      * Finds the magnitude of the cross product of two vectors (if we pretend
84254      * they're in three dimensions)
84255      *
84256      * @param {Object} a First vector
84257      * @param {Object} b Second vector
84258      * @private
84259      * @returns {Number} The magnitude of the cross product
84260      */
84261     function crossProduct(a, b) {
84262       return (a[0] * b[1]) - (a[1] * b[0]);
84263     }
84264
84265     /**
84266      * Finds the dot product of two vectors.
84267      *
84268      * @param {Object} a First vector
84269      * @param {Object} b Second vector
84270      * @private
84271      * @returns {Number} The dot product
84272      */
84273     function dotProduct(a, b) {
84274       return (a[0] * b[0]) + (a[1] * b[1]);
84275     }
84276
84277     /**
84278      * Finds the intersection (if any) between two line segments a and b, given the
84279      * line segments' end points a1, a2 and b1, b2.
84280      *
84281      * This algorithm is based on Schneider and Eberly.
84282      * http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf
84283      * Page 244.
84284      *
84285      * @param {Array.<Number>} a1 point of first line
84286      * @param {Array.<Number>} a2 point of first line
84287      * @param {Array.<Number>} b1 point of second line
84288      * @param {Array.<Number>} b2 point of second line
84289      * @param {Boolean=}       noEndpointTouch whether to skip single touchpoints
84290      *                                         (meaning connected segments) as
84291      *                                         intersections
84292      * @returns {Array.<Array.<Number>>|Null} If the lines intersect, the point of
84293      * intersection. If they overlap, the two end points of the overlapping segment.
84294      * Otherwise, null.
84295      */
84296     function intersection (a1, a2, b1, b2, noEndpointTouch) {
84297       // The algorithm expects our lines in the form P + sd, where P is a point,
84298       // s is on the interval [0, 1], and d is a vector.
84299       // We are passed two points. P can be the first point of each pair. The
84300       // vector, then, could be thought of as the distance (in x and y components)
84301       // from the first point to the second point.
84302       // So first, let's make our vectors:
84303       var va = [a2[0] - a1[0], a2[1] - a1[1]];
84304       var vb = [b2[0] - b1[0], b2[1] - b1[1]];
84305       // We also define a function to convert back to regular point form:
84306
84307       /* eslint-disable arrow-body-style */
84308
84309       function toPoint(p, s, d) {
84310         return [
84311           p[0] + s * d[0],
84312           p[1] + s * d[1]
84313         ];
84314       }
84315
84316       /* eslint-enable arrow-body-style */
84317
84318       // The rest is pretty much a straight port of the algorithm.
84319       var e = [b1[0] - a1[0], b1[1] - a1[1]];
84320       var kross    = crossProduct(va, vb);
84321       var sqrKross = kross * kross;
84322       var sqrLenA  = dotProduct(va, va);
84323       //const sqrLenB  = dotProduct(vb, vb);
84324
84325       // Check for line intersection. This works because of the properties of the
84326       // cross product -- specifically, two vectors are parallel if and only if the
84327       // cross product is the 0 vector. The full calculation involves relative error
84328       // to account for possible very small line segments. See Schneider & Eberly
84329       // for details.
84330       if (sqrKross > 0/* EPS * sqrLenB * sqLenA */) {
84331         // If they're not parallel, then (because these are line segments) they
84332         // still might not actually intersect. This code checks that the
84333         // intersection point of the lines is actually on both line segments.
84334         var s = crossProduct(e, vb) / kross;
84335         if (s < 0 || s > 1) {
84336           // not on line segment a
84337           return null;
84338         }
84339         var t = crossProduct(e, va) / kross;
84340         if (t < 0 || t > 1) {
84341           // not on line segment b
84342           return null;
84343         }
84344         if (s === 0 || s === 1) {
84345           // on an endpoint of line segment a
84346           return noEndpointTouch ? null : [toPoint(a1, s, va)];
84347         }
84348         if (t === 0 || t === 1) {
84349           // on an endpoint of line segment b
84350           return noEndpointTouch ? null : [toPoint(b1, t, vb)];
84351         }
84352         return [toPoint(a1, s, va)];
84353       }
84354
84355       // If we've reached this point, then the lines are either parallel or the
84356       // same, but the segments could overlap partially or fully, or not at all.
84357       // So we need to find the overlap, if any. To do that, we can use e, which is
84358       // the (vector) difference between the two initial points. If this is parallel
84359       // with the line itself, then the two lines are the same line, and there will
84360       // be overlap.
84361       //const sqrLenE = dotProduct(e, e);
84362       kross = crossProduct(e, va);
84363       sqrKross = kross * kross;
84364
84365       if (sqrKross > 0 /* EPS * sqLenB * sqLenE */) {
84366       // Lines are just parallel, not the same. No overlap.
84367         return null;
84368       }
84369
84370       var sa = dotProduct(va, e) / sqrLenA;
84371       var sb = sa + dotProduct(va, vb) / sqrLenA;
84372       var smin = Math.min(sa, sb);
84373       var smax = Math.max(sa, sb);
84374
84375       // this is, essentially, the FindIntersection acting on floats from
84376       // Schneider & Eberly, just inlined into this function.
84377       if (smin <= 1 && smax >= 0) {
84378
84379         // overlap on an end point
84380         if (smin === 1) {
84381           return noEndpointTouch ? null : [toPoint(a1, smin > 0 ? smin : 0, va)];
84382         }
84383
84384         if (smax === 0) {
84385           return noEndpointTouch ? null : [toPoint(a1, smax < 1 ? smax : 1, va)];
84386         }
84387
84388         if (noEndpointTouch && smin === 0 && smax === 1) { return null; }
84389
84390         // There's overlap on a segment -- two points of intersection. Return both.
84391         return [
84392           toPoint(a1, smin > 0 ? smin : 0, va),
84393           toPoint(a1, smax < 1 ? smax : 1, va)
84394         ];
84395       }
84396
84397       return null;
84398     }
84399
84400     /**
84401      * @param  {SweepEvent} se1
84402      * @param  {SweepEvent} se2
84403      * @param  {Queue}      queue
84404      * @return {Number}
84405      */
84406     function possibleIntersection (se1, se2, queue) {
84407       // that disallows self-intersecting polygons,
84408       // did cost us half a day, so I'll leave it
84409       // out of respect
84410       // if (se1.isSubject === se2.isSubject) return;
84411       var inter = intersection(
84412         se1.point, se1.otherEvent.point,
84413         se2.point, se2.otherEvent.point
84414       );
84415
84416       var nintersections = inter ? inter.length : 0;
84417       if (nintersections === 0) { return 0; } // no intersection
84418
84419       // the line segments intersect at an endpoint of both line segments
84420       if ((nintersections === 1) &&
84421           (equals(se1.point, se2.point) ||
84422            equals(se1.otherEvent.point, se2.otherEvent.point))) {
84423         return 0;
84424       }
84425
84426       if (nintersections === 2 && se1.isSubject === se2.isSubject) {
84427         // if(se1.contourId === se2.contourId){
84428         // console.warn('Edges of the same polygon overlap',
84429         //   se1.point, se1.otherEvent.point, se2.point, se2.otherEvent.point);
84430         // }
84431         //throw new Error('Edges of the same polygon overlap');
84432         return 0;
84433       }
84434
84435       // The line segments associated to se1 and se2 intersect
84436       if (nintersections === 1) {
84437
84438         // if the intersection point is not an endpoint of se1
84439         if (!equals(se1.point, inter[0]) && !equals(se1.otherEvent.point, inter[0])) {
84440           divideSegment(se1, inter[0], queue);
84441         }
84442
84443         // if the intersection point is not an endpoint of se2
84444         if (!equals(se2.point, inter[0]) && !equals(se2.otherEvent.point, inter[0])) {
84445           divideSegment(se2, inter[0], queue);
84446         }
84447         return 1;
84448       }
84449
84450       // The line segments associated to se1 and se2 overlap
84451       var events        = [];
84452       var leftCoincide  = false;
84453       var rightCoincide = false;
84454
84455       if (equals(se1.point, se2.point)) {
84456         leftCoincide = true; // linked
84457       } else if (compareEvents(se1, se2) === 1) {
84458         events.push(se2, se1);
84459       } else {
84460         events.push(se1, se2);
84461       }
84462
84463       if (equals(se1.otherEvent.point, se2.otherEvent.point)) {
84464         rightCoincide = true;
84465       } else if (compareEvents(se1.otherEvent, se2.otherEvent) === 1) {
84466         events.push(se2.otherEvent, se1.otherEvent);
84467       } else {
84468         events.push(se1.otherEvent, se2.otherEvent);
84469       }
84470
84471       if ((leftCoincide && rightCoincide) || leftCoincide) {
84472         // both line segments are equal or share the left endpoint
84473         se2.type = NON_CONTRIBUTING;
84474         se1.type = (se2.inOut === se1.inOut)
84475           ? SAME_TRANSITION : DIFFERENT_TRANSITION;
84476
84477         if (leftCoincide && !rightCoincide) {
84478           // honestly no idea, but changing events selection from [2, 1]
84479           // to [0, 1] fixes the overlapping self-intersecting polygons issue
84480           divideSegment(events[1].otherEvent, events[0].point, queue);
84481         }
84482         return 2;
84483       }
84484
84485       // the line segments share the right endpoint
84486       if (rightCoincide) {
84487         divideSegment(events[0], events[1].point, queue);
84488         return 3;
84489       }
84490
84491       // no line segment includes totally the other one
84492       if (events[0] !== events[3].otherEvent) {
84493         divideSegment(events[0], events[1].point, queue);
84494         divideSegment(events[1], events[2].point, queue);
84495         return 3;
84496       }
84497
84498       // one line segment includes the other one
84499       divideSegment(events[0], events[1].point, queue);
84500       divideSegment(events[3].otherEvent, events[2].point, queue);
84501
84502       return 3;
84503     }
84504
84505     /**
84506      * @param  {SweepEvent} le1
84507      * @param  {SweepEvent} le2
84508      * @return {Number}
84509      */
84510     function compareSegments(le1, le2) {
84511       if (le1 === le2) { return 0; }
84512
84513       // Segments are not collinear
84514       if (signedArea(le1.point, le1.otherEvent.point, le2.point) !== 0 ||
84515         signedArea(le1.point, le1.otherEvent.point, le2.otherEvent.point) !== 0) {
84516
84517         // If they share their left endpoint use the right endpoint to sort
84518         if (equals(le1.point, le2.point)) { return le1.isBelow(le2.otherEvent.point) ? -1 : 1; }
84519
84520         // Different left endpoint: use the left endpoint to sort
84521         if (le1.point[0] === le2.point[0]) { return le1.point[1] < le2.point[1] ? -1 : 1; }
84522
84523         // has the line segment associated to e1 been inserted
84524         // into S after the line segment associated to e2 ?
84525         if (compareEvents(le1, le2) === 1) { return le2.isAbove(le1.point) ? -1 : 1; }
84526
84527         // The line segment associated to e2 has been inserted
84528         // into S after the line segment associated to e1
84529         return le1.isBelow(le2.point) ? -1 : 1;
84530       }
84531
84532       if (le1.isSubject === le2.isSubject) { // same polygon
84533         var p1 = le1.point, p2 = le2.point;
84534         if (p1[0] === p2[0] && p1[1] === p2[1]/*equals(le1.point, le2.point)*/) {
84535           p1 = le1.otherEvent.point; p2 = le2.otherEvent.point;
84536           if (p1[0] === p2[0] && p1[1] === p2[1]) { return 0; }
84537           else { return le1.contourId > le2.contourId ? 1 : -1; }
84538         }
84539       } else { // Segments are collinear, but belong to separate polygons
84540         return le1.isSubject ? -1 : 1;
84541       }
84542
84543       return compareEvents(le1, le2) === 1 ? 1 : -1;
84544     }
84545
84546     function subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation) {
84547       var sweepLine = new SplayTree(compareSegments);
84548       var sortedEvents = [];
84549
84550       var rightbound = Math.min(sbbox[2], cbbox[2]);
84551
84552       var prev, next, begin;
84553
84554       while (eventQueue.length !== 0) {
84555         var event = eventQueue.pop();
84556         sortedEvents.push(event);
84557
84558         // optimization by bboxes for intersection and difference goes here
84559         if ((operation === INTERSECTION && event.point[0] > rightbound) ||
84560             (operation === DIFFERENCE   && event.point[0] > sbbox[2])) {
84561           break;
84562         }
84563
84564         if (event.left) {
84565           next  = prev = sweepLine.insert(event);
84566           begin = sweepLine.minNode();
84567
84568           if (prev !== begin) { prev = sweepLine.prev(prev); }
84569           else                { prev = null; }
84570
84571           next = sweepLine.next(next);
84572
84573           var prevEvent = prev ? prev.key : null;
84574           var prevprevEvent = (void 0);
84575           computeFields(event, prevEvent, operation);
84576           if (next) {
84577             if (possibleIntersection(event, next.key, eventQueue) === 2) {
84578               computeFields(event, prevEvent, operation);
84579               computeFields(event, next.key, operation);
84580             }
84581           }
84582
84583           if (prev) {
84584             if (possibleIntersection(prev.key, event, eventQueue) === 2) {
84585               var prevprev = prev;
84586               if (prevprev !== begin) { prevprev = sweepLine.prev(prevprev); }
84587               else                    { prevprev = null; }
84588
84589               prevprevEvent = prevprev ? prevprev.key : null;
84590               computeFields(prevEvent, prevprevEvent, operation);
84591               computeFields(event,     prevEvent,     operation);
84592             }
84593           }
84594         } else {
84595           event = event.otherEvent;
84596           next = prev = sweepLine.find(event);
84597
84598           if (prev && next) {
84599
84600             if (prev !== begin) { prev = sweepLine.prev(prev); }
84601             else                { prev = null; }
84602
84603             next = sweepLine.next(next);
84604             sweepLine.remove(event);
84605
84606             if (next && prev) {
84607               possibleIntersection(prev.key, next.key, eventQueue);
84608             }
84609           }
84610         }
84611       }
84612       return sortedEvents;
84613     }
84614
84615     /**
84616      * @param  {Array.<SweepEvent>} sortedEvents
84617      * @return {Array.<SweepEvent>}
84618      */
84619     function orderEvents(sortedEvents) {
84620       var event, i, len, tmp;
84621       var resultEvents = [];
84622       for (i = 0, len = sortedEvents.length; i < len; i++) {
84623         event = sortedEvents[i];
84624         if ((event.left && event.inResult) ||
84625           (!event.left && event.otherEvent.inResult)) {
84626           resultEvents.push(event);
84627         }
84628       }
84629       // Due to overlapping edges the resultEvents array can be not wholly sorted
84630       var sorted = false;
84631       while (!sorted) {
84632         sorted = true;
84633         for (i = 0, len = resultEvents.length; i < len; i++) {
84634           if ((i + 1) < len &&
84635             compareEvents(resultEvents[i], resultEvents[i + 1]) === 1) {
84636             tmp = resultEvents[i];
84637             resultEvents[i] = resultEvents[i + 1];
84638             resultEvents[i + 1] = tmp;
84639             sorted = false;
84640           }
84641         }
84642       }
84643
84644
84645       for (i = 0, len = resultEvents.length; i < len; i++) {
84646         event = resultEvents[i];
84647         event.pos = i;
84648       }
84649
84650       // imagine, the right event is found in the beginning of the queue,
84651       // when his left counterpart is not marked yet
84652       for (i = 0, len = resultEvents.length; i < len; i++) {
84653         event = resultEvents[i];
84654         if (!event.left) {
84655           tmp = event.pos;
84656           event.pos = event.otherEvent.pos;
84657           event.otherEvent.pos = tmp;
84658         }
84659       }
84660
84661       return resultEvents;
84662     }
84663
84664
84665     /**
84666      * @param  {Number} pos
84667      * @param  {Array.<SweepEvent>} resultEvents
84668      * @param  {Object>}    processed
84669      * @return {Number}
84670      */
84671     function nextPos(pos, resultEvents, processed, origIndex) {
84672       var p, p1;
84673       var newPos = pos + 1;
84674       var length = resultEvents.length;
84675
84676       p  = resultEvents[pos].point;
84677
84678       if (newPos < length)
84679         { p1 = resultEvents[newPos].point; }
84680
84681
84682       // while in range and not the current one by value
84683       while (newPos < length && p1[0] === p[0] && p1[1] === p[1]) {
84684         if (!processed[newPos]) {
84685           return newPos;
84686         } else   {
84687           newPos++;
84688         }
84689         p1 = resultEvents[newPos].point;
84690       }
84691
84692       newPos = pos - 1;
84693
84694       while (processed[newPos] && newPos >= origIndex) {
84695         newPos--;
84696       }
84697       return newPos;
84698     }
84699
84700
84701     /**
84702      * @param  {Array.<SweepEvent>} sortedEvents
84703      * @return {Array.<*>} polygons
84704      */
84705     function connectEdges(sortedEvents, operation) {
84706       var i, len;
84707       var resultEvents = orderEvents(sortedEvents);
84708
84709       // "false"-filled array
84710       var processed = {};
84711       var result = [];
84712       var event;
84713
84714       for (i = 0, len = resultEvents.length; i < len; i++) {
84715         if (processed[i]) { continue; }
84716         var contour = [[]];
84717
84718         if (!resultEvents[i].isExteriorRing) {
84719           if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length === 0) {
84720             result.push(contour);
84721           } else if (result.length === 0) {
84722             result.push([[contour]]);
84723           } else {
84724             result[result.length - 1].push(contour[0]);
84725           }
84726         } else if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length > 1) {
84727           result[result.length - 1].push(contour[0]);
84728         } else {
84729           result.push(contour);
84730         }
84731
84732         var ringId = result.length - 1;
84733         var pos = i;
84734
84735         var initial = resultEvents[i].point;
84736         contour[0].push(initial);
84737
84738         while (pos >= i) {
84739           event = resultEvents[pos];
84740           processed[pos] = true;
84741
84742           if (event.left) {
84743             event.resultInOut = false;
84744             event.contourId   = ringId;
84745           } else {
84746             event.otherEvent.resultInOut = true;
84747             event.otherEvent.contourId   = ringId;
84748           }
84749
84750           pos = event.pos;
84751           processed[pos] = true;
84752           contour[0].push(resultEvents[pos].point);
84753           pos = nextPos(pos, resultEvents, processed, i);
84754         }
84755
84756         pos = pos === -1 ? i : pos;
84757
84758         event = resultEvents[pos];
84759         processed[pos] = processed[event.pos] = true;
84760         event.otherEvent.resultInOut = true;
84761         event.otherEvent.contourId   = ringId;
84762       }
84763
84764       // Handle if the result is a polygon (eg not multipoly)
84765       // Commented it again, let's see what do we mean by that
84766       // if (result.length === 1) result = result[0];
84767       return result;
84768     }
84769
84770     var tinyqueue = TinyQueue;
84771     var default_1 = TinyQueue;
84772
84773     function TinyQueue(data, compare) {
84774         var this$1 = this;
84775
84776         if (!(this instanceof TinyQueue)) { return new TinyQueue(data, compare); }
84777
84778         this.data = data || [];
84779         this.length = this.data.length;
84780         this.compare = compare || defaultCompare;
84781
84782         if (this.length > 0) {
84783             for (var i = (this.length >> 1) - 1; i >= 0; i--) { this$1._down(i); }
84784         }
84785     }
84786
84787     function defaultCompare(a, b) {
84788         return a < b ? -1 : a > b ? 1 : 0;
84789     }
84790
84791     TinyQueue.prototype = {
84792
84793         push: function (item) {
84794             this.data.push(item);
84795             this.length++;
84796             this._up(this.length - 1);
84797         },
84798
84799         pop: function () {
84800             if (this.length === 0) { return undefined; }
84801
84802             var top = this.data[0];
84803             this.length--;
84804
84805             if (this.length > 0) {
84806                 this.data[0] = this.data[this.length];
84807                 this._down(0);
84808             }
84809             this.data.pop();
84810
84811             return top;
84812         },
84813
84814         peek: function () {
84815             return this.data[0];
84816         },
84817
84818         _up: function (pos) {
84819             var data = this.data;
84820             var compare = this.compare;
84821             var item = data[pos];
84822
84823             while (pos > 0) {
84824                 var parent = (pos - 1) >> 1;
84825                 var current = data[parent];
84826                 if (compare(item, current) >= 0) { break; }
84827                 data[pos] = current;
84828                 pos = parent;
84829             }
84830
84831             data[pos] = item;
84832         },
84833
84834         _down: function (pos) {
84835             var this$1 = this;
84836
84837             var data = this.data;
84838             var compare = this.compare;
84839             var halfLength = this.length >> 1;
84840             var item = data[pos];
84841
84842             while (pos < halfLength) {
84843                 var left = (pos << 1) + 1;
84844                 var right = left + 1;
84845                 var best = data[left];
84846
84847                 if (right < this$1.length && compare(data[right], best) < 0) {
84848                     left = right;
84849                     best = data[right];
84850                 }
84851                 if (compare(best, item) >= 0) { break; }
84852
84853                 data[pos] = best;
84854                 pos = left;
84855             }
84856
84857             data[pos] = item;
84858         }
84859     };
84860     tinyqueue.default = default_1;
84861
84862     var max = Math.max;
84863     var min = Math.min;
84864
84865     var contourId = 0;
84866
84867
84868     function processPolygon(contourOrHole, isSubject, depth, Q, bbox, isExteriorRing) {
84869       var i, len, s1, s2, e1, e2;
84870       for (i = 0, len = contourOrHole.length - 1; i < len; i++) {
84871         s1 = contourOrHole[i];
84872         s2 = contourOrHole[i + 1];
84873         e1 = new SweepEvent(s1, false, undefined, isSubject);
84874         e2 = new SweepEvent(s2, false, e1,        isSubject);
84875         e1.otherEvent = e2;
84876
84877         if (s1[0] === s2[0] && s1[1] === s2[1]) {
84878           continue; // skip collapsed edges, or it breaks
84879         }
84880
84881         e1.contourId = e2.contourId = depth;
84882         if (!isExteriorRing) {
84883           e1.isExteriorRing = false;
84884           e2.isExteriorRing = false;
84885         }
84886         if (compareEvents(e1, e2) > 0) {
84887           e2.left = true;
84888         } else {
84889           e1.left = true;
84890         }
84891
84892         var x = s1[0], y = s1[1];
84893         bbox[0] = min(bbox[0], x);
84894         bbox[1] = min(bbox[1], y);
84895         bbox[2] = max(bbox[2], x);
84896         bbox[3] = max(bbox[3], y);
84897
84898         // Pushing it so the queue is sorted from left to right,
84899         // with object on the left having the highest priority.
84900         Q.push(e1);
84901         Q.push(e2);
84902       }
84903     }
84904
84905
84906     function fillQueue(subject, clipping, sbbox, cbbox, operation) {
84907       var eventQueue = new tinyqueue(null, compareEvents);
84908       var polygonSet, isExteriorRing, i, ii, j, jj; //, k, kk;
84909
84910       for (i = 0, ii = subject.length; i < ii; i++) {
84911         polygonSet = subject[i];
84912         for (j = 0, jj = polygonSet.length; j < jj; j++) {
84913           isExteriorRing = j === 0;
84914           if (isExteriorRing) { contourId++; }
84915           processPolygon(polygonSet[j], true, contourId, eventQueue, sbbox, isExteriorRing);
84916         }
84917       }
84918
84919       for (i = 0, ii = clipping.length; i < ii; i++) {
84920         polygonSet = clipping[i];
84921         for (j = 0, jj = polygonSet.length; j < jj; j++) {
84922           isExteriorRing = j === 0;
84923           if (operation === DIFFERENCE) { isExteriorRing = false; }
84924           if (isExteriorRing) { contourId++; }
84925           processPolygon(polygonSet[j], false, contourId, eventQueue, cbbox, isExteriorRing);
84926         }
84927       }
84928
84929       return eventQueue;
84930     }
84931
84932     var EMPTY = [];
84933
84934
84935     function trivialOperation(subject, clipping, operation) {
84936       var result = null;
84937       if (subject.length * clipping.length === 0) {
84938         if        (operation === INTERSECTION) {
84939           result = EMPTY;
84940         } else if (operation === DIFFERENCE) {
84941           result = subject;
84942         } else if (operation === UNION ||
84943                    operation === XOR) {
84944           result = (subject.length === 0) ? clipping : subject;
84945         }
84946       }
84947       return result;
84948     }
84949
84950
84951     function compareBBoxes(subject, clipping, sbbox, cbbox, operation) {
84952       var result = null;
84953       if (sbbox[0] > cbbox[2] ||
84954           cbbox[0] > sbbox[2] ||
84955           sbbox[1] > cbbox[3] ||
84956           cbbox[1] > sbbox[3]) {
84957         if        (operation === INTERSECTION) {
84958           result = EMPTY;
84959         } else if (operation === DIFFERENCE) {
84960           result = subject;
84961         } else if (operation === UNION ||
84962                    operation === XOR) {
84963           result = subject.concat(clipping);
84964         }
84965       }
84966       return result;
84967     }
84968
84969
84970     function boolean(subject, clipping, operation) {
84971       if (typeof subject[0][0][0] === 'number') {
84972         subject = [subject];
84973       }
84974       if (typeof clipping[0][0][0] === 'number') {
84975         clipping = [clipping];
84976       }
84977       var trivial = trivialOperation(subject, clipping, operation);
84978       if (trivial) {
84979         return trivial === EMPTY ? null : trivial;
84980       }
84981       var sbbox = [Infinity, Infinity, -Infinity, -Infinity];
84982       var cbbox = [Infinity, Infinity, -Infinity, -Infinity];
84983
84984       //console.time('fill queue');
84985       var eventQueue = fillQueue(subject, clipping, sbbox, cbbox, operation);
84986       //console.timeEnd('fill queue');
84987
84988       trivial = compareBBoxes(subject, clipping, sbbox, cbbox, operation);
84989       if (trivial) {
84990         return trivial === EMPTY ? null : trivial;
84991       }
84992       //console.time('subdivide edges');
84993       var sortedEvents = subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation);
84994       //console.timeEnd('subdivide edges');
84995
84996       //console.time('connect vertices');
84997       var result = connectEdges(sortedEvents, operation);
84998       //console.timeEnd('connect vertices');
84999       return result;
85000     }
85001
85002     function union (subject, clipping) {
85003       return boolean(subject, clipping, UNION);
85004     }
85005
85006     function diff (subject, clipping) {
85007       return boolean(subject, clipping, DIFFERENCE);
85008     }
85009
85010     function xor (subject, clipping){
85011       return boolean(subject, clipping, XOR);
85012     }
85013
85014     function intersection$1 (subject, clipping) {
85015       return boolean(subject, clipping, INTERSECTION);
85016     }
85017
85018     /**
85019      * @enum {Number}
85020      */
85021     var operations = { UNION: UNION, DIFFERENCE: DIFFERENCE, INTERSECTION: INTERSECTION, XOR: XOR };
85022
85023     exports.union = union;
85024     exports.diff = diff;
85025     exports.xor = xor;
85026     exports.intersection = intersection$1;
85027     exports.operations = operations;
85028
85029     Object.defineProperty(exports, '__esModule', { value: true });
85030
85031   })));
85032
85033   });
85034
85035   var martinez = unwrapExports(martinez_umd);
85036
85037   var read$6 = function (buffer, offset, isLE, mLen, nBytes) {
85038     var e, m;
85039     var eLen = (nBytes * 8) - mLen - 1;
85040     var eMax = (1 << eLen) - 1;
85041     var eBias = eMax >> 1;
85042     var nBits = -7;
85043     var i = isLE ? (nBytes - 1) : 0;
85044     var d = isLE ? -1 : 1;
85045     var s = buffer[offset + i];
85046
85047     i += d;
85048
85049     e = s & ((1 << (-nBits)) - 1);
85050     s >>= (-nBits);
85051     nBits += eLen;
85052     for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
85053
85054     m = e & ((1 << (-nBits)) - 1);
85055     e >>= (-nBits);
85056     nBits += mLen;
85057     for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
85058
85059     if (e === 0) {
85060       e = 1 - eBias;
85061     } else if (e === eMax) {
85062       return m ? NaN : ((s ? -1 : 1) * Infinity)
85063     } else {
85064       m = m + Math.pow(2, mLen);
85065       e = e - eBias;
85066     }
85067     return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
85068   };
85069
85070   var write$6 = function (buffer, value, offset, isLE, mLen, nBytes) {
85071     var e, m, c;
85072     var eLen = (nBytes * 8) - mLen - 1;
85073     var eMax = (1 << eLen) - 1;
85074     var eBias = eMax >> 1;
85075     var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0);
85076     var i = isLE ? 0 : (nBytes - 1);
85077     var d = isLE ? 1 : -1;
85078     var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;
85079
85080     value = Math.abs(value);
85081
85082     if (isNaN(value) || value === Infinity) {
85083       m = isNaN(value) ? 1 : 0;
85084       e = eMax;
85085     } else {
85086       e = Math.floor(Math.log(value) / Math.LN2);
85087       if (value * (c = Math.pow(2, -e)) < 1) {
85088         e--;
85089         c *= 2;
85090       }
85091       if (e + eBias >= 1) {
85092         value += rt / c;
85093       } else {
85094         value += rt * Math.pow(2, 1 - eBias);
85095       }
85096       if (value * c >= 2) {
85097         e++;
85098         c /= 2;
85099       }
85100
85101       if (e + eBias >= eMax) {
85102         m = 0;
85103         e = eMax;
85104       } else if (e + eBias >= 1) {
85105         m = ((value * c) - 1) * Math.pow(2, mLen);
85106         e = e + eBias;
85107       } else {
85108         m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
85109         e = 0;
85110       }
85111     }
85112
85113     for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
85114
85115     e = (e << mLen) | m;
85116     eLen += mLen;
85117     for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
85118
85119     buffer[offset + i - d] |= s * 128;
85120   };
85121
85122   var ieee754 = {
85123         read: read$6,
85124         write: write$6
85125   };
85126
85127   var pbf = Pbf;
85128
85129
85130
85131   function Pbf(buf) {
85132       this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);
85133       this.pos = 0;
85134       this.type = 0;
85135       this.length = this.buf.length;
85136   }
85137
85138   Pbf.Varint  = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum
85139   Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64
85140   Pbf.Bytes   = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields
85141   Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32
85142
85143   var SHIFT_LEFT_32 = (1 << 16) * (1 << 16),
85144       SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
85145
85146   Pbf.prototype = {
85147
85148       destroy: function() {
85149           this.buf = null;
85150       },
85151
85152       // === READING =================================================================
85153
85154       readFields: function(readField, result, end) {
85155           end = end || this.length;
85156
85157           while (this.pos < end) {
85158               var val = this.readVarint(),
85159                   tag = val >> 3,
85160                   startPos = this.pos;
85161
85162               this.type = val & 0x7;
85163               readField(tag, result, this);
85164
85165               if (this.pos === startPos) this.skip(val);
85166           }
85167           return result;
85168       },
85169
85170       readMessage: function(readField, result) {
85171           return this.readFields(readField, result, this.readVarint() + this.pos);
85172       },
85173
85174       readFixed32: function() {
85175           var val = readUInt32(this.buf, this.pos);
85176           this.pos += 4;
85177           return val;
85178       },
85179
85180       readSFixed32: function() {
85181           var val = readInt32(this.buf, this.pos);
85182           this.pos += 4;
85183           return val;
85184       },
85185
85186       // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)
85187
85188       readFixed64: function() {
85189           var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
85190           this.pos += 8;
85191           return val;
85192       },
85193
85194       readSFixed64: function() {
85195           var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
85196           this.pos += 8;
85197           return val;
85198       },
85199
85200       readFloat: function() {
85201           var val = ieee754.read(this.buf, this.pos, true, 23, 4);
85202           this.pos += 4;
85203           return val;
85204       },
85205
85206       readDouble: function() {
85207           var val = ieee754.read(this.buf, this.pos, true, 52, 8);
85208           this.pos += 8;
85209           return val;
85210       },
85211
85212       readVarint: function(isSigned) {
85213           var buf = this.buf,
85214               val, b;
85215
85216           b = buf[this.pos++]; val  =  b & 0x7f;        if (b < 0x80) return val;
85217           b = buf[this.pos++]; val |= (b & 0x7f) << 7;  if (b < 0x80) return val;
85218           b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;
85219           b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;
85220           b = buf[this.pos];   val |= (b & 0x0f) << 28;
85221
85222           return readVarintRemainder(val, isSigned, this);
85223       },
85224
85225       readVarint64: function() { // for compatibility with v2.0.1
85226           return this.readVarint(true);
85227       },
85228
85229       readSVarint: function() {
85230           var num = this.readVarint();
85231           return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding
85232       },
85233
85234       readBoolean: function() {
85235           return Boolean(this.readVarint());
85236       },
85237
85238       readString: function() {
85239           var end = this.readVarint() + this.pos,
85240               str = readUtf8(this.buf, this.pos, end);
85241           this.pos = end;
85242           return str;
85243       },
85244
85245       readBytes: function() {
85246           var end = this.readVarint() + this.pos,
85247               buffer = this.buf.subarray(this.pos, end);
85248           this.pos = end;
85249           return buffer;
85250       },
85251
85252       // verbose for performance reasons; doesn't affect gzipped size
85253
85254       readPackedVarint: function(arr, isSigned) {
85255           var end = readPackedEnd(this);
85256           arr = arr || [];
85257           while (this.pos < end) arr.push(this.readVarint(isSigned));
85258           return arr;
85259       },
85260       readPackedSVarint: function(arr) {
85261           var end = readPackedEnd(this);
85262           arr = arr || [];
85263           while (this.pos < end) arr.push(this.readSVarint());
85264           return arr;
85265       },
85266       readPackedBoolean: function(arr) {
85267           var end = readPackedEnd(this);
85268           arr = arr || [];
85269           while (this.pos < end) arr.push(this.readBoolean());
85270           return arr;
85271       },
85272       readPackedFloat: function(arr) {
85273           var end = readPackedEnd(this);
85274           arr = arr || [];
85275           while (this.pos < end) arr.push(this.readFloat());
85276           return arr;
85277       },
85278       readPackedDouble: function(arr) {
85279           var end = readPackedEnd(this);
85280           arr = arr || [];
85281           while (this.pos < end) arr.push(this.readDouble());
85282           return arr;
85283       },
85284       readPackedFixed32: function(arr) {
85285           var end = readPackedEnd(this);
85286           arr = arr || [];
85287           while (this.pos < end) arr.push(this.readFixed32());
85288           return arr;
85289       },
85290       readPackedSFixed32: function(arr) {
85291           var end = readPackedEnd(this);
85292           arr = arr || [];
85293           while (this.pos < end) arr.push(this.readSFixed32());
85294           return arr;
85295       },
85296       readPackedFixed64: function(arr) {
85297           var end = readPackedEnd(this);
85298           arr = arr || [];
85299           while (this.pos < end) arr.push(this.readFixed64());
85300           return arr;
85301       },
85302       readPackedSFixed64: function(arr) {
85303           var end = readPackedEnd(this);
85304           arr = arr || [];
85305           while (this.pos < end) arr.push(this.readSFixed64());
85306           return arr;
85307       },
85308
85309       skip: function(val) {
85310           var type = val & 0x7;
85311           if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}
85312           else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;
85313           else if (type === Pbf.Fixed32) this.pos += 4;
85314           else if (type === Pbf.Fixed64) this.pos += 8;
85315           else throw new Error('Unimplemented type: ' + type);
85316       },
85317
85318       // === WRITING =================================================================
85319
85320       writeTag: function(tag, type) {
85321           this.writeVarint((tag << 3) | type);
85322       },
85323
85324       realloc: function(min) {
85325           var length = this.length || 16;
85326
85327           while (length < this.pos + min) length *= 2;
85328
85329           if (length !== this.length) {
85330               var buf = new Uint8Array(length);
85331               buf.set(this.buf);
85332               this.buf = buf;
85333               this.length = length;
85334           }
85335       },
85336
85337       finish: function() {
85338           this.length = this.pos;
85339           this.pos = 0;
85340           return this.buf.subarray(0, this.length);
85341       },
85342
85343       writeFixed32: function(val) {
85344           this.realloc(4);
85345           writeInt32(this.buf, val, this.pos);
85346           this.pos += 4;
85347       },
85348
85349       writeSFixed32: function(val) {
85350           this.realloc(4);
85351           writeInt32(this.buf, val, this.pos);
85352           this.pos += 4;
85353       },
85354
85355       writeFixed64: function(val) {
85356           this.realloc(8);
85357           writeInt32(this.buf, val & -1, this.pos);
85358           writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
85359           this.pos += 8;
85360       },
85361
85362       writeSFixed64: function(val) {
85363           this.realloc(8);
85364           writeInt32(this.buf, val & -1, this.pos);
85365           writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
85366           this.pos += 8;
85367       },
85368
85369       writeVarint: function(val) {
85370           val = +val || 0;
85371
85372           if (val > 0xfffffff || val < 0) {
85373               writeBigVarint(val, this);
85374               return;
85375           }
85376
85377           this.realloc(4);
85378
85379           this.buf[this.pos++] =           val & 0x7f  | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
85380           this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
85381           this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
85382           this.buf[this.pos++] =   (val >>> 7) & 0x7f;
85383       },
85384
85385       writeSVarint: function(val) {
85386           this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);
85387       },
85388
85389       writeBoolean: function(val) {
85390           this.writeVarint(Boolean(val));
85391       },
85392
85393       writeString: function(str) {
85394           str = String(str);
85395           this.realloc(str.length * 4);
85396
85397           this.pos++; // reserve 1 byte for short string length
85398
85399           var startPos = this.pos;
85400           // write the string directly to the buffer and see how much was written
85401           this.pos = writeUtf8(this.buf, str, this.pos);
85402           var len = this.pos - startPos;
85403
85404           if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
85405
85406           // finally, write the message length in the reserved place and restore the position
85407           this.pos = startPos - 1;
85408           this.writeVarint(len);
85409           this.pos += len;
85410       },
85411
85412       writeFloat: function(val) {
85413           this.realloc(4);
85414           ieee754.write(this.buf, val, this.pos, true, 23, 4);
85415           this.pos += 4;
85416       },
85417
85418       writeDouble: function(val) {
85419           this.realloc(8);
85420           ieee754.write(this.buf, val, this.pos, true, 52, 8);
85421           this.pos += 8;
85422       },
85423
85424       writeBytes: function(buffer) {
85425           var len = buffer.length;
85426           this.writeVarint(len);
85427           this.realloc(len);
85428           for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];
85429       },
85430
85431       writeRawMessage: function(fn, obj) {
85432           this.pos++; // reserve 1 byte for short message length
85433
85434           // write the message directly to the buffer and see how much was written
85435           var startPos = this.pos;
85436           fn(obj, this);
85437           var len = this.pos - startPos;
85438
85439           if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
85440
85441           // finally, write the message length in the reserved place and restore the position
85442           this.pos = startPos - 1;
85443           this.writeVarint(len);
85444           this.pos += len;
85445       },
85446
85447       writeMessage: function(tag, fn, obj) {
85448           this.writeTag(tag, Pbf.Bytes);
85449           this.writeRawMessage(fn, obj);
85450       },
85451
85452       writePackedVarint:   function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr);   },
85453       writePackedSVarint:  function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr);  },
85454       writePackedBoolean:  function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr);  },
85455       writePackedFloat:    function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr);    },
85456       writePackedDouble:   function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr);   },
85457       writePackedFixed32:  function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr);  },
85458       writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); },
85459       writePackedFixed64:  function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr);  },
85460       writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); },
85461
85462       writeBytesField: function(tag, buffer) {
85463           this.writeTag(tag, Pbf.Bytes);
85464           this.writeBytes(buffer);
85465       },
85466       writeFixed32Field: function(tag, val) {
85467           this.writeTag(tag, Pbf.Fixed32);
85468           this.writeFixed32(val);
85469       },
85470       writeSFixed32Field: function(tag, val) {
85471           this.writeTag(tag, Pbf.Fixed32);
85472           this.writeSFixed32(val);
85473       },
85474       writeFixed64Field: function(tag, val) {
85475           this.writeTag(tag, Pbf.Fixed64);
85476           this.writeFixed64(val);
85477       },
85478       writeSFixed64Field: function(tag, val) {
85479           this.writeTag(tag, Pbf.Fixed64);
85480           this.writeSFixed64(val);
85481       },
85482       writeVarintField: function(tag, val) {
85483           this.writeTag(tag, Pbf.Varint);
85484           this.writeVarint(val);
85485       },
85486       writeSVarintField: function(tag, val) {
85487           this.writeTag(tag, Pbf.Varint);
85488           this.writeSVarint(val);
85489       },
85490       writeStringField: function(tag, str) {
85491           this.writeTag(tag, Pbf.Bytes);
85492           this.writeString(str);
85493       },
85494       writeFloatField: function(tag, val) {
85495           this.writeTag(tag, Pbf.Fixed32);
85496           this.writeFloat(val);
85497       },
85498       writeDoubleField: function(tag, val) {
85499           this.writeTag(tag, Pbf.Fixed64);
85500           this.writeDouble(val);
85501       },
85502       writeBooleanField: function(tag, val) {
85503           this.writeVarintField(tag, Boolean(val));
85504       }
85505   };
85506
85507   function readVarintRemainder(l, s, p) {
85508       var buf = p.buf,
85509           h, b;
85510
85511       b = buf[p.pos++]; h  = (b & 0x70) >> 4;  if (b < 0x80) return toNum(l, h, s);
85512       b = buf[p.pos++]; h |= (b & 0x7f) << 3;  if (b < 0x80) return toNum(l, h, s);
85513       b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) return toNum(l, h, s);
85514       b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) return toNum(l, h, s);
85515       b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) return toNum(l, h, s);
85516       b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) return toNum(l, h, s);
85517
85518       throw new Error('Expected varint not more than 10 bytes');
85519   }
85520
85521   function readPackedEnd(pbf) {
85522       return pbf.type === Pbf.Bytes ?
85523           pbf.readVarint() + pbf.pos : pbf.pos + 1;
85524   }
85525
85526   function toNum(low, high, isSigned) {
85527       if (isSigned) {
85528           return high * 0x100000000 + (low >>> 0);
85529       }
85530
85531       return ((high >>> 0) * 0x100000000) + (low >>> 0);
85532   }
85533
85534   function writeBigVarint(val, pbf) {
85535       var low, high;
85536
85537       if (val >= 0) {
85538           low  = (val % 0x100000000) | 0;
85539           high = (val / 0x100000000) | 0;
85540       } else {
85541           low  = ~(-val % 0x100000000);
85542           high = ~(-val / 0x100000000);
85543
85544           if (low ^ 0xffffffff) {
85545               low = (low + 1) | 0;
85546           } else {
85547               low = 0;
85548               high = (high + 1) | 0;
85549           }
85550       }
85551
85552       if (val >= 0x10000000000000000 || val < -0x10000000000000000) {
85553           throw new Error('Given varint doesn\'t fit into 10 bytes');
85554       }
85555
85556       pbf.realloc(10);
85557
85558       writeBigVarintLow(low, high, pbf);
85559       writeBigVarintHigh(high, pbf);
85560   }
85561
85562   function writeBigVarintLow(low, high, pbf) {
85563       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
85564       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
85565       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
85566       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
85567       pbf.buf[pbf.pos]   = low & 0x7f;
85568   }
85569
85570   function writeBigVarintHigh(high, pbf) {
85571       var lsb = (high & 0x07) << 4;
85572
85573       pbf.buf[pbf.pos++] |= lsb         | ((high >>>= 3) ? 0x80 : 0); if (!high) return;
85574       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
85575       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
85576       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
85577       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
85578       pbf.buf[pbf.pos++]  = high & 0x7f;
85579   }
85580
85581   function makeRoomForExtraLength(startPos, len, pbf) {
85582       var extraLen =
85583           len <= 0x3fff ? 1 :
85584           len <= 0x1fffff ? 2 :
85585           len <= 0xfffffff ? 3 : Math.ceil(Math.log(len) / (Math.LN2 * 7));
85586
85587       // if 1 byte isn't enough for encoding message length, shift the data to the right
85588       pbf.realloc(extraLen);
85589       for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];
85590   }
85591
85592   function writePackedVarint(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]);   }
85593   function writePackedSVarint(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]);  }
85594   function writePackedFloat(arr, pbf)    { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]);    }
85595   function writePackedDouble(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]);   }
85596   function writePackedBoolean(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]);  }
85597   function writePackedFixed32(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]);  }
85598   function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }
85599   function writePackedFixed64(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]);  }
85600   function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }
85601
85602   // Buffer code below from https://github.com/feross/buffer, MIT-licensed
85603
85604   function readUInt32(buf, pos) {
85605       return ((buf[pos]) |
85606           (buf[pos + 1] << 8) |
85607           (buf[pos + 2] << 16)) +
85608           (buf[pos + 3] * 0x1000000);
85609   }
85610
85611   function writeInt32(buf, val, pos) {
85612       buf[pos] = val;
85613       buf[pos + 1] = (val >>> 8);
85614       buf[pos + 2] = (val >>> 16);
85615       buf[pos + 3] = (val >>> 24);
85616   }
85617
85618   function readInt32(buf, pos) {
85619       return ((buf[pos]) |
85620           (buf[pos + 1] << 8) |
85621           (buf[pos + 2] << 16)) +
85622           (buf[pos + 3] << 24);
85623   }
85624
85625   function readUtf8(buf, pos, end) {
85626       var str = '';
85627       var i = pos;
85628
85629       while (i < end) {
85630           var b0 = buf[i];
85631           var c = null; // codepoint
85632           var bytesPerSequence =
85633               b0 > 0xEF ? 4 :
85634               b0 > 0xDF ? 3 :
85635               b0 > 0xBF ? 2 : 1;
85636
85637           if (i + bytesPerSequence > end) break;
85638
85639           var b1, b2, b3;
85640
85641           if (bytesPerSequence === 1) {
85642               if (b0 < 0x80) {
85643                   c = b0;
85644               }
85645           } else if (bytesPerSequence === 2) {
85646               b1 = buf[i + 1];
85647               if ((b1 & 0xC0) === 0x80) {
85648                   c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F);
85649                   if (c <= 0x7F) {
85650                       c = null;
85651                   }
85652               }
85653           } else if (bytesPerSequence === 3) {
85654               b1 = buf[i + 1];
85655               b2 = buf[i + 2];
85656               if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) {
85657                   c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F);
85658                   if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) {
85659                       c = null;
85660                   }
85661               }
85662           } else if (bytesPerSequence === 4) {
85663               b1 = buf[i + 1];
85664               b2 = buf[i + 2];
85665               b3 = buf[i + 3];
85666               if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {
85667                   c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F);
85668                   if (c <= 0xFFFF || c >= 0x110000) {
85669                       c = null;
85670                   }
85671               }
85672           }
85673
85674           if (c === null) {
85675               c = 0xFFFD;
85676               bytesPerSequence = 1;
85677
85678           } else if (c > 0xFFFF) {
85679               c -= 0x10000;
85680               str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800);
85681               c = 0xDC00 | c & 0x3FF;
85682           }
85683
85684           str += String.fromCharCode(c);
85685           i += bytesPerSequence;
85686       }
85687
85688       return str;
85689   }
85690
85691   function writeUtf8(buf, str, pos) {
85692       for (var i = 0, c, lead; i < str.length; i++) {
85693           c = str.charCodeAt(i); // code point
85694
85695           if (c > 0xD7FF && c < 0xE000) {
85696               if (lead) {
85697                   if (c < 0xDC00) {
85698                       buf[pos++] = 0xEF;
85699                       buf[pos++] = 0xBF;
85700                       buf[pos++] = 0xBD;
85701                       lead = c;
85702                       continue;
85703                   } else {
85704                       c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;
85705                       lead = null;
85706                   }
85707               } else {
85708                   if (c > 0xDBFF || (i + 1 === str.length)) {
85709                       buf[pos++] = 0xEF;
85710                       buf[pos++] = 0xBF;
85711                       buf[pos++] = 0xBD;
85712                   } else {
85713                       lead = c;
85714                   }
85715                   continue;
85716               }
85717           } else if (lead) {
85718               buf[pos++] = 0xEF;
85719               buf[pos++] = 0xBF;
85720               buf[pos++] = 0xBD;
85721               lead = null;
85722           }
85723
85724           if (c < 0x80) {
85725               buf[pos++] = c;
85726           } else {
85727               if (c < 0x800) {
85728                   buf[pos++] = c >> 0x6 | 0xC0;
85729               } else {
85730                   if (c < 0x10000) {
85731                       buf[pos++] = c >> 0xC | 0xE0;
85732                   } else {
85733                       buf[pos++] = c >> 0x12 | 0xF0;
85734                       buf[pos++] = c >> 0xC & 0x3F | 0x80;
85735                   }
85736                   buf[pos++] = c >> 0x6 & 0x3F | 0x80;
85737               }
85738               buf[pos++] = c & 0x3F | 0x80;
85739           }
85740       }
85741       return pos;
85742   }
85743
85744   var pointGeometry = Point;
85745
85746   /**
85747    * A standalone point geometry with useful accessor, comparison, and
85748    * modification methods.
85749    *
85750    * @class Point
85751    * @param {Number} x the x-coordinate. this could be longitude or screen
85752    * pixels, or any other sort of unit.
85753    * @param {Number} y the y-coordinate. this could be latitude or screen
85754    * pixels, or any other sort of unit.
85755    * @example
85756    * var point = new Point(-77, 38);
85757    */
85758   function Point(x, y) {
85759       this.x = x;
85760       this.y = y;
85761   }
85762
85763   Point.prototype = {
85764
85765       /**
85766        * Clone this point, returning a new point that can be modified
85767        * without affecting the old one.
85768        * @return {Point} the clone
85769        */
85770       clone: function() { return new Point(this.x, this.y); },
85771
85772       /**
85773        * Add this point's x & y coordinates to another point,
85774        * yielding a new point.
85775        * @param {Point} p the other point
85776        * @return {Point} output point
85777        */
85778       add:     function(p) { return this.clone()._add(p); },
85779
85780       /**
85781        * Subtract this point's x & y coordinates to from point,
85782        * yielding a new point.
85783        * @param {Point} p the other point
85784        * @return {Point} output point
85785        */
85786       sub:     function(p) { return this.clone()._sub(p); },
85787
85788       /**
85789        * Multiply this point's x & y coordinates by point,
85790        * yielding a new point.
85791        * @param {Point} p the other point
85792        * @return {Point} output point
85793        */
85794       multByPoint:    function(p) { return this.clone()._multByPoint(p); },
85795
85796       /**
85797        * Divide this point's x & y coordinates by point,
85798        * yielding a new point.
85799        * @param {Point} p the other point
85800        * @return {Point} output point
85801        */
85802       divByPoint:     function(p) { return this.clone()._divByPoint(p); },
85803
85804       /**
85805        * Multiply this point's x & y coordinates by a factor,
85806        * yielding a new point.
85807        * @param {Point} k factor
85808        * @return {Point} output point
85809        */
85810       mult:    function(k) { return this.clone()._mult(k); },
85811
85812       /**
85813        * Divide this point's x & y coordinates by a factor,
85814        * yielding a new point.
85815        * @param {Point} k factor
85816        * @return {Point} output point
85817        */
85818       div:     function(k) { return this.clone()._div(k); },
85819
85820       /**
85821        * Rotate this point around the 0, 0 origin by an angle a,
85822        * given in radians
85823        * @param {Number} a angle to rotate around, in radians
85824        * @return {Point} output point
85825        */
85826       rotate:  function(a) { return this.clone()._rotate(a); },
85827
85828       /**
85829        * Rotate this point around p point by an angle a,
85830        * given in radians
85831        * @param {Number} a angle to rotate around, in radians
85832        * @param {Point} p Point to rotate around
85833        * @return {Point} output point
85834        */
85835       rotateAround:  function(a,p) { return this.clone()._rotateAround(a,p); },
85836
85837       /**
85838        * Multiply this point by a 4x1 transformation matrix
85839        * @param {Array<Number>} m transformation matrix
85840        * @return {Point} output point
85841        */
85842       matMult: function(m) { return this.clone()._matMult(m); },
85843
85844       /**
85845        * Calculate this point but as a unit vector from 0, 0, meaning
85846        * that the distance from the resulting point to the 0, 0
85847        * coordinate will be equal to 1 and the angle from the resulting
85848        * point to the 0, 0 coordinate will be the same as before.
85849        * @return {Point} unit vector point
85850        */
85851       unit:    function() { return this.clone()._unit(); },
85852
85853       /**
85854        * Compute a perpendicular point, where the new y coordinate
85855        * is the old x coordinate and the new x coordinate is the old y
85856        * coordinate multiplied by -1
85857        * @return {Point} perpendicular point
85858        */
85859       perp:    function() { return this.clone()._perp(); },
85860
85861       /**
85862        * Return a version of this point with the x & y coordinates
85863        * rounded to integers.
85864        * @return {Point} rounded point
85865        */
85866       round:   function() { return this.clone()._round(); },
85867
85868       /**
85869        * Return the magitude of this point: this is the Euclidean
85870        * distance from the 0, 0 coordinate to this point's x and y
85871        * coordinates.
85872        * @return {Number} magnitude
85873        */
85874       mag: function() {
85875           return Math.sqrt(this.x * this.x + this.y * this.y);
85876       },
85877
85878       /**
85879        * Judge whether this point is equal to another point, returning
85880        * true or false.
85881        * @param {Point} other the other point
85882        * @return {boolean} whether the points are equal
85883        */
85884       equals: function(other) {
85885           return this.x === other.x &&
85886                  this.y === other.y;
85887       },
85888
85889       /**
85890        * Calculate the distance from this point to another point
85891        * @param {Point} p the other point
85892        * @return {Number} distance
85893        */
85894       dist: function(p) {
85895           return Math.sqrt(this.distSqr(p));
85896       },
85897
85898       /**
85899        * Calculate the distance from this point to another point,
85900        * without the square root step. Useful if you're comparing
85901        * relative distances.
85902        * @param {Point} p the other point
85903        * @return {Number} distance
85904        */
85905       distSqr: function(p) {
85906           var dx = p.x - this.x,
85907               dy = p.y - this.y;
85908           return dx * dx + dy * dy;
85909       },
85910
85911       /**
85912        * Get the angle from the 0, 0 coordinate to this point, in radians
85913        * coordinates.
85914        * @return {Number} angle
85915        */
85916       angle: function() {
85917           return Math.atan2(this.y, this.x);
85918       },
85919
85920       /**
85921        * Get the angle from this point to another point, in radians
85922        * @param {Point} b the other point
85923        * @return {Number} angle
85924        */
85925       angleTo: function(b) {
85926           return Math.atan2(this.y - b.y, this.x - b.x);
85927       },
85928
85929       /**
85930        * Get the angle between this point and another point, in radians
85931        * @param {Point} b the other point
85932        * @return {Number} angle
85933        */
85934       angleWith: function(b) {
85935           return this.angleWithSep(b.x, b.y);
85936       },
85937
85938       /*
85939        * Find the angle of the two vectors, solving the formula for
85940        * the cross product a x b = |a||b|sin(θ) for θ.
85941        * @param {Number} x the x-coordinate
85942        * @param {Number} y the y-coordinate
85943        * @return {Number} the angle in radians
85944        */
85945       angleWithSep: function(x, y) {
85946           return Math.atan2(
85947               this.x * y - this.y * x,
85948               this.x * x + this.y * y);
85949       },
85950
85951       _matMult: function(m) {
85952           var x = m[0] * this.x + m[1] * this.y,
85953               y = m[2] * this.x + m[3] * this.y;
85954           this.x = x;
85955           this.y = y;
85956           return this;
85957       },
85958
85959       _add: function(p) {
85960           this.x += p.x;
85961           this.y += p.y;
85962           return this;
85963       },
85964
85965       _sub: function(p) {
85966           this.x -= p.x;
85967           this.y -= p.y;
85968           return this;
85969       },
85970
85971       _mult: function(k) {
85972           this.x *= k;
85973           this.y *= k;
85974           return this;
85975       },
85976
85977       _div: function(k) {
85978           this.x /= k;
85979           this.y /= k;
85980           return this;
85981       },
85982
85983       _multByPoint: function(p) {
85984           this.x *= p.x;
85985           this.y *= p.y;
85986           return this;
85987       },
85988
85989       _divByPoint: function(p) {
85990           this.x /= p.x;
85991           this.y /= p.y;
85992           return this;
85993       },
85994
85995       _unit: function() {
85996           this._div(this.mag());
85997           return this;
85998       },
85999
86000       _perp: function() {
86001           var y = this.y;
86002           this.y = this.x;
86003           this.x = -y;
86004           return this;
86005       },
86006
86007       _rotate: function(angle) {
86008           var cos = Math.cos(angle),
86009               sin = Math.sin(angle),
86010               x = cos * this.x - sin * this.y,
86011               y = sin * this.x + cos * this.y;
86012           this.x = x;
86013           this.y = y;
86014           return this;
86015       },
86016
86017       _rotateAround: function(angle, p) {
86018           var cos = Math.cos(angle),
86019               sin = Math.sin(angle),
86020               x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y),
86021               y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y);
86022           this.x = x;
86023           this.y = y;
86024           return this;
86025       },
86026
86027       _round: function() {
86028           this.x = Math.round(this.x);
86029           this.y = Math.round(this.y);
86030           return this;
86031       }
86032   };
86033
86034   /**
86035    * Construct a point from an array if necessary, otherwise if the input
86036    * is already a Point, or an unknown type, return it unchanged
86037    * @param {Array<Number>|Point|*} a any kind of input value
86038    * @return {Point} constructed point, or passed-through value.
86039    * @example
86040    * // this
86041    * var point = Point.convert([0, 1]);
86042    * // is equivalent to
86043    * var point = new Point(0, 1);
86044    */
86045   Point.convert = function (a) {
86046       if (a instanceof Point) {
86047           return a;
86048       }
86049       if (Array.isArray(a)) {
86050           return new Point(a[0], a[1]);
86051       }
86052       return a;
86053   };
86054
86055   var vectortilefeature = VectorTileFeature;
86056
86057   function VectorTileFeature(pbf, end, extent, keys, values) {
86058       // Public
86059       this.properties = {};
86060       this.extent = extent;
86061       this.type = 0;
86062
86063       // Private
86064       this._pbf = pbf;
86065       this._geometry = -1;
86066       this._keys = keys;
86067       this._values = values;
86068
86069       pbf.readFields(readFeature, this, end);
86070   }
86071
86072   function readFeature(tag, feature, pbf) {
86073       if (tag == 1) feature.id = pbf.readVarint();
86074       else if (tag == 2) readTag(pbf, feature);
86075       else if (tag == 3) feature.type = pbf.readVarint();
86076       else if (tag == 4) feature._geometry = pbf.pos;
86077   }
86078
86079   function readTag(pbf, feature) {
86080       var end = pbf.readVarint() + pbf.pos;
86081
86082       while (pbf.pos < end) {
86083           var key = feature._keys[pbf.readVarint()],
86084               value = feature._values[pbf.readVarint()];
86085           feature.properties[key] = value;
86086       }
86087   }
86088
86089   VectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon'];
86090
86091   VectorTileFeature.prototype.loadGeometry = function() {
86092       var pbf = this._pbf;
86093       pbf.pos = this._geometry;
86094
86095       var end = pbf.readVarint() + pbf.pos,
86096           cmd = 1,
86097           length = 0,
86098           x = 0,
86099           y = 0,
86100           lines = [],
86101           line;
86102
86103       while (pbf.pos < end) {
86104           if (length <= 0) {
86105               var cmdLen = pbf.readVarint();
86106               cmd = cmdLen & 0x7;
86107               length = cmdLen >> 3;
86108           }
86109
86110           length--;
86111
86112           if (cmd === 1 || cmd === 2) {
86113               x += pbf.readSVarint();
86114               y += pbf.readSVarint();
86115
86116               if (cmd === 1) { // moveTo
86117                   if (line) lines.push(line);
86118                   line = [];
86119               }
86120
86121               line.push(new pointGeometry(x, y));
86122
86123           } else if (cmd === 7) {
86124
86125               // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90
86126               if (line) {
86127                   line.push(line[0].clone()); // closePolygon
86128               }
86129
86130           } else {
86131               throw new Error('unknown command ' + cmd);
86132           }
86133       }
86134
86135       if (line) lines.push(line);
86136
86137       return lines;
86138   };
86139
86140   VectorTileFeature.prototype.bbox = function() {
86141       var pbf = this._pbf;
86142       pbf.pos = this._geometry;
86143
86144       var end = pbf.readVarint() + pbf.pos,
86145           cmd = 1,
86146           length = 0,
86147           x = 0,
86148           y = 0,
86149           x1 = Infinity,
86150           x2 = -Infinity,
86151           y1 = Infinity,
86152           y2 = -Infinity;
86153
86154       while (pbf.pos < end) {
86155           if (length <= 0) {
86156               var cmdLen = pbf.readVarint();
86157               cmd = cmdLen & 0x7;
86158               length = cmdLen >> 3;
86159           }
86160
86161           length--;
86162
86163           if (cmd === 1 || cmd === 2) {
86164               x += pbf.readSVarint();
86165               y += pbf.readSVarint();
86166               if (x < x1) x1 = x;
86167               if (x > x2) x2 = x;
86168               if (y < y1) y1 = y;
86169               if (y > y2) y2 = y;
86170
86171           } else if (cmd !== 7) {
86172               throw new Error('unknown command ' + cmd);
86173           }
86174       }
86175
86176       return [x1, y1, x2, y2];
86177   };
86178
86179   VectorTileFeature.prototype.toGeoJSON = function(x, y, z) {
86180       var size = this.extent * Math.pow(2, z),
86181           x0 = this.extent * x,
86182           y0 = this.extent * y,
86183           coords = this.loadGeometry(),
86184           type = VectorTileFeature.types[this.type],
86185           i, j;
86186
86187       function project(line) {
86188           for (var j = 0; j < line.length; j++) {
86189               var p = line[j], y2 = 180 - (p.y + y0) * 360 / size;
86190               line[j] = [
86191                   (p.x + x0) * 360 / size - 180,
86192                   360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90
86193               ];
86194           }
86195       }
86196
86197       switch (this.type) {
86198       case 1:
86199           var points = [];
86200           for (i = 0; i < coords.length; i++) {
86201               points[i] = coords[i][0];
86202           }
86203           coords = points;
86204           project(coords);
86205           break;
86206
86207       case 2:
86208           for (i = 0; i < coords.length; i++) {
86209               project(coords[i]);
86210           }
86211           break;
86212
86213       case 3:
86214           coords = classifyRings(coords);
86215           for (i = 0; i < coords.length; i++) {
86216               for (j = 0; j < coords[i].length; j++) {
86217                   project(coords[i][j]);
86218               }
86219           }
86220           break;
86221       }
86222
86223       if (coords.length === 1) {
86224           coords = coords[0];
86225       } else {
86226           type = 'Multi' + type;
86227       }
86228
86229       var result = {
86230           type: "Feature",
86231           geometry: {
86232               type: type,
86233               coordinates: coords
86234           },
86235           properties: this.properties
86236       };
86237
86238       if ('id' in this) {
86239           result.id = this.id;
86240       }
86241
86242       return result;
86243   };
86244
86245   // classifies an array of rings into polygons with outer rings and holes
86246
86247   function classifyRings(rings) {
86248       var len = rings.length;
86249
86250       if (len <= 1) return [rings];
86251
86252       var polygons = [],
86253           polygon,
86254           ccw;
86255
86256       for (var i = 0; i < len; i++) {
86257           var area = signedArea(rings[i]);
86258           if (area === 0) continue;
86259
86260           if (ccw === undefined) ccw = area < 0;
86261
86262           if (ccw === area < 0) {
86263               if (polygon) polygons.push(polygon);
86264               polygon = [rings[i]];
86265
86266           } else {
86267               polygon.push(rings[i]);
86268           }
86269       }
86270       if (polygon) polygons.push(polygon);
86271
86272       return polygons;
86273   }
86274
86275   function signedArea(ring) {
86276       var sum = 0;
86277       for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {
86278           p1 = ring[i];
86279           p2 = ring[j];
86280           sum += (p2.x - p1.x) * (p1.y + p2.y);
86281       }
86282       return sum;
86283   }
86284
86285   var vectortilelayer = VectorTileLayer;
86286
86287   function VectorTileLayer(pbf, end) {
86288       // Public
86289       this.version = 1;
86290       this.name = null;
86291       this.extent = 4096;
86292       this.length = 0;
86293
86294       // Private
86295       this._pbf = pbf;
86296       this._keys = [];
86297       this._values = [];
86298       this._features = [];
86299
86300       pbf.readFields(readLayer, this, end);
86301
86302       this.length = this._features.length;
86303   }
86304
86305   function readLayer(tag, layer, pbf) {
86306       if (tag === 15) layer.version = pbf.readVarint();
86307       else if (tag === 1) layer.name = pbf.readString();
86308       else if (tag === 5) layer.extent = pbf.readVarint();
86309       else if (tag === 2) layer._features.push(pbf.pos);
86310       else if (tag === 3) layer._keys.push(pbf.readString());
86311       else if (tag === 4) layer._values.push(readValueMessage(pbf));
86312   }
86313
86314   function readValueMessage(pbf) {
86315       var value = null,
86316           end = pbf.readVarint() + pbf.pos;
86317
86318       while (pbf.pos < end) {
86319           var tag = pbf.readVarint() >> 3;
86320
86321           value = tag === 1 ? pbf.readString() :
86322               tag === 2 ? pbf.readFloat() :
86323               tag === 3 ? pbf.readDouble() :
86324               tag === 4 ? pbf.readVarint64() :
86325               tag === 5 ? pbf.readVarint() :
86326               tag === 6 ? pbf.readSVarint() :
86327               tag === 7 ? pbf.readBoolean() : null;
86328       }
86329
86330       return value;
86331   }
86332
86333   // return feature `i` from this layer as a `VectorTileFeature`
86334   VectorTileLayer.prototype.feature = function(i) {
86335       if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds');
86336
86337       this._pbf.pos = this._features[i];
86338
86339       var end = this._pbf.readVarint() + this._pbf.pos;
86340       return new vectortilefeature(this._pbf, end, this.extent, this._keys, this._values);
86341   };
86342
86343   var vectortile = VectorTile;
86344
86345   function VectorTile(pbf, end) {
86346       this.layers = pbf.readFields(readTile, {}, end);
86347   }
86348
86349   function readTile(tag, layers, pbf) {
86350       if (tag === 3) {
86351           var layer = new vectortilelayer(pbf, pbf.readVarint() + pbf.pos);
86352           if (layer.length) layers[layer.name] = layer;
86353       }
86354   }
86355
86356   var VectorTile$1 = vectortile;
86357   var VectorTileFeature$1 = vectortilefeature;
86358   var VectorTileLayer$1 = vectortilelayer;
86359
86360   var vectorTile = {
86361         VectorTile: VectorTile$1,
86362         VectorTileFeature: VectorTileFeature$1,
86363         VectorTileLayer: VectorTileLayer$1
86364   };
86365
86366   var tiler$5 = utilTiler().tileSize(512).margin(1);
86367   var dispatch$6 = dispatch('loadedData');
86368   var _vtCache;
86369
86370
86371   function abortRequest$5(i) {
86372       i.abort();
86373   }
86374
86375
86376   function vtToGeoJSON(data, tile, mergeCache) {
86377       var vectorTile$$1 = new vectorTile.VectorTile(new pbf(data.response));
86378       var layers = Object.keys(vectorTile$$1.layers);
86379       if (!Array.isArray(layers)) { layers = [layers]; }
86380
86381       var features = [];
86382       layers.forEach(function(layerID) {
86383           var layer = vectorTile$$1.layers[layerID];
86384           if (layer) {
86385               for (var i = 0; i < layer.length; i++) {
86386                   var feature = layer.feature(i).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
86387                   var geometry = feature.geometry;
86388
86389                   // Treat all Polygons as MultiPolygons
86390                   if (geometry.type === 'Polygon') {
86391                       geometry.type = 'MultiPolygon';
86392                       geometry.coordinates = [geometry.coordinates];
86393                   }
86394
86395                   // Clip to tile bounds
86396                   if (geometry.type === 'MultiPolygon') {
86397                       var isClipped = false;
86398                       var featureClip = turf_bboxClip(feature, tile.extent.rectangle());
86399                       if (!isEqual(feature.geometry, featureClip.geometry)) {
86400                           // feature = featureClip;
86401                           isClipped = true;
86402                       }
86403                       if (!feature.geometry.coordinates.length) continue;   // not actually on this tile
86404                       if (!feature.geometry.coordinates[0].length) continue;   // not actually on this tile
86405                   }
86406
86407                   // Generate some unique IDs and add some metadata
86408                   var featurehash = utilHashcode(fastJsonStableStringify(feature));
86409                   var propertyhash = utilHashcode(fastJsonStableStringify(feature.properties || {}));
86410                   feature.__layerID__ = layerID.replace(/[^_a-zA-Z0-9\-]/g, '_');
86411                   feature.__featurehash__ = featurehash;
86412                   feature.__propertyhash__ = propertyhash;
86413                   features.push(feature);
86414
86415                   // Clipped Polygons at same zoom with identical properties can get merged
86416                   if (isClipped && geometry.type === 'MultiPolygon') {
86417                       var merged = mergeCache[propertyhash];
86418                       if (merged && merged.length) {
86419                           var other = merged[0];
86420                           var coords = martinez.union(
86421                               feature.geometry.coordinates, other.geometry.coordinates
86422                           );
86423
86424                           if (!coords || !coords.length) {
86425                               continue;  // something failed in martinez union
86426                           }
86427
86428                           merged.push(feature);
86429                           for (var j = 0; j < merged.length; j++) {      // all these features get...
86430                               merged[j].geometry.coordinates = coords;   // same coords
86431                               merged[j].__featurehash__ = featurehash;   // same hash, so deduplication works
86432                           }
86433                       } else {
86434                           mergeCache[propertyhash] = [feature];
86435                       }
86436                   }
86437               }
86438           }
86439       });
86440
86441       return features;
86442   }
86443
86444
86445   function loadTile(source, tile) {
86446       if (source.loaded[tile.id] || source.inflight[tile.id]) return;
86447
86448       var url = source.template
86449           .replace('{x}', tile.xyz[0])
86450           .replace('{y}', tile.xyz[1])
86451           // TMS-flipped y coordinate
86452           .replace(/\{[t-]y\}/, Math.pow(2, tile.xyz[2]) - tile.xyz[1] - 1)
86453           .replace(/\{z(oom)?\}/, tile.xyz[2])
86454           .replace(/\{switch:([^}]+)\}/, function(s, r) {
86455               var subdomains = r.split(',');
86456               return subdomains[(tile.xyz[0] + tile.xyz[1]) % subdomains.length];
86457           });
86458
86459       source.inflight[tile.id] = request(url)
86460           .responseType('arraybuffer')
86461           .get(function(err, data) {
86462               source.loaded[tile.id] = [];
86463               delete source.inflight[tile.id];
86464               if (err || !data) return;
86465
86466               var z = tile.xyz[2];
86467               if (!source.canMerge[z]) {
86468                   source.canMerge[z] = {};  // initialize mergeCache
86469               }
86470
86471               source.loaded[tile.id] = vtToGeoJSON(data, tile, source.canMerge[z]);
86472               dispatch$6.call('loadedData');
86473           });
86474   }
86475
86476
86477   var serviceVectorTile = {
86478
86479       init: function() {
86480           if (!_vtCache) {
86481               this.reset();
86482           }
86483
86484           this.event = utilRebind(this, dispatch$6, 'on');
86485       },
86486
86487
86488       reset: function() {
86489           for (var sourceID in _vtCache) {
86490               var source = _vtCache[sourceID];
86491               if (source && source.inflight) {
86492                   forEach(source.inflight, abortRequest$5);
86493               }
86494           }
86495
86496           _vtCache = {};
86497       },
86498
86499
86500       addSource: function(sourceID, template) {
86501           _vtCache[sourceID] = { template: template, inflight: {}, loaded: {}, canMerge: {} };
86502           return _vtCache[sourceID];
86503       },
86504
86505
86506       data: function(sourceID, projection) {
86507           var source = _vtCache[sourceID];
86508           if (!source) return [];
86509
86510           var tiles = tiler$5.getTiles(projection);
86511           var seen = {};
86512           var results = [];
86513
86514           for (var i = 0; i < tiles.length; i++) {
86515               var features = source.loaded[tiles[i].id];
86516               if (!features || !features.length) continue;
86517
86518               for (var j = 0; j < features.length; j++) {
86519                   var feature = features[j];
86520                   var hash = feature.__featurehash__;
86521                   if (seen[hash]) continue;
86522                   seen[hash] = true;
86523
86524                   // return a shallow clone, because the hash may change
86525                   // later if this feature gets merged with another
86526                   results.push(clone(feature));
86527               }
86528           }
86529
86530           return results;
86531       },
86532
86533
86534       loadTiles: function(sourceID, template, projection) {
86535           var source = _vtCache[sourceID];
86536           if (!source) {
86537               source = this.addSource(sourceID, template);
86538           }
86539
86540           var tiles = tiler$5.getTiles(projection);
86541
86542           // abort inflight requests that are no longer needed
86543           forEach(source.inflight, function(v, k) {
86544               var wanted = find$1(tiles, function(tile) { return k === tile.id; });
86545
86546               if (!wanted) {
86547                   abortRequest$5(v);
86548                   delete source.inflight[k];
86549               }
86550           });
86551
86552           tiles.forEach(function(tile) {
86553               loadTile(source, tile);
86554           });
86555       },
86556
86557
86558       cache: function() {
86559           return _vtCache;
86560       }
86561
86562   };
86563
86564   var endpoint = 'https://www.wikidata.org/w/api.php?';
86565   var _wikidataCache = {};
86566
86567   var serviceWikidata = {
86568
86569       init: function() {},
86570
86571       reset: function() {
86572           _wikidataCache = {};
86573       },
86574
86575
86576       // Given a Wikipedia language and article title, return an array of
86577       // corresponding Wikidata entities.
86578       itemsByTitle: function(lang, title, callback) {
86579           if (!title) {
86580               callback('', {});
86581               return;
86582           }
86583
86584           lang = lang || 'en';
86585
86586           d3_json(endpoint + utilQsString({
86587               action: 'wbgetentities',
86588               format: 'json',
86589               formatversion: 2,
86590               sites: lang.replace(/-/g, '_') + 'wiki',
86591               titles: title,
86592               languages: 'en', // shrink response by filtering to one language
86593               origin: '*'
86594           }), function(err, data) {
86595               if (err || !data || data.error) {
86596                   callback('', {});
86597               } else {
86598                   callback(title, data.entities || {});
86599               }
86600           });
86601       },
86602
86603
86604       entityByQID: function(qid, callback) {
86605           if (!qid) {
86606               callback('', {});
86607               return;
86608           }
86609           if (_wikidataCache[qid]) {
86610               callback('', _wikidataCache[qid]);
86611               return;
86612           }
86613
86614           var langs = uniq([
86615               currentLocale.toLowerCase(),
86616               currentLocale.split('-', 2)[0].toLowerCase(),
86617               'en'
86618           ]);
86619
86620           d3_json(endpoint + utilQsString({
86621               action: 'wbgetentities',
86622               format: 'json',
86623               formatversion: 2,
86624               ids: qid,
86625               props: /*sitelinks|*/'labels|descriptions',
86626               //sitefilter: lang + 'wiki',
86627               languages: langs.join('|'),
86628               languagefallback: 1,
86629               origin: '*'
86630           }), function(err, data) {
86631               if (err || !data || data.error) {
86632                   callback('', {});
86633               } else {
86634                   _wikidataCache[qid] = data.entities[qid];
86635                   callback(qid, data.entities[qid] || {});
86636               }
86637           });
86638       }
86639
86640   };
86641
86642   var endpoint$1 = 'https://en.wikipedia.org/w/api.php?';
86643
86644   var serviceWikipedia = {
86645
86646       init: function() {},
86647       reset: function() {},
86648
86649
86650       search: function(lang, query, callback) {
86651           if (!query) {
86652               callback('', []);
86653               return;
86654           }
86655
86656           lang = lang || 'en';
86657           d3_json(endpoint$1.replace('en', lang) +
86658               utilQsString({
86659                   action: 'query',
86660                   list: 'search',
86661                   srlimit: '10',
86662                   srinfo: 'suggestion',
86663                   format: 'json',
86664                   origin: '*',
86665                   srsearch: query
86666               }), function(err, data) {
86667                   if (err || !data || !data.query || !data.query.search || data.error) {
86668                       callback('', []);
86669                   } else {
86670                       var results = data.query.search.map(function(d) { return d.title; });
86671                       callback(query, results);
86672                   }
86673               }
86674           );
86675       },
86676
86677
86678       suggestions: function(lang, query, callback) {
86679           if (!query) {
86680               callback('', []);
86681               return;
86682           }
86683
86684           lang = lang || 'en';
86685           d3_json(endpoint$1.replace('en', lang) +
86686               utilQsString({
86687                   action: 'opensearch',
86688                   namespace: 0,
86689                   suggest: '',
86690                   format: 'json',
86691                   origin: '*',
86692                   search: query
86693               }), function(err, data) {
86694                   if (err || !data || data.error) {
86695                       callback('', []);
86696                   } else {
86697                       callback(data[0], data[1] || []);
86698                   }
86699               }
86700           );
86701       },
86702
86703
86704       translations: function(lang, title, callback) {
86705           if (!title) {
86706               callback({});
86707               return;
86708           }
86709
86710           d3_json(endpoint$1.replace('en', lang) +
86711               utilQsString({
86712                   action: 'query',
86713                   prop: 'langlinks',
86714                   format: 'json',
86715                   origin: '*',
86716                   lllimit: 500,
86717                   titles: title
86718               }), function(err, data) {
86719                   if (err || !data || !data.query || !data.query.pages || data.error) {
86720                       callback({});
86721                   } else {
86722                       var list = data.query.pages[Object.keys(data.query.pages)[0]],
86723                           translations = {};
86724                       if (list && list.langlinks) {
86725                           list.langlinks.forEach(function(d) {
86726                               translations[d.lang] = d['*'];
86727                           });
86728                       }
86729                       callback(translations);
86730                   }
86731               }
86732           );
86733       }
86734
86735   };
86736
86737   var services = {
86738       geocoder: serviceNominatim,
86739       keepRight: serviceKeepRight,
86740       mapillary: serviceMapillary,
86741       openstreetcam: serviceOpenstreetcam,
86742       osm: serviceOsm,
86743       osmWikibase: serviceOsmWikibase,
86744       maprules: serviceMapRules,
86745       streetside: serviceStreetside,
86746       taginfo: serviceTaginfo,
86747       vectorTile: serviceVectorTile,
86748       wikidata: serviceWikidata,
86749       wikipedia: serviceWikipedia
86750   };
86751
86752   function validationMapCSSChecks() {
86753       var validation = function(changes, graph) {
86754           if (!services.maprules) return [];
86755
86756           var rules = services.maprules.validationRules();
86757           var warnings = [];
86758           var createdModified = ['created', 'modified'];
86759
86760           for (var i = 0; i < rules.length; i++) {
86761               var rule = rules[i];
86762               for (var j = 0; j < createdModified.length; j++) {
86763                   var type = createdModified[j];
86764                   var entities = changes[type];
86765                   for (var k = 0; k < entities.length; k++) {
86766                       rule.findWarnings(entities[k], graph, warnings);
86767                   }
86768               }
86769           }
86770
86771           return warnings;
86772       };
86773
86774
86775       return validation;
86776   }
86777
86778   function validationMissingTag() {
86779
86780       // Slightly stricter check than Entity#isUsed (#3091)
86781       function hasTags(entity, graph) {
86782           return without(Object.keys(entity.tags), 'area', 'name').length > 0 ||
86783               graph.parentRelations(entity).length > 0;
86784       }
86785
86786       var validation = function(changes, graph) {
86787           var types = ['point', 'line', 'area', 'relation'];
86788           var warnings = [];
86789
86790           for (var i = 0; i < changes.created.length; i++) {
86791               var change = changes.created[i];
86792               var geometry = change.geometry(graph);
86793
86794               if (types.indexOf(geometry) !== -1 && !hasTags(change, graph)) {
86795                   warnings.push({
86796                       id: 'missing_tag',
86797                       message: t('validations.untagged_' + geometry),
86798                       tooltip: t('validations.untagged_' + geometry + '_tooltip'),
86799                       entity: change
86800                   });
86801               }
86802           }
86803
86804           return warnings;
86805       };
86806
86807
86808       return validation;
86809   }
86810
86811   function validationOldMultipolygon() {
86812
86813       return function validation(changes, graph) {
86814           var warnings = [];
86815           for (var i = 0; i < changes.created.length; i++) {
86816               var entity = changes.created[i];
86817               var parent = osmIsSimpleMultipolygonOuterMember(entity, graph);
86818               if (parent) {
86819                   warnings.push({
86820                       id: 'old_multipolygon',
86821                       message: t('validations.old_multipolygon'),
86822                       tooltip: t('validations.old_multipolygon_tooltip'),
86823                       entity: parent
86824                   });
86825               }
86826           }
86827           return warnings;
86828       };
86829   }
86830
86831   // https://github.com/openstreetmap/josm/blob/mirror/src/org/
86832   // openstreetmap/josm/data/validation/tests/UnclosedWays.java#L80
86833   function validationTagSuggestsArea() {
86834
86835       function tagSuggestsArea(tags) {
86836           if (isEmpty(tags)) return false;
86837
86838           var presence = ['landuse', 'amenities', 'tourism', 'shop'];
86839           for (var i = 0; i < presence.length; i++) {
86840               if (tags[presence[i]] !== undefined) {
86841                   if (presence[i] === 'tourism' && tags[presence[i]] === 'artwork') {
86842                       continue;   // exception for tourism=artwork - #5206
86843                   } else {
86844                       return presence[i] + '=' + tags[presence[i]];
86845                   }
86846               }
86847           }
86848
86849           if (tags.building && tags.building === 'yes') return 'building=yes';
86850       }
86851
86852
86853       var validation = function(changes, graph) {
86854           var warnings = [];
86855           for (var i = 0; i < changes.created.length; i++) {
86856               var change = changes.created[i];
86857               var geometry = change.geometry(graph);
86858               var suggestion = (geometry === 'line' ? tagSuggestsArea(change.tags) : undefined);
86859
86860               if (suggestion) {
86861                   warnings.push({
86862                       id: 'tag_suggests_area',
86863                       message: t('validations.tag_suggests_area', { tag: suggestion }),
86864                       entity: change
86865                   });
86866               }
86867           }
86868
86869           return warnings;
86870       };
86871
86872
86873       return validation;
86874   }
86875
86876
86877
86878   var Validations = /*#__PURE__*/Object.freeze({
86879     validationDeprecatedTag: validationDeprecatedTag,
86880     validationDisconnectedHighway: validationDisconnectedHighway,
86881     validationGenericName: validationGenericName,
86882     validationManyDeletions: validationManyDeletions,
86883     validationMapCSSChecks: validationMapCSSChecks,
86884     validationMissingTag: validationMissingTag,
86885     validationOldMultipolygon: validationOldMultipolygon,
86886     validationTagSuggestsArea: validationTagSuggestsArea
86887   });
86888
86889   function coreHistory(context) {
86890       var dispatch$$1 = dispatch('change', 'undone', 'redone');
86891       var lock = utilSessionMutex('lock');
86892       var duration = 150;
86893       var _imageryUsed = [];
86894       var _checkpoints = {};
86895       var _stack;
86896       var _index;
86897       var _tree;
86898
86899
86900       // internal _act, accepts list of actions and eased time
86901       function _act(actions, t) {
86902           actions = Array.prototype.slice.call(actions);
86903
86904           var annotation;
86905           if (!isFunction(actions[actions.length - 1])) {
86906               annotation = actions.pop();
86907           }
86908
86909           var graph = _stack[_index].graph;
86910           for (var i = 0; i < actions.length; i++) {
86911               graph = actions[i](graph, t);
86912           }
86913
86914           return {
86915               graph: graph,
86916               annotation: annotation,
86917               imageryUsed: _imageryUsed,
86918               transform: context.projection.transform(),
86919               selectedIDs: context.selectedIDs()
86920           };
86921       }
86922
86923
86924       // internal _perform with eased time
86925       function _perform(args, t) {
86926           var previous = _stack[_index].graph;
86927           _stack = _stack.slice(0, _index + 1);
86928           _stack.push(_act(args, t));
86929           _index++;
86930           return change(previous);
86931       }
86932
86933
86934       // internal _replace with eased time
86935       function _replace(args, t) {
86936           var previous = _stack[_index].graph;
86937           // assert(_index == _stack.length - 1)
86938           _stack[_index] = _act(args, t);
86939           return change(previous);
86940       }
86941
86942
86943       // internal _overwrite with eased time
86944       function _overwrite(args, t) {
86945           var previous = _stack[_index].graph;
86946           if (_index > 0) {
86947               _index--;
86948               _stack.pop();
86949           }
86950           _stack = _stack.slice(0, _index + 1);
86951           _stack.push(_act(args, t));
86952           _index++;
86953           return change(previous);
86954       }
86955
86956
86957       // determine diffrence and dispatch a change event
86958       function change(previous) {
86959           var difference$$1 = coreDifference(previous, history.graph());
86960           dispatch$$1.call('change', this, difference$$1);
86961           return difference$$1;
86962       }
86963
86964
86965       // iD uses namespaced keys so multiple installations do not conflict
86966       function getKey(n) {
86967           return 'iD_' + window.location.origin + '_' + n;
86968       }
86969
86970
86971       var history = {
86972
86973           graph: function() {
86974               return _stack[_index].graph;
86975           },
86976
86977
86978           base: function() {
86979               return _stack[0].graph;
86980           },
86981
86982
86983           merge: function(entities, extent) {
86984               _stack[0].graph.rebase(entities, map$3(_stack, 'graph'), false);
86985               _tree.rebase(entities, false);
86986
86987               dispatch$$1.call('change', this, undefined, extent);
86988           },
86989
86990
86991           perform: function() {
86992               // complete any transition already in progress
86993               select(document).interrupt('history.perform');
86994
86995               var transitionable = false;
86996               var action0 = arguments[0];
86997
86998               if (arguments.length === 1 ||
86999                   arguments.length === 2 && !isFunction(arguments[1])) {
87000                   transitionable = !!action0.transitionable;
87001               }
87002
87003               if (transitionable) {
87004                   var origArguments = arguments;
87005                   select(document)
87006                       .transition('history.perform')
87007                       .duration(duration)
87008                       .ease(linear$1)
87009                       .tween('history.tween', function() {
87010                           return function(t) {
87011                               if (t < 1) _overwrite([action0], t);
87012                           };
87013                       })
87014                       .on('start', function() {
87015                           _perform([action0], 0);
87016                       })
87017                       .on('end interrupt', function() {
87018                           _overwrite(origArguments, 1);
87019                       });
87020
87021               } else {
87022                   return _perform(arguments);
87023               }
87024           },
87025
87026
87027           replace: function() {
87028               select(document).interrupt('history.perform');
87029               return _replace(arguments, 1);
87030           },
87031
87032
87033           // Same as calling pop and then perform
87034           overwrite: function() {
87035               select(document).interrupt('history.perform');
87036               return _overwrite(arguments, 1);
87037           },
87038
87039
87040           pop: function(n) {
87041               select(document).interrupt('history.perform');
87042
87043               var previous = _stack[_index].graph;
87044               if (isNaN(+n) || +n < 0) {
87045                   n = 1;
87046               }
87047               while (n-- > 0 && _index > 0) {
87048                   _index--;
87049                   _stack.pop();
87050               }
87051               return change(previous);
87052           },
87053
87054
87055           // Back to the previous annotated state or _index = 0.
87056           undo: function() {
87057               select(document).interrupt('history.perform');
87058
87059               var previous = _stack[_index].graph;
87060               while (_index > 0) {
87061                   _index--;
87062                   if (_stack[_index].annotation) break;
87063               }
87064
87065               dispatch$$1.call('undone', this, _stack[_index]);
87066               return change(previous);
87067           },
87068
87069
87070           // Forward to the next annotated state.
87071           redo: function() {
87072               select(document).interrupt('history.perform');
87073
87074               var previous = _stack[_index].graph;
87075               var tryIndex = _index;
87076               while (tryIndex < _stack.length - 1) {
87077                   tryIndex++;
87078                   if (_stack[tryIndex].annotation) {
87079                       _index = tryIndex;
87080                       dispatch$$1.call('redone', this, _stack[_index]);
87081                       break;
87082                   }
87083               }
87084
87085               return change(previous);
87086           },
87087
87088
87089           undoAnnotation: function() {
87090               var i = _index;
87091               while (i >= 0) {
87092                   if (_stack[i].annotation) return _stack[i].annotation;
87093                   i--;
87094               }
87095           },
87096
87097
87098           redoAnnotation: function() {
87099               var i = _index + 1;
87100               while (i <= _stack.length - 1) {
87101                   if (_stack[i].annotation) return _stack[i].annotation;
87102                   i++;
87103               }
87104           },
87105
87106
87107           intersects: function(extent) {
87108               return _tree.intersects(extent, _stack[_index].graph);
87109           },
87110
87111
87112           difference: function() {
87113               var base = _stack[0].graph;
87114               var head = _stack[_index].graph;
87115               return coreDifference(base, head);
87116           },
87117
87118
87119           changes: function(action) {
87120               var base = _stack[0].graph;
87121               var head = _stack[_index].graph;
87122
87123               if (action) {
87124                   head = action(head);
87125               }
87126
87127               var difference$$1 = coreDifference(base, head);
87128
87129               return {
87130                   modified: difference$$1.modified(),
87131                   created: difference$$1.created(),
87132                   deleted: difference$$1.deleted()
87133               };
87134           },
87135
87136
87137           validate: function(changes) {
87138               return flatten(map$3(Validations, function(fn) {
87139                   return fn()(changes, _stack[_index].graph);
87140               }));
87141           },
87142
87143
87144           hasChanges: function() {
87145               return this.difference().length() > 0;
87146           },
87147
87148
87149           imageryUsed: function(sources) {
87150               if (sources) {
87151                   _imageryUsed = sources;
87152                   return history;
87153               } else {
87154                   var arr = map$3(_stack.slice(1, _index + 1), 'imageryUsed');
87155                   return without(uniq(flatten(arr)), 'Custom');
87156               }
87157           },
87158
87159
87160           // save the current history state
87161           checkpoint: function(key) {
87162               _checkpoints[key] = {
87163                   stack: cloneDeep(_stack),
87164                   index: _index
87165               };
87166               return history;
87167           },
87168
87169
87170           // restore history state to a given checkpoint or reset completely
87171           reset: function(key) {
87172               if (key !== undefined && _checkpoints.hasOwnProperty(key)) {
87173                   _stack = cloneDeep(_checkpoints[key].stack);
87174                   _index = _checkpoints[key].index;
87175               } else {
87176                   _stack = [{graph: coreGraph$$1()}];
87177                   _index = 0;
87178                   _tree = coreTree(_stack[0].graph);
87179                   _checkpoints = {};
87180               }
87181               dispatch$$1.call('change');
87182               return history;
87183           },
87184
87185
87186           toIntroGraph: function() {
87187               var nextId = { n: 0, r: 0, w: 0 };
87188               var permIds = {};
87189               var graph = this.graph();
87190               var baseEntities = {};
87191
87192               // clone base entities..
87193               forEach(graph.base().entities, function(entity) {
87194                   var copy = cloneDeepWith(entity, customizer);
87195                   baseEntities[copy.id] = copy;
87196               });
87197
87198               // replace base entities with head entities..
87199               forEach(graph.entities, function(entity, id) {
87200                   if (entity) {
87201                       var copy = cloneDeepWith(entity, customizer);
87202                       baseEntities[copy.id] = copy;
87203                   } else {
87204                       delete baseEntities[id];
87205                   }
87206               });
87207
87208               // swap temporary for permanent ids..
87209               forEach(baseEntities, function(entity) {
87210                   if (Array.isArray(entity.nodes)) {
87211                       entity.nodes = entity.nodes.map(function(node) {
87212                           return permIds[node] || node;
87213                       });
87214                   }
87215                   if (Array.isArray(entity.members)) {
87216                       entity.members = entity.members.map(function(member) {
87217                           member.id = permIds[member.id] || member.id;
87218                           return member;
87219                       });
87220                   }
87221               });
87222
87223               return JSON.stringify({ dataIntroGraph: baseEntities });
87224
87225
87226               function customizer(src) {
87227                   var copy = omit(cloneDeep(src), ['type', 'user', 'v', 'version', 'visible']);
87228                   if (isEmpty(copy.tags)) {
87229                       delete copy.tags;
87230                   }
87231
87232                   if (Array.isArray(copy.loc)) {
87233                       copy.loc[0] = +copy.loc[0].toFixed(6);
87234                       copy.loc[1] = +copy.loc[1].toFixed(6);
87235                   }
87236
87237                   var match = src.id.match(/([nrw])-\d*/);  // temporary id
87238                   if (match !== null) {
87239                       var nrw = match[1], permId;
87240                       do { permId = nrw + (++nextId[nrw]); }
87241                       while (baseEntities.hasOwnProperty(permId));
87242
87243                       copy.id = permIds[src.id] = permId;
87244                   }
87245                   return copy;
87246               }
87247           },
87248
87249
87250           toJSON: function() {
87251               if (!this.hasChanges()) return;
87252
87253               var allEntities = {};
87254               var baseEntities = {};
87255               var base = _stack[0];
87256
87257               var s = _stack.map(function(i) {
87258                   var modified = [];
87259                   var deleted = [];
87260
87261                   forEach(i.graph.entities, function(entity, id) {
87262                       if (entity) {
87263                           var key = osmEntity$$1.key(entity);
87264                           allEntities[key] = entity;
87265                           modified.push(key);
87266                       } else {
87267                           deleted.push(id);
87268                       }
87269
87270                       // make sure that the originals of changed or deleted entities get merged
87271                       // into the base of the _stack after restoring the data from JSON.
87272                       if (id in base.graph.entities) {
87273                           baseEntities[id] = base.graph.entities[id];
87274                       }
87275                       if (entity && entity.nodes) {
87276                           // get originals of pre-existing child nodes
87277                           forEach(entity.nodes, function(nodeId) {
87278                               if (nodeId in base.graph.entities) {
87279                                   baseEntities[nodeId] = base.graph.entities[nodeId];
87280                               }
87281                           });
87282                       }
87283                       // get originals of parent entities too
87284                       forEach(base.graph._parentWays[id], function(parentId) {
87285                           if (parentId in base.graph.entities) {
87286                               baseEntities[parentId] = base.graph.entities[parentId];
87287                           }
87288                       });
87289                   });
87290
87291                   var x = {};
87292
87293                   if (modified.length) x.modified = modified;
87294                   if (deleted.length) x.deleted = deleted;
87295                   if (i.imageryUsed) x.imageryUsed = i.imageryUsed;
87296                   if (i.annotation) x.annotation = i.annotation;
87297                   if (i.transform) x.transform = i.transform;
87298                   if (i.selectedIDs) x.selectedIDs = i.selectedIDs;
87299
87300                   return x;
87301               });
87302
87303               return JSON.stringify({
87304                   version: 3,
87305                   entities: values$1(allEntities),
87306                   baseEntities: values$1(baseEntities),
87307                   stack: s,
87308                   nextIDs: osmEntity$$1.id.next,
87309                   index: _index
87310               });
87311           },
87312
87313
87314           fromJSON: function(json, loadChildNodes) {
87315               var h = JSON.parse(json);
87316               var loadComplete = true;
87317
87318               osmEntity$$1.id.next = h.nextIDs;
87319               _index = h.index;
87320
87321               if (h.version === 2 || h.version === 3) {
87322                   var allEntities = {};
87323
87324                   h.entities.forEach(function(entity) {
87325                       allEntities[osmEntity$$1.key(entity)] = osmEntity$$1(entity);
87326                   });
87327
87328                   if (h.version === 3) {
87329                       // This merges originals for changed entities into the base of
87330                       // the _stack even if the current _stack doesn't have them (for
87331                       // example when iD has been restarted in a different region)
87332                       var baseEntities = h.baseEntities.map(function(d) { return osmEntity$$1(d); });
87333                       _stack[0].graph.rebase(baseEntities, map$3(_stack, 'graph'), true);
87334                       _tree.rebase(baseEntities, true);
87335
87336                       // When we restore a modified way, we also need to fetch any missing
87337                       // childnodes that would normally have been downloaded with it.. #2142
87338                       if (loadChildNodes) {
87339                           var osm = context.connection();
87340                           var nodes = flatten(uniq(map$3(filter(baseEntities, { type: 'way' }), 'nodes')));
87341                           var missing = reject(nodes, function(n) { return _stack[0].graph.hasEntity(n); });
87342
87343                           if (!isEmpty(missing) && osm) {
87344                               loadComplete = false;
87345                               context.redrawEnable(false);
87346
87347                               var loading = uiLoading(context).blocking(true);
87348                               context.container().call(loading);
87349
87350                               var childNodesLoaded = function(err, result) {
87351                                   if (!err) {
87352                                       var visible = groupBy(result.data, 'visible');
87353                                       if (!isEmpty(visible.true)) {
87354                                           missing = difference(missing, map$3(visible.true, 'id'));
87355                                           _stack[0].graph.rebase(visible.true, map$3(_stack, 'graph'), true);
87356                                           _tree.rebase(visible.true, true);
87357                                       }
87358
87359                                       // fetch older versions of nodes that were deleted..
87360                                       forEach(visible.false, function(entity) {
87361                                           osm.loadEntityVersion(entity.id, +entity.version - 1, childNodesLoaded);
87362                                       });
87363                                   }
87364
87365                                   if (err || isEmpty(missing)) {
87366                                       loading.close();
87367                                       context.redrawEnable(true);
87368                                       dispatch$$1.call('change');
87369                                   }
87370                               };
87371
87372                               osm.loadMultiple(missing, childNodesLoaded);
87373                           }
87374                       }
87375                   }
87376
87377                   _stack = h.stack.map(function(d) {
87378                       var entities = {}, entity;
87379
87380                       if (d.modified) {
87381                           d.modified.forEach(function(key) {
87382                               entity = allEntities[key];
87383                               entities[entity.id] = entity;
87384                           });
87385                       }
87386
87387                       if (d.deleted) {
87388                           d.deleted.forEach(function(id) {
87389                               entities[id] = undefined;
87390                           });
87391                       }
87392
87393                       return {
87394                           graph: coreGraph$$1(_stack[0].graph).load(entities),
87395                           annotation: d.annotation,
87396                           imageryUsed: d.imageryUsed,
87397                           transform: d.transform,
87398                           selectedIDs: d.selectedIDs
87399                       };
87400                   });
87401
87402               } else { // original version
87403                   _stack = h.stack.map(function(d) {
87404                       var entities = {};
87405
87406                       for (var i in d.entities) {
87407                           var entity = d.entities[i];
87408                           entities[i] = entity === 'undefined' ? undefined : osmEntity$$1(entity);
87409                       }
87410
87411                       d.graph = coreGraph$$1(_stack[0].graph).load(entities);
87412                       return d;
87413                   });
87414               }
87415
87416               var transform = _stack[_index].transform;
87417               if (transform) {
87418                   context.map().transformEase(transform, 0);   // 0 = immediate, no easing
87419               }
87420
87421               if (loadComplete) {
87422                   dispatch$$1.call('change');
87423               }
87424
87425               return history;
87426           },
87427
87428
87429           save: function() {
87430               if (lock.locked()) context.storage(getKey('saved_history'), history.toJSON() || null);
87431               return history;
87432           },
87433
87434
87435           clearSaved: function() {
87436               context.debouncedSave.cancel();
87437               if (lock.locked()) context.storage(getKey('saved_history'), null);
87438               return history;
87439           },
87440
87441
87442           lock: function() {
87443               return lock.lock();
87444           },
87445
87446
87447           unlock: function() {
87448               lock.unlock();
87449           },
87450
87451
87452           // is iD not open in another window and it detects that
87453           // there's a history stored in localStorage that's recoverable?
87454           restorableChanges: function() {
87455               return lock.locked() && !!context.storage(getKey('saved_history'));
87456           },
87457
87458
87459           // load history from a version stored in localStorage
87460           restore: function() {
87461               if (!lock.locked()) return;
87462
87463               var json = context.storage(getKey('saved_history'));
87464               if (json) history.fromJSON(json, true);
87465           },
87466
87467
87468           _getKey: getKey
87469
87470       };
87471
87472
87473       history.reset();
87474
87475       return utilRebind(history, dispatch$$1, 'on');
87476   }
87477
87478   /** Used to store function metadata. */
87479   var metaMap = WeakMap && new WeakMap;
87480
87481   /**
87482    * The base implementation of `setData` without support for hot loop shorting.
87483    *
87484    * @private
87485    * @param {Function} func The function to associate metadata with.
87486    * @param {*} data The metadata.
87487    * @returns {Function} Returns `func`.
87488    */
87489   var baseSetData = !metaMap ? identity$8 : function(func, data) {
87490     metaMap.set(func, data);
87491     return func;
87492   };
87493
87494   /**
87495    * Creates a function that produces an instance of `Ctor` regardless of
87496    * whether it was invoked as part of a `new` expression or by `call` or `apply`.
87497    *
87498    * @private
87499    * @param {Function} Ctor The constructor to wrap.
87500    * @returns {Function} Returns the new wrapped function.
87501    */
87502   function createCtor(Ctor) {
87503     return function() {
87504       // Use a `switch` statement to work with class constructors. See
87505       // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
87506       // for more details.
87507       var args = arguments;
87508       switch (args.length) {
87509         case 0: return new Ctor;
87510         case 1: return new Ctor(args[0]);
87511         case 2: return new Ctor(args[0], args[1]);
87512         case 3: return new Ctor(args[0], args[1], args[2]);
87513         case 4: return new Ctor(args[0], args[1], args[2], args[3]);
87514         case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
87515         case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
87516         case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
87517       }
87518       var thisBinding = baseCreate(Ctor.prototype),
87519           result = Ctor.apply(thisBinding, args);
87520
87521       // Mimic the constructor's `return` behavior.
87522       // See https://es5.github.io/#x13.2.2 for more details.
87523       return isObject(result) ? result : thisBinding;
87524     };
87525   }
87526
87527   /** Used to compose bitmasks for function metadata. */
87528   var WRAP_BIND_FLAG = 1;
87529
87530   /**
87531    * Creates a function that wraps `func` to invoke it with the optional `this`
87532    * binding of `thisArg`.
87533    *
87534    * @private
87535    * @param {Function} func The function to wrap.
87536    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
87537    * @param {*} [thisArg] The `this` binding of `func`.
87538    * @returns {Function} Returns the new wrapped function.
87539    */
87540   function createBind(func, bitmask, thisArg) {
87541     var isBind = bitmask & WRAP_BIND_FLAG,
87542         Ctor = createCtor(func);
87543
87544     function wrapper() {
87545       var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
87546       return fn.apply(isBind ? thisArg : this, arguments);
87547     }
87548     return wrapper;
87549   }
87550
87551   /* Built-in method references for those with the same name as other `lodash` methods. */
87552   var nativeMax$5 = Math.max;
87553
87554   /**
87555    * Creates an array that is the composition of partially applied arguments,
87556    * placeholders, and provided arguments into a single array of arguments.
87557    *
87558    * @private
87559    * @param {Array} args The provided arguments.
87560    * @param {Array} partials The arguments to prepend to those provided.
87561    * @param {Array} holders The `partials` placeholder indexes.
87562    * @params {boolean} [isCurried] Specify composing for a curried function.
87563    * @returns {Array} Returns the new array of composed arguments.
87564    */
87565   function composeArgs(args, partials, holders, isCurried) {
87566     var argsIndex = -1,
87567         argsLength = args.length,
87568         holdersLength = holders.length,
87569         leftIndex = -1,
87570         leftLength = partials.length,
87571         rangeLength = nativeMax$5(argsLength - holdersLength, 0),
87572         result = Array(leftLength + rangeLength),
87573         isUncurried = !isCurried;
87574
87575     while (++leftIndex < leftLength) {
87576       result[leftIndex] = partials[leftIndex];
87577     }
87578     while (++argsIndex < holdersLength) {
87579       if (isUncurried || argsIndex < argsLength) {
87580         result[holders[argsIndex]] = args[argsIndex];
87581       }
87582     }
87583     while (rangeLength--) {
87584       result[leftIndex++] = args[argsIndex++];
87585     }
87586     return result;
87587   }
87588
87589   /* Built-in method references for those with the same name as other `lodash` methods. */
87590   var nativeMax$6 = Math.max;
87591
87592   /**
87593    * This function is like `composeArgs` except that the arguments composition
87594    * is tailored for `_.partialRight`.
87595    *
87596    * @private
87597    * @param {Array} args The provided arguments.
87598    * @param {Array} partials The arguments to append to those provided.
87599    * @param {Array} holders The `partials` placeholder indexes.
87600    * @params {boolean} [isCurried] Specify composing for a curried function.
87601    * @returns {Array} Returns the new array of composed arguments.
87602    */
87603   function composeArgsRight(args, partials, holders, isCurried) {
87604     var argsIndex = -1,
87605         argsLength = args.length,
87606         holdersIndex = -1,
87607         holdersLength = holders.length,
87608         rightIndex = -1,
87609         rightLength = partials.length,
87610         rangeLength = nativeMax$6(argsLength - holdersLength, 0),
87611         result = Array(rangeLength + rightLength),
87612         isUncurried = !isCurried;
87613
87614     while (++argsIndex < rangeLength) {
87615       result[argsIndex] = args[argsIndex];
87616     }
87617     var offset = argsIndex;
87618     while (++rightIndex < rightLength) {
87619       result[offset + rightIndex] = partials[rightIndex];
87620     }
87621     while (++holdersIndex < holdersLength) {
87622       if (isUncurried || argsIndex < argsLength) {
87623         result[offset + holders[holdersIndex]] = args[argsIndex++];
87624       }
87625     }
87626     return result;
87627   }
87628
87629   /**
87630    * Gets the number of `placeholder` occurrences in `array`.
87631    *
87632    * @private
87633    * @param {Array} array The array to inspect.
87634    * @param {*} placeholder The placeholder to search for.
87635    * @returns {number} Returns the placeholder count.
87636    */
87637   function countHolders(array, placeholder) {
87638     var length = array.length,
87639         result = 0;
87640
87641     while (length--) {
87642       if (array[length] === placeholder) {
87643         ++result;
87644       }
87645     }
87646     return result;
87647   }
87648
87649   /**
87650    * The function whose prototype chain sequence wrappers inherit from.
87651    *
87652    * @private
87653    */
87654   function baseLodash() {
87655     // No operation performed.
87656   }
87657
87658   /** Used as references for the maximum length and index of an array. */
87659   var MAX_ARRAY_LENGTH = 4294967295;
87660
87661   /**
87662    * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
87663    *
87664    * @private
87665    * @constructor
87666    * @param {*} value The value to wrap.
87667    */
87668   function LazyWrapper(value) {
87669     this.__wrapped__ = value;
87670     this.__actions__ = [];
87671     this.__dir__ = 1;
87672     this.__filtered__ = false;
87673     this.__iteratees__ = [];
87674     this.__takeCount__ = MAX_ARRAY_LENGTH;
87675     this.__views__ = [];
87676   }
87677
87678   // Ensure `LazyWrapper` is an instance of `baseLodash`.
87679   LazyWrapper.prototype = baseCreate(baseLodash.prototype);
87680   LazyWrapper.prototype.constructor = LazyWrapper;
87681
87682   /**
87683    * Gets metadata for `func`.
87684    *
87685    * @private
87686    * @param {Function} func The function to query.
87687    * @returns {*} Returns the metadata for `func`.
87688    */
87689   var getData = !metaMap ? noop$3 : function(func) {
87690     return metaMap.get(func);
87691   };
87692
87693   /** Used to lookup unminified function names. */
87694   var realNames = {};
87695
87696   /** Used for built-in method references. */
87697   var objectProto$k = Object.prototype;
87698
87699   /** Used to check objects for own properties. */
87700   var hasOwnProperty$h = objectProto$k.hasOwnProperty;
87701
87702   /**
87703    * Gets the name of `func`.
87704    *
87705    * @private
87706    * @param {Function} func The function to query.
87707    * @returns {string} Returns the function name.
87708    */
87709   function getFuncName(func) {
87710     var result = (func.name + ''),
87711         array = realNames[result],
87712         length = hasOwnProperty$h.call(realNames, result) ? array.length : 0;
87713
87714     while (length--) {
87715       var data = array[length],
87716           otherFunc = data.func;
87717       if (otherFunc == null || otherFunc == func) {
87718         return data.name;
87719       }
87720     }
87721     return result;
87722   }
87723
87724   /**
87725    * The base constructor for creating `lodash` wrapper objects.
87726    *
87727    * @private
87728    * @param {*} value The value to wrap.
87729    * @param {boolean} [chainAll] Enable explicit method chain sequences.
87730    */
87731   function LodashWrapper(value, chainAll) {
87732     this.__wrapped__ = value;
87733     this.__actions__ = [];
87734     this.__chain__ = !!chainAll;
87735     this.__index__ = 0;
87736     this.__values__ = undefined;
87737   }
87738
87739   LodashWrapper.prototype = baseCreate(baseLodash.prototype);
87740   LodashWrapper.prototype.constructor = LodashWrapper;
87741
87742   /**
87743    * Creates a clone of `wrapper`.
87744    *
87745    * @private
87746    * @param {Object} wrapper The wrapper to clone.
87747    * @returns {Object} Returns the cloned wrapper.
87748    */
87749   function wrapperClone(wrapper) {
87750     if (wrapper instanceof LazyWrapper) {
87751       return wrapper.clone();
87752     }
87753     var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
87754     result.__actions__ = copyArray(wrapper.__actions__);
87755     result.__index__  = wrapper.__index__;
87756     result.__values__ = wrapper.__values__;
87757     return result;
87758   }
87759
87760   /** Used for built-in method references. */
87761   var objectProto$l = Object.prototype;
87762
87763   /** Used to check objects for own properties. */
87764   var hasOwnProperty$i = objectProto$l.hasOwnProperty;
87765
87766   /**
87767    * Creates a `lodash` object which wraps `value` to enable implicit method
87768    * chain sequences. Methods that operate on and return arrays, collections,
87769    * and functions can be chained together. Methods that retrieve a single value
87770    * or may return a primitive value will automatically end the chain sequence
87771    * and return the unwrapped value. Otherwise, the value must be unwrapped
87772    * with `_#value`.
87773    *
87774    * Explicit chain sequences, which must be unwrapped with `_#value`, may be
87775    * enabled using `_.chain`.
87776    *
87777    * The execution of chained methods is lazy, that is, it's deferred until
87778    * `_#value` is implicitly or explicitly called.
87779    *
87780    * Lazy evaluation allows several methods to support shortcut fusion.
87781    * Shortcut fusion is an optimization to merge iteratee calls; this avoids
87782    * the creation of intermediate arrays and can greatly reduce the number of
87783    * iteratee executions. Sections of a chain sequence qualify for shortcut
87784    * fusion if the section is applied to an array and iteratees accept only
87785    * one argument. The heuristic for whether a section qualifies for shortcut
87786    * fusion is subject to change.
87787    *
87788    * Chaining is supported in custom builds as long as the `_#value` method is
87789    * directly or indirectly included in the build.
87790    *
87791    * In addition to lodash methods, wrappers have `Array` and `String` methods.
87792    *
87793    * The wrapper `Array` methods are:
87794    * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
87795    *
87796    * The wrapper `String` methods are:
87797    * `replace` and `split`
87798    *
87799    * The wrapper methods that support shortcut fusion are:
87800    * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
87801    * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
87802    * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
87803    *
87804    * The chainable wrapper methods are:
87805    * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
87806    * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
87807    * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
87808    * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
87809    * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
87810    * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
87811    * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
87812    * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
87813    * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
87814    * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
87815    * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
87816    * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
87817    * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
87818    * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
87819    * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
87820    * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
87821    * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
87822    * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
87823    * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
87824    * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
87825    * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
87826    * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
87827    * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
87828    * `zipObject`, `zipObjectDeep`, and `zipWith`
87829    *
87830    * The wrapper methods that are **not** chainable by default are:
87831    * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
87832    * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
87833    * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
87834    * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
87835    * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
87836    * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
87837    * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
87838    * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
87839    * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
87840    * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
87841    * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
87842    * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
87843    * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
87844    * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
87845    * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
87846    * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
87847    * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
87848    * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
87849    * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
87850    * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
87851    * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
87852    * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
87853    * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
87854    * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
87855    * `upperFirst`, `value`, and `words`
87856    *
87857    * @name _
87858    * @constructor
87859    * @category Seq
87860    * @param {*} value The value to wrap in a `lodash` instance.
87861    * @returns {Object} Returns the new `lodash` wrapper instance.
87862    * @example
87863    *
87864    * function square(n) {
87865    *   return n * n;
87866    * }
87867    *
87868    * var wrapped = _([1, 2, 3]);
87869    *
87870    * // Returns an unwrapped value.
87871    * wrapped.reduce(_.add);
87872    * // => 6
87873    *
87874    * // Returns a wrapped value.
87875    * var squares = wrapped.map(square);
87876    *
87877    * _.isArray(squares);
87878    * // => false
87879    *
87880    * _.isArray(squares.value());
87881    * // => true
87882    */
87883   function lodash(value) {
87884     if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
87885       if (value instanceof LodashWrapper) {
87886         return value;
87887       }
87888       if (hasOwnProperty$i.call(value, '__wrapped__')) {
87889         return wrapperClone(value);
87890       }
87891     }
87892     return new LodashWrapper(value);
87893   }
87894
87895   // Ensure wrappers are instances of `baseLodash`.
87896   lodash.prototype = baseLodash.prototype;
87897   lodash.prototype.constructor = lodash;
87898
87899   /**
87900    * Checks if `func` has a lazy counterpart.
87901    *
87902    * @private
87903    * @param {Function} func The function to check.
87904    * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
87905    *  else `false`.
87906    */
87907   function isLaziable(func) {
87908     var funcName = getFuncName(func),
87909         other = lodash[funcName];
87910
87911     if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
87912       return false;
87913     }
87914     if (func === other) {
87915       return true;
87916     }
87917     var data = getData(other);
87918     return !!data && func === data[0];
87919   }
87920
87921   /**
87922    * Sets metadata for `func`.
87923    *
87924    * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
87925    * period of time, it will trip its breaker and transition to an identity
87926    * function to avoid garbage collection pauses in V8. See
87927    * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
87928    * for more details.
87929    *
87930    * @private
87931    * @param {Function} func The function to associate metadata with.
87932    * @param {*} data The metadata.
87933    * @returns {Function} Returns `func`.
87934    */
87935   var setData = shortOut(baseSetData);
87936
87937   /** Used to match wrap detail comments. */
87938   var reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
87939       reSplitDetails = /,? & /;
87940
87941   /**
87942    * Extracts wrapper details from the `source` body comment.
87943    *
87944    * @private
87945    * @param {string} source The source to inspect.
87946    * @returns {Array} Returns the wrapper details.
87947    */
87948   function getWrapDetails(source) {
87949     var match = source.match(reWrapDetails);
87950     return match ? match[1].split(reSplitDetails) : [];
87951   }
87952
87953   /** Used to match wrap detail comments. */
87954   var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;
87955
87956   /**
87957    * Inserts wrapper `details` in a comment at the top of the `source` body.
87958    *
87959    * @private
87960    * @param {string} source The source to modify.
87961    * @returns {Array} details The details to insert.
87962    * @returns {string} Returns the modified source.
87963    */
87964   function insertWrapDetails(source, details) {
87965     var length = details.length;
87966     if (!length) {
87967       return source;
87968     }
87969     var lastIndex = length - 1;
87970     details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
87971     details = details.join(length > 2 ? ', ' : ' ');
87972     return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
87973   }
87974
87975   /** Used to compose bitmasks for function metadata. */
87976   var WRAP_BIND_FLAG$1 = 1,
87977       WRAP_BIND_KEY_FLAG = 2,
87978       WRAP_CURRY_FLAG = 8,
87979       WRAP_CURRY_RIGHT_FLAG = 16,
87980       WRAP_PARTIAL_FLAG = 32,
87981       WRAP_PARTIAL_RIGHT_FLAG = 64,
87982       WRAP_ARY_FLAG = 128,
87983       WRAP_REARG_FLAG = 256,
87984       WRAP_FLIP_FLAG = 512;
87985
87986   /** Used to associate wrap methods with their bit flags. */
87987   var wrapFlags = [
87988     ['ary', WRAP_ARY_FLAG],
87989     ['bind', WRAP_BIND_FLAG$1],
87990     ['bindKey', WRAP_BIND_KEY_FLAG],
87991     ['curry', WRAP_CURRY_FLAG],
87992     ['curryRight', WRAP_CURRY_RIGHT_FLAG],
87993     ['flip', WRAP_FLIP_FLAG],
87994     ['partial', WRAP_PARTIAL_FLAG],
87995     ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
87996     ['rearg', WRAP_REARG_FLAG]
87997   ];
87998
87999   /**
88000    * Updates wrapper `details` based on `bitmask` flags.
88001    *
88002    * @private
88003    * @returns {Array} details The details to modify.
88004    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
88005    * @returns {Array} Returns `details`.
88006    */
88007   function updateWrapDetails(details, bitmask) {
88008     arrayEach(wrapFlags, function(pair) {
88009       var value = '_.' + pair[0];
88010       if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
88011         details.push(value);
88012       }
88013     });
88014     return details.sort();
88015   }
88016
88017   /**
88018    * Sets the `toString` method of `wrapper` to mimic the source of `reference`
88019    * with wrapper details in a comment at the top of the source body.
88020    *
88021    * @private
88022    * @param {Function} wrapper The function to modify.
88023    * @param {Function} reference The reference function.
88024    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
88025    * @returns {Function} Returns `wrapper`.
88026    */
88027   function setWrapToString(wrapper, reference, bitmask) {
88028     var source = (reference + '');
88029     return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
88030   }
88031
88032   /** Used to compose bitmasks for function metadata. */
88033   var WRAP_BIND_FLAG$2 = 1,
88034       WRAP_BIND_KEY_FLAG$1 = 2,
88035       WRAP_CURRY_BOUND_FLAG = 4,
88036       WRAP_CURRY_FLAG$1 = 8,
88037       WRAP_PARTIAL_FLAG$1 = 32,
88038       WRAP_PARTIAL_RIGHT_FLAG$1 = 64;
88039
88040   /**
88041    * Creates a function that wraps `func` to continue currying.
88042    *
88043    * @private
88044    * @param {Function} func The function to wrap.
88045    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
88046    * @param {Function} wrapFunc The function to create the `func` wrapper.
88047    * @param {*} placeholder The placeholder value.
88048    * @param {*} [thisArg] The `this` binding of `func`.
88049    * @param {Array} [partials] The arguments to prepend to those provided to
88050    *  the new function.
88051    * @param {Array} [holders] The `partials` placeholder indexes.
88052    * @param {Array} [argPos] The argument positions of the new function.
88053    * @param {number} [ary] The arity cap of `func`.
88054    * @param {number} [arity] The arity of `func`.
88055    * @returns {Function} Returns the new wrapped function.
88056    */
88057   function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
88058     var isCurry = bitmask & WRAP_CURRY_FLAG$1,
88059         newHolders = isCurry ? holders : undefined,
88060         newHoldersRight = isCurry ? undefined : holders,
88061         newPartials = isCurry ? partials : undefined,
88062         newPartialsRight = isCurry ? undefined : partials;
88063
88064     bitmask |= (isCurry ? WRAP_PARTIAL_FLAG$1 : WRAP_PARTIAL_RIGHT_FLAG$1);
88065     bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG$1 : WRAP_PARTIAL_FLAG$1);
88066
88067     if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
88068       bitmask &= ~(WRAP_BIND_FLAG$2 | WRAP_BIND_KEY_FLAG$1);
88069     }
88070     var newData = [
88071       func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
88072       newHoldersRight, argPos, ary, arity
88073     ];
88074
88075     var result = wrapFunc.apply(undefined, newData);
88076     if (isLaziable(func)) {
88077       setData(result, newData);
88078     }
88079     result.placeholder = placeholder;
88080     return setWrapToString(result, func, bitmask);
88081   }
88082
88083   /**
88084    * Gets the argument placeholder value for `func`.
88085    *
88086    * @private
88087    * @param {Function} func The function to inspect.
88088    * @returns {*} Returns the placeholder value.
88089    */
88090   function getHolder(func) {
88091     var object = func;
88092     return object.placeholder;
88093   }
88094
88095   /* Built-in method references for those with the same name as other `lodash` methods. */
88096   var nativeMin$2 = Math.min;
88097
88098   /**
88099    * Reorder `array` according to the specified indexes where the element at
88100    * the first index is assigned as the first element, the element at
88101    * the second index is assigned as the second element, and so on.
88102    *
88103    * @private
88104    * @param {Array} array The array to reorder.
88105    * @param {Array} indexes The arranged array indexes.
88106    * @returns {Array} Returns `array`.
88107    */
88108   function reorder(array, indexes) {
88109     var arrLength = array.length,
88110         length = nativeMin$2(indexes.length, arrLength),
88111         oldArray = copyArray(array);
88112
88113     while (length--) {
88114       var index = indexes[length];
88115       array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
88116     }
88117     return array;
88118   }
88119
88120   /** Used as the internal argument placeholder. */
88121   var PLACEHOLDER = '__lodash_placeholder__';
88122
88123   /**
88124    * Replaces all `placeholder` elements in `array` with an internal placeholder
88125    * and returns an array of their indexes.
88126    *
88127    * @private
88128    * @param {Array} array The array to modify.
88129    * @param {*} placeholder The placeholder to replace.
88130    * @returns {Array} Returns the new array of placeholder indexes.
88131    */
88132   function replaceHolders(array, placeholder) {
88133     var index = -1,
88134         length = array.length,
88135         resIndex = 0,
88136         result = [];
88137
88138     while (++index < length) {
88139       var value = array[index];
88140       if (value === placeholder || value === PLACEHOLDER) {
88141         array[index] = PLACEHOLDER;
88142         result[resIndex++] = index;
88143       }
88144     }
88145     return result;
88146   }
88147
88148   /** Used to compose bitmasks for function metadata. */
88149   var WRAP_BIND_FLAG$3 = 1,
88150       WRAP_BIND_KEY_FLAG$2 = 2,
88151       WRAP_CURRY_FLAG$2 = 8,
88152       WRAP_CURRY_RIGHT_FLAG$1 = 16,
88153       WRAP_ARY_FLAG$1 = 128,
88154       WRAP_FLIP_FLAG$1 = 512;
88155
88156   /**
88157    * Creates a function that wraps `func` to invoke it with optional `this`
88158    * binding of `thisArg`, partial application, and currying.
88159    *
88160    * @private
88161    * @param {Function|string} func The function or method name to wrap.
88162    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
88163    * @param {*} [thisArg] The `this` binding of `func`.
88164    * @param {Array} [partials] The arguments to prepend to those provided to
88165    *  the new function.
88166    * @param {Array} [holders] The `partials` placeholder indexes.
88167    * @param {Array} [partialsRight] The arguments to append to those provided
88168    *  to the new function.
88169    * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
88170    * @param {Array} [argPos] The argument positions of the new function.
88171    * @param {number} [ary] The arity cap of `func`.
88172    * @param {number} [arity] The arity of `func`.
88173    * @returns {Function} Returns the new wrapped function.
88174    */
88175   function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
88176     var isAry = bitmask & WRAP_ARY_FLAG$1,
88177         isBind = bitmask & WRAP_BIND_FLAG$3,
88178         isBindKey = bitmask & WRAP_BIND_KEY_FLAG$2,
88179         isCurried = bitmask & (WRAP_CURRY_FLAG$2 | WRAP_CURRY_RIGHT_FLAG$1),
88180         isFlip = bitmask & WRAP_FLIP_FLAG$1,
88181         Ctor = isBindKey ? undefined : createCtor(func);
88182
88183     function wrapper() {
88184       var length = arguments.length,
88185           args = Array(length),
88186           index = length;
88187
88188       while (index--) {
88189         args[index] = arguments[index];
88190       }
88191       if (isCurried) {
88192         var placeholder = getHolder(wrapper),
88193             holdersCount = countHolders(args, placeholder);
88194       }
88195       if (partials) {
88196         args = composeArgs(args, partials, holders, isCurried);
88197       }
88198       if (partialsRight) {
88199         args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
88200       }
88201       length -= holdersCount;
88202       if (isCurried && length < arity) {
88203         var newHolders = replaceHolders(args, placeholder);
88204         return createRecurry(
88205           func, bitmask, createHybrid, wrapper.placeholder, thisArg,
88206           args, newHolders, argPos, ary, arity - length
88207         );
88208       }
88209       var thisBinding = isBind ? thisArg : this,
88210           fn = isBindKey ? thisBinding[func] : func;
88211
88212       length = args.length;
88213       if (argPos) {
88214         args = reorder(args, argPos);
88215       } else if (isFlip && length > 1) {
88216         args.reverse();
88217       }
88218       if (isAry && ary < length) {
88219         args.length = ary;
88220       }
88221       if (this && this !== root$2 && this instanceof wrapper) {
88222         fn = Ctor || createCtor(fn);
88223       }
88224       return fn.apply(thisBinding, args);
88225     }
88226     return wrapper;
88227   }
88228
88229   /**
88230    * Creates a function that wraps `func` to enable currying.
88231    *
88232    * @private
88233    * @param {Function} func The function to wrap.
88234    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
88235    * @param {number} arity The arity of `func`.
88236    * @returns {Function} Returns the new wrapped function.
88237    */
88238   function createCurry(func, bitmask, arity) {
88239     var Ctor = createCtor(func);
88240
88241     function wrapper() {
88242       var length = arguments.length,
88243           args = Array(length),
88244           index = length,
88245           placeholder = getHolder(wrapper);
88246
88247       while (index--) {
88248         args[index] = arguments[index];
88249       }
88250       var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
88251         ? []
88252         : replaceHolders(args, placeholder);
88253
88254       length -= holders.length;
88255       if (length < arity) {
88256         return createRecurry(
88257           func, bitmask, createHybrid, wrapper.placeholder, undefined,
88258           args, holders, undefined, undefined, arity - length);
88259       }
88260       var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
88261       return apply(fn, this, args);
88262     }
88263     return wrapper;
88264   }
88265
88266   /** Used to compose bitmasks for function metadata. */
88267   var WRAP_BIND_FLAG$4 = 1;
88268
88269   /**
88270    * Creates a function that wraps `func` to invoke it with the `this` binding
88271    * of `thisArg` and `partials` prepended to the arguments it receives.
88272    *
88273    * @private
88274    * @param {Function} func The function to wrap.
88275    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
88276    * @param {*} thisArg The `this` binding of `func`.
88277    * @param {Array} partials The arguments to prepend to those provided to
88278    *  the new function.
88279    * @returns {Function} Returns the new wrapped function.
88280    */
88281   function createPartial(func, bitmask, thisArg, partials) {
88282     var isBind = bitmask & WRAP_BIND_FLAG$4,
88283         Ctor = createCtor(func);
88284
88285     function wrapper() {
88286       var argsIndex = -1,
88287           argsLength = arguments.length,
88288           leftIndex = -1,
88289           leftLength = partials.length,
88290           args = Array(leftLength + argsLength),
88291           fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
88292
88293       while (++leftIndex < leftLength) {
88294         args[leftIndex] = partials[leftIndex];
88295       }
88296       while (argsLength--) {
88297         args[leftIndex++] = arguments[++argsIndex];
88298       }
88299       return apply(fn, isBind ? thisArg : this, args);
88300     }
88301     return wrapper;
88302   }
88303
88304   /** Used as the internal argument placeholder. */
88305   var PLACEHOLDER$1 = '__lodash_placeholder__';
88306
88307   /** Used to compose bitmasks for function metadata. */
88308   var WRAP_BIND_FLAG$5 = 1,
88309       WRAP_BIND_KEY_FLAG$3 = 2,
88310       WRAP_CURRY_BOUND_FLAG$1 = 4,
88311       WRAP_CURRY_FLAG$3 = 8,
88312       WRAP_ARY_FLAG$2 = 128,
88313       WRAP_REARG_FLAG$1 = 256;
88314
88315   /* Built-in method references for those with the same name as other `lodash` methods. */
88316   var nativeMin$3 = Math.min;
88317
88318   /**
88319    * Merges the function metadata of `source` into `data`.
88320    *
88321    * Merging metadata reduces the number of wrappers used to invoke a function.
88322    * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
88323    * may be applied regardless of execution order. Methods like `_.ary` and
88324    * `_.rearg` modify function arguments, making the order in which they are
88325    * executed important, preventing the merging of metadata. However, we make
88326    * an exception for a safe combined case where curried functions have `_.ary`
88327    * and or `_.rearg` applied.
88328    *
88329    * @private
88330    * @param {Array} data The destination metadata.
88331    * @param {Array} source The source metadata.
88332    * @returns {Array} Returns `data`.
88333    */
88334   function mergeData(data, source) {
88335     var bitmask = data[1],
88336         srcBitmask = source[1],
88337         newBitmask = bitmask | srcBitmask,
88338         isCommon = newBitmask < (WRAP_BIND_FLAG$5 | WRAP_BIND_KEY_FLAG$3 | WRAP_ARY_FLAG$2);
88339
88340     var isCombo =
88341       ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_CURRY_FLAG$3)) ||
88342       ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_REARG_FLAG$1) && (data[7].length <= source[8])) ||
88343       ((srcBitmask == (WRAP_ARY_FLAG$2 | WRAP_REARG_FLAG$1)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG$3));
88344
88345     // Exit early if metadata can't be merged.
88346     if (!(isCommon || isCombo)) {
88347       return data;
88348     }
88349     // Use source `thisArg` if available.
88350     if (srcBitmask & WRAP_BIND_FLAG$5) {
88351       data[2] = source[2];
88352       // Set when currying a bound function.
88353       newBitmask |= bitmask & WRAP_BIND_FLAG$5 ? 0 : WRAP_CURRY_BOUND_FLAG$1;
88354     }
88355     // Compose partial arguments.
88356     var value = source[3];
88357     if (value) {
88358       var partials = data[3];
88359       data[3] = partials ? composeArgs(partials, value, source[4]) : value;
88360       data[4] = partials ? replaceHolders(data[3], PLACEHOLDER$1) : source[4];
88361     }
88362     // Compose partial right arguments.
88363     value = source[5];
88364     if (value) {
88365       partials = data[5];
88366       data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
88367       data[6] = partials ? replaceHolders(data[5], PLACEHOLDER$1) : source[6];
88368     }
88369     // Use source `argPos` if available.
88370     value = source[7];
88371     if (value) {
88372       data[7] = value;
88373     }
88374     // Use source `ary` if it's smaller.
88375     if (srcBitmask & WRAP_ARY_FLAG$2) {
88376       data[8] = data[8] == null ? source[8] : nativeMin$3(data[8], source[8]);
88377     }
88378     // Use source `arity` if one is not provided.
88379     if (data[9] == null) {
88380       data[9] = source[9];
88381     }
88382     // Use source `func` and merge bitmasks.
88383     data[0] = source[0];
88384     data[1] = newBitmask;
88385
88386     return data;
88387   }
88388
88389   /** Error message constants. */
88390   var FUNC_ERROR_TEXT$4 = 'Expected a function';
88391
88392   /** Used to compose bitmasks for function metadata. */
88393   var WRAP_BIND_FLAG$6 = 1,
88394       WRAP_BIND_KEY_FLAG$4 = 2,
88395       WRAP_CURRY_FLAG$4 = 8,
88396       WRAP_CURRY_RIGHT_FLAG$2 = 16,
88397       WRAP_PARTIAL_FLAG$2 = 32,
88398       WRAP_PARTIAL_RIGHT_FLAG$2 = 64;
88399
88400   /* Built-in method references for those with the same name as other `lodash` methods. */
88401   var nativeMax$7 = Math.max;
88402
88403   /**
88404    * Creates a function that either curries or invokes `func` with optional
88405    * `this` binding and partially applied arguments.
88406    *
88407    * @private
88408    * @param {Function|string} func The function or method name to wrap.
88409    * @param {number} bitmask The bitmask flags.
88410    *    1 - `_.bind`
88411    *    2 - `_.bindKey`
88412    *    4 - `_.curry` or `_.curryRight` of a bound function
88413    *    8 - `_.curry`
88414    *   16 - `_.curryRight`
88415    *   32 - `_.partial`
88416    *   64 - `_.partialRight`
88417    *  128 - `_.rearg`
88418    *  256 - `_.ary`
88419    *  512 - `_.flip`
88420    * @param {*} [thisArg] The `this` binding of `func`.
88421    * @param {Array} [partials] The arguments to be partially applied.
88422    * @param {Array} [holders] The `partials` placeholder indexes.
88423    * @param {Array} [argPos] The argument positions of the new function.
88424    * @param {number} [ary] The arity cap of `func`.
88425    * @param {number} [arity] The arity of `func`.
88426    * @returns {Function} Returns the new wrapped function.
88427    */
88428   function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
88429     var isBindKey = bitmask & WRAP_BIND_KEY_FLAG$4;
88430     if (!isBindKey && typeof func != 'function') {
88431       throw new TypeError(FUNC_ERROR_TEXT$4);
88432     }
88433     var length = partials ? partials.length : 0;
88434     if (!length) {
88435       bitmask &= ~(WRAP_PARTIAL_FLAG$2 | WRAP_PARTIAL_RIGHT_FLAG$2);
88436       partials = holders = undefined;
88437     }
88438     ary = ary === undefined ? ary : nativeMax$7(toInteger(ary), 0);
88439     arity = arity === undefined ? arity : toInteger(arity);
88440     length -= holders ? holders.length : 0;
88441
88442     if (bitmask & WRAP_PARTIAL_RIGHT_FLAG$2) {
88443       var partialsRight = partials,
88444           holdersRight = holders;
88445
88446       partials = holders = undefined;
88447     }
88448     var data = isBindKey ? undefined : getData(func);
88449
88450     var newData = [
88451       func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
88452       argPos, ary, arity
88453     ];
88454
88455     if (data) {
88456       mergeData(newData, data);
88457     }
88458     func = newData[0];
88459     bitmask = newData[1];
88460     thisArg = newData[2];
88461     partials = newData[3];
88462     holders = newData[4];
88463     arity = newData[9] = newData[9] === undefined
88464       ? (isBindKey ? 0 : func.length)
88465       : nativeMax$7(newData[9] - length, 0);
88466
88467     if (!arity && bitmask & (WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2)) {
88468       bitmask &= ~(WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2);
88469     }
88470     if (!bitmask || bitmask == WRAP_BIND_FLAG$6) {
88471       var result = createBind(func, bitmask, thisArg);
88472     } else if (bitmask == WRAP_CURRY_FLAG$4 || bitmask == WRAP_CURRY_RIGHT_FLAG$2) {
88473       result = createCurry(func, bitmask, arity);
88474     } else if ((bitmask == WRAP_PARTIAL_FLAG$2 || bitmask == (WRAP_BIND_FLAG$6 | WRAP_PARTIAL_FLAG$2)) && !holders.length) {
88475       result = createPartial(func, bitmask, thisArg, partials);
88476     } else {
88477       result = createHybrid.apply(undefined, newData);
88478     }
88479     var setter = data ? baseSetData : setData;
88480     return setWrapToString(setter(result, newData), func, bitmask);
88481   }
88482
88483   /** Used to compose bitmasks for function metadata. */
88484   var WRAP_BIND_FLAG$7 = 1,
88485       WRAP_PARTIAL_FLAG$3 = 32;
88486
88487   /**
88488    * Creates a function that invokes `func` with the `this` binding of `thisArg`
88489    * and `partials` prepended to the arguments it receives.
88490    *
88491    * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
88492    * may be used as a placeholder for partially applied arguments.
88493    *
88494    * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
88495    * property of bound functions.
88496    *
88497    * @static
88498    * @memberOf _
88499    * @since 0.1.0
88500    * @category Function
88501    * @param {Function} func The function to bind.
88502    * @param {*} thisArg The `this` binding of `func`.
88503    * @param {...*} [partials] The arguments to be partially applied.
88504    * @returns {Function} Returns the new bound function.
88505    * @example
88506    *
88507    * function greet(greeting, punctuation) {
88508    *   return greeting + ' ' + this.user + punctuation;
88509    * }
88510    *
88511    * var object = { 'user': 'fred' };
88512    *
88513    * var bound = _.bind(greet, object, 'hi');
88514    * bound('!');
88515    * // => 'hi fred!'
88516    *
88517    * // Bound with placeholders.
88518    * var bound = _.bind(greet, object, _, '!');
88519    * bound('hi');
88520    * // => 'hi fred!'
88521    */
88522   var bind$2 = baseRest(function(func, thisArg, partials) {
88523     var bitmask = WRAP_BIND_FLAG$7;
88524     if (partials.length) {
88525       var holders = replaceHolders(partials, getHolder(bind$2));
88526       bitmask |= WRAP_PARTIAL_FLAG$3;
88527     }
88528     return createWrap(func, bitmask, thisArg, partials, holders);
88529   });
88530
88531   // Assign default placeholders.
88532   bind$2.placeholder = {};
88533
88534   function presetCollection(collection) {
88535       var maxSearchResults = 50;
88536       var maxSuggestionResults = 10;
88537
88538       var presets = {
88539
88540           collection: collection,
88541
88542
88543           item: function(id) {
88544               return find$1(this.collection, function(d) {
88545                   return d.id === id;
88546               });
88547           },
88548
88549           index: function(id) {
88550               return findIndex(this.collection, function(d) {
88551                   return d.id === id;
88552               });
88553           },
88554
88555           matchGeometry: function(geometry) {
88556               return presetCollection(this.collection.filter(function(d) {
88557                   return d.matchGeometry(geometry);
88558               }));
88559           },
88560
88561
88562           search: function(value, geometry) {
88563               if (!value) return this;
88564
88565               function leading(a) {
88566                   var index = a.indexOf(value);
88567                   return index === 0 || a[index - 1] === ' ';
88568               }
88569
88570               function suggestionName(name) {
88571                   var nameArray = name.split(' - ');
88572                   if (nameArray.length > 1) {
88573                       name = nameArray.slice(0, nameArray.length - 1).join(' - ');
88574                   }
88575                   return name.toLowerCase();
88576               }
88577
88578
88579               value = value.toLowerCase();
88580
88581               var searchable = filter(this.collection, function(a) {
88582                   return a.searchable !== false && a.suggestion !== true;
88583               });
88584               var suggestions = filter(this.collection, function(a) {
88585                   return a.suggestion === true;
88586               });
88587
88588
88589               // matches value to preset.name
88590               var leading_name = filter(searchable, function(a) {
88591                       return leading(a.name().toLowerCase());
88592                   }).sort(function(a, b) {
88593                       var aCompare = a.name().toLowerCase();
88594                       var bCompare = b.name().toLowerCase();
88595                       var i;
88596
88597                       // priority if search string matches preset name exactly - #4325
88598                       if (value === aCompare) return -1;
88599                       if (value === bCompare) return 1;
88600
88601                       // priority for higher matchScore
88602                       i = b.originalScore - a.originalScore;
88603                       if (i !== 0) return i;
88604
88605                       // priority if search string appears earlier in preset name
88606                       i = aCompare.indexOf(value) - bCompare.indexOf(value);
88607                       if (i !== 0) return i;
88608
88609                       // priority for shorter preset names
88610                       return a.name().length - b.name().length;
88611                   });
88612
88613               // matches value to preset.terms values
88614               var leading_terms = filter(searchable, function(a) {
88615                   return some(a.terms() || [], leading);
88616               });
88617
88618               // matches value to preset.tags values
88619               var leading_tag_values = filter(searchable, function(a) {
88620                   return some(without(values$1(a.tags || {}), '*'), leading);
88621               });
88622
88623
88624               // finds close matches to value in preset.name
88625               var similar_name = searchable
88626                   .map(function(a) {
88627                       return { preset: a, dist: utilEditDistance(value, a.name()) };
88628                   }).filter(function(a) {
88629                       return a.dist + Math.min(value.length - a.preset.name().length, 0) < 3;
88630                   }).sort(function(a, b) {
88631                       return a.dist - b.dist;
88632                   }).map(function(a) {
88633                       return a.preset;
88634                   });
88635
88636               // finds close matches to value in preset.terms
88637               var similar_terms = filter(searchable, function(a) {
88638                       return some(a.terms() || [], function(b) {
88639                           return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
88640                       });
88641                   });
88642
88643               var leading_suggestions = filter(suggestions, function(a) {
88644                       return leading(suggestionName(a.name()));
88645                   }).sort(function(a, b) {
88646                       a = suggestionName(a.name());
88647                       b = suggestionName(b.name());
88648                       var i = a.indexOf(value) - b.indexOf(value);
88649                       if (i === 0) return a.length - b.length;
88650                       else return i;
88651                   });
88652
88653               var similar_suggestions = suggestions.map(function(a) {
88654                       return { preset: a, dist: utilEditDistance(value, suggestionName(a.name())) };
88655                   }).filter(function(a) {
88656                       return a.dist + Math.min(value.length - suggestionName(a.preset.name()).length, 0) < 1;
88657                   }).sort(function(a, b) {
88658                       return a.dist - b.dist;
88659                   }).map(function(a) {
88660                       return a.preset;
88661                   });
88662
88663               var other = presets.item(geometry);
88664
88665               var results = leading_name.concat(
88666                   leading_terms,
88667                   leading_tag_values,
88668                   leading_suggestions.slice(0, maxSuggestionResults + 5),
88669                   similar_name,
88670                   similar_terms,
88671                   similar_suggestions.slice(0, maxSuggestionResults)
88672               ).slice(0, maxSearchResults - 1);
88673
88674               return presetCollection(uniq(results.concat(other)));
88675           }
88676       };
88677
88678
88679       return presets;
88680   }
88681
88682   function presetCategory(id, category, all) {
88683       category = clone(category);
88684
88685       category.id = id;
88686
88687
88688       category.members = presetCollection(category.members.map(function(id) {
88689           return all.item(id);
88690       }));
88691
88692
88693       category.matchGeometry = function(geometry) {
88694           return category.geometry.indexOf(geometry) >= 0;
88695       };
88696
88697
88698       category.matchScore = function() {
88699           return -1;
88700       };
88701
88702
88703       category.name = function() {
88704           return t('presets.categories.' + id + '.name', {'default': id});
88705       };
88706
88707
88708       category.terms = function() {
88709           return [];
88710       };
88711
88712
88713       return category;
88714   }
88715
88716   function presetField(id, field) {
88717       field = clone(field);
88718
88719       field.id = id;
88720
88721       // for use in classes, element ids, css selectors
88722       field.safeid = id.replace(/[^_a-zA-Z0-9\-]/g, '_');
88723
88724       field.matchGeometry = function(geometry) {
88725           return !field.geometry || field.geometry === geometry;
88726       };
88727
88728
88729       field.t = function(scope, options) {
88730           return t('presets.fields.' + id + '.' + scope, options);
88731       };
88732
88733
88734       field.label = function() {
88735           return field.overrideLabel || field.t('label', {'default': id});
88736       };
88737
88738
88739       var placeholder = field.placeholder;
88740       field.placeholder = function() {
88741           return field.t('placeholder', {'default': placeholder});
88742       };
88743
88744
88745       return field;
88746   }
88747
88748   function presetPreset(id, preset, fields, visible, rawPresets) {
88749       preset = clone(preset);
88750
88751       preset.id = id;
88752
88753       preset.parentPresetID = function() {
88754           var endIndex = preset.id.lastIndexOf('/');
88755           if (endIndex < 0) return null;
88756
88757           return preset.id.substring(0, endIndex);
88758       };
88759
88760
88761       // For a preset without fields, use the fields of the parent preset.
88762       // Replace {preset} placeholders with the fields of the specified presets.
88763       function resolveFieldInheritance() {
88764
88765           // Skip `fields` for the keys which define the preset.
88766           // These are usually `typeCombo` fields like `shop=*`
88767           function withoutKeyFields(fieldID) {
88768               var f = fields[fieldID];
88769               if (f.key) {
88770                   return preset.tags[f.key] === undefined;
88771               }
88772               return true;
88773           }
88774
88775           // returns an array of field IDs to inherit from the given presetID, if found
88776           function inheritedFieldIDs(presetID, prop) {
88777               if (!presetID) return null;
88778
88779               var inheritPreset = rawPresets[presetID];
88780               if (!inheritPreset) return null;
88781
88782               var inheritFieldIDs = inheritPreset[prop] || [];
88783
88784               if (prop === 'fields') {
88785                   inheritFieldIDs = inheritFieldIDs.filter(withoutKeyFields);
88786               }
88787
88788               return inheritFieldIDs;
88789           }
88790
88791
88792           ['fields', 'moreFields'].forEach(function(prop) {
88793               var fieldIDs = [];
88794               if (preset[prop] && preset[prop].length) {    // fields were defined
88795                   preset[prop].forEach(function(fieldID) {
88796                       var match = fieldID.match(/\{(.*)\}/);
88797                       if (match !== null) {        // presetID wrapped in braces {}
88798                           var inheritIDs = inheritedFieldIDs(match[1], prop);
88799                           if (inheritIDs !== null) {
88800                               fieldIDs = fieldIDs.concat(inheritIDs);
88801                           } else {
88802                               /* eslint-disable no-console */
88803                               console.log('Cannot resolve presetID ' + match[0] +
88804                                   ' found in ' + preset.id + ' ' + prop);
88805                               /* eslint-enable no-console */
88806                           }
88807                       } else {
88808                           fieldIDs.push(fieldID);  // no braces - just a normal field
88809                       }
88810                   });
88811
88812               } else {  // no fields defined, so use the parent's if possible
88813                   fieldIDs = inheritedFieldIDs(preset.parentPresetID(), prop);
88814               }
88815               // resolve duplicate fields
88816               fieldIDs = uniq(fieldIDs);
88817
88818               // update this preset with the results
88819               preset[prop] = fieldIDs;
88820
88821               // update the raw object to allow for multiple levels of inheritance
88822               rawPresets[preset.id][prop] = fieldIDs;
88823           });
88824       }
88825
88826       if (rawPresets) {
88827           resolveFieldInheritance();
88828       }
88829
88830       preset.fields = (preset.fields || []).map(getFields);
88831       preset.moreFields = (preset.moreFields || []).map(getFields);
88832       preset.geometry = (preset.geometry || []);
88833
88834       visible = visible || false;
88835
88836       function getFields(f) {
88837           return fields[f];
88838       }
88839
88840
88841       preset.matchGeometry = function(geometry) {
88842           return preset.geometry.indexOf(geometry) >= 0;
88843       };
88844
88845
88846       preset.originalScore = preset.matchScore || 1;
88847
88848
88849       preset.matchScore = function(entity) {
88850           var tags = preset.tags;
88851           var score = 0;
88852
88853           for (var t$$1 in tags) {
88854               if (entity.tags[t$$1] === tags[t$$1]) {
88855                   score += preset.originalScore;
88856               } else if (tags[t$$1] === '*' && t$$1 in entity.tags) {
88857                   score += preset.originalScore / 2;
88858               } else {
88859                   return -1;
88860               }
88861           }
88862
88863           return score;
88864       };
88865
88866
88867       preset.t = function(scope, options) {
88868           return t('presets.presets.' + id + '.' + scope, options);
88869       };
88870
88871
88872       var origName = preset.name || '';
88873       preset.name = function() {
88874           if (preset.suggestion) {
88875               var path = id.split('/');
88876               path.pop();  // remove brand name
88877               // NOTE: insert an en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
88878               return origName + ' – ' + t('presets.presets.' + path.join('/') + '.name');
88879           }
88880           return preset.t('name', { 'default': origName });
88881       };
88882
88883       var origTerms = (preset.terms || []).join();
88884       preset.terms = function() {
88885           return preset.t('terms', { 'default': origTerms }).toLowerCase().trim().split(/\s*,+\s*/);
88886       };
88887
88888
88889       preset.isFallback = function() {
88890           var tagCount = Object.keys(preset.tags).length;
88891           return tagCount === 0 || (tagCount === 1 && preset.tags.hasOwnProperty('area'));
88892       };
88893
88894       preset.visible = function(val) {
88895           if (!arguments.length) return visible;
88896           visible = val;
88897           return visible;
88898       };
88899
88900
88901       var reference = preset.reference || {};
88902       preset.reference = function(geometry) {
88903           var key = reference.key || Object.keys(omit(preset.tags, 'name'))[0],
88904               value = reference.value || preset.tags[key];
88905
88906           if (geometry === 'relation' && key === 'type') {
88907               if (value in preset.tags) {
88908                   key = value;
88909                   value = preset.tags[key];
88910               } else {
88911                   return { rtype: value };
88912               }
88913           }
88914
88915           if (value === '*') {
88916               return { key: key };
88917           } else {
88918               return { key: key, value: value };
88919           }
88920       };
88921
88922
88923       preset.removeTags = preset.removeTags || preset.tags || {};
88924       preset.unsetTags = function(tags, geometry) {
88925           tags = omit(tags, Object.keys(preset.removeTags));
88926
88927           for (var f in preset.fields) {
88928               var field = preset.fields[f];
88929               if (field.matchGeometry(geometry) && field.default === tags[field.key]) {
88930                   delete tags[field.key];
88931               }
88932           }
88933
88934           delete tags.area;
88935           return tags;
88936       };
88937
88938
88939       preset.addTags = preset.addTags || preset.tags || {};
88940       preset.setTags = function(tags, geometry) {
88941           var addTags = preset.addTags;
88942           var k;
88943
88944           tags = clone(tags);
88945
88946           for (k in addTags) {
88947               if (addTags[k] === '*') {
88948                   tags[k] = 'yes';
88949               } else {
88950                   tags[k] = addTags[k];
88951               }
88952           }
88953
88954           // Add area=yes if necessary.
88955           // This is necessary if the geometry is already an area (e.g. user drew an area) AND any of:
88956           // 1. chosen preset could be either an area or a line (`barrier=city_wall`)
88957           // 2. chosen preset doesn't have a key in areaKeys (`railway=station`)
88958           if (!addTags.hasOwnProperty('area')) {
88959               delete tags.area;
88960               if (geometry === 'area') {
88961                   var needsAreaTag = true;
88962                   if (preset.geometry.indexOf('line') === -1) {
88963                       for (k in addTags) {
88964                           if (k in areaKeys) {
88965                               needsAreaTag = false;
88966                               break;
88967                           }
88968                       }
88969                   }
88970                   if (needsAreaTag) {
88971                       tags.area = 'yes';
88972                   }
88973               }
88974           }
88975
88976           for (var f in preset.fields) {
88977               var field = preset.fields[f];
88978               if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) {
88979                   tags[field.key] = field.default;
88980               }
88981           }
88982
88983           return tags;
88984       };
88985
88986
88987       return preset;
88988   }
88989
88990   function presetIndex() {
88991       // a presetCollection with methods for
88992       // loading new data and returning defaults
88993
88994       var all = presetCollection([]);
88995       var _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
88996       var _fields = {};
88997       var _universal = [];
88998       var _recent = presetCollection([]);
88999
89000       // Index of presets by (geometry, tag key).
89001       var _index = {
89002           point: {},
89003           vertex: {},
89004           line: {},
89005           area: {},
89006           relation: {}
89007       };
89008
89009       all.match = function(entity, resolver) {
89010           return resolver.transient(entity, 'presetMatch', function() {
89011               var geometry = entity.geometry(resolver);
89012               var address;
89013
89014               // Treat entities on addr:interpolation lines as points, not vertices - #3241
89015               if (geometry === 'vertex' && entity.isOnAddressLine(resolver)) {
89016                   geometry = 'point';
89017               }
89018
89019               var geometryMatches = _index[geometry];
89020               var best = -1;
89021               var match;
89022
89023               for (var k in entity.tags) {
89024                   // If any part of an address is present,
89025                   // allow fallback to "Address" preset - #4353
89026                   if (k.match(/^addr:/) !== null && geometryMatches['addr:*']) {
89027                       address = geometryMatches['addr:*'][0];
89028                   }
89029
89030                   var keyMatches = geometryMatches[k];
89031                   if (!keyMatches) continue;
89032
89033                   for (var i = 0; i < keyMatches.length; i++) {
89034                       var score = keyMatches[i].matchScore(entity);
89035                       if (score > best) {
89036                           best = score;
89037                           match = keyMatches[i];
89038                       }
89039                   }
89040               }
89041
89042               if (address && (!match || match.isFallback())) {
89043                   match = address;
89044               }
89045               return match || all.item(geometry);
89046           });
89047       };
89048
89049
89050       // Because of the open nature of tagging, iD will never have a complete
89051       // list of tags used in OSM, so we want it to have logic like "assume
89052       // that a closed way with an amenity tag is an area, unless the amenity
89053       // is one of these specific types". This function computes a structure
89054       // that allows testing of such conditions, based on the presets designated
89055       // as as supporting (or not supporting) the area geometry.
89056       //
89057       // The returned object L is a whitelist/blacklist of tags. A closed way
89058       // with a tag (k, v) is considered to be an area if `k in L && !(v in L[k])`
89059       // (see `Way#isArea()`). In other words, the keys of L form the whitelist,
89060       // and the subkeys form the blacklist.
89061       all.areaKeys = function() {
89062           var areaKeys = {};
89063           var ignore = ['barrier', 'highway', 'footway', 'railway', 'type'];  // probably a line..
89064           var presets = reject(all.collection, 'suggestion');
89065
89066           // whitelist
89067           presets.forEach(function(d) {
89068               for (var key in d.tags) break;
89069               if (!key) return;
89070               if (ignore.indexOf(key) !== -1) return;
89071
89072               if (d.geometry.indexOf('area') !== -1) {    // probably an area..
89073                   areaKeys[key] = areaKeys[key] || {};
89074               }
89075           });
89076
89077           // blacklist
89078           presets.forEach(function(d) {
89079               for (var key in d.tags) break;
89080               if (!key) return;
89081               if (ignore.indexOf(key) !== -1) return;
89082
89083               var value = d.tags[key];
89084               if (key in areaKeys &&                      // probably an area...
89085                   d.geometry.indexOf('line') !== -1 &&    // but sometimes a line
89086                   value !== '*') {
89087                   areaKeys[key][value] = true;
89088               }
89089           });
89090
89091           return areaKeys;
89092       };
89093
89094       all.build = function(d, visible) {
89095           if (d.fields) {
89096               forEach(d.fields, function(d, id) {
89097                   _fields[id] = presetField(id, d);
89098                   if (d.universal) {
89099                       _universal.push(_fields[id]);
89100                   }
89101               });
89102           }
89103
89104           if (d.presets) {
89105               var rawPresets = d.presets;
89106               forEach(d.presets, function(d, id) {
89107                   var existing = all.index(id);
89108                   if (existing !== -1) {
89109                       all.collection[existing] = presetPreset(id, d, _fields, visible, rawPresets);
89110                   } else {
89111                       all.collection.push(presetPreset(id, d, _fields, visible, rawPresets));
89112                   }
89113               });
89114           }
89115
89116           if (d.categories) {
89117               forEach(d.categories, function(d, id) {
89118                   var existing = all.index(id);
89119                   if (existing !== -1) {
89120                       all.collection[existing] = presetCategory(id, d, all);
89121                   } else {
89122                       all.collection.push(presetCategory(id, d, all));
89123                   }
89124               });
89125           }
89126
89127           if (d.defaults) {
89128               var getItem = bind$2(all.item, all);
89129               _defaults = {
89130                   area: presetCollection(d.defaults.area.map(getItem)),
89131                   line: presetCollection(d.defaults.line.map(getItem)),
89132                   point: presetCollection(d.defaults.point.map(getItem)),
89133                   vertex: presetCollection(d.defaults.vertex.map(getItem)),
89134                   relation: presetCollection(d.defaults.relation.map(getItem))
89135               };
89136           }
89137
89138           for (var i = 0; i < all.collection.length; i++) {
89139               var preset = all.collection[i];
89140               var geometry = preset.geometry;
89141
89142               for (var j = 0; j < geometry.length; j++) {
89143                   var g = _index[geometry[j]];
89144                   for (var k in preset.tags) {
89145                       (g[k] = g[k] || []).push(preset);
89146                   }
89147               }
89148           }
89149           return all;
89150       };
89151
89152       all.init = function() {
89153           all.collection = [];
89154           _recent.collection = [];
89155           _fields = {};
89156           _universal = [];
89157           _index = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
89158
89159           return all.build(data.presets, true);
89160       };
89161
89162
89163       all.reset = function() {
89164           all.collection = [];
89165           _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
89166           _fields = {};
89167           _universal = [];
89168           _recent = presetCollection([]);
89169
89170           // Index of presets by (geometry, tag key).
89171           _index = {
89172               point: {},
89173               vertex: {},
89174               line: {},
89175               area: {},
89176               relation: {}
89177           };
89178
89179           return all;
89180       };
89181
89182       all.fromExternal = function(external, done) {
89183           all.reset();
89184           d3_json(external, function(err, externalPresets) {
89185               if (err) {
89186                   all.init();
89187               } else {
89188                   all.build(data.presets, false); // make default presets hidden to begin
89189                   all.build(externalPresets, true); // make the external visible
89190               }
89191               done(all);
89192           });
89193       };
89194
89195       all.field = function(id) {
89196           return _fields[id];
89197       };
89198
89199       all.universal = function() {
89200           return _universal;
89201       };
89202
89203       all.defaults = function(geometry, n) {
89204           var rec = _recent.matchGeometry(geometry).collection.slice(0, 4);
89205           var def = uniq(rec.concat(_defaults[geometry].collection)).slice(0, n - 1);
89206           return presetCollection(uniq(rec.concat(def).concat(all.item(geometry))));
89207       };
89208
89209       all.choose = function(preset) {
89210           if (preset.searchable !== false) {
89211               _recent = presetCollection(uniq([preset].concat(_recent.collection)));
89212           }
89213           return all;
89214       };
89215
89216       return all;
89217   }
89218
89219   var areaKeys = {};
89220
89221   function setAreaKeys(value) {
89222       areaKeys = value;
89223   }
89224
89225
89226   function coreContext() {
89227       var context = {};
89228       context.version = '2.13.1';
89229
89230       // create a special translation that contains the keys in place of the strings
89231       var tkeys = cloneDeep(en);
89232       var parents = [];
89233
89234       function traverser(v, k, obj) {
89235           parents.push(k);
89236           if (isObject(v)) {
89237               forOwn(v, traverser);
89238           } else if (isString(v)) {
89239               obj[k] = parents.join('.');
89240           }
89241           parents.pop();
89242       }
89243
89244       forOwn(tkeys, traverser);
89245       addTranslation('_tkeys_', tkeys);
89246
89247       addTranslation('en', en);
89248       setLocale('en');
89249
89250       var dispatch$$1 = dispatch('enter', 'exit', 'change');
89251
89252       // https://github.com/openstreetmap/iD/issues/772
89253       // http://mathiasbynens.be/notes/localstorage-pattern#comment-9
89254       var storage;
89255       try { storage = localStorage; } catch (e) {}  // eslint-disable-line no-empty
89256       storage = storage || (function() {
89257           var s = {};
89258           return {
89259               getItem: function(k) { return s[k]; },
89260               setItem: function(k, v) { s[k] = v; },
89261               removeItem: function(k) { delete s[k]; }
89262           };
89263       })();
89264
89265       context.storage = function(k, v) {
89266           try {
89267               if (arguments.length === 1) return storage.getItem(k);
89268               else if (v === null) storage.removeItem(k);
89269               else storage.setItem(k, v);
89270           } catch (e) {
89271               // localstorage quota exceeded
89272               /* eslint-disable no-console */
89273               if (typeof console !== 'undefined') console.error('localStorage quota exceeded');
89274               /* eslint-enable no-console */
89275           }
89276       };
89277
89278
89279       /* User interface and keybinding */
89280       var ui;
89281       context.ui = function() { return ui; };
89282
89283       var keybinding = utilKeybinding('context');
89284       context.keybinding = function() { return keybinding; };
89285       select(document).call(keybinding);
89286
89287
89288       /* Straight accessors. Avoid using these if you can. */
89289       var connection, history;
89290       context.connection = function() { return connection; };
89291       context.history = function() { return history; };
89292
89293
89294       /* Connection */
89295       context.preauth = function(options) {
89296           if (connection) {
89297               connection.switch(options);
89298           }
89299           return context;
89300       };
89301
89302       context.loadTiles = utilCallWhenIdle(function(projection, callback) {
89303           var cid;
89304           function done(err, result) {
89305               if (connection.getConnectionId() !== cid) {
89306                   if (callback) callback({ message: 'Connection Switched', status: -1 });
89307                   return;
89308               }
89309               if (!err) history.merge(result.data, result.extent);
89310               if (callback) callback(err, result);
89311           }
89312           if (connection && context.editable()) {
89313               cid = connection.getConnectionId();
89314               connection.loadTiles(projection, done);
89315           }
89316       });
89317
89318       context.loadEntity = function(entityID, callback) {
89319           var cid;
89320           function done(err, result) {
89321               if (connection.getConnectionId() !== cid) {
89322                   if (callback) callback({ message: 'Connection Switched', status: -1 });
89323                   return;
89324               }
89325               if (!err) history.merge(result.data, result.extent);
89326               if (callback) callback(err, result);
89327           }
89328           if (connection) {
89329               cid = connection.getConnectionId();
89330               connection.loadEntity(entityID, done);
89331           }
89332       };
89333
89334       context.zoomToEntity = function(entityID, zoomTo) {
89335           if (zoomTo !== false) {
89336               this.loadEntity(entityID, function(err, result) {
89337                   if (err) return;
89338                   var entity = find$1(result.data, function(e) { return e.id === entityID; });
89339                   if (entity) {
89340                       map.zoomTo(entity);
89341                   }
89342               });
89343           }
89344
89345           map.on('drawn.zoomToEntity', function() {
89346               if (!context.hasEntity(entityID)) return;
89347               map.on('drawn.zoomToEntity', null);
89348               context.on('enter.zoomToEntity', null);
89349               context.enter(modeSelect(context, [entityID]));
89350           });
89351
89352           context.on('enter.zoomToEntity', function() {
89353               if (mode.id !== 'browse') {
89354                   map.on('drawn.zoomToEntity', null);
89355                   context.on('enter.zoomToEntity', null);
89356               }
89357           });
89358       };
89359
89360       var minEditableZoom = 16;
89361       context.minEditableZoom = function(_) {
89362           if (!arguments.length) return minEditableZoom;
89363           minEditableZoom = _;
89364           if (connection) {
89365               connection.tileZoom(_);
89366           }
89367           return context;
89368       };
89369
89370
89371       /* History */
89372       var inIntro = false;
89373       context.inIntro = function(_) {
89374           if (!arguments.length) return inIntro;
89375           inIntro = _;
89376           return context;
89377       };
89378
89379       context.save = function() {
89380           // no history save, no message onbeforeunload
89381           if (inIntro || select('.modal').size()) return;
89382
89383           var canSave;
89384           if (mode && mode.id === 'save') {
89385               canSave = false;
89386
89387               // Attempt to prevent user from creating duplicate changes - see #5200
89388               if (services.osm && services.osm.isChangesetInflight()) {
89389                   history.clearSaved();
89390                   return;
89391               }
89392
89393           } else {
89394               canSave = context.selectedIDs().every(function(id) {
89395                   var entity = context.hasEntity(id);
89396                   return entity && !entity.isDegenerate();
89397               });
89398           }
89399
89400           if (canSave) {
89401               history.save();
89402           }
89403           if (history.hasChanges()) {
89404               return t('save.unsaved_changes');
89405           }
89406       };
89407
89408
89409       /* Graph */
89410       context.hasEntity = function(id) {
89411           return history.graph().hasEntity(id);
89412       };
89413       context.entity = function(id) {
89414           return history.graph().entity(id);
89415       };
89416       context.childNodes = function(way) {
89417           return history.graph().childNodes(way);
89418       };
89419       context.geometry = function(id) {
89420           return context.entity(id).geometry(history.graph());
89421       };
89422
89423
89424       /* Modes */
89425       var mode;
89426       context.mode = function() {
89427           return mode;
89428       };
89429       context.enter = function(newMode) {
89430           if (mode) {
89431               mode.exit();
89432               dispatch$$1.call('exit', this, mode);
89433           }
89434
89435           mode = newMode;
89436           mode.enter();
89437           dispatch$$1.call('enter', this, mode);
89438       };
89439
89440       context.selectedIDs = function() {
89441           if (mode && mode.selectedIDs) {
89442               return mode.selectedIDs();
89443           } else {
89444               return [];
89445           }
89446       };
89447
89448       context.activeID = function() {
89449           return mode && mode.activeID && mode.activeID();
89450       };
89451
89452       var _selectedNoteID;
89453       context.selectedNoteID = function(noteID) {
89454           if (!arguments.length) return _selectedNoteID;
89455           _selectedNoteID = noteID;
89456           return context;
89457       };
89458
89459       var _selectedErrorID;
89460       context.selectedErrorID = function(errorID) {
89461           if (!arguments.length) return _selectedErrorID;
89462           _selectedErrorID = errorID;
89463           return context;
89464       };
89465
89466
89467       /* Behaviors */
89468       context.install = function(behavior) {
89469           context.surface().call(behavior);
89470       };
89471       context.uninstall = function(behavior) {
89472           context.surface().call(behavior.off);
89473       };
89474
89475
89476       /* Copy/Paste */
89477       var copyIDs = [], copyGraph;
89478       context.copyGraph = function() { return copyGraph; };
89479       context.copyIDs = function(_) {
89480           if (!arguments.length) return copyIDs;
89481           copyIDs = _;
89482           copyGraph = history.graph();
89483           return context;
89484       };
89485
89486
89487       /* Background */
89488       var background;
89489       context.background = function() { return background; };
89490
89491
89492       /* Features */
89493       var features;
89494       context.features = function() { return features; };
89495       context.hasHiddenConnections = function(id) {
89496           var graph = history.graph(),
89497               entity = graph.entity(id);
89498           return features.hasHiddenConnections(entity, graph);
89499       };
89500
89501
89502       /* Presets */
89503       var presets;
89504       context.presets = function() { return presets; };
89505
89506
89507       /* Map */
89508       var map;
89509       context.map = function() { return map; };
89510       context.layers = function() { return map.layers; };
89511       context.surface = function() { return map.surface; };
89512       context.editable = function() { return map.editable(); };
89513       context.surfaceRect = function() {
89514           return map.surface.node().getBoundingClientRect();
89515       };
89516
89517
89518       /* Debug */
89519       var debugFlags = {
89520           tile: false,        // tile boundaries
89521           collision: false,   // label collision bounding boxes
89522           imagery: false,     // imagery bounding polygons
89523           community: false,   // community bounding polygons
89524           imperial: false,    // imperial (not metric) bounding polygons
89525           driveLeft: false,   // driveLeft bounding polygons
89526           target: false       // touch targets
89527       };
89528       context.debugFlags = function() {
89529           return debugFlags;
89530       };
89531       context.setDebug = function(flag, val) {
89532           if (arguments.length === 1) val = true;
89533           debugFlags[flag] = val;
89534           dispatch$$1.call('change');
89535           return context;
89536       };
89537       context.getDebug = function(flag) {
89538           return flag && debugFlags[flag];
89539       };
89540
89541
89542       /* Container */
89543       var container = select(document.body);
89544       context.container = function(_) {
89545           if (!arguments.length) return container;
89546           container = _;
89547           container.classed('id-container', true);
89548           return context;
89549       };
89550       var embed;
89551       context.embed = function(_) {
89552           if (!arguments.length) return embed;
89553           embed = _;
89554           return context;
89555       };
89556
89557
89558       /* Assets */
89559       var assetPath = '';
89560       context.assetPath = function(_) {
89561           if (!arguments.length) return assetPath;
89562           assetPath = _;
89563           return context;
89564       };
89565
89566       var assetMap = {};
89567       context.assetMap = function(_) {
89568           if (!arguments.length) return assetMap;
89569           assetMap = _;
89570           return context;
89571       };
89572
89573       context.asset = function(_) {
89574           var filename = assetPath + _;
89575           return assetMap[filename] || filename;
89576       };
89577
89578       context.imagePath = function(_) {
89579           return context.asset('img/' + _);
89580       };
89581
89582
89583       /* locales */
89584       // `locale` variable contains a "requested locale".
89585       // It won't become the `currentLocale` until after loadLocale() is called.
89586       var locale, localePath;
89587
89588       context.locale = function(loc, path) {
89589           if (!arguments.length) return currentLocale;
89590           locale = loc;
89591           localePath = path;
89592           return context;
89593       };
89594
89595       context.loadLocale = function(callback) {
89596           if (locale && locale !== 'en' && dataLocales.hasOwnProperty(locale)) {
89597               localePath = localePath || context.asset('locales/' + locale + '.json');
89598               d3_json(localePath, function(err, result) {
89599                   if (!err) {
89600                       addTranslation(locale, result[locale]);
89601                       setLocale(locale);
89602                       utilDetect(true);
89603                   }
89604                   if (callback) {
89605                       callback(err);
89606                   }
89607               });
89608           } else {
89609               if (locale) {
89610                   setLocale(locale);
89611                   utilDetect(true);
89612               }
89613               if (callback) {
89614                   callback();
89615               }
89616           }
89617       };
89618
89619
89620       /* reset (aka flush) */
89621       context.reset = context.flush = function() {
89622           context.debouncedSave.cancel();
89623           forEach(services, function(service) {
89624               if (service && typeof service.reset === 'function') {
89625                   service.reset(context);
89626               }
89627           });
89628           features.reset();
89629           history.reset();
89630           return context;
89631       };
89632
89633
89634       /* Init */
89635
89636       context.projection = geoRawMercator();
89637       context.curtainProjection = geoRawMercator();
89638
89639       locale = utilDetect().locale;
89640       if (locale && !dataLocales.hasOwnProperty(locale)) {
89641           locale = locale.split('-')[0];
89642       }
89643
89644       history = coreHistory(context);
89645       context.graph = history.graph;
89646       context.changes = history.changes;
89647       context.intersects = history.intersects;
89648
89649       // Debounce save, since it's a synchronous localStorage write,
89650       // and history changes can happen frequently (e.g. when dragging).
89651       context.debouncedSave = debounce(context.save, 350);
89652       function withDebouncedSave(fn) {
89653           return function() {
89654               var result = fn.apply(history, arguments);
89655               context.debouncedSave();
89656               return result;
89657           };
89658       }
89659
89660       context.perform = withDebouncedSave(history.perform);
89661       context.replace = withDebouncedSave(history.replace);
89662       context.pop = withDebouncedSave(history.pop);
89663       context.overwrite = withDebouncedSave(history.overwrite);
89664       context.undo = withDebouncedSave(history.undo);
89665       context.redo = withDebouncedSave(history.redo);
89666
89667       ui = uiInit(context);
89668
89669       connection = services.osm;
89670       background = rendererBackground(context);
89671       features = rendererFeatures(context);
89672       presets = presetIndex();
89673
89674       if (services.maprules && utilStringQs(window.location.hash).maprules) {
89675           var maprules = utilStringQs(window.location.hash).maprules;
89676           d3_json(maprules, function (err, mapcss) {
89677               if (err) return;
89678               services.maprules.init(context.presets().areaKeys());
89679               forEach(mapcss, function(mapcssSelector) {
89680                   return services.maprules.addRule(mapcssSelector);
89681               });
89682           });
89683       }
89684
89685       map = rendererMap(context);
89686       context.mouse = map.mouse;
89687       context.extent = map.extent;
89688       context.pan = map.pan;
89689       context.zoomIn = map.zoomIn;
89690       context.zoomOut = map.zoomOut;
89691       context.zoomInFurther = map.zoomInFurther;
89692       context.zoomOutFurther = map.zoomOutFurther;
89693       context.redrawEnable = map.redrawEnable;
89694
89695       forEach(services, function(service) {
89696           if (service && typeof service.init === 'function') {
89697               service.init(context);
89698           }
89699       });
89700
89701       background.init();
89702       features.init();
89703       if (utilStringQs(window.location.hash).presets) {
89704           var external = utilStringQs(window.location.hash).presets;
89705           presets.fromExternal(external, function(externalPresets) {
89706               context.presets = function() { return externalPresets; }; // default + external presets...
89707               areaKeys = presets.areaKeys();
89708           });
89709       } else {
89710           presets.init();
89711           areaKeys = presets.areaKeys();
89712       }
89713
89714       return utilRebind(context, dispatch$$1, 'on');
89715   }
89716
89717   function osmWay() {
89718       if (!(this instanceof osmWay)) {
89719           return (new osmWay()).initialize(arguments);
89720       } else if (arguments.length) {
89721           this.initialize(arguments);
89722       }
89723   }
89724
89725
89726   osmEntity$$1.way = osmWay;
89727
89728   osmWay.prototype = Object.create(osmEntity$$1.prototype);
89729
89730
89731   assignIn(osmWay.prototype, {
89732       type: 'way',
89733       nodes: [],
89734
89735
89736       copy: function(resolver, copies) {
89737           if (copies[this.id]) return copies[this.id];
89738
89739           var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
89740
89741           var nodes = this.nodes.map(function(id) {
89742               return resolver.entity(id).copy(resolver, copies).id;
89743           });
89744
89745           copy = copy.update({ nodes: nodes });
89746           copies[this.id] = copy;
89747
89748           return copy;
89749       },
89750
89751
89752       extent: function(resolver) {
89753           return resolver.transient(this, 'extent', function() {
89754               var extent = geoExtent$$1();
89755               for (var i = 0; i < this.nodes.length; i++) {
89756                   var node = resolver.hasEntity(this.nodes[i]);
89757                   if (node) {
89758                       extent._extend(node.extent());
89759                   }
89760               }
89761               return extent;
89762           });
89763       },
89764
89765
89766       first: function() {
89767           return this.nodes[0];
89768       },
89769
89770
89771       last: function() {
89772           return this.nodes[this.nodes.length - 1];
89773       },
89774
89775
89776       contains: function(node) {
89777           return this.nodes.indexOf(node) >= 0;
89778       },
89779
89780
89781       affix: function(node) {
89782           if (this.nodes[0] === node) return 'prefix';
89783           if (this.nodes[this.nodes.length - 1] === node) return 'suffix';
89784       },
89785
89786
89787       layer: function() {
89788           // explicit layer tag, clamp between -10, 10..
89789           if (isFinite(this.tags.layer)) {
89790               return Math.max(-10, Math.min(+(this.tags.layer), 10));
89791           }
89792
89793           // implied layer tag..
89794           if (this.tags.covered === 'yes') return -1;
89795           if (this.tags.location === 'overground') return 1;
89796           if (this.tags.location === 'underground') return -1;
89797           if (this.tags.location === 'underwater') return -10;
89798
89799           if (this.tags.power === 'line') return 10;
89800           if (this.tags.power === 'minor_line') return 10;
89801           if (this.tags.aerialway) return 10;
89802           if (this.tags.bridge) return 1;
89803           if (this.tags.cutting) return -1;
89804           if (this.tags.tunnel) return -1;
89805           if (this.tags.waterway) return -1;
89806           if (this.tags.man_made === 'pipeline') return -10;
89807           if (this.tags.boundary) return -10;
89808           return 0;
89809       },
89810
89811
89812       isOneWay: function() {
89813           // explicit oneway tag..
89814           var values = {
89815               'yes': true,
89816               '1': true,
89817               '-1': true,
89818               'reversible': true,
89819               'alternating': true,
89820               'no': false,
89821               '0': false
89822           };
89823           if (values[this.tags.oneway] !== undefined) {
89824               return values[this.tags.oneway];
89825           }
89826
89827           // implied oneway tag..
89828           for (var key in this.tags) {
89829               if (key in osmOneWayTags && (this.tags[key] in osmOneWayTags[key]))
89830                   return true;
89831           }
89832           return false;
89833       },
89834
89835       // Some identifier for tag that implies that this way is "sided",
89836       // i.e. the right side is the 'inside' (e.g. the right side of a
89837       // natural=cliff is lower).
89838       sidednessIdentifier: function() {
89839           for (var key in this.tags) {
89840               var value = this.tags[key];
89841               if (key in osmRightSideIsInsideTags && (value in osmRightSideIsInsideTags[key])) {
89842                   if (osmRightSideIsInsideTags[key][value] === true) {
89843                       return key;
89844                   } else {
89845                       // if the map's value is something other than a
89846                       // literal true, we should use it so we can
89847                       // special case some keys (e.g. natural=coastline
89848                       // is handled differently to other naturals).
89849                       return osmRightSideIsInsideTags[key][value];
89850                   }
89851               }
89852           }
89853
89854           return null;
89855       },
89856       isSided: function() {
89857           if (this.tags.two_sided === 'yes') {
89858               return false;
89859           }
89860
89861           return this.sidednessIdentifier() != null;
89862       },
89863
89864       lanes: function() {
89865           return osmLanes(this);
89866       },
89867
89868
89869       isClosed: function() {
89870           return this.nodes.length > 1 && this.first() === this.last();
89871       },
89872
89873
89874       isConvex: function(resolver) {
89875           if (!this.isClosed() || this.isDegenerate()) return null;
89876
89877           var nodes = uniq(resolver.childNodes(this));
89878           var coords = map$3(nodes, 'loc');
89879           var curr = 0;
89880           var prev = 0;
89881
89882           for (var i = 0; i < coords.length; i++) {
89883               var o = coords[(i+1) % coords.length];
89884               var a = coords[i];
89885               var b = coords[(i+2) % coords.length];
89886               var res = geoVecCross(a, b, o);
89887
89888               curr = (res > 0) ? 1 : (res < 0) ? -1 : 0;
89889               if (curr === 0) {
89890                   continue;
89891               } else if (prev && curr !== prev) {
89892                   return false;
89893               }
89894               prev = curr;
89895           }
89896           return true;
89897       },
89898
89899
89900       isArea: function() {
89901           // `highway` and `railway` are typically linear features, but there
89902           // are a few exceptions that should be treated as areas, even in the
89903           // absence of a proper `area=yes` or `areaKeys` tag.. see #4194
89904           var lineKeys = {
89905               highway: {
89906                   rest_area: true,
89907                   services: true
89908               },
89909               railway: {
89910                   roundhouse: true,
89911                   station: true,
89912                   traverser: true,
89913                   turntable: true,
89914                   wash: true
89915               }
89916           };
89917
89918           if (this.tags.area === 'yes')
89919               return true;
89920           if (!this.isClosed() || this.tags.area === 'no')
89921               return false;
89922           for (var key in this.tags) {
89923               if (key in areaKeys && !(this.tags[key] in areaKeys[key])) {
89924                   return true;
89925               }
89926               if (key in lineKeys && this.tags[key] in lineKeys[key]) {
89927                   return true;
89928               }
89929           }
89930           return false;
89931       },
89932
89933
89934       isDegenerate: function() {
89935           return uniq(this.nodes).length < (this.isArea() ? 3 : 2);
89936       },
89937
89938
89939       areAdjacent: function(n1, n2) {
89940           for (var i = 0; i < this.nodes.length; i++) {
89941               if (this.nodes[i] === n1) {
89942                   if (this.nodes[i - 1] === n2) return true;
89943                   if (this.nodes[i + 1] === n2) return true;
89944               }
89945           }
89946           return false;
89947       },
89948
89949
89950       geometry: function(graph) {
89951           return graph.transient(this, 'geometry', function() {
89952               return this.isArea() ? 'area' : 'line';
89953           });
89954       },
89955
89956
89957       // If this way is not closed, append the beginning node to the end of the nodelist to close it.
89958       close: function() {
89959           if (this.isClosed() || !this.nodes.length) return this;
89960
89961           var nodes = this.nodes.slice();
89962           nodes = nodes.filter(noRepeatNodes);
89963           nodes.push(nodes[0]);
89964           return this.update({ nodes: nodes });
89965       },
89966
89967
89968       // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
89969       unclose: function() {
89970           if (!this.isClosed()) return this;
89971
89972           var nodes = this.nodes.slice();
89973           var connector = this.first();
89974           var i = nodes.length - 1;
89975
89976           // remove trailing connectors..
89977           while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
89978               nodes.splice(i, 1);
89979               i = nodes.length - 1;
89980           }
89981
89982           nodes = nodes.filter(noRepeatNodes);
89983           return this.update({ nodes: nodes });
89984       },
89985
89986
89987       // Adds a node (id) in front of the node which is currently at position index.
89988       // If index is undefined, the node will be added to the end of the way for linear ways,
89989       //   or just before the final connecting node for circular ways.
89990       // Consecutive duplicates are eliminated including existing ones.
89991       // Circularity is always preserved when adding a node.
89992       addNode: function(id, index) {
89993           var nodes = this.nodes.slice();
89994           var isClosed = this.isClosed();
89995           var max = isClosed ? nodes.length - 1 : nodes.length;
89996
89997           if (index === undefined) {
89998               index = max;
89999           }
90000
90001           if (index < 0 || index > max) {
90002               throw new RangeError('index ' + index + ' out of range 0..' + max);
90003           }
90004
90005           // If this is a closed way, remove all connector nodes except the first one
90006           // (there may be duplicates) and adjust index if necessary..
90007           if (isClosed) {
90008               var connector = this.first();
90009
90010               // leading connectors..
90011               var i = 1;
90012               while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
90013                   nodes.splice(i, 1);
90014                   if (index > i) index--;
90015               }
90016
90017               // trailing connectors..
90018               i = nodes.length - 1;
90019               while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
90020                   nodes.splice(i, 1);
90021                   if (index > i) index--;
90022                   i = nodes.length - 1;
90023               }
90024           }
90025
90026           nodes.splice(index, 0, id);
90027           nodes = nodes.filter(noRepeatNodes);
90028
90029           // If the way was closed before, append a connector node to keep it closed..
90030           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
90031               nodes.push(nodes[0]);
90032           }
90033
90034           return this.update({ nodes: nodes });
90035       },
90036
90037
90038       // Replaces the node which is currently at position index with the given node (id).
90039       // Consecutive duplicates are eliminated including existing ones.
90040       // Circularity is preserved when updating a node.
90041       updateNode: function(id, index) {
90042           var nodes = this.nodes.slice();
90043           var isClosed = this.isClosed();
90044           var max = nodes.length - 1;
90045
90046           if (index === undefined || index < 0 || index > max) {
90047               throw new RangeError('index ' + index + ' out of range 0..' + max);
90048           }
90049
90050           // If this is a closed way, remove all connector nodes except the first one
90051           // (there may be duplicates) and adjust index if necessary..
90052           if (isClosed) {
90053               var connector = this.first();
90054
90055               // leading connectors..
90056               var i = 1;
90057               while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
90058                   nodes.splice(i, 1);
90059                   if (index > i) index--;
90060               }
90061
90062               // trailing connectors..
90063               i = nodes.length - 1;
90064               while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
90065                   nodes.splice(i, 1);
90066                   if (index === i) index = 0;  // update leading connector instead
90067                   i = nodes.length - 1;
90068               }
90069           }
90070
90071           nodes.splice(index, 1, id);
90072           nodes = nodes.filter(noRepeatNodes);
90073
90074           // If the way was closed before, append a connector node to keep it closed..
90075           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
90076               nodes.push(nodes[0]);
90077           }
90078
90079           return this.update({nodes: nodes});
90080       },
90081
90082
90083       // Replaces each occurrence of node id needle with replacement.
90084       // Consecutive duplicates are eliminated including existing ones.
90085       // Circularity is preserved.
90086       replaceNode: function(needleID, replacementID) {
90087           var nodes = this.nodes.slice();
90088           var isClosed = this.isClosed();
90089
90090           for (var i = 0; i < nodes.length; i++) {
90091               if (nodes[i] === needleID) {
90092                   nodes[i] = replacementID;
90093               }
90094           }
90095
90096           nodes = nodes.filter(noRepeatNodes);
90097
90098           // If the way was closed before, append a connector node to keep it closed..
90099           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
90100               nodes.push(nodes[0]);
90101           }
90102
90103           return this.update({nodes: nodes});
90104       },
90105
90106
90107       // Removes each occurrence of node id.
90108       // Consecutive duplicates are eliminated including existing ones.
90109       // Circularity is preserved.
90110       removeNode: function(id) {
90111           var nodes = this.nodes.slice();
90112           var isClosed = this.isClosed();
90113
90114           nodes = nodes
90115               .filter(function(node) { return node !== id; })
90116               .filter(noRepeatNodes);
90117
90118           // If the way was closed before, append a connector node to keep it closed..
90119           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
90120               nodes.push(nodes[0]);
90121           }
90122
90123           return this.update({nodes: nodes});
90124       },
90125
90126
90127       asJXON: function(changeset_id) {
90128           var r = {
90129               way: {
90130                   '@id': this.osmId(),
90131                   '@version': this.version || 0,
90132                   nd: map$3(this.nodes, function(id) {
90133                       return { keyAttributes: { ref: osmEntity$$1.id.toOSM(id) } };
90134                   }),
90135                   tag: map$3(this.tags, function(v, k) {
90136                       return { keyAttributes: { k: k, v: v } };
90137                   })
90138               }
90139           };
90140           if (changeset_id) {
90141               r.way['@changeset'] = changeset_id;
90142           }
90143           return r;
90144       },
90145
90146
90147       asGeoJSON: function(resolver) {
90148           return resolver.transient(this, 'GeoJSON', function() {
90149               var coordinates = map$3(resolver.childNodes(this), 'loc');
90150               if (this.isArea() && this.isClosed()) {
90151                   return {
90152                       type: 'Polygon',
90153                       coordinates: [coordinates]
90154                   };
90155               } else {
90156                   return {
90157                       type: 'LineString',
90158                       coordinates: coordinates
90159                   };
90160               }
90161           });
90162       },
90163
90164
90165       area: function(resolver) {
90166           return resolver.transient(this, 'area', function() {
90167               var nodes = resolver.childNodes(this);
90168
90169               var json = {
90170                   type: 'Polygon',
90171                   coordinates: [map$3(nodes, 'loc')]
90172               };
90173
90174               if (!this.isClosed() && nodes.length) {
90175                   json.coordinates[0].push(nodes[0].loc);
90176               }
90177
90178               var area = d3_geoArea(json);
90179
90180               // Heuristic for detecting counterclockwise winding order. Assumes
90181               // that OpenStreetMap polygons are not hemisphere-spanning.
90182               if (area > 2 * Math.PI) {
90183                   json.coordinates[0] = json.coordinates[0].reverse();
90184                   area = d3_geoArea(json);
90185               }
90186
90187               return isNaN(area) ? 0 : area;
90188           });
90189       }
90190   });
90191
90192
90193   // Filter function to eliminate consecutive duplicates.
90194   function noRepeatNodes(node, i, arr) {
90195       return i === 0 || node !== arr[i - 1];
90196   }
90197
90198   // For fixing up rendering of multipolygons with tags on the outer member.
90199   // https://github.com/openstreetmap/iD/issues/613
90200   function osmIsSimpleMultipolygonOuterMember(entity, graph) {
90201       if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0)
90202           return false;
90203
90204       var parents = graph.parentRelations(entity);
90205       if (parents.length !== 1)
90206           return false;
90207
90208       var parent = parents[0];
90209       if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
90210           return false;
90211
90212       var members = parent.members, member;
90213       for (var i = 0; i < members.length; i++) {
90214           member = members[i];
90215           if (member.id === entity.id && member.role && member.role !== 'outer')
90216               return false; // Not outer member
90217           if (member.id !== entity.id && (!member.role || member.role === 'outer'))
90218               return false; // Not a simple multipolygon
90219       }
90220
90221       return parent;
90222   }
90223
90224
90225   function osmSimpleMultipolygonOuterMember(entity, graph) {
90226       if (entity.type !== 'way')
90227           return false;
90228
90229       var parents = graph.parentRelations(entity);
90230       if (parents.length !== 1)
90231           return false;
90232
90233       var parent = parents[0];
90234       if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
90235           return false;
90236
90237       var members = parent.members, member, outerMember;
90238       for (var i = 0; i < members.length; i++) {
90239           member = members[i];
90240           if (!member.role || member.role === 'outer') {
90241               if (outerMember)
90242                   return false; // Not a simple multipolygon
90243               outerMember = member;
90244           }
90245       }
90246
90247       if (!outerMember)
90248           return false;
90249
90250       var outerEntity = graph.hasEntity(outerMember.id);
90251       if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length)
90252           return false;
90253
90254       return outerEntity;
90255   }
90256
90257
90258   // Join `toJoin` array into sequences of connecting ways.
90259
90260   // Segments which share identical start/end nodes will, as much as possible,
90261   // be connected with each other.
90262   //
90263   // The return value is a nested array. Each constituent array contains elements
90264   // of `toJoin` which have been determined to connect.
90265   //
90266   // Each consitituent array also has a `nodes` property whose value is an
90267   // ordered array of member nodes, with appropriate order reversal and
90268   // start/end coordinate de-duplication.
90269   //
90270   // Members of `toJoin` must have, at minimum, `type` and `id` properties.
90271   // Thus either an array of `osmWay`s or a relation member array may be used.
90272   //
90273   // If an member is an `osmWay`, its tags and childnodes may be reversed via
90274   // `actionReverse` in the output.
90275   //
90276   // The returned sequences array also has an `actions` array property, containing
90277   // any reversal actions that should be applied to the graph, should the calling
90278   // code attempt to actually join the given ways.
90279   //
90280   // Incomplete members (those for which `graph.hasEntity(element.id)` returns
90281   // false) and non-way members are ignored.
90282   //
90283   function osmJoinWays(toJoin, graph) {
90284       function resolve(member) {
90285           return graph.childNodes(graph.entity(member.id));
90286       }
90287
90288       function reverse(item) {
90289           var action = actionReverse(item.id, { reverseOneway: true });
90290           sequences.actions.push(action);
90291           return (item instanceof osmWay) ? action(graph).entity(item.id) : item;
90292       }
90293
90294       // make a copy containing only the items to join
90295       toJoin = toJoin.filter(function(member) {
90296           return member.type === 'way' && graph.hasEntity(member.id);
90297       });
90298
90299       // Are the things we are joining relation members or `osmWays`?
90300       // If `osmWays`, skip the "prefer a forward path" code below (see #4872)
90301       var i;
90302       var joinAsMembers = true;
90303       for (i = 0; i < toJoin.length; i++) {
90304           if (toJoin[i] instanceof osmWay) {
90305               joinAsMembers = false;
90306               break;
90307           }
90308       }
90309
90310       var sequences = [];
90311       sequences.actions = [];
90312
90313       while (toJoin.length) {
90314           // start a new sequence
90315           var item = toJoin.shift();
90316           var currWays = [item];
90317           var currNodes = resolve(item).slice();
90318           var doneSequence = false;
90319
90320           // add to it
90321           while (toJoin.length && !doneSequence) {
90322               var start = currNodes[0];
90323               var end = currNodes[currNodes.length - 1];
90324               var fn = null;
90325               var nodes = null;
90326
90327               // Find the next way/member to join.
90328               for (i = 0; i < toJoin.length; i++) {
90329                   item = toJoin[i];
90330                   nodes = resolve(item);
90331
90332                   // (for member ordering only, not way ordering - see #4872)
90333                   // Strongly prefer to generate a forward path that preserves the order
90334                   // of the members array. For multipolygons and most relations, member
90335                   // order does not matter - but for routes, it does. (see #4589)
90336                   // If we started this sequence backwards (i.e. next member way attaches to
90337                   // the start node and not the end node), reverse the initial way before continuing.
90338                   if (joinAsMembers && currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end &&
90339                       (nodes[nodes.length - 1] === start || nodes[0] === start)
90340                   ) {
90341                       currWays[0] = reverse(currWays[0]);
90342                       currNodes.reverse();
90343                       start = currNodes[0];
90344                       end = currNodes[currNodes.length - 1];
90345                   }
90346
90347                   if (nodes[0] === end) {
90348                       fn = currNodes.push;               // join to end
90349                       nodes = nodes.slice(1);
90350                       break;
90351                   } else if (nodes[nodes.length - 1] === end) {
90352                       fn = currNodes.push;               // join to end
90353                       nodes = nodes.slice(0, -1).reverse();
90354                       item = reverse(item);
90355                       break;
90356                   } else if (nodes[nodes.length - 1] === start) {
90357                       fn = currNodes.unshift;            // join to beginning
90358                       nodes = nodes.slice(0, -1);
90359                       break;
90360                   } else if (nodes[0] === start) {
90361                       fn = currNodes.unshift;            // join to beginning
90362                       nodes = nodes.slice(1).reverse();
90363                       item = reverse(item);
90364                       break;
90365                   } else {
90366                       fn = nodes = null;
90367                   }
90368               }
90369
90370               if (!nodes) {     // couldn't find a joinable way/member
90371                   doneSequence = true;
90372                   break;
90373               }
90374
90375               fn.apply(currWays, [item]);
90376               fn.apply(currNodes, nodes);
90377
90378               toJoin.splice(i, 1);
90379           }
90380
90381           currWays.nodes = currNodes;
90382           sequences.push(currWays);
90383       }
90384
90385       return sequences;
90386   }
90387
90388   function osmRelation() {
90389       if (!(this instanceof osmRelation)) {
90390           return (new osmRelation()).initialize(arguments);
90391       } else if (arguments.length) {
90392           this.initialize(arguments);
90393       }
90394   }
90395
90396
90397   osmEntity$$1.relation = osmRelation;
90398
90399   osmRelation.prototype = Object.create(osmEntity$$1.prototype);
90400
90401
90402   osmRelation.creationOrder = function(a, b) {
90403       var aId = parseInt(osmEntity$$1.id.toOSM(a.id), 10);
90404       var bId = parseInt(osmEntity$$1.id.toOSM(b.id), 10);
90405
90406       if (aId < 0 || bId < 0) return aId - bId;
90407       return bId - aId;
90408   };
90409
90410
90411   assignIn(osmRelation.prototype, {
90412       type: 'relation',
90413       members: [],
90414
90415
90416       copy: function(resolver, copies) {
90417           if (copies[this.id]) return copies[this.id];
90418
90419           var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
90420
90421           var members = this.members.map(function(member) {
90422               return assignIn({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id });
90423           });
90424
90425           copy = copy.update({members: members});
90426           copies[this.id] = copy;
90427
90428           return copy;
90429       },
90430
90431
90432       extent: function(resolver, memo) {
90433           return resolver.transient(this, 'extent', function() {
90434               if (memo && memo[this.id]) return geoExtent$$1();
90435               memo = memo || {};
90436               memo[this.id] = true;
90437
90438               var extent = geoExtent$$1();
90439               for (var i = 0; i < this.members.length; i++) {
90440                   var member = resolver.hasEntity(this.members[i].id);
90441                   if (member) {
90442                       extent._extend(member.extent(resolver, memo));
90443                   }
90444               }
90445               return extent;
90446           });
90447       },
90448
90449
90450       geometry: function(graph) {
90451           return graph.transient(this, 'geometry', function() {
90452               return this.isMultipolygon() ? 'area' : 'relation';
90453           });
90454       },
90455
90456
90457       isDegenerate: function() {
90458           return this.members.length === 0;
90459       },
90460
90461
90462       // Return an array of members, each extended with an 'index' property whose value
90463       // is the member index.
90464       indexedMembers: function() {
90465           var result = new Array(this.members.length);
90466           for (var i = 0; i < this.members.length; i++) {
90467               result[i] = assignIn({}, this.members[i], {index: i});
90468           }
90469           return result;
90470       },
90471
90472
90473       // Return the first member with the given role. A copy of the member object
90474       // is returned, extended with an 'index' property whose value is the member index.
90475       memberByRole: function(role) {
90476           for (var i = 0; i < this.members.length; i++) {
90477               if (this.members[i].role === role) {
90478                   return assignIn({}, this.members[i], {index: i});
90479               }
90480           }
90481       },
90482
90483       // Same as memberByRole, but returns all members with the given role
90484       membersByRole: function(role) {
90485           var result = [];
90486           for (var i = 0; i < this.members.length; i++) {
90487               if (this.members[i].role === role) {
90488                   result.push(assignIn({}, this.members[i], {index: i}));
90489               }
90490           }
90491           return result;
90492       },
90493
90494       // Return the first member with the given id. A copy of the member object
90495       // is returned, extended with an 'index' property whose value is the member index.
90496       memberById: function(id) {
90497           for (var i = 0; i < this.members.length; i++) {
90498               if (this.members[i].id === id) {
90499                   return assignIn({}, this.members[i], {index: i});
90500               }
90501           }
90502       },
90503
90504
90505       // Return the first member with the given id and role. A copy of the member object
90506       // is returned, extended with an 'index' property whose value is the member index.
90507       memberByIdAndRole: function(id, role) {
90508           for (var i = 0; i < this.members.length; i++) {
90509               if (this.members[i].id === id && this.members[i].role === role) {
90510                   return assignIn({}, this.members[i], {index: i});
90511               }
90512           }
90513       },
90514
90515
90516       addMember: function(member, index) {
90517           var members = this.members.slice();
90518           members.splice(index === undefined ? members.length : index, 0, member);
90519           return this.update({members: members});
90520       },
90521
90522
90523       updateMember: function(member, index) {
90524           var members = this.members.slice();
90525           members.splice(index, 1, assignIn({}, members[index], member));
90526           return this.update({members: members});
90527       },
90528
90529
90530       removeMember: function(index) {
90531           var members = this.members.slice();
90532           members.splice(index, 1);
90533           return this.update({members: members});
90534       },
90535
90536
90537       removeMembersWithID: function(id) {
90538           var members = reject(this.members, function(m) { return m.id === id; });
90539           return this.update({members: members});
90540       },
90541
90542
90543       // Wherever a member appears with id `needle.id`, replace it with a member
90544       // with id `replacement.id`, type `replacement.type`, and the original role,
90545       // By default, adding a duplicate member (by id and role) is prevented.
90546       // Return an updated relation.
90547       replaceMember: function(needle, replacement, keepDuplicates) {
90548           if (!this.memberById(needle.id))
90549               return this;
90550
90551           var members = [];
90552
90553           for (var i = 0; i < this.members.length; i++) {
90554               var member = this.members[i];
90555               if (member.id !== needle.id) {
90556                   members.push(member);
90557               } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) {
90558                   members.push({id: replacement.id, type: replacement.type, role: member.role});
90559               }
90560           }
90561
90562           return this.update({members: members});
90563       },
90564
90565
90566       asJXON: function(changeset_id) {
90567           var r = {
90568               relation: {
90569                   '@id': this.osmId(),
90570                   '@version': this.version || 0,
90571                   member: map$3(this.members, function(member) {
90572                       return {
90573                           keyAttributes: {
90574                               type: member.type,
90575                               role: member.role,
90576                               ref: osmEntity$$1.id.toOSM(member.id)
90577                           }
90578                       };
90579                   }),
90580                   tag: map$3(this.tags, function(v, k) {
90581                       return { keyAttributes: { k: k, v: v } };
90582                   })
90583               }
90584           };
90585           if (changeset_id) r.relation['@changeset'] = changeset_id;
90586           return r;
90587       },
90588
90589
90590       asGeoJSON: function(resolver) {
90591           return resolver.transient(this, 'GeoJSON', function () {
90592               if (this.isMultipolygon()) {
90593                   return {
90594                       type: 'MultiPolygon',
90595                       coordinates: this.multipolygon(resolver)
90596                   };
90597               } else {
90598                   return {
90599                       type: 'FeatureCollection',
90600                       properties: this.tags,
90601                       features: this.members.map(function (member) {
90602                           return assignIn({role: member.role}, resolver.entity(member.id).asGeoJSON(resolver));
90603                       })
90604                   };
90605               }
90606           });
90607       },
90608
90609
90610       area: function(resolver) {
90611           return resolver.transient(this, 'area', function() {
90612               return d3_geoArea(this.asGeoJSON(resolver));
90613           });
90614       },
90615
90616
90617       isMultipolygon: function() {
90618           return this.tags.type === 'multipolygon';
90619       },
90620
90621
90622       isComplete: function(resolver) {
90623           for (var i = 0; i < this.members.length; i++) {
90624               if (!resolver.hasEntity(this.members[i].id)) {
90625                   return false;
90626               }
90627           }
90628           return true;
90629       },
90630
90631
90632       isRestriction: function() {
90633           return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
90634       },
90635
90636
90637       isValidRestriction: function() {
90638           if (!this.isRestriction()) return false;
90639
90640           var froms = this.members.filter(function(m) { return m.role === 'from'; });
90641           var vias = this.members.filter(function(m) { return m.role === 'via'; });
90642           var tos = this.members.filter(function(m) { return m.role === 'to'; });
90643
90644           if (froms.length !== 1 && this.tags.restriction !== 'no_entry') return false;
90645           if (froms.some(function(m) { return m.type !== 'way'; })) return false;
90646
90647           if (tos.length !== 1 && this.tags.restriction !== 'no_exit') return false;
90648           if (tos.some(function(m) { return m.type !== 'way'; })) return false;
90649
90650           if (vias.length === 0) return false;
90651           if (vias.length > 1 && vias.some(function(m) { return m.type !== 'way'; })) return false;
90652
90653           return true;
90654       },
90655
90656
90657       // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
90658       // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
90659       //
90660       // This corresponds to the structure needed for rendering a multipolygon path using a
90661       // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
90662       //
90663       // In the case of invalid geometries, this function will still return a result which
90664       // includes the nodes of all way members, but some Nds may be unclosed and some inner
90665       // rings not matched with the intended outer ring.
90666       //
90667       multipolygon: function(resolver) {
90668           var outers = this.members.filter(function(m) { return 'outer' === (m.role || 'outer'); });
90669           var inners = this.members.filter(function(m) { return 'inner' === m.role; });
90670
90671           outers = osmJoinWays(outers, resolver);
90672           inners = osmJoinWays(inners, resolver);
90673
90674           outers = outers.map(function(outer) { return map$3(outer.nodes, 'loc'); });
90675           inners = inners.map(function(inner) { return map$3(inner.nodes, 'loc'); });
90676
90677           var result = outers.map(function(o) {
90678               // Heuristic for detecting counterclockwise winding order. Assumes
90679               // that OpenStreetMap polygons are not hemisphere-spanning.
90680               return [d3_geoArea({ type: 'Polygon', coordinates: [o] }) > 2 * Math.PI ? o.reverse() : o];
90681           });
90682
90683           function findOuter(inner) {
90684               var o, outer;
90685
90686               for (o = 0; o < outers.length; o++) {
90687                   outer = outers[o];
90688                   if (geoPolygonContainsPolygon(outer, inner))
90689                       return o;
90690               }
90691
90692               for (o = 0; o < outers.length; o++) {
90693                   outer = outers[o];
90694                   if (geoPolygonIntersectsPolygon(outer, inner, false))
90695                       return o;
90696               }
90697           }
90698
90699           for (var i = 0; i < inners.length; i++) {
90700               var inner = inners[i];
90701
90702               if (d3_geoArea({ type: 'Polygon', coordinates: [inner] }) < 2 * Math.PI) {
90703                   inner = inner.reverse();
90704               }
90705
90706               var o = findOuter(inners[i]);
90707               if (o !== undefined)
90708                   result[o].push(inners[i]);
90709               else
90710                   result.push([inners[i]]); // Invalid geometry
90711           }
90712
90713           return result;
90714       }
90715   });
90716
90717   function osmTurn(turn) {
90718       if (!(this instanceof osmTurn)) {
90719           return new osmTurn(turn);
90720       }
90721       assignIn(this, turn);
90722   }
90723
90724
90725   function osmIntersection(graph, startVertexId, maxDistance) {
90726       maxDistance = maxDistance || 30;    // in meters
90727       var vgraph = coreGraph$$1();           // virtual graph
90728       var i, j, k;
90729
90730
90731       function memberOfRestriction(entity) {
90732           return graph.parentRelations(entity)
90733               .some(function(r) { return r.isRestriction(); });
90734       }
90735
90736       function isRoad(way) {
90737           if (way.isArea() || way.isDegenerate()) return false;
90738           var roads = {
90739               'motorway': true,
90740               'motorway_link': true,
90741               'trunk': true,
90742               'trunk_link': true,
90743               'primary': true,
90744               'primary_link': true,
90745               'secondary': true,
90746               'secondary_link': true,
90747               'tertiary': true,
90748               'tertiary_link': true,
90749               'residential': true,
90750               'unclassified': true,
90751               'living_street': true,
90752               'service': true,
90753               'road': true,
90754               'track': true
90755           };
90756           return roads[way.tags.highway];
90757       }
90758
90759
90760       var startNode = graph.entity(startVertexId);
90761       var checkVertices = [startNode];
90762       var checkWays;
90763       var vertices = [];
90764       var vertexIds = [];
90765       var vertex;
90766       var ways = [];
90767       var wayIds = [];
90768       var way;
90769       var nodes = [];
90770       var node;
90771       var parents = [];
90772       var parent;
90773
90774       // `actions` will store whatever actions must be performed to satisfy
90775       // preconditions for adding a turn restriction to this intersection.
90776       //  - Remove any existing degenerate turn restrictions (missing from/to, etc)
90777       //  - Reverse oneways so that they are drawn in the forward direction
90778       //  - Split ways on key vertices
90779       var actions = [];
90780
90781
90782       // STEP 1:  walk the graph outwards from starting vertex to search
90783       //  for more key vertices and ways to include in the intersection..
90784
90785       while (checkVertices.length) {
90786           vertex = checkVertices.pop();
90787
90788           // check this vertex for parent ways that are roads
90789           checkWays = graph.parentWays(vertex);
90790           var hasWays = false;
90791           for (i = 0; i < checkWays.length; i++) {
90792               way = checkWays[i];
90793               if (!isRoad(way) && !memberOfRestriction(way)) continue;
90794
90795               ways.push(way);   // it's a road, or it's already in a turn restriction
90796               hasWays = true;
90797
90798               // check the way's children for more key vertices
90799               nodes = uniq(graph.childNodes(way));
90800               for (j = 0; j < nodes.length; j++) {
90801                   node = nodes[j];
90802                   if (node === vertex) continue;                                           // same thing
90803                   if (vertices.indexOf(node) !== -1) continue;                             // seen it already
90804                   if (node.loc && startNode.loc &&
90805                       geoSphericalDistance(node.loc, startNode.loc) > maxDistance) continue;   // too far from start
90806
90807                   // a key vertex will have parents that are also roads
90808                   var hasParents = false;
90809                   parents = graph.parentWays(node);
90810                   for (k = 0; k < parents.length; k++) {
90811                       parent = parents[k];
90812                       if (parent === way) continue;                 // same thing
90813                       if (ways.indexOf(parent) !== -1) continue;    // seen it already
90814                       if (!isRoad(parent)) continue;                // not a road
90815                       hasParents = true;
90816                       break;
90817                   }
90818
90819                   if (hasParents) {
90820                       checkVertices.push(node);
90821                   }
90822               }
90823           }
90824
90825           if (hasWays) {
90826               vertices.push(vertex);
90827           }
90828       }
90829
90830       vertices = uniq(vertices);
90831       ways = uniq(ways);
90832
90833
90834       // STEP 2:  Build a virtual graph containing only the entities in the intersection..
90835       // Everything done after this step should act on the virtual graph
90836       // Any actions that must be performed later to the main graph go in `actions` array
90837       ways.forEach(function(way) {
90838           graph.childNodes(way).forEach(function(node) {
90839               vgraph = vgraph.replace(node);
90840           });
90841
90842           vgraph = vgraph.replace(way);
90843
90844           graph.parentRelations(way).forEach(function(relation) {
90845               if (relation.isRestriction()) {
90846                   if (relation.isValidRestriction(graph)) {
90847                       vgraph = vgraph.replace(relation);
90848                   } else if (relation.isComplete(graph)) {
90849                       actions.push(actionDeleteRelation(relation.id));
90850                   }
90851               }
90852           });
90853       });
90854
90855
90856       // STEP 3:  Force all oneways to be drawn in the forward direction
90857       ways.forEach(function(w) {
90858           var way = vgraph.entity(w.id);
90859           if (way.tags.oneway === '-1') {
90860               var action = actionReverse(way.id, { reverseOneway: true });
90861               actions.push(action);
90862               vgraph = action(vgraph);
90863           }
90864       });
90865
90866
90867       // STEP 4:  Split ways on key vertices
90868       var origCount = osmEntity$$1.id.next.way;
90869       vertices.forEach(function(v) {
90870           // This is an odd way to do it, but we need to find all the ways that
90871           // will be split here, then split them one at a time to ensure that these
90872           // actions can be replayed on the main graph exactly in the same order.
90873           // (It is unintuitive, but the order of ways returned from graph.parentWays()
90874           // is arbitrary, depending on how the main graph and vgraph were built)
90875           var splitAll = actionSplit(v.id);
90876           if (!splitAll.disabled(vgraph)) {
90877               splitAll.ways(vgraph).forEach(function(way) {
90878                   var splitOne = actionSplit(v.id).limitWays([way.id]);
90879                   actions.push(splitOne);
90880                   vgraph = splitOne(vgraph);
90881               });
90882           }
90883       });
90884
90885       // In here is where we should also split the intersection at nearby junction.
90886       //   for https://github.com/mapbox/iD-internal/issues/31
90887       // nearbyVertices.forEach(function(v) {
90888       // });
90889
90890       // Reasons why we reset the way id count here:
90891       //  1. Continuity with way ids created by the splits so that we can replay
90892       //     these actions later if the user decides to create a turn restriction
90893       //  2. Avoids churning way ids just by hovering over a vertex
90894       //     and displaying the turn restriction editor
90895       osmEntity$$1.id.next.way = origCount;
90896
90897
90898       // STEP 5:  Update arrays to point to vgraph entities
90899       vertexIds = vertices.map(function(v) { return v.id; });
90900       vertices = [];
90901       ways = [];
90902
90903       vertexIds.forEach(function(id) {
90904           var vertex = vgraph.entity(id);
90905           var parents = vgraph.parentWays(vertex);
90906           vertices.push(vertex);
90907           ways = ways.concat(parents);
90908       });
90909
90910       vertices = uniq(vertices);
90911       ways = uniq(ways);
90912
90913       vertexIds = vertices.map(function(v) { return v.id; });
90914       wayIds = ways.map(function(w) { return w.id; });
90915
90916
90917       // STEP 6:  Update the ways with some metadata that will be useful for
90918       // walking the intersection graph later and rendering turn arrows.
90919
90920       function withMetadata(way, vertexIds) {
90921           var __oneWay = way.isOneWay();
90922
90923           // which affixes are key vertices?
90924           var __first = (vertexIds.indexOf(way.first()) !== -1);
90925           var __last = (vertexIds.indexOf(way.last()) !== -1);
90926
90927           // what roles is this way eligible for?
90928           var __via = (__first && __last);
90929           var __from = ((__first && !__oneWay) || __last);
90930           var __to = (__first || (__last && !__oneWay));
90931
90932           return way.update({
90933               __first:  __first,
90934               __last:  __last,
90935               __from:  __from,
90936               __via: __via,
90937               __to:  __to,
90938               __oneWay:  __oneWay
90939           });
90940       }
90941
90942       ways = [];
90943       wayIds.forEach(function(id) {
90944           var way = withMetadata(vgraph.entity(id), vertexIds);
90945           vgraph = vgraph.replace(way);
90946           ways.push(way);
90947       });
90948
90949
90950       // STEP 7:  Simplify - This is an iterative process where we:
90951       //  1. Find trivial vertices with only 2 parents
90952       //  2. trim off the leaf way from those vertices and remove from vgraph
90953
90954       var keepGoing;
90955       var removeWayIds = [];
90956       var removeVertexIds = [];
90957
90958       do {
90959           keepGoing = false;
90960           checkVertices = vertexIds.slice();
90961
90962           for (i = 0; i < checkVertices.length; i++) {
90963               var vertexId = checkVertices[i];
90964               vertex = vgraph.hasEntity(vertexId);
90965
90966               if (!vertex) {
90967                   if (vertexIds.indexOf(vertexId) !== -1) {
90968                       vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
90969                   }
90970                   removeVertexIds.push(vertexId);
90971                   continue;
90972               }
90973
90974               parents = vgraph.parentWays(vertex);
90975               if (parents.length < 3) {
90976                   if (vertexIds.indexOf(vertexId) !== -1) {
90977                       vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
90978                   }
90979               }
90980
90981               if (parents.length === 2) {     // vertex with 2 parents is trivial
90982                   var a = parents[0];
90983                   var b = parents[1];
90984                   var aIsLeaf = a && !a.__via;
90985                   var bIsLeaf = b && !b.__via;
90986                   var leaf, survivor;
90987
90988                   if (aIsLeaf && !bIsLeaf) {
90989                       leaf = a;
90990                       survivor = b;
90991                   } else if (!aIsLeaf && bIsLeaf) {
90992                       leaf = b;
90993                       survivor = a;
90994                   }
90995
90996                   if (leaf && survivor) {
90997                       survivor = withMetadata(survivor, vertexIds);      // update survivor way
90998                       vgraph = vgraph.replace(survivor).remove(leaf);    // update graph
90999                       removeWayIds.push(leaf.id);
91000                       keepGoing = true;
91001                   }
91002               }
91003
91004               parents = vgraph.parentWays(vertex);
91005
91006               if (parents.length < 2) {     // vertex is no longer a key vertex
91007                   if (vertexIds.indexOf(vertexId) !== -1) {
91008                       vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
91009                   }
91010                   removeVertexIds.push(vertexId);
91011                   keepGoing = true;
91012               }
91013
91014               if (parents.length < 1) {     // vertex is no longer attached to anything
91015                   vgraph = vgraph.remove(vertex);
91016               }
91017
91018           }
91019       } while (keepGoing);
91020
91021
91022       vertices = vertices
91023           .filter(function(vertex) { return removeVertexIds.indexOf(vertex.id) === -1; })
91024           .map(function(vertex) { return vgraph.entity(vertex.id); });
91025       ways = ways
91026           .filter(function(way) { return removeWayIds.indexOf(way.id) === -1; })
91027           .map(function(way) { return vgraph.entity(way.id); });
91028
91029
91030       // OK!  Here is our intersection..
91031       var intersection = {
91032           graph: vgraph,
91033           actions: actions,
91034           vertices: vertices,
91035           ways: ways,
91036       };
91037
91038
91039
91040       // Get all the valid turns through this intersection given a starting way id.
91041       // This operates on the virtual graph for everything.
91042       //
91043       // Basically, walk through all possible paths from starting way,
91044       //   honoring the existing turn restrictions as we go (watch out for loops!)
91045       //
91046       // For each path found, generate and return a `osmTurn` datastructure.
91047       //
91048       intersection.turns = function(fromWayId, maxViaWay) {
91049           if (!fromWayId) return [];
91050           if (!maxViaWay) maxViaWay = 0;
91051
91052           var vgraph = intersection.graph;
91053           var keyVertexIds = intersection.vertices.map(function(v) { return v.id; });
91054
91055           var start = vgraph.entity(fromWayId);
91056           if (!start || !(start.__from || start.__via)) return [];
91057
91058           // maxViaWay=0   from-*-to              (0 vias)
91059           // maxViaWay=1   from-*-via-*-to        (1 via max)
91060           // maxViaWay=2   from-*-via-*-via-*-to  (2 vias max)
91061           var maxPathLength = (maxViaWay * 2) + 3;
91062           var turns = [];
91063
91064           step(start);
91065           return turns;
91066
91067
91068           // traverse the intersection graph and find all the valid paths
91069           function step(entity, currPath, currRestrictions, matchedRestriction) {
91070               currPath = clone(currPath || []);
91071               if (currPath.length >= maxPathLength) return;
91072               currPath.push(entity.id);
91073               currRestrictions = clone(currRestrictions || []);
91074               var i, j;
91075
91076               if (entity.type === 'node') {
91077                   var parents = vgraph.parentWays(entity);
91078                   var nextWays = [];
91079
91080                   // which ways can we step into?
91081                   for (i = 0; i < parents.length; i++) {
91082                       var way = parents[i];
91083
91084                       // if next way is a oneway incoming to this vertex, skip
91085                       if (way.__oneWay && way.nodes[0] !== entity.id) continue;
91086
91087                       // if we have seen it before (allowing for an initial u-turn), skip
91088                       if (currPath.indexOf(way.id) !== -1 && currPath.length >= 3) continue;
91089
91090                       // Check all "current" restrictions (where we've already walked the `FROM`)
91091                       var restrict = undefined;
91092                       for (j = 0; j < currRestrictions.length; j++) {
91093                           var restriction = currRestrictions[j];
91094                           var f = restriction.memberByRole('from');
91095                           var v = restriction.membersByRole('via');
91096                           var t = restriction.memberByRole('to');
91097                           var isOnly = /^only_/.test(restriction.tags.restriction);
91098
91099                           // Does the current path match this turn restriction?
91100                           var matchesFrom = (f.id === fromWayId);
91101                           var matchesViaTo = false;
91102                           var isAlongOnlyPath = false;
91103
91104                           if (t.id === way.id) {     // match TO
91105
91106                               if (v.length === 1 && v[0].type === 'node') {    // match VIA node
91107                                   matchesViaTo = (v[0].id === entity.id && (
91108                                       (matchesFrom && currPath.length === 2) ||
91109                                       (!matchesFrom && currPath.length > 2)
91110                                   ));
91111
91112                               } else {                                         // match all VIA ways
91113                                   var pathVias = [];
91114                                   for (k = 2; k < currPath.length; k +=2 ) {   // k = 2 skips FROM
91115                                       pathVias.push(currPath[k]);              // (path goes way-node-way...)
91116                                   }
91117                                   var restrictionVias = [];
91118                                   for (k = 0; k < v.length; k++) {
91119                                       if (v[k].type === 'way') {
91120                                           restrictionVias.push(v[k].id);
91121                                       }
91122                                   }
91123                                   var diff = difference(pathVias, restrictionVias);
91124                                   matchesViaTo = !diff.length;
91125                               }
91126
91127                           } else if (isOnly) {
91128                               for (k = 0; k < v.length; k++) {
91129                                   // way doesn't match TO, but is one of the via ways along the path of an "only"
91130                                   if (v[k].type === 'way' && v[k].id === way.id) {
91131                                       isAlongOnlyPath = true;
91132                                       break;
91133                                   }
91134                               }
91135                           }
91136
91137                           if (matchesViaTo) {
91138                               if (isOnly) {
91139                                   restrict = { id: restriction.id, direct: matchesFrom, from: f.id, only: true, end: true };
91140                               } else {
91141                                   restrict = { id: restriction.id, direct: matchesFrom, from: f.id, no: true, end: true };
91142                               }
91143                           } else {    // indirect - caused by a different nearby restriction
91144                               if (isAlongOnlyPath) {
91145                                   restrict = { id: restriction.id, direct: false, from: f.id, only: true, end: false };
91146                               } else if (isOnly) {
91147                                   restrict = { id: restriction.id, direct: false, from: f.id, no: true, end: true };
91148                               }
91149                           }
91150
91151                           // stop looking if we find a "direct" restriction (matching FROM, VIA, TO)
91152                           if (restrict && restrict.direct)
91153                               break;
91154                       }
91155
91156                       nextWays.push({ way: way, restrict: restrict });
91157                   }
91158
91159                   nextWays.forEach(function(nextWay) {
91160                       step(nextWay.way, currPath, currRestrictions, nextWay.restrict);
91161                   });
91162
91163
91164               } else {  // entity.type === 'way'
91165                   if (currPath.length >= 3) {     // this is a "complete" path..
91166                       var turnPath = clone(currPath);
91167
91168                       // an indirect restriction - only include the partial path (starting at FROM)
91169                       if (matchedRestriction && matchedRestriction.direct === false) {
91170                           for (i = 0; i < turnPath.length; i++) {
91171                               if (turnPath[i] === matchedRestriction.from) {
91172                                   turnPath = turnPath.slice(i);
91173                                   break;
91174                               }
91175                           }
91176                       }
91177
91178                       var turn = pathToTurn(turnPath);
91179                       if (turn) {
91180                           if (matchedRestriction) {
91181                               turn.restrictionID = matchedRestriction.id;
91182                               turn.no = matchedRestriction.no;
91183                               turn.only = matchedRestriction.only;
91184                               turn.direct = matchedRestriction.direct;
91185                           }
91186                           turns.push(osmTurn(turn));
91187                       }
91188
91189                       if (currPath[0] === currPath[2]) return;   // if we made a u-turn - stop here
91190                   }
91191
91192                   if (matchedRestriction && matchedRestriction.end) return;  // don't advance any further
91193
91194                   // which nodes can we step into?
91195                   var n1 = vgraph.entity(entity.first());
91196                   var n2 = vgraph.entity(entity.last());
91197                   var dist = n1.loc && n2.loc && geoSphericalDistance(n1.loc, n2.loc);
91198                   var nextNodes = [];
91199
91200                   if (currPath.length > 1) {
91201                       if (dist > maxDistance) return;   // the next node is too far
91202                       if (!entity.__via) return;        // this way is a leaf / can't be a via
91203                   }
91204
91205                   if (!entity.__oneWay &&                     // bidirectional..
91206                       keyVertexIds.indexOf(n1.id) !== -1 &&   // key vertex..
91207                       currPath.indexOf(n1.id) === -1) {       // haven't seen it yet..
91208                       nextNodes.push(n1);                     // can advance to first node
91209                   }
91210                   if (keyVertexIds.indexOf(n2.id) !== -1 &&   // key vertex..
91211                       currPath.indexOf(n2.id) === -1) {       // haven't seen it yet..
91212                       nextNodes.push(n2);                     // can advance to last node
91213                   }
91214
91215                   nextNodes.forEach(function(nextNode) {
91216                       // gather restrictions FROM this way
91217                       var fromRestrictions = vgraph.parentRelations(entity).filter(function(r) {
91218                           if (!r.isRestriction()) return false;
91219
91220                           var f = r.memberByRole('from');
91221                           if (!f || f.id !== entity.id) return false;
91222
91223                           var isOnly = /^only_/.test(r.tags.restriction);
91224                           if (!isOnly) return true;
91225
91226                           // `only_` restrictions only matter along the direction of the VIA - #4849
91227                           var isOnlyVia = false;
91228                           var v = r.membersByRole('via');
91229                           if (v.length === 1 && v[0].type === 'node') {   // via node
91230                               isOnlyVia = (v[0].id === nextNode.id);
91231                           } else {                                        // via way(s)
91232                               for (var i = 0; i < v.length; i++) {
91233                                   if (v[i].type !== 'way') continue;
91234                                   var viaWay = vgraph.entity(v[i].id);
91235                                   if (viaWay.first() === nextNode.id || viaWay.last() === nextNode.id) {
91236                                       isOnlyVia = true;
91237                                       break;
91238                                   }
91239                               }
91240                           }
91241                           return isOnlyVia;
91242                       });
91243
91244                       step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false);
91245                   });
91246               }
91247           }
91248
91249
91250           // assumes path is alternating way-node-way of odd length
91251           function pathToTurn(path) {
91252               if (path.length < 3) return;
91253               var fromWayId, fromNodeId, fromVertexId;
91254               var toWayId, toNodeId, toVertexId;
91255               var viaWayIds, viaNodeId, isUturn;
91256
91257               fromWayId = path[0];
91258               toWayId = path[path.length - 1];
91259
91260               if (path.length === 3 && fromWayId === toWayId) {  // u turn
91261                   var way = vgraph.entity(fromWayId);
91262                   if (way.__oneWay) return null;
91263
91264                   isUturn = true;
91265                   viaNodeId = fromVertexId = toVertexId = path[1];
91266                   fromNodeId = toNodeId = adjacentNode(fromWayId, viaNodeId);
91267
91268               } else {
91269                   isUturn = false;
91270                   fromVertexId = path[1];
91271                   fromNodeId = adjacentNode(fromWayId, fromVertexId);
91272                   toVertexId = path[path.length - 2];
91273                   toNodeId = adjacentNode(toWayId, toVertexId);
91274
91275                   if (path.length === 3) {
91276                       viaNodeId = path[1];
91277                   } else {
91278                       viaWayIds = path.filter(function(entityId) { return entityId[0] === 'w'; });
91279                       viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1);  // remove first, last
91280                   }
91281               }
91282
91283               return {
91284                   key:  path.join('_'),
91285                   path: path,
91286                   from: { node: fromNodeId, way:  fromWayId, vertex: fromVertexId },
91287                   via:  { node: viaNodeId,  ways: viaWayIds },
91288                   to:   { node: toNodeId,   way:  toWayId, vertex: toVertexId },
91289                   u:    isUturn
91290               };
91291
91292
91293               function adjacentNode(wayId, affixId) {
91294                   var nodes = vgraph.entity(wayId).nodes;
91295                   return affixId === nodes[0] ? nodes[1] : nodes[nodes.length - 2];
91296               }
91297           }
91298
91299       };
91300
91301       return intersection;
91302   }
91303
91304
91305   function osmInferRestriction(graph, turn, projection) {
91306       var fromWay = graph.entity(turn.from.way);
91307       var fromNode = graph.entity(turn.from.node);
91308       var fromVertex = graph.entity(turn.from.vertex);
91309       var toWay = graph.entity(turn.to.way);
91310       var toNode = graph.entity(turn.to.node);
91311       var toVertex = graph.entity(turn.to.vertex);
91312
91313       var fromOneWay = (fromWay.tags.oneway === 'yes');
91314       var toOneWay = (toWay.tags.oneway === 'yes');
91315       var angle = (geoAngle(fromVertex, fromNode, projection) -
91316                   geoAngle(toVertex, toNode, projection)) * 180 / Math.PI;
91317
91318       while (angle < 0)
91319           angle += 360;
91320
91321       if (fromNode === toNode)
91322           return 'no_u_turn';
91323       if ((angle < 23 || angle > 336) && fromOneWay && toOneWay)
91324           return 'no_u_turn';   // wider tolerance for u-turn if both ways are oneway
91325       if ((angle < 40 || angle > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex)
91326           return 'no_u_turn';   // even wider tolerance for u-turn if there is a via way (from !== to)
91327       if (angle < 158)
91328           return 'no_right_turn';
91329       if (angle > 202)
91330           return 'no_left_turn';
91331
91332       return 'no_straight_on';
91333   }
91334
91335   function actionAddMember(relationId, member, memberIndex, insertPair) {
91336
91337       return function action(graph) {
91338           var relation = graph.entity(relationId);
91339
91340           // There are some special rules for Public Transport v2 routes.
91341           var isPTv2 = /stop|platform/.test(member.role);
91342
91343           if ((isNaN(memberIndex) || insertPair) && member.type === 'way' && !isPTv2) {
91344               // Try to perform sensible inserts based on how the ways join together
91345               graph = addWayMember(relation, graph);
91346           } else {
91347               // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
91348               // Stops and Platforms for PTv2 should be ordered first.
91349               // hack: We do not currently have the ability to place them in the exactly correct order.
91350               if (isPTv2 && isNaN(memberIndex)) {
91351                   memberIndex = 0;
91352               }
91353
91354               graph = graph.replace(relation.addMember(member, memberIndex));
91355           }
91356
91357           return graph;
91358       };
91359
91360
91361       // Add a way member into the relation "wherever it makes sense".
91362       // In this situation we were not supplied a memberIndex.
91363       function addWayMember(relation, graph) {
91364           var groups, tempWay, item, i, j, k;
91365
91366           // remove PTv2 stops and platforms before doing anything.
91367           var PTv2members = [];
91368           var members = [];
91369           for (i = 0; i < relation.members.length; i++) {
91370               var m = relation.members[i];
91371               if (/stop|platform/.test(m.role)) {
91372                   PTv2members.push(m);
91373               } else {
91374                   members.push(m);
91375               }
91376           }
91377           relation = relation.update({ members: members });
91378
91379
91380           if (insertPair) {
91381               // We're adding a member that must stay paired with an existing member.
91382               // (This feature is used by `actionSplit`)
91383               //
91384               // This is tricky because the members may exist multiple times in the
91385               // member list, and with different A-B/B-A ordering and different roles.
91386               // (e.g. a bus route that loops out and back - #4589).
91387               //
91388               // Replace the existing member with a temporary way,
91389               // so that `osmJoinWays` can treat the pair like a single way.
91390               tempWay = osmWay({ id: 'wTemp', nodes: insertPair.nodes });
91391               graph = graph.replace(tempWay);
91392               var tempMember = { id: tempWay.id, type: 'way', role: member.role };
91393               var tempRelation = relation.replaceMember({id: insertPair.originalID}, tempMember, true);
91394               groups = groupBy(tempRelation.members, function(m) { return m.type; });
91395               groups.way = groups.way || [];
91396
91397           } else {
91398               // Add the member anywhere, one time. Just push and let `osmJoinWays` decide where to put it.
91399               groups = groupBy(relation.members, function(m) { return m.type; });
91400               groups.way = groups.way || [];
91401               groups.way.push(member);
91402           }
91403
91404           members = withIndex(groups.way);
91405           var joined = osmJoinWays(members, graph);
91406
91407           // `joined` might not contain all of the way members,
91408           // But will contain only the completed (downloaded) members
91409           for (i = 0; i < joined.length; i++) {
91410               var segment = joined[i];
91411               var nodes = segment.nodes.slice();
91412               var startIndex = segment[0].index;
91413
91414               // j = array index in `members` where this segment starts
91415               for (j = 0; j < members.length; j++) {
91416                   if (members[j].index === startIndex) {
91417                       break;
91418                   }
91419               }
91420
91421               // k = each member in segment
91422               for (k = 0; k < segment.length; k++) {
91423                   item = segment[k];
91424                   var way = graph.entity(item.id);
91425
91426                   // If this is a paired item, generate members in correct order and role
91427                   if (tempWay && item.id === tempWay.id) {
91428                       if (nodes[0].id === insertPair.nodes[0]) {
91429                           item.pair = [
91430                               { id: insertPair.originalID, type: 'way', role: item.role },
91431                               { id: insertPair.insertedID, type: 'way', role: item.role }
91432                           ];
91433                       } else {
91434                           item.pair = [
91435                               { id: insertPair.insertedID, type: 'way', role: item.role },
91436                               { id: insertPair.originalID, type: 'way', role: item.role }
91437                           ];
91438                       }
91439                   }
91440
91441                   // reorder `members` if necessary
91442                   if (k > 0) {
91443                       if (j+k >= members.length || item.index !== members[j+k].index) {
91444                           moveMember(members, item.index, j+k);
91445                       }
91446                   }
91447
91448                   nodes.splice(0, way.nodes.length - 1);
91449               }
91450           }
91451
91452           if (tempWay) {
91453               graph = graph.remove(tempWay);
91454           }
91455
91456           // Final pass: skip dead items, split pairs, remove index properties
91457           var wayMembers = [];
91458           for (i = 0; i < members.length; i++) {
91459               item = members[i];
91460               if (item.index === -1) continue;
91461
91462               if (item.pair) {
91463                   wayMembers.push(item.pair[0]);
91464                   wayMembers.push(item.pair[1]);
91465               } else {
91466                   wayMembers.push(omit(item, 'index'));
91467               }
91468           }
91469
91470           // Put stops and platforms first, then nodes, ways, relations
91471           // This is recommended for Public Transport v2 routes:
91472           // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
91473           var newMembers = PTv2members.concat( (groups.node || []), wayMembers, (groups.relation || []) );
91474
91475           return graph.replace(relation.update({members: newMembers}));
91476
91477
91478           // `moveMember()` changes the `members` array in place by splicing
91479           // the item with `.index = findIndex` to where it belongs,
91480           // and marking the old position as "dead" with `.index = -1`
91481           //
91482           // j=5, k=0                jk
91483           // segment                 5 4 7 6
91484           // members       0 1 2 3 4 5 6 7 8 9        keep 5 in j+k
91485           //
91486           // j=5, k=1                j k
91487           // segment                 5 4 7 6
91488           // members       0 1 2 3 4 5 6 7 8 9        move 4 to j+k
91489           // members       0 1 2 3 x 5 4 6 7 8 9      moved
91490           //
91491           // j=5, k=2                j   k
91492           // segment                 5 4 7 6
91493           // members       0 1 2 3 x 5 4 6 7 8 9      move 7 to j+k
91494           // members       0 1 2 3 x 5 4 7 6 x 8 9    moved
91495           //
91496           // j=5, k=3                j     k
91497           // segment                 5 4 7 6
91498           // members       0 1 2 3 x 5 4 7 6 x 8 9    keep 6 in j+k
91499           //
91500           function moveMember(arr, findIndex, toIndex) {
91501               for (var i = 0; i < arr.length; i++) {
91502                   if (arr[i].index === findIndex) {
91503                       break;
91504                   }
91505               }
91506
91507               var item = clone(arr[i]);
91508               arr[i].index = -1;   // mark as dead
91509               item.index = toIndex;
91510               arr.splice(toIndex, 0, item);
91511           }
91512
91513
91514           // This is the same as `Relation.indexedMembers`,
91515           // Except we don't want to index all the members, only the ways
91516           function withIndex(arr) {
91517               var result = new Array(arr.length);
91518               for (var i = 0; i < arr.length; i++) {
91519                   result[i] = clone(arr[i]);
91520                   result[i].index = i;
91521               }
91522               return result;
91523           }
91524       }
91525
91526   }
91527
91528   function actionAddMidpoint(midpoint, node) {
91529       return function(graph) {
91530           graph = graph.replace(node.move(midpoint.loc));
91531
91532           var parents = intersection(
91533               graph.parentWays(graph.entity(midpoint.edge[0])),
91534               graph.parentWays(graph.entity(midpoint.edge[1])));
91535
91536           parents.forEach(function(way) {
91537               for (var i = 0; i < way.nodes.length - 1; i++) {
91538                   if (geoEdgeEqual([way.nodes[i], way.nodes[i + 1]], midpoint.edge)) {
91539                       graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1));
91540
91541                       // Add only one midpoint on doubled-back segments,
91542                       // turning them into self-intersections.
91543                       return;
91544                   }
91545               }
91546           });
91547
91548           return graph;
91549       };
91550   }
91551
91552   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as
91553   function actionAddVertex(wayId, nodeId, index) {
91554       return function(graph) {
91555           return graph.replace(graph.entity(wayId).addNode(nodeId, index));
91556       };
91557   }
91558
91559   function actionChangeMember(relationId, member, memberIndex) {
91560       return function(graph) {
91561           return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
91562       };
91563   }
91564
91565   function actionChangePreset(entityID, oldPreset, newPreset) {
91566       return function action(graph) {
91567           var entity = graph.entity(entityID);
91568           var geometry = entity.geometry(graph);
91569           var tags = entity.tags;
91570
91571           if (oldPreset) tags = oldPreset.unsetTags(tags, geometry);
91572           if (newPreset) tags = newPreset.setTags(tags, geometry);
91573
91574           return graph.replace(entity.update({tags: tags}));
91575       };
91576   }
91577
91578   function actionChangeTags(entityId, tags) {
91579       return function(graph) {
91580           var entity = graph.entity(entityId);
91581           return graph.replace(entity.update({tags: tags}));
91582       };
91583   }
91584
91585   function actionCircularize(wayId, projection, maxAngle) {
91586       maxAngle = (maxAngle || 20) * Math.PI / 180;
91587
91588
91589       var action = function(graph, t) {
91590           if (t === null || !isFinite(t)) t = 1;
91591           t = Math.min(Math.max(+t, 0), 1);
91592
91593           var way = graph.entity(wayId),
91594               origNodes = {};
91595
91596           graph.childNodes(way).forEach(function(node) {
91597               if (!origNodes[node.id]) origNodes[node.id] = node;
91598           });
91599
91600           if (!way.isConvex(graph)) {
91601               graph = action.makeConvex(graph);
91602           }
91603
91604           var nodes = uniq(graph.childNodes(way)),
91605               keyNodes = nodes.filter(function(n) { return graph.parentWays(n).length !== 1; }),
91606               points = nodes.map(function(n) { return projection(n.loc); }),
91607               keyPoints = keyNodes.map(function(n) { return projection(n.loc); }),
91608               centroid = (points.length === 2) ? geoVecInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points),
91609               radius = d3_median(points, function(p) { return geoVecLength(centroid, p); }),
91610               sign = d3_polygonArea(points) > 0 ? 1 : -1,
91611               ids;
91612
91613           // we need atleast two key nodes for the algorithm to work
91614           if (!keyNodes.length) {
91615               keyNodes = [nodes[0]];
91616               keyPoints = [points[0]];
91617           }
91618
91619           if (keyNodes.length === 1) {
91620               var index = nodes.indexOf(keyNodes[0]),
91621                   oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
91622
91623               keyNodes.push(nodes[oppositeIndex]);
91624               keyPoints.push(points[oppositeIndex]);
91625           }
91626
91627           // key points and nodes are those connected to the ways,
91628           // they are projected onto the circle, inbetween nodes are moved
91629           // to constant intervals between key nodes, extra inbetween nodes are
91630           // added if necessary.
91631           for (var i = 0; i < keyPoints.length; i++) {
91632               var nextKeyNodeIndex = (i + 1) % keyNodes.length,
91633                   startNode = keyNodes[i],
91634                   endNode = keyNodes[nextKeyNodeIndex],
91635                   startNodeIndex = nodes.indexOf(startNode),
91636                   endNodeIndex = nodes.indexOf(endNode),
91637                   numberNewPoints = -1,
91638                   indexRange = endNodeIndex - startNodeIndex,
91639                   nearNodes = {},
91640                   inBetweenNodes = [],
91641                   startAngle, endAngle, totalAngle, eachAngle,
91642                   angle, loc, node, origNode, j;
91643
91644               if (indexRange < 0) {
91645                   indexRange += nodes.length;
91646               }
91647
91648               // position this key node
91649               var distance = geoVecLength(centroid, keyPoints[i]);
91650               if (distance === 0) { distance = 1e-4; }
91651               keyPoints[i] = [
91652                   centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius,
91653                   centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius
91654               ];
91655               loc = projection.invert(keyPoints[i]);
91656               node = keyNodes[i];
91657               origNode = origNodes[node.id];
91658               node = node.move(geoVecInterp(origNode.loc, loc, t));
91659               graph = graph.replace(node);
91660
91661               // figure out the between delta angle we want to match to
91662               startAngle = Math.atan2(keyPoints[i][1] - centroid[1], keyPoints[i][0] - centroid[0]);
91663               endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
91664               totalAngle = endAngle - startAngle;
91665
91666               // detects looping around -pi/pi
91667               if (totalAngle * sign > 0) {
91668                   totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle));
91669               }
91670
91671               do {
91672                   numberNewPoints++;
91673                   eachAngle = totalAngle / (indexRange + numberNewPoints);
91674               } while (Math.abs(eachAngle) > maxAngle);
91675
91676
91677               // move existing nodes
91678               for (j = 1; j < indexRange; j++) {
91679                   angle = startAngle + j * eachAngle;
91680                   loc = projection.invert([
91681                       centroid[0] + Math.cos(angle) * radius,
91682                       centroid[1] + Math.sin(angle) * radius
91683                   ]);
91684
91685                   node = nodes[(j + startNodeIndex) % nodes.length];
91686                   origNode = origNodes[node.id];
91687                   nearNodes[node.id] = angle;
91688
91689                   node = node.move(geoVecInterp(origNode.loc, loc, t));
91690                   graph = graph.replace(node);
91691               }
91692
91693               // add new inbetween nodes if necessary
91694               for (j = 0; j < numberNewPoints; j++) {
91695                   angle = startAngle + (indexRange + j) * eachAngle;
91696                   loc = projection.invert([
91697                       centroid[0] + Math.cos(angle) * radius,
91698                       centroid[1] + Math.sin(angle) * radius
91699                   ]);
91700
91701                   // choose a nearnode to use as the original
91702                   var min$$1 = Infinity;
91703                   for (var nodeId in nearNodes) {
91704                       var nearAngle = nearNodes[nodeId],
91705                           dist = Math.abs(nearAngle - angle);
91706                       if (dist < min$$1) {
91707                           dist = min$$1;
91708                           origNode = origNodes[nodeId];
91709                       }
91710                   }
91711
91712                   node = osmNode({ loc: geoVecInterp(origNode.loc, loc, t) });
91713                   graph = graph.replace(node);
91714
91715                   nodes.splice(endNodeIndex + j, 0, node);
91716                   inBetweenNodes.push(node.id);
91717               }
91718
91719               // Check for other ways that share these keyNodes..
91720               // If keyNodes are adjacent in both ways,
91721               // we can add inBetween nodes to that shared way too..
91722               if (indexRange === 1 && inBetweenNodes.length) {
91723                   var startIndex1 = way.nodes.lastIndexOf(startNode.id),
91724                       endIndex1 = way.nodes.lastIndexOf(endNode.id),
91725                       wayDirection1 = (endIndex1 - startIndex1);
91726                   if (wayDirection1 < -1) { wayDirection1 = 1; }
91727
91728                   /* eslint-disable no-loop-func */
91729                   forEach(without(graph.parentWays(keyNodes[i]), way), function(sharedWay) {
91730                       if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
91731                           var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id),
91732                               endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id),
91733                               wayDirection2 = (endIndex2 - startIndex2),
91734                               insertAt = endIndex2;
91735                           if (wayDirection2 < -1) { wayDirection2 = 1; }
91736
91737                           if (wayDirection1 !== wayDirection2) {
91738                               inBetweenNodes.reverse();
91739                               insertAt = startIndex2;
91740                           }
91741                           for (j = 0; j < inBetweenNodes.length; j++) {
91742                               sharedWay = sharedWay.addNode(inBetweenNodes[j], insertAt + j);
91743                           }
91744                           graph = graph.replace(sharedWay);
91745                       }
91746                   });
91747                   /* eslint-enable no-loop-func */
91748               }
91749
91750           }
91751
91752           // update the way to have all the new nodes
91753           ids = nodes.map(function(n) { return n.id; });
91754           ids.push(ids[0]);
91755
91756           way = way.update({nodes: ids});
91757           graph = graph.replace(way);
91758
91759           return graph;
91760       };
91761
91762
91763       action.makeConvex = function(graph) {
91764           var way = graph.entity(wayId),
91765               nodes = uniq(graph.childNodes(way)),
91766               points = nodes.map(function(n) { return projection(n.loc); }),
91767               sign = d3_polygonArea(points) > 0 ? 1 : -1,
91768               hull = d3_polygonHull(points);
91769
91770           // D3 convex hulls go counterclockwise..
91771           if (sign === -1) {
91772               nodes.reverse();
91773               points.reverse();
91774           }
91775
91776           for (var i = 0; i < hull.length - 1; i++) {
91777               var startIndex = points.indexOf(hull[i]),
91778                   endIndex = points.indexOf(hull[i+1]),
91779                   indexRange = (endIndex - startIndex);
91780
91781               if (indexRange < 0) {
91782                   indexRange += nodes.length;
91783               }
91784
91785               // move interior nodes to the surface of the convex hull..
91786               for (var j = 1; j < indexRange; j++) {
91787                   var point = geoVecInterp(hull[i], hull[i+1], j / indexRange),
91788                       node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point));
91789                   graph = graph.replace(node);
91790               }
91791           }
91792           return graph;
91793       };
91794
91795
91796       action.disabled = function(graph) {
91797           if (!graph.entity(wayId).isClosed())
91798               return 'not_closed';
91799       };
91800
91801
91802       action.transitionable = true;
91803
91804
91805       return action;
91806   }
91807
91808   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteWayAction.as
91809   function actionDeleteWay(wayId) {
91810
91811
91812       function canDeleteNode(node, graph) {
91813           return !graph.parentWays(node).length &&
91814               !graph.parentRelations(node).length &&
91815               !node.hasInterestingTags();
91816       }
91817
91818
91819       var action = function(graph) {
91820           var way = graph.entity(wayId);
91821
91822           graph.parentRelations(way)
91823               .forEach(function(parent) {
91824                   parent = parent.removeMembersWithID(wayId);
91825                   graph = graph.replace(parent);
91826
91827                   if (parent.isDegenerate()) {
91828                       graph = actionDeleteRelation(parent.id)(graph);
91829                   }
91830               });
91831
91832           uniq(way.nodes).forEach(function(nodeId) {
91833               graph = graph.replace(way.removeNode(nodeId));
91834
91835               var node = graph.entity(nodeId);
91836               if (canDeleteNode(node, graph)) {
91837                   graph = graph.remove(node);
91838               }
91839           });
91840
91841           return graph.remove(way);
91842       };
91843
91844
91845       return action;
91846   }
91847
91848   function actionDeleteMultiple(ids) {
91849       var actions = {
91850           way: actionDeleteWay,
91851           node: actionDeleteNode,
91852           relation: actionDeleteRelation
91853       };
91854
91855
91856       var action = function(graph) {
91857           ids.forEach(function(id) {
91858               if (graph.hasEntity(id)) { // It may have been deleted aready.
91859                   graph = actions[graph.entity(id).type](id)(graph);
91860               }
91861           });
91862
91863           return graph;
91864       };
91865
91866
91867       return action;
91868   }
91869
91870   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as
91871   function actionDeleteRelation(relationId) {
91872
91873
91874       function canDeleteEntity(entity, graph) {
91875           return !graph.parentWays(entity).length &&
91876               !graph.parentRelations(entity).length &&
91877               !entity.hasInterestingTags();
91878       }
91879
91880
91881       var action = function(graph) {
91882           var relation = graph.entity(relationId);
91883
91884           graph.parentRelations(relation)
91885               .forEach(function(parent) {
91886                   parent = parent.removeMembersWithID(relationId);
91887                   graph = graph.replace(parent);
91888
91889                   if (parent.isDegenerate()) {
91890                       graph = actionDeleteRelation(parent.id)(graph);
91891                   }
91892               });
91893
91894           uniq(map$3(relation.members, 'id')).forEach(function(memberId) {
91895               graph = graph.replace(relation.removeMembersWithID(memberId));
91896
91897               var entity = graph.entity(memberId);
91898               if (canDeleteEntity(entity, graph)) {
91899                   graph = actionDeleteMultiple([memberId])(graph);
91900               }
91901           });
91902
91903           return graph.remove(relation);
91904       };
91905
91906
91907       return action;
91908   }
91909
91910   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteNodeAction.as
91911   function actionDeleteNode(nodeId) {
91912       var action = function(graph) {
91913           var node = graph.entity(nodeId);
91914
91915           graph.parentWays(node)
91916               .forEach(function(parent) {
91917                   parent = parent.removeNode(nodeId);
91918                   graph = graph.replace(parent);
91919
91920                   if (parent.isDegenerate()) {
91921                       graph = actionDeleteWay(parent.id)(graph);
91922                   }
91923               });
91924
91925           graph.parentRelations(node)
91926               .forEach(function(parent) {
91927                   parent = parent.removeMembersWithID(nodeId);
91928                   graph = graph.replace(parent);
91929
91930                   if (parent.isDegenerate()) {
91931                       graph = actionDeleteRelation(parent.id)(graph);
91932                   }
91933               });
91934
91935           return graph.remove(node);
91936       };
91937
91938
91939       return action;
91940   }
91941
91942   // Connect the ways at the given nodes.
91943   //
91944   // First choose a node to be the survivor, with preference given
91945   // to an existing (not new) node.
91946   //
91947   // Tags and relation memberships of of non-surviving nodes are merged
91948   // to the survivor.
91949   //
91950   // This is the inverse of `iD.actionDisconnect`.
91951   //
91952   // Reference:
91953   //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as
91954   //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java
91955   //
91956   function actionConnect(nodeIDs) {
91957       var action = function(graph) {
91958           var survivor;
91959           var node;
91960           var parents;
91961           var i, j;
91962
91963           // Choose a survivor node, prefer an existing (not new) node - #4974
91964           for (i = 0; i < nodeIDs.length; i++) {
91965               survivor = graph.entity(nodeIDs[i]);
91966               if (survivor.version) break;  // found one
91967           }
91968
91969           // Replace all non-surviving nodes with the survivor and merge tags.
91970           for (i = 0; i < nodeIDs.length; i++) {
91971               node = graph.entity(nodeIDs[i]);
91972               if (node.id === survivor.id) continue;
91973
91974               parents = graph.parentWays(node);
91975               for (j = 0; j < parents.length; j++) {
91976                   if (!parents[j].areAdjacent(node.id, survivor.id)) {
91977                       graph = graph.replace(parents[j].replaceNode(node.id, survivor.id));
91978                   }
91979               }
91980
91981               parents = graph.parentRelations(node);
91982               for (j = 0; j < parents.length; j++) {
91983                   graph = graph.replace(parents[j].replaceMember(node, survivor));
91984               }
91985
91986               survivor = survivor.mergeTags(node.tags);
91987               graph = actionDeleteNode(node.id)(graph);
91988           }
91989
91990           graph = graph.replace(survivor);
91991
91992           return graph;
91993       };
91994
91995
91996       action.disabled = function(graph) {
91997           var seen = {};
91998           var restrictionIDs = [];
91999           var survivor;
92000           var node, way;
92001           var relations, relation, role;
92002           var i, j, k;
92003
92004           // Choose a survivor node, prefer an existing (not new) node - #4974
92005           for (i = 0; i < nodeIDs.length; i++) {
92006               survivor = graph.entity(nodeIDs[i]);
92007               if (survivor.version) break;  // found one
92008           }
92009
92010           // 1. disable if the nodes being connected have conflicting relation roles
92011           for (i = 0; i < nodeIDs.length; i++) {
92012               node = graph.entity(nodeIDs[i]);
92013               relations = graph.parentRelations(node);
92014
92015               for (j = 0; j < relations.length; j++) {
92016                   relation = relations[j];
92017                   role = relation.memberById(node.id).role || '';
92018
92019                   // if this node is a via node in a restriction, remember for later
92020                   if (relation.isValidRestriction()) {
92021                       restrictionIDs.push(relation.id);
92022                   }
92023
92024                   if (seen[relation.id] !== undefined && seen[relation.id] !== role) {
92025                       return 'relation';
92026                   } else {
92027                       seen[relation.id] = role;
92028                   }
92029               }
92030           }
92031
92032           // gather restrictions for parent ways
92033           for (i = 0; i < nodeIDs.length; i++) {
92034               node = graph.entity(nodeIDs[i]);
92035
92036               var parents = graph.parentWays(node);
92037               for (j = 0; j < parents.length; j++) {
92038                   var parent = parents[j];
92039                   relations = graph.parentRelations(parent);
92040
92041                   for (k = 0; k < relations.length; k++) {
92042                       relation = relations[k];
92043                       if (relation.isValidRestriction()) {
92044                           restrictionIDs.push(relation.id);
92045                       }
92046                   }
92047               }
92048           }
92049
92050
92051           // test restrictions
92052           restrictionIDs = uniq(restrictionIDs);
92053           for (i = 0; i < restrictionIDs.length; i++) {
92054               relation = graph.entity(restrictionIDs[i]);
92055               if (!relation.isComplete(graph)) continue;
92056
92057               var memberWays = relation.members
92058                   .filter(function(m) { return m.type === 'way'; })
92059                   .map(function(m) { return graph.entity(m.id); });
92060
92061               memberWays = uniq(memberWays);
92062               var f = relation.memberByRole('from');
92063               var t = relation.memberByRole('to');
92064               var isUturn = (f.id === t.id);
92065
92066               // 2a. disable if connection would damage a restriction
92067               // (a key node is a node at the junction of ways)
92068               var nodes = { from: [], via: [], to: [], keyfrom: [], keyto: [] };
92069               for (j = 0; j < relation.members.length; j++) {
92070                   collectNodes(relation.members[j], nodes);
92071               }
92072
92073               nodes.keyfrom = uniq(nodes.keyfrom.filter(hasDuplicates));
92074               nodes.keyto = uniq(nodes.keyto.filter(hasDuplicates));
92075
92076               var filter = keyNodeFilter(nodes.keyfrom, nodes.keyto);
92077               nodes.from = nodes.from.filter(filter);
92078               nodes.via = nodes.via.filter(filter);
92079               nodes.to = nodes.to.filter(filter);
92080
92081               var connectFrom = false;
92082               var connectVia = false;
92083               var connectTo = false;
92084               var connectKeyFrom = false;
92085               var connectKeyTo = false;
92086
92087               for (j = 0; j < nodeIDs.length; j++) {
92088                   var n = nodeIDs[j];
92089                   if (nodes.from.indexOf(n) !== -1)    { connectFrom = true; }
92090                   if (nodes.via.indexOf(n) !== -1)     { connectVia = true; }
92091                   if (nodes.to.indexOf(n) !== -1)      { connectTo = true; }
92092                   if (nodes.keyfrom.indexOf(n) !== -1) { connectKeyFrom = true; }
92093                   if (nodes.keyto.indexOf(n) !== -1)   { connectKeyTo = true; }
92094               }
92095               if (connectFrom && connectTo && !isUturn) { return 'restriction'; }
92096               if (connectFrom && connectVia) { return 'restriction'; }
92097               if (connectTo   && connectVia) { return 'restriction'; }
92098
92099               // connecting to a key node -
92100               // if both nodes are on a member way (i.e. part of the turn restriction),
92101               // the connecting node must be adjacent to the key node.
92102               if (connectKeyFrom || connectKeyTo) {
92103                   if (nodeIDs.length !== 2) { return 'restriction'; }
92104
92105                   var n0 = null;
92106                   var n1 = null;
92107                   for (j = 0; j < memberWays.length; j++) {
92108                       way = memberWays[j];
92109                       if (way.contains(nodeIDs[0])) { n0 = nodeIDs[0]; }
92110                       if (way.contains(nodeIDs[1])) { n1 = nodeIDs[1]; }
92111                   }
92112
92113                   if (n0 && n1) {    // both nodes are part of the restriction
92114                       var ok = false;
92115                       for (j = 0; j < memberWays.length; j++) {
92116                           way = memberWays[j];
92117                           if (way.areAdjacent(n0, n1)) {
92118                               ok = true;
92119                               break;
92120                           }
92121                       }
92122                       if (!ok) {
92123                           return 'restriction';
92124                       }
92125                   }
92126               }
92127
92128               // 2b. disable if nodes being connected will destroy a member way in a restriction
92129               // (to test, make a copy and try actually connecting the nodes)
92130               for (j = 0; j < memberWays.length; j++) {
92131                   way = memberWays[j].update({});   // make copy
92132                   for (k = 0; k < nodeIDs.length; k++) {
92133                       if (nodeIDs[k] === survivor.id) continue;
92134
92135                       if (way.areAdjacent(nodeIDs[k], survivor.id)) {
92136                           way = way.removeNode(nodeIDs[k]);
92137                       } else {
92138                           way = way.replaceNode(nodeIDs[k], survivor.id);
92139                       }
92140                   }
92141                   if (way.isDegenerate()) {
92142                       return 'restriction';
92143                   }
92144               }
92145           }
92146
92147           return false;
92148
92149
92150           // if a key node appears multiple times (indexOf !== lastIndexOf) it's a FROM-VIA or TO-VIA junction
92151           function hasDuplicates(n, i, arr) {
92152               return arr.indexOf(n) !== arr.lastIndexOf(n);
92153           }
92154
92155           function keyNodeFilter(froms, tos) {
92156               return function(n) {
92157                   return froms.indexOf(n) === -1 && tos.indexOf(n) === -1;
92158               };
92159           }
92160
92161           function collectNodes(member, collection) {
92162               var entity = graph.hasEntity(member.id);
92163               if (!entity) return;
92164
92165               var role = member.role || '';
92166               if (!collection[role]) {
92167                   collection[role] = [];
92168               }
92169
92170               if (member.type === 'node') {
92171                   collection[role].push(member.id);
92172                   if (role === 'via') {
92173                       collection.keyfrom.push(member.id);
92174                       collection.keyto.push(member.id);
92175                   }
92176
92177               } else if (member.type === 'way') {
92178                   collection[role].push.apply(collection[role], entity.nodes);
92179                   if (role === 'from' || role === 'via') {
92180                       collection.keyfrom.push(entity.first());
92181                       collection.keyfrom.push(entity.last());
92182                   }
92183                   if (role === 'to' || role === 'via') {
92184                       collection.keyto.push(entity.first());
92185                       collection.keyto.push(entity.last());
92186                   }
92187               }
92188           }
92189       };
92190
92191
92192       return action;
92193   }
92194
92195   function actionCopyEntities(ids, fromGraph) {
92196       var copies = {};
92197
92198
92199       var action = function(graph) {
92200           ids.forEach(function(id) {
92201               fromGraph.entity(id).copy(fromGraph, copies);
92202           });
92203
92204           for (var id in copies) {
92205               graph = graph.replace(copies[id]);
92206           }
92207
92208           return graph;
92209       };
92210
92211
92212       action.copies = function() {
92213           return copies;
92214       };
92215
92216
92217       return action;
92218   }
92219
92220   function actionDeleteMember(relationId, memberIndex) {
92221       return function(graph) {
92222           var relation = graph.entity(relationId)
92223               .removeMember(memberIndex);
92224
92225           graph = graph.replace(relation);
92226
92227           if (relation.isDegenerate())
92228               graph = actionDeleteRelation(relation.id)(graph);
92229
92230           return graph;
92231       };
92232   }
92233
92234   function actionDeprecateTags(entityId) {
92235
92236       return function(graph) {
92237           var entity = graph.entity(entityId),
92238               newtags = clone(entity.tags),
92239               change = false,
92240               rule;
92241
92242           // This handles dataDeprecated tags with a single condition
92243           for (var i = 0; i < dataDeprecated.length; i++) {
92244
92245               rule = dataDeprecated[i];
92246               var match = toPairs(rule.old)[0],
92247                   replacements = rule.replace ? toPairs(rule.replace) : null;
92248
92249               if (entity.tags[match[0]] && match[1] === '*') {
92250
92251                   var value = entity.tags[match[0]];
92252                   if (replacements && !newtags[replacements[0][0]]) {
92253                       newtags[replacements[0][0]] = value;
92254                   }
92255                   delete newtags[match[0]];
92256                   change = true;
92257
92258               } else if (entity.tags[match[0]] === match[1]) {
92259                   newtags = assign({}, rule.replace || {}, omit(newtags, match[0]));
92260                   change = true;
92261               }
92262           }
92263
92264           if (change) {
92265               return graph.replace(entity.update({tags: newtags}));
92266           } else {
92267               return graph;
92268           }
92269       };
92270   }
92271
92272   function actionDiscardTags(difference) {
92273
92274       return function(graph) {
92275           function discardTags(entity) {
92276               var tags = {};
92277               var keys = Object.keys(entity.tags);
92278               var discarded = false;
92279
92280               for (var i = 0; i < keys.length; i++) {
92281                   var k = keys[i];
92282                   if (dataDiscarded[k] || !entity.tags[k]) {
92283                       discarded = true;
92284                   } else {
92285                       tags[k] = entity.tags[k];
92286                   }
92287               }
92288
92289               if (discarded) {
92290                   graph = graph.replace(entity.update({ tags: tags }));
92291               }
92292           }
92293
92294           difference.modified().forEach(discardTags);
92295           difference.created().forEach(discardTags);
92296
92297           return graph;
92298       };
92299   }
92300
92301   // Disconect the ways at the given node.
92302   //
92303   // Optionally, disconnect only the given ways.
92304   //
92305   // For testing convenience, accepts an ID to assign to the (first) new node.
92306   // Normally, this will be undefined and the way will automatically
92307   // be assigned a new ID.
92308   //
92309   // This is the inverse of `iD.actionConnect`.
92310   //
92311   // Reference:
92312   //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as
92313   //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java
92314   //
92315   function actionDisconnect(nodeId, newNodeId) {
92316       var wayIds;
92317
92318
92319       var action = function(graph) {
92320           var node = graph.entity(nodeId);
92321           var connections = action.connections(graph);
92322
92323           connections.forEach(function(connection) {
92324               var way = graph.entity(connection.wayID);
92325               var newNode = osmNode({id: newNodeId, loc: node.loc, tags: node.tags});
92326
92327               graph = graph.replace(newNode);
92328               if (connection.index === 0 && way.isArea()) {
92329                   // replace shared node with shared node..
92330                   graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
92331               } else if (way.isClosed() && connection.index === way.nodes.length - 1) {
92332                   // replace closing node with new new node..
92333                   graph = graph.replace(way.unclose().addNode(newNode.id));
92334               } else {
92335                   // replace shared node with multiple new nodes..
92336                   graph = graph.replace(way.updateNode(newNode.id, connection.index));
92337               }
92338           });
92339
92340           return graph;
92341       };
92342
92343
92344       action.connections = function(graph) {
92345           var candidates = [];
92346           var keeping = false;
92347           var parentWays = graph.parentWays(graph.entity(nodeId));
92348
92349           parentWays.forEach(function(way) {
92350               if (wayIds && wayIds.indexOf(way.id) === -1) {
92351                   keeping = true;
92352                   return;
92353               }
92354               if (way.isArea() && (way.nodes[0] === nodeId)) {
92355                   candidates.push({ wayID: way.id, index: 0 });
92356               } else {
92357                   way.nodes.forEach(function(waynode, index) {
92358                       if (waynode === nodeId) {
92359                           candidates.push({ wayID: way.id, index: index });
92360                       }
92361                   });
92362               }
92363           });
92364
92365           return keeping ? candidates : candidates.slice(1);
92366       };
92367
92368
92369       action.disabled = function(graph) {
92370           var connections = action.connections(graph);
92371           if (connections.length === 0 || (wayIds && wayIds.length !== connections.length))
92372               return 'not_connected';
92373
92374           var parentWays = graph.parentWays(graph.entity(nodeId));
92375           var seenRelationIds = {};
92376           var sharedRelation;
92377
92378           parentWays.forEach(function(way) {
92379               if (wayIds && wayIds.indexOf(way.id) === -1)
92380                   return;
92381
92382               var relations = graph.parentRelations(way);
92383               relations.forEach(function(relation) {
92384                   if (relation.id in seenRelationIds) {
92385                       sharedRelation = relation;
92386                   } else {
92387                       seenRelationIds[relation.id] = true;
92388                   }
92389               });
92390           });
92391
92392           if (sharedRelation)
92393               return 'relation';
92394       };
92395
92396
92397       action.limitWays = function(_) {
92398           if (!arguments.length) return wayIds;
92399           wayIds = _;
92400           return action;
92401       };
92402
92403
92404       return action;
92405   }
92406
92407   // Join ways at the end node they share.
92408   //
92409   // This is the inverse of `iD.actionSplit`.
92410   //
92411   // Reference:
92412   //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as
92413   //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java
92414   //
92415   function actionJoin(ids) {
92416
92417       function groupEntitiesByGeometry(graph) {
92418           var entities = ids.map(function(id) { return graph.entity(id); });
92419           return assignIn({line: []}, groupBy(entities, function(entity) { return entity.geometry(graph); }));
92420       }
92421
92422
92423       var action = function(graph) {
92424           var ways = ids.map(graph.entity, graph);
92425           var survivorID = ways[0].id;
92426
92427           // Prefer to keep an existing way.
92428           for (var i = 0; i < ways.length; i++) {
92429               if (!ways[i].isNew()) {
92430                   survivorID = ways[i].id;
92431                   break;
92432               }
92433           }
92434
92435           var sequences = osmJoinWays(ways, graph);
92436           var joined = sequences[0];
92437
92438           // We might need to reverse some of these ways before joining them.  #4688
92439           // `joined.actions` property will contain any actions we need to apply.
92440           graph = sequences.actions.reduce(function(g, action) { return action(g); }, graph);
92441
92442           var survivor = graph.entity(survivorID);
92443           survivor = survivor.update({ nodes: joined.nodes.map(function(n) { return n.id; }) });
92444           graph = graph.replace(survivor);
92445
92446           joined.forEach(function(way) {
92447               if (way.id === survivorID) return;
92448
92449               graph.parentRelations(way).forEach(function(parent) {
92450                   graph = graph.replace(parent.replaceMember(way, survivor));
92451               });
92452
92453               survivor = survivor.mergeTags(way.tags);
92454
92455               graph = graph.replace(survivor);
92456               graph = actionDeleteWay(way.id)(graph);
92457           });
92458
92459           return graph;
92460       };
92461
92462
92463       action.disabled = function(graph) {
92464           var geometries = groupEntitiesByGeometry(graph);
92465           if (ids.length < 2 || ids.length !== geometries.line.length)
92466               return 'not_eligible';
92467
92468           var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
92469           if (joined.length > 1)
92470               return 'not_adjacent';
92471
92472           var nodeIds = joined[0].nodes.map(function(n) { return n.id; }).slice(1, -1);
92473           var relation;
92474           var tags = {};
92475           var conflicting = false;
92476
92477           joined[0].forEach(function(way) {
92478               var parents = graph.parentRelations(way);
92479               parents.forEach(function(parent) {
92480                   if (parent.isRestriction() && parent.members.some(function(m) { return nodeIds.indexOf(m.id) >= 0; }))
92481                       relation = parent;
92482               });
92483
92484               for (var k in way.tags) {
92485                   if (!(k in tags)) {
92486                       tags[k] = way.tags[k];
92487                   } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) {
92488                       conflicting = true;
92489                   }
92490               }
92491           });
92492
92493           if (relation)
92494               return 'restriction';
92495
92496           if (conflicting)
92497               return 'conflicting_tags';
92498       };
92499
92500
92501       return action;
92502   }
92503
92504   function actionMerge(ids) {
92505
92506       function groupEntitiesByGeometry(graph) {
92507           var entities = ids.map(function(id) { return graph.entity(id); });
92508           return assignIn({point: [], area: [], line: [], relation: []},
92509               groupBy(entities, function(entity) { return entity.geometry(graph); }));
92510       }
92511
92512
92513       var action = function(graph) {
92514           var geometries = groupEntitiesByGeometry(graph),
92515               target = geometries.area[0] || geometries.line[0],
92516               points = geometries.point;
92517
92518           points.forEach(function(point) {
92519               target = target.mergeTags(point.tags);
92520               graph = graph.replace(target);
92521
92522               graph.parentRelations(point).forEach(function(parent) {
92523                   graph = graph.replace(parent.replaceMember(point, target));
92524               });
92525
92526               var nodes = uniq(graph.childNodes(target)),
92527                   removeNode = point;
92528
92529               for (var i = 0; i < nodes.length; i++) {
92530                   var node = nodes[i];
92531                   if (graph.parentWays(node).length > 1 ||
92532                       graph.parentRelations(node).length ||
92533                       node.hasInterestingTags()) {
92534                       continue;
92535                   }
92536
92537                   // Found an uninteresting child node on the target way.
92538                   // Move orig point into its place to preserve point's history. #3683
92539                   graph = graph.replace(point.update({ tags: {}, loc: node.loc }));
92540                   target = target.replaceNode(node.id, point.id);
92541                   graph = graph.replace(target);
92542                   removeNode = node;
92543                   break;
92544               }
92545
92546               graph = graph.remove(removeNode);
92547           });
92548
92549           return graph;
92550       };
92551
92552
92553       action.disabled = function(graph) {
92554           var geometries = groupEntitiesByGeometry(graph);
92555           if (geometries.point.length === 0 ||
92556               (geometries.area.length + geometries.line.length) !== 1 ||
92557               geometries.relation.length !== 0)
92558               return 'not_eligible';
92559       };
92560
92561
92562       return action;
92563   }
92564
92565   // `actionMergeNodes` is just a combination of:
92566   //
92567   // 1. move all the nodes to a common location
92568   // 2. `actionConnect` them
92569
92570   function actionMergeNodes(nodeIDs) {
92571
92572       // If there is a single "interesting" node, use that as the location.
92573       // Otherwise return the average location of all the nodes.
92574       function chooseLoc(graph) {
92575           if (!nodeIDs.length) return null;
92576           var sum = [0,0];
92577           var interestingCount = 0;
92578           var interestingLoc;
92579
92580           for (var i = 0; i < nodeIDs.length; i++) {
92581               var node = graph.entity(nodeIDs[i]);
92582               if (node.hasInterestingTags()) {
92583                   interestingLoc = (++interestingCount === 1) ? node.loc : null;
92584               }
92585               sum = geoVecAdd(sum, node.loc);
92586           }
92587
92588           return interestingLoc || geoVecScale(sum, 1 / nodeIDs.length);
92589       }
92590
92591
92592       var action = function(graph) {
92593           if (nodeIDs.length < 2) return graph;
92594           var toLoc = chooseLoc(graph);
92595
92596           for (var i = 0; i < nodeIDs.length; i++) {
92597               var node = graph.entity(nodeIDs[i]);
92598               graph = graph.replace(node.move(toLoc));
92599           }
92600
92601           return actionConnect(nodeIDs)(graph);
92602       };
92603
92604
92605       action.disabled = function(graph) {
92606           if (nodeIDs.length < 2) return 'not_eligible';
92607
92608           for (var i = 0; i < nodeIDs.length; i++) {
92609               var entity = graph.entity(nodeIDs[i]);
92610               if (entity.type !== 'node') return 'not_eligible';
92611           }
92612
92613           return actionConnect(nodeIDs).disabled(graph);
92614       };
92615
92616       return action;
92617   }
92618
92619   function actionMergePolygon(ids, newRelationId) {
92620
92621       function groupEntities(graph) {
92622           var entities = ids.map(function (id) { return graph.entity(id); });
92623           return assignIn({
92624                   closedWay: [],
92625                   multipolygon: [],
92626                   other: []
92627               }, groupBy(entities, function(entity) {
92628                   if (entity.type === 'way' && entity.isClosed()) {
92629                       return 'closedWay';
92630                   } else if (entity.type === 'relation' && entity.isMultipolygon()) {
92631                       return 'multipolygon';
92632                   } else {
92633                       return 'other';
92634                   }
92635               }));
92636       }
92637
92638
92639       var action = function(graph) {
92640           var entities = groupEntities(graph);
92641
92642           // An array representing all the polygons that are part of the multipolygon.
92643           //
92644           // Each element is itself an array of objects with an id property, and has a
92645           // locs property which is an array of the locations forming the polygon.
92646           var polygons = entities.multipolygon.reduce(function(polygons, m) {
92647               return polygons.concat(osmJoinWays(m.members, graph));
92648           }, []).concat(entities.closedWay.map(function(d) {
92649               var member = [{id: d.id}];
92650               member.nodes = graph.childNodes(d);
92651               return member;
92652           }));
92653
92654           // contained is an array of arrays of boolean values,
92655           // where contained[j][k] is true iff the jth way is
92656           // contained by the kth way.
92657           var contained = polygons.map(function(w, i) {
92658               return polygons.map(function(d, n) {
92659                   if (i === n) return null;
92660                   return geoPolygonContainsPolygon(
92661                       map$3(d.nodes, 'loc'),
92662                       map$3(w.nodes, 'loc'));
92663               });
92664           });
92665
92666           // Sort all polygons as either outer or inner ways
92667           var members = [],
92668               outer = true;
92669
92670           while (polygons.length) {
92671               extractUncontained(polygons);
92672               polygons = polygons.filter(isContained);
92673               contained = contained.filter(isContained).map(filterContained);
92674           }
92675
92676           function isContained(d, i) {
92677               return some(contained[i]);
92678           }
92679
92680           function filterContained(d) {
92681               return d.filter(isContained);
92682           }
92683
92684           function extractUncontained(polygons) {
92685               polygons.forEach(function(d, i) {
92686                   if (!isContained(d, i)) {
92687                       d.forEach(function(member) {
92688                           members.push({
92689                               type: 'way',
92690                               id: member.id,
92691                               role: outer ? 'outer' : 'inner'
92692                           });
92693                       });
92694                   }
92695               });
92696               outer = !outer;
92697           }
92698
92699           // Move all tags to one relation
92700           var relation = entities.multipolygon[0] ||
92701               osmRelation({ id: newRelationId, tags: { type: 'multipolygon' }});
92702
92703           entities.multipolygon.slice(1).forEach(function(m) {
92704               relation = relation.mergeTags(m.tags);
92705               graph = graph.remove(m);
92706           });
92707
92708           entities.closedWay.forEach(function(way) {
92709               function isThisOuter(m) {
92710                   return m.id === way.id && m.role !== 'inner';
92711               }
92712               if (members.some(isThisOuter)) {
92713                   relation = relation.mergeTags(way.tags);
92714                   graph = graph.replace(way.update({ tags: {} }));
92715               }
92716           });
92717
92718           return graph.replace(relation.update({
92719               members: members,
92720               tags: omit(relation.tags, 'area')
92721           }));
92722       };
92723
92724
92725       action.disabled = function(graph) {
92726           var entities = groupEntities(graph);
92727           if (entities.other.length > 0 ||
92728               entities.closedWay.length + entities.multipolygon.length < 2)
92729               return 'not_eligible';
92730           if (!entities.multipolygon.every(function(r) { return r.isComplete(graph); }))
92731               return 'incomplete_relation';
92732       };
92733
92734
92735       return action;
92736   }
92737
92738   // Text diff algorithm following Hunt and McIlroy 1976.
92739   // J. W. Hunt and M. D. McIlroy, An algorithm for differential file
92740   // comparison, Bell Telephone Laboratories CSTR #41 (1976)
92741   // http://www.cs.dartmouth.edu/~doug/
92742   //
92743   // Expects two arrays of strings.
92744   function LCS(file1, file2) {
92745     var equivalenceClasses;
92746     var file2indices;
92747     var newCandidate;
92748     var candidates;
92749     var line;
92750     var c, i, j, jX, r, s;
92751
92752     equivalenceClasses = {};
92753     for (j = 0; j < file2.length; j++) {
92754       line = file2[j];
92755       if (equivalenceClasses[line]) {
92756         equivalenceClasses[line].push(j);
92757       } else {
92758         equivalenceClasses[line] = [j];
92759       }
92760     }
92761
92762     candidates = [
92763       { file1index: -1, file2index: -1, chain: null }
92764     ];
92765
92766     for (i = 0; i < file1.length; i++) {
92767       line = file1[i];
92768       file2indices = equivalenceClasses[line] || [];
92769
92770       r = 0;
92771       c = candidates[0];
92772
92773       for (jX = 0; jX < file2indices.length; jX++) {
92774         j = file2indices[jX];
92775
92776         for (s = r; s < candidates.length; s++) {
92777           if ((candidates[s].file2index < j) && ((s === candidates.length - 1) || (candidates[s + 1].file2index > j))) {
92778             break;
92779           }
92780         }
92781
92782         if (s < candidates.length) {
92783           newCandidate = { file1index: i, file2index: j, chain: candidates[s] };
92784           if (r === candidates.length) {
92785             candidates.push(c);
92786           } else {
92787             candidates[r] = c;
92788           }
92789           r = s + 1;
92790           c = newCandidate;
92791           if (r === candidates.length) {
92792             break; // no point in examining further (j)s
92793           }
92794         }
92795       }
92796
92797       candidates[r] = c;
92798     }
92799
92800     // At this point, we know the LCS: it's in the reverse of the
92801     // linked-list through .chain of candidates[candidates.length - 1].
92802
92803     return candidates[candidates.length - 1];
92804   }
92805
92806
92807   // We apply the LCS to give a simple representation of the
92808   // offsets and lengths of mismatched chunks in the input
92809   // files. This is used by diff3MergeIndices below.
92810   function diffIndices(file1, file2) {
92811     var result = [];
92812     var tail1 = file1.length;
92813     var tail2 = file2.length;
92814
92815     for (var candidate = LCS(file1, file2);
92816        candidate !== null;
92817        candidate = candidate.chain)
92818     {
92819       var mismatchLength1 = tail1 - candidate.file1index - 1;
92820       var mismatchLength2 = tail2 - candidate.file2index - 1;
92821       tail1 = candidate.file1index;
92822       tail2 = candidate.file2index;
92823
92824       if (mismatchLength1 || mismatchLength2) {
92825         result.push({
92826           file1: [tail1 + 1, mismatchLength1],
92827           file2: [tail2 + 1, mismatchLength2]
92828         });
92829       }
92830     }
92831
92832     result.reverse();
92833     return result;
92834   }
92835
92836
92837   // Given three files, A, O, and B, where both A and B are
92838   // independently derived from O, returns a fairly complicated
92839   // internal representation of merge decisions it's taken. The
92840   // interested reader may wish to consult
92841   //
92842   // Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce.
92843   // 'A Formal Investigation of ' In Arvind and Prasad,
92844   // editors, Foundations of Software Technology and Theoretical
92845   // Computer Science (FSTTCS), December 2007.
92846   //
92847   // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf)
92848   function diff3MergeIndices(a, o, b) {
92849     var i;
92850     var m1 = diffIndices(o, a);
92851     var m2 = diffIndices(o, b);
92852
92853     var hunks = [];
92854     function addHunk(h, side) {
92855       hunks.push([h.file1[0], side, h.file1[1], h.file2[0], h.file2[1]]);
92856     }
92857     for (i = 0; i < m1.length; i++) { addHunk(m1[i], 0); }
92858     for (i = 0; i < m2.length; i++) { addHunk(m2[i], 2); }
92859     hunks.sort(function (x, y) { return x[0] - y[0]; });
92860
92861     var result = [];
92862     var commonOffset = 0;
92863     function copyCommon(targetOffset) {
92864       if (targetOffset > commonOffset) {
92865         result.push([1, commonOffset, targetOffset - commonOffset]);
92866         commonOffset = targetOffset;
92867       }
92868     }
92869
92870     for (var hunkIndex = 0; hunkIndex < hunks.length; hunkIndex++) {
92871       var firstHunkIndex = hunkIndex;
92872       var hunk = hunks[hunkIndex];
92873       var regionLhs = hunk[0];
92874       var regionRhs = regionLhs + hunk[2];
92875       while (hunkIndex < hunks.length - 1) {
92876         var maybeOverlapping = hunks[hunkIndex + 1];
92877         var maybeLhs = maybeOverlapping[0];
92878         if (maybeLhs > regionRhs) {
92879           break;
92880         }
92881         regionRhs = Math.max(regionRhs, maybeLhs + maybeOverlapping[2]);
92882         hunkIndex++;
92883       }
92884
92885       copyCommon(regionLhs);
92886       if (firstHunkIndex === hunkIndex) {
92887         // The 'overlap' was only one hunk long, meaning that
92888         // there's no conflict here. Either a and o were the
92889         // same, or b and o were the same.
92890         if (hunk[4] > 0) {
92891           result.push([hunk[1], hunk[3], hunk[4]]);
92892         }
92893       } else {
92894         // A proper conflict. Determine the extents of the
92895         // regions involved from a, o and b. Effectively merge
92896         // all the hunks on the left into one giant hunk, and
92897         // do the same for the right; then, correct for skew
92898         // in the regions of o that each side changed, and
92899         // report appropriate spans for the three sides.
92900         var regions = {
92901           0: [a.length, -1, o.length, -1],
92902           2: [b.length, -1, o.length, -1]
92903         };
92904         for (i = firstHunkIndex; i <= hunkIndex; i++) {
92905           hunk = hunks[i];
92906           var side = hunk[1];
92907           var r = regions[side];
92908           var oLhs = hunk[0];
92909           var oRhs = oLhs + hunk[2];
92910           var abLhs = hunk[3];
92911           var abRhs = abLhs + hunk[4];
92912           r[0] = Math.min(abLhs, r[0]);
92913           r[1] = Math.max(abRhs, r[1]);
92914           r[2] = Math.min(oLhs, r[2]);
92915           r[3] = Math.max(oRhs, r[3]);
92916         }
92917         var aLhs = regions[0][0] + (regionLhs - regions[0][2]);
92918         var aRhs = regions[0][1] + (regionRhs - regions[0][3]);
92919         var bLhs = regions[2][0] + (regionLhs - regions[2][2]);
92920         var bRhs = regions[2][1] + (regionRhs - regions[2][3]);
92921         result.push([-1,
92922                      aLhs,      aRhs      - aLhs,
92923                      regionLhs, regionRhs - regionLhs,
92924                      bLhs,      bRhs      - bLhs]);
92925       }
92926       commonOffset = regionRhs;
92927     }
92928
92929     copyCommon(o.length);
92930     return result;
92931   }
92932
92933
92934   // Applies the output of diff3MergeIndices to actually
92935   // construct the merged file; the returned result alternates
92936   // between 'ok' and 'conflict' blocks.
92937   function diff3Merge(a, o, b, excludeFalseConflicts) {
92938     var result = [];
92939     var files = [a, o, b];
92940     var indices = diff3MergeIndices(a, o, b);
92941
92942     var okLines = [];
92943     function flushOk() {
92944       if (okLines.length) {
92945         result.push({ok: okLines});
92946       }
92947       okLines = [];
92948     }
92949     function pushOk(xs) {
92950       for (var j = 0; j < xs.length; j++) {
92951         okLines.push(xs[j]);
92952       }
92953     }
92954
92955     function isTrueConflict(rec) {
92956       if (rec[2] !== rec[6]) return true;
92957       var aoff = rec[1];
92958       var boff = rec[5];
92959       for (var j = 0; j < rec[2]; j++) {
92960         if (a[j + aoff] !== b[j + boff]) {
92961           return true;
92962         }
92963       }
92964       return false;
92965     }
92966
92967     for (var i = 0; i < indices.length; i++) {
92968       var x = indices[i];
92969       var side = x[0];
92970       if (side === -1) {
92971         if (excludeFalseConflicts && !isTrueConflict(x)) {
92972           pushOk(files[0].slice(x[1], x[1] + x[2]));
92973         } else {
92974           flushOk();
92975           result.push({
92976             conflict: {
92977               a: a.slice(x[1], x[1] + x[2]),
92978               aIndex: x[1],
92979               o: o.slice(x[3], x[3] + x[4]),
92980               oIndex: x[3],
92981               b: b.slice(x[5], x[5] + x[6]),
92982               bIndex: x[5]
92983             }
92984           });
92985         }
92986       } else {
92987         pushOk(files[side].slice(x[1], x[1] + x[2]));
92988       }
92989     }
92990
92991     flushOk();
92992     return result;
92993   }
92994
92995   function actionMergeRemoteChanges(id, localGraph, remoteGraph, formatUser) {
92996       var _option = 'safe';  // 'safe', 'force_local', 'force_remote'
92997       var _conflicts = [];
92998
92999
93000       function user(d) {
93001           return isFunction(formatUser) ? formatUser(d) : d;
93002       }
93003
93004
93005       function mergeLocation(remote, target) {
93006           function pointEqual(a, b) {
93007               var epsilon = 1e-6;
93008               return (Math.abs(a[0] - b[0]) < epsilon) && (Math.abs(a[1] - b[1]) < epsilon);
93009           }
93010
93011           if (_option === 'force_local' || pointEqual(target.loc, remote.loc)) {
93012               return target;
93013           }
93014           if (_option === 'force_remote') {
93015               return target.update({loc: remote.loc});
93016           }
93017
93018           _conflicts.push(t('merge_remote_changes.conflict.location', { user: user(remote.user) }));
93019           return target;
93020       }
93021
93022
93023       function mergeNodes(base, remote, target) {
93024           if (_option === 'force_local' || isEqual(target.nodes, remote.nodes)) {
93025               return target;
93026           }
93027           if (_option === 'force_remote') {
93028               return target.update({nodes: remote.nodes});
93029           }
93030
93031           var ccount = _conflicts.length;
93032           var o = base.nodes || [];
93033           var a = target.nodes || [];
93034           var b = remote.nodes || [];
93035           var nodes = [];
93036           var hunks = diff3Merge(a, o, b, true);
93037
93038           for (var i = 0; i < hunks.length; i++) {
93039               var hunk = hunks[i];
93040               if (hunk.ok) {
93041                   nodes.push.apply(nodes, hunk.ok);
93042               } else {
93043                   // for all conflicts, we can assume c.a !== c.b
93044                   // because `diff3Merge` called with `true` option to exclude false conflicts..
93045                   var c = hunk.conflict;
93046                   if (isEqual(c.o, c.a)) {  // only changed remotely
93047                       nodes.push.apply(nodes, c.b);
93048                   } else if (isEqual(c.o, c.b)) {  // only changed locally
93049                       nodes.push.apply(nodes, c.a);
93050                   } else {       // changed both locally and remotely
93051                       _conflicts.push(t('merge_remote_changes.conflict.nodelist', { user: user(remote.user) }));
93052                       break;
93053                   }
93054               }
93055           }
93056
93057           return (_conflicts.length === ccount) ? target.update({nodes: nodes}) : target;
93058       }
93059
93060
93061       function mergeChildren(targetWay, children, updates, graph) {
93062           function isUsed(node, targetWay) {
93063               var parentWays = map$3(graph.parentWays(node), 'id');
93064               return node.hasInterestingTags() ||
93065                   without(parentWays, targetWay.id).length > 0 ||
93066                   graph.parentRelations(node).length > 0;
93067           }
93068
93069           var ccount = _conflicts.length;
93070
93071           for (var i = 0; i < children.length; i++) {
93072               var id = children[i];
93073               var node = graph.hasEntity(id);
93074
93075               // remove unused childNodes..
93076               if (targetWay.nodes.indexOf(id) === -1) {
93077                   if (node && !isUsed(node, targetWay)) {
93078                       updates.removeIds.push(id);
93079                   }
93080                   continue;
93081               }
93082
93083               // restore used childNodes..
93084               var local = localGraph.hasEntity(id);
93085               var remote = remoteGraph.hasEntity(id);
93086               var target;
93087
93088               if (_option === 'force_remote' && remote && remote.visible) {
93089                   updates.replacements.push(remote);
93090
93091               } else if (_option === 'force_local' && local) {
93092                   target = osmEntity$$1(local);
93093                   if (remote) {
93094                       target = target.update({ version: remote.version });
93095                   }
93096                   updates.replacements.push(target);
93097
93098               } else if (_option === 'safe' && local && remote && local.version !== remote.version) {
93099                   target = osmEntity$$1(local, { version: remote.version });
93100                   if (remote.visible) {
93101                       target = mergeLocation(remote, target);
93102                   } else {
93103                       _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
93104                   }
93105
93106                   if (_conflicts.length !== ccount) break;
93107                   updates.replacements.push(target);
93108               }
93109           }
93110
93111           return targetWay;
93112       }
93113
93114
93115       function updateChildren(updates, graph) {
93116           for (var i = 0; i < updates.replacements.length; i++) {
93117               graph = graph.replace(updates.replacements[i]);
93118           }
93119           if (updates.removeIds.length) {
93120               graph = actionDeleteMultiple(updates.removeIds)(graph);
93121           }
93122           return graph;
93123       }
93124
93125
93126       function mergeMembers(remote, target) {
93127           if (_option === 'force_local' || isEqual(target.members, remote.members)) {
93128               return target;
93129           }
93130           if (_option === 'force_remote') {
93131               return target.update({members: remote.members});
93132           }
93133
93134           _conflicts.push(t('merge_remote_changes.conflict.memberlist', { user: user(remote.user) }));
93135           return target;
93136       }
93137
93138
93139       function mergeTags(base, remote, target) {
93140           function ignoreKey(k) {
93141               return dataDiscarded[k];
93142           }
93143
93144           if (_option === 'force_local' || isEqual(target.tags, remote.tags)) {
93145               return target;
93146           }
93147           if (_option === 'force_remote') {
93148               return target.update({tags: remote.tags});
93149           }
93150
93151           var ccount = _conflicts.length;
93152           var o = base.tags || {};
93153           var a = target.tags || {};
93154           var b = remote.tags || {};
93155           var keys = reject(union(keys$1(o), keys$1(a), keys$1(b)), ignoreKey);
93156           var tags = clone(a);
93157           var changed = false;
93158
93159           for (var i = 0; i < keys.length; i++) {
93160               var k = keys[i];
93161
93162               if (o[k] !== b[k] && a[k] !== b[k]) {    // changed remotely..
93163                   if (o[k] !== a[k]) {      // changed locally..
93164                       _conflicts.push(t('merge_remote_changes.conflict.tags',
93165                           { tag: k, local: a[k], remote: b[k], user: user(remote.user) }));
93166
93167                   } else {                  // unchanged locally, accept remote change..
93168                       if (b.hasOwnProperty(k)) {
93169                           tags[k] = b[k];
93170                       } else {
93171                           delete tags[k];
93172                       }
93173                       changed = true;
93174                   }
93175               }
93176           }
93177
93178           return (changed && _conflicts.length === ccount) ? target.update({tags: tags}) : target;
93179       }
93180
93181
93182       //  `graph.base()` is the common ancestor of the two graphs.
93183       //  `localGraph` contains user's edits up to saving
93184       //  `remoteGraph` contains remote edits to modified nodes
93185       //  `graph` must be a descendent of `localGraph` and may include
93186       //      some conflict resolution actions performed on it.
93187       //
93188       //                  --- ... --- `localGraph` -- ... -- `graph`
93189       //                 /
93190       //  `graph.base()` --- ... --- `remoteGraph`
93191       //
93192       var action = function(graph) {
93193           var updates = { replacements: [], removeIds: [] };
93194           var base = graph.base().entities[id];
93195           var local = localGraph.entity(id);
93196           var remote = remoteGraph.entity(id);
93197           var target = osmEntity$$1(local, { version: remote.version });
93198
93199           // delete/undelete
93200           if (!remote.visible) {
93201               if (_option === 'force_remote') {
93202                   return actionDeleteMultiple([id])(graph);
93203
93204               } else if (_option === 'force_local') {
93205                   if (target.type === 'way') {
93206                       target = mergeChildren(target, uniq(local.nodes), updates, graph);
93207                       graph = updateChildren(updates, graph);
93208                   }
93209                   return graph.replace(target);
93210
93211               } else {
93212                   _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
93213                   return graph;  // do nothing
93214               }
93215           }
93216
93217           // merge
93218           if (target.type === 'node') {
93219               target = mergeLocation(remote, target);
93220
93221           } else if (target.type === 'way') {
93222               // pull in any child nodes that may not be present locally..
93223               graph.rebase(remoteGraph.childNodes(remote), [graph], false);
93224               target = mergeNodes(base, remote, target);
93225               target = mergeChildren(target, union(local.nodes, remote.nodes), updates, graph);
93226
93227           } else if (target.type === 'relation') {
93228               target = mergeMembers(remote, target);
93229           }
93230
93231           target = mergeTags(base, remote, target);
93232
93233           if (!_conflicts.length) {
93234               graph = updateChildren(updates, graph).replace(target);
93235           }
93236
93237           return graph;
93238       };
93239
93240
93241       action.withOption = function(opt) {
93242           _option = opt;
93243           return action;
93244       };
93245
93246
93247       action.conflicts = function() {
93248           return _conflicts;
93249       };
93250
93251
93252       return action;
93253   }
93254
93255   // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
93256   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
93257   function actionMove(moveIds, tryDelta, projection, cache) {
93258       var _delta = tryDelta;
93259
93260       function setupCache(graph) {
93261           function canMove(nodeId) {
93262               // Allow movement of any node that is in the selectedIDs list..
93263               if (moveIds.indexOf(nodeId) !== -1) return true;
93264
93265               // Allow movement of a vertex where 2 ways meet..
93266               var parents = map$3(graph.parentWays(graph.entity(nodeId)), 'id');
93267               if (parents.length < 3) return true;
93268
93269               // Restrict movement of a vertex where >2 ways meet, unless all parentWays are moving too..
93270               var parentsMoving = every(parents, function(id) { return cache.moving[id]; });
93271               if (!parentsMoving) delete cache.moving[nodeId];
93272
93273               return parentsMoving;
93274           }
93275
93276           function cacheEntities(ids) {
93277               for (var i = 0; i < ids.length; i++) {
93278                   var id = ids[i];
93279                   if (cache.moving[id]) continue;
93280                   cache.moving[id] = true;
93281
93282                   var entity = graph.hasEntity(id);
93283                   if (!entity) continue;
93284
93285                   if (entity.type === 'node') {
93286                       cache.nodes.push(id);
93287                       cache.startLoc[id] = entity.loc;
93288                   } else if (entity.type === 'way') {
93289                       cache.ways.push(id);
93290                       cacheEntities(entity.nodes);
93291                   } else {
93292                       cacheEntities(entity.members.map(function(member) {
93293                           return member.id;
93294                       }));
93295                   }
93296               }
93297           }
93298
93299           function cacheIntersections(ids) {
93300               function isEndpoint(way, id) {
93301                   return !way.isClosed() && !!way.affix(id);
93302               }
93303
93304               for (var i = 0; i < ids.length; i++) {
93305                   var id = ids[i];
93306
93307                   // consider only intersections with 1 moved and 1 unmoved way.
93308                   var childNodes = graph.childNodes(graph.entity(id));
93309                   for (var j = 0; j < childNodes.length; j++) {
93310                       var node = childNodes[j];
93311                       var parents = graph.parentWays(node);
93312                       if (parents.length !== 2) continue;
93313
93314                       var moved = graph.entity(id);
93315                       var unmoved = null;
93316                       for (var k = 0; k < parents.length; k++) {
93317                           var way = parents[k];
93318                           if (!cache.moving[way.id]) {
93319                               unmoved = way;
93320                               break;
93321                           }
93322                       }
93323                       if (!unmoved) continue;
93324
93325                       // exclude ways that are overly connected..
93326                       if (intersection(moved.nodes, unmoved.nodes).length > 2) continue;
93327                       if (moved.isArea() || unmoved.isArea()) continue;
93328
93329                       cache.intersections.push({
93330                           nodeId: node.id,
93331                           movedId: moved.id,
93332                           unmovedId: unmoved.id,
93333                           movedIsEP: isEndpoint(moved, node.id),
93334                           unmovedIsEP: isEndpoint(unmoved, node.id)
93335                       });
93336                   }
93337               }
93338           }
93339
93340
93341           if (!cache) {
93342               cache = {};
93343           }
93344           if (!cache.ok) {
93345               cache.moving = {};
93346               cache.intersections = [];
93347               cache.replacedVertex = {};
93348               cache.startLoc = {};
93349               cache.nodes = [];
93350               cache.ways = [];
93351
93352               cacheEntities(moveIds);
93353               cacheIntersections(cache.ways);
93354               cache.nodes = filter(cache.nodes, canMove);
93355
93356               cache.ok = true;
93357           }
93358       }
93359
93360
93361       // Place a vertex where the moved vertex used to be, to preserve way shape..
93362       //
93363       //  Start:
93364       //      b ---- e
93365       //     / \
93366       //    /   \
93367       //   /     \
93368       //  a       c
93369       //
93370       //      *               node '*' added to preserve shape
93371       //     / \
93372       //    /   b ---- e      way `b,e` moved here:
93373       //   /     \
93374       //  a       c
93375       //
93376       //
93377       function replaceMovedVertex(nodeId, wayId, graph, delta) {
93378           var way = graph.entity(wayId);
93379           var moved = graph.entity(nodeId);
93380           var movedIndex = way.nodes.indexOf(nodeId);
93381           var len, prevIndex, nextIndex;
93382
93383           if (way.isClosed()) {
93384               len = way.nodes.length - 1;
93385               prevIndex = (movedIndex + len - 1) % len;
93386               nextIndex = (movedIndex + len + 1) % len;
93387           } else {
93388               len = way.nodes.length;
93389               prevIndex = movedIndex - 1;
93390               nextIndex = movedIndex + 1;
93391           }
93392
93393           var prev = graph.hasEntity(way.nodes[prevIndex]);
93394           var next = graph.hasEntity(way.nodes[nextIndex]);
93395
93396           // Don't add orig vertex at endpoint..
93397           if (!prev || !next) return graph;
93398
93399           var key = wayId + '_' + nodeId;
93400           var orig = cache.replacedVertex[key];
93401           if (!orig) {
93402               orig = osmNode();
93403               cache.replacedVertex[key] = orig;
93404               cache.startLoc[orig.id] = cache.startLoc[nodeId];
93405           }
93406
93407           var start, end;
93408           if (delta) {
93409               start = projection(cache.startLoc[nodeId]);
93410               end = projection.invert(geoVecAdd(start, delta));
93411           } else {
93412               end = cache.startLoc[nodeId];
93413           }
93414           orig = orig.move(end);
93415
93416           var angle = Math.abs(geoAngle(orig, prev, projection) -
93417                   geoAngle(orig, next, projection)) * 180 / Math.PI;
93418
93419           // Don't add orig vertex if it would just make a straight line..
93420           if (angle > 175 && angle < 185) return graph;
93421
93422           // moving forward or backward along way?
93423           var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection);
93424           var p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection);
93425           var d1 = geoPathLength(p1);
93426           var d2 = geoPathLength(p2);
93427           var insertAt = (d1 <= d2) ? movedIndex : nextIndex;
93428
93429           // moving around closed loop?
93430           if (way.isClosed() && insertAt === 0) insertAt = len;
93431
93432           way = way.addNode(orig.id, insertAt);
93433           return graph.replace(orig).replace(way);
93434       }
93435
93436
93437       // Remove duplicate vertex that might have been added by
93438       // replaceMovedVertex.  This is done after the unzorro checks.
93439       function removeDuplicateVertices(wayId, graph) {
93440           var way = graph.entity(wayId);
93441           var epsilon = 1e-6;
93442           var prev, curr;
93443
93444           function isInteresting(node, graph) {
93445               return graph.parentWays(node).length > 1 ||
93446                   graph.parentRelations(node).length ||
93447                   node.hasInterestingTags();
93448           }
93449
93450           for (var i = 0; i < way.nodes.length; i++) {
93451               curr = graph.entity(way.nodes[i]);
93452
93453               if (prev && curr && geoVecEqual(prev.loc, curr.loc, epsilon)) {
93454                   if (!isInteresting(prev, graph)) {
93455                       way = way.removeNode(prev.id);
93456                       graph = graph.replace(way).remove(prev);
93457                   } else if (!isInteresting(curr, graph)) {
93458                       way = way.removeNode(curr.id);
93459                       graph = graph.replace(way).remove(curr);
93460                   }
93461               }
93462
93463               prev = curr;
93464           }
93465
93466           return graph;
93467       }
93468
93469
93470       // Reorder nodes around intersections that have moved..
93471       //
93472       //  Start:                way1.nodes: b,e         (moving)
93473       //  a - b - c ----- d     way2.nodes: a,b,c,d     (static)
93474       //      |                 vertex: b
93475       //      e                 isEP1: true,  isEP2, false
93476       //
93477       //  way1 `b,e` moved here:
93478       //  a ----- c = b - d
93479       //              |
93480       //              e
93481       //
93482       //  reorder nodes         way1.nodes: b,e
93483       //  a ----- c - b - d     way2.nodes: a,c,b,d
93484       //              |
93485       //              e
93486       //
93487       function unZorroIntersection(intersection$$1, graph) {
93488           var vertex = graph.entity(intersection$$1.nodeId);
93489           var way1 = graph.entity(intersection$$1.movedId);
93490           var way2 = graph.entity(intersection$$1.unmovedId);
93491           var isEP1 = intersection$$1.movedIsEP;
93492           var isEP2 = intersection$$1.unmovedIsEP;
93493
93494           // don't move the vertex if it is the endpoint of both ways.
93495           if (isEP1 && isEP2) return graph;
93496
93497           var nodes1 = without(graph.childNodes(way1), vertex);
93498           var nodes2 = without(graph.childNodes(way2), vertex);
93499
93500           if (way1.isClosed() && way1.first() === vertex.id) nodes1.push(nodes1[0]);
93501           if (way2.isClosed() && way2.first() === vertex.id) nodes2.push(nodes2[0]);
93502
93503           var edge1 = !isEP1 && geoChooseEdge(nodes1, projection(vertex.loc), projection);
93504           var edge2 = !isEP2 && geoChooseEdge(nodes2, projection(vertex.loc), projection);
93505           var loc;
93506
93507           // snap vertex to nearest edge (or some point between them)..
93508           if (!isEP1 && !isEP2) {
93509               var epsilon = 1e-6, maxIter = 10;
93510               for (var i = 0; i < maxIter; i++) {
93511                   loc = geoVecInterp(edge1.loc, edge2.loc, 0.5);
93512                   edge1 = geoChooseEdge(nodes1, projection(loc), projection);
93513                   edge2 = geoChooseEdge(nodes2, projection(loc), projection);
93514                   if (Math.abs(edge1.distance - edge2.distance) < epsilon) break;
93515               }
93516           } else if (!isEP1) {
93517               loc = edge1.loc;
93518           } else {
93519               loc = edge2.loc;
93520           }
93521
93522           graph = graph.replace(vertex.move(loc));
93523
93524           // if zorro happened, reorder nodes..
93525           if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) {
93526               way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index);
93527               graph = graph.replace(way1);
93528           }
93529           if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) {
93530               way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index);
93531               graph = graph.replace(way2);
93532           }
93533
93534           return graph;
93535       }
93536
93537
93538       function cleanupIntersections(graph) {
93539           for (var i = 0; i < cache.intersections.length; i++) {
93540               var obj = cache.intersections[i];
93541               graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, _delta);
93542               graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null);
93543               graph = unZorroIntersection(obj, graph);
93544               graph = removeDuplicateVertices(obj.movedId, graph);
93545               graph = removeDuplicateVertices(obj.unmovedId, graph);
93546           }
93547
93548           return graph;
93549       }
93550
93551
93552       // check if moving way endpoint can cross an unmoved way, if so limit delta..
93553       function limitDelta(graph) {
93554           function moveNode(loc) {
93555               return geoVecAdd(projection(loc), _delta);
93556           }
93557
93558           for (var i = 0; i < cache.intersections.length; i++) {
93559               var obj = cache.intersections[i];
93560
93561               // Don't limit movement if this is vertex joins 2 endpoints..
93562               if (obj.movedIsEP && obj.unmovedIsEP) continue;
93563               // Don't limit movement if this vertex is not an endpoint anyway..
93564               if (!obj.movedIsEP) continue;
93565
93566               var node = graph.entity(obj.nodeId);
93567               var start = projection(node.loc);
93568               var end = geoVecAdd(start, _delta);
93569               var movedNodes = graph.childNodes(graph.entity(obj.movedId));
93570               var movedPath = map$3(map$3(movedNodes, 'loc'), moveNode);
93571               var unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId));
93572               var unmovedPath = map$3(map$3(unmovedNodes, 'loc'), projection);
93573               var hits = geoPathIntersections(movedPath, unmovedPath);
93574
93575               for (var j = 0; i < hits.length; i++) {
93576                   if (isEqual(hits[j], end)) continue;
93577                   var edge = geoChooseEdge(unmovedNodes, end, projection);
93578                   _delta = geoVecSubtract(projection(edge.loc), start);
93579               }
93580           }
93581       }
93582
93583
93584       var action = function(graph) {
93585           if (_delta[0] === 0 && _delta[1] === 0) return graph;
93586
93587           setupCache(graph);
93588
93589           if (cache.intersections.length) {
93590               limitDelta(graph);
93591           }
93592
93593           for (var i = 0; i < cache.nodes.length; i++) {
93594               var node = graph.entity(cache.nodes[i]);
93595               var start = projection(node.loc);
93596               var end = geoVecAdd(start, _delta);
93597               graph = graph.replace(node.move(projection.invert(end)));
93598           }
93599
93600           if (cache.intersections.length) {
93601               graph = cleanupIntersections(graph);
93602           }
93603
93604           return graph;
93605       };
93606
93607
93608       action.delta = function() {
93609           return _delta;
93610       };
93611
93612
93613       return action;
93614   }
93615
93616   function actionMoveNode(nodeID, toLoc) {
93617
93618       var action = function(graph, t) {
93619           if (t === null || !isFinite(t)) t = 1;
93620           t = Math.min(Math.max(+t, 0), 1);
93621
93622           var node = graph.entity(nodeID);
93623           return graph.replace(
93624               node.move(geoVecInterp(node.loc, toLoc, t))
93625           );
93626       };
93627
93628       action.transitionable = true;
93629
93630       return action;
93631   }
93632
93633   function actionNoop() {
93634       return function(graph) {
93635           return graph;
93636       };
93637   }
93638
93639   /*
93640    * Based on https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/potlatch2/tools/Quadrilateralise.as
93641    */
93642   function actionOrthogonalize(wayId, projection) {
93643       var threshold = 12, // degrees within right or straight to alter
93644           lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180),
93645           upperThreshold = Math.cos(threshold * Math.PI / 180);
93646
93647
93648       var action = function(graph, t) {
93649           if (t === null || !isFinite(t)) t = 1;
93650           t = Math.min(Math.max(+t, 0), 1);
93651
93652           var way = graph.entity(wayId),
93653               nodes = graph.childNodes(way),
93654               points = uniq(nodes).map(function(n) { return projection(n.loc); }),
93655               corner = {i: 0, dotp: 1},
93656               epsilon = 1e-4,
93657               node, loc, score, motions, i, j;
93658
93659           if (points.length === 3) {   // move only one vertex for right triangle
93660               for (i = 0; i < 1000; i++) {
93661                   motions = points.map(calcMotion);
93662                   points[corner.i] = addPoints(points[corner.i], motions[corner.i]);
93663                   score = corner.dotp;
93664                   if (score < epsilon) {
93665                       break;
93666                   }
93667               }
93668
93669               node = graph.entity(nodes[corner.i].id);
93670               loc = projection.invert(points[corner.i]);
93671               graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
93672
93673           } else {
93674               var best,
93675                   originalPoints = clone(points);
93676               score = Infinity;
93677
93678               for (i = 0; i < 1000; i++) {
93679                   motions = points.map(calcMotion);
93680                   for (j = 0; j < motions.length; j++) {
93681                       points[j] = addPoints(points[j],motions[j]);
93682                   }
93683                   var newScore = squareness(points);
93684                   if (newScore < score) {
93685                       best = clone(points);
93686                       score = newScore;
93687                   }
93688                   if (score < epsilon) {
93689                       break;
93690                   }
93691               }
93692
93693               points = best;
93694
93695               for (i = 0; i < points.length; i++) {
93696                   // only move the points that actually moved
93697                   if (originalPoints[i][0] !== points[i][0] || originalPoints[i][1] !== points[i][1]) {
93698                       loc = projection.invert(points[i]);
93699                       node = graph.entity(nodes[i].id);
93700                       graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
93701                   }
93702               }
93703
93704               // remove empty nodes on straight sections
93705               for (i = 0; t === 1 && i < points.length; i++) {
93706                   node = graph.entity(nodes[i].id);
93707
93708                   if (graph.parentWays(node).length > 1 ||
93709                       graph.parentRelations(node).length ||
93710                       node.hasInterestingTags()) {
93711                       continue;
93712                   }
93713
93714                   var dotp = normalizedDotProduct(i, points);
93715                   if (dotp < -1 + epsilon) {
93716                       graph = actionDeleteNode(node.id)(graph);
93717                   }
93718               }
93719           }
93720
93721           return graph;
93722
93723
93724           function calcMotion(b, i, array) {
93725               var a = array[(i - 1 + array.length) % array.length],
93726                   c = array[(i + 1) % array.length],
93727                   p = subtractPoints(a, b),
93728                   q = subtractPoints(c, b),
93729                   scale, dotp;
93730
93731               scale = 2 * Math.min(geoVecLength(p, [0, 0]), geoVecLength(q, [0, 0]));
93732               p = normalizePoint(p, 1.0);
93733               q = normalizePoint(q, 1.0);
93734
93735               dotp = filterDotProduct(p[0] * q[0] + p[1] * q[1]);
93736
93737               // nasty hack to deal with almost-straight segments (angle is closer to 180 than to 90/270).
93738               if (array.length > 3) {
93739                   if (dotp < -0.707106781186547) {
93740                       dotp += 1.0;
93741                   }
93742               } else if (dotp && Math.abs(dotp) < corner.dotp) {
93743                   corner.i = i;
93744                   corner.dotp = Math.abs(dotp);
93745               }
93746
93747               return normalizePoint(addPoints(p, q), 0.1 * dotp * scale);
93748           }
93749       };
93750
93751
93752       function squareness(points) {
93753           return points.reduce(function(sum, val, i, array) {
93754               var dotp = normalizedDotProduct(i, array);
93755
93756               dotp = filterDotProduct(dotp);
93757               return sum + 2.0 * Math.min(Math.abs(dotp - 1.0), Math.min(Math.abs(dotp), Math.abs(dotp + 1)));
93758           }, 0);
93759       }
93760
93761
93762       function normalizedDotProduct(i, points) {
93763           var a = points[(i - 1 + points.length) % points.length],
93764               b = points[i],
93765               c = points[(i + 1) % points.length],
93766               p = subtractPoints(a, b),
93767               q = subtractPoints(c, b);
93768
93769           p = normalizePoint(p, 1.0);
93770           q = normalizePoint(q, 1.0);
93771
93772           return p[0] * q[0] + p[1] * q[1];
93773       }
93774
93775
93776       function subtractPoints(a, b) {
93777           return [a[0] - b[0], a[1] - b[1]];
93778       }
93779
93780
93781       function addPoints(a, b) {
93782           return [a[0] + b[0], a[1] + b[1]];
93783       }
93784
93785
93786       function normalizePoint(point, scale) {
93787           var vector = [0, 0];
93788           var length = Math.sqrt(point[0] * point[0] + point[1] * point[1]);
93789           if (length !== 0) {
93790               vector[0] = point[0] / length;
93791               vector[1] = point[1] / length;
93792           }
93793
93794           vector[0] *= scale;
93795           vector[1] *= scale;
93796
93797           return vector;
93798       }
93799
93800
93801       function filterDotProduct(dotp) {
93802           if (lowerThreshold > Math.abs(dotp) || Math.abs(dotp) > upperThreshold) {
93803               return dotp;
93804           }
93805
93806           return 0;
93807       }
93808
93809
93810       action.disabled = function(graph) {
93811           var way = graph.entity(wayId),
93812               nodes = graph.childNodes(way),
93813               points = uniq(nodes).map(function(n) { return projection(n.loc); });
93814
93815           if (squareness(points)) {
93816               return false;
93817           }
93818
93819           return 'not_squarish';
93820       };
93821
93822
93823       action.transitionable = true;
93824
93825
93826       return action;
93827   }
93828
93829   // `actionRestrictTurn` creates a turn restriction relation.
93830   //
93831   // `turn` must be an `osmTurn` object
93832   // see osm/intersection.js, pathToTurn()
93833   //
93834   // This specifies a restriction of type `restriction` when traveling from
93835   // `turn.from.way` toward `turn.to.way` via `turn.via.node` OR `turn.via.ways`.
93836   // (The action does not check that these entities form a valid intersection.)
93837   //
93838   // From, to, and via ways should be split before calling this action.
93839   // (old versions of the code would split the ways here, but we no longer do it)
93840   //
93841   // For testing convenience, accepts a restrictionID to assign to the new
93842   // relation. Normally, this will be undefined and the relation will
93843   // automatically be assigned a new ID.
93844   //
93845   function actionRestrictTurn(turn, restrictionType, restrictionID) {
93846
93847       return function(graph) {
93848           var fromWay = graph.entity(turn.from.way);
93849           var toWay = graph.entity(turn.to.way);
93850           var viaNode = turn.via.node && graph.entity(turn.via.node);
93851           var viaWays = turn.via.ways && turn.via.ways.map(function(id) { return graph.entity(id); });
93852           var members = [];
93853
93854           members.push({ id: fromWay.id, type: 'way',  role: 'from' });
93855
93856           if (viaNode) {
93857               members.push({ id: viaNode.id,  type: 'node', role: 'via' });
93858           } else if (viaWays) {
93859               viaWays.forEach(function(viaWay) {
93860                   members.push({ id: viaWay.id,  type: 'way', role: 'via' });
93861               });
93862           }
93863
93864           members.push({ id: toWay.id, type: 'way',  role: 'to' });
93865
93866           return graph.replace(osmRelation({
93867               id: restrictionID,
93868               tags: {
93869                   type: 'restriction',
93870                   restriction: restrictionType
93871               },
93872               members: members
93873           }));
93874       };
93875   }
93876
93877   function actionRevert(id) {
93878       var action = function(graph) {
93879           var entity = graph.hasEntity(id),
93880               base = graph.base().entities[id];
93881
93882           if (entity && !base) {    // entity will be removed..
93883               if (entity.type === 'node') {
93884                   graph.parentWays(entity)
93885                       .forEach(function(parent) {
93886                           parent = parent.removeNode(id);
93887                           graph = graph.replace(parent);
93888
93889                           if (parent.isDegenerate()) {
93890                               graph = actionDeleteWay(parent.id)(graph);
93891                           }
93892                       });
93893               }
93894
93895               graph.parentRelations(entity)
93896                   .forEach(function(parent) {
93897                       parent = parent.removeMembersWithID(id);
93898                       graph = graph.replace(parent);
93899
93900                       if (parent.isDegenerate()) {
93901                           graph = actionDeleteRelation(parent.id)(graph);
93902                       }
93903                   });
93904           }
93905
93906           return graph.revert(id);
93907       };
93908
93909       return action;
93910   }
93911
93912   function actionRotate(rotateIds, pivot, angle, projection) {
93913
93914       var action = function(graph) {
93915           return graph.update(function(graph) {
93916               utilGetAllNodes(rotateIds, graph).forEach(function(node) {
93917                   var point = geoRotate([projection(node.loc)], angle, pivot)[0];
93918                   graph = graph.replace(node.move(projection.invert(point)));
93919               });
93920           });
93921       };
93922
93923       return action;
93924   }
93925
93926   /* Built-in method references for those with the same name as other `lodash` methods. */
93927   var nativeMax$8 = Math.max;
93928
93929   /**
93930    * Gets the index at which the first occurrence of `value` is found in `array`
93931    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
93932    * for equality comparisons. If `fromIndex` is negative, it's used as the
93933    * offset from the end of `array`.
93934    *
93935    * @static
93936    * @memberOf _
93937    * @since 0.1.0
93938    * @category Array
93939    * @param {Array} array The array to inspect.
93940    * @param {*} value The value to search for.
93941    * @param {number} [fromIndex=0] The index to search from.
93942    * @returns {number} Returns the index of the matched value, else `-1`.
93943    * @example
93944    *
93945    * _.indexOf([1, 2, 1, 2], 2);
93946    * // => 1
93947    *
93948    * // Search from the `fromIndex`.
93949    * _.indexOf([1, 2, 1, 2], 2, 2);
93950    * // => 3
93951    */
93952   function indexOf(array, value, fromIndex) {
93953     var length = array == null ? 0 : array.length;
93954     if (!length) {
93955       return -1;
93956     }
93957     var index = fromIndex == null ? 0 : toInteger(fromIndex);
93958     if (index < 0) {
93959       index = nativeMax$8(length + index, 0);
93960     }
93961     return baseIndexOf(array, value, index);
93962   }
93963
93964   // Split a way at the given node.
93965   //
93966   // Optionally, split only the given ways, if multiple ways share
93967   // the given node.
93968   //
93969   // This is the inverse of `iD.actionJoin`.
93970   //
93971   // For testing convenience, accepts an ID to assign to the new way.
93972   // Normally, this will be undefined and the way will automatically
93973   // be assigned a new ID.
93974   //
93975   // Reference:
93976   //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
93977   //
93978   function actionSplit(nodeId, newWayIds) {
93979       var _wayIDs;
93980
93981       // If the way is closed, we need to search for a partner node
93982       // to split the way at.
93983       //
93984       // The following looks for a node that is both far away from
93985       // the initial node in terms of way segment length and nearby
93986       // in terms of beeline-distance. This assures that areas get
93987       // split on the most "natural" points (independent of the number
93988       // of nodes).
93989       // For example: bone-shaped areas get split across their waist
93990       // line, circles across the diameter.
93991       function splitArea(nodes, idxA, graph) {
93992           var lengths = new Array(nodes.length);
93993           var length;
93994           var i;
93995           var best = 0;
93996           var idxB;
93997
93998           function wrap(index) {
93999               return utilWrap(index, nodes.length);
94000           }
94001
94002           function dist(nA, nB) {
94003               var locA = graph.entity(nA).loc;
94004               var locB = graph.entity(nB).loc;
94005               var epsilon = 1e-6;
94006               return (locA && locB) ? geoSphericalDistance(locA, locB) : epsilon;
94007           }
94008
94009           // calculate lengths
94010           length = 0;
94011           for (i = wrap(idxA+1); i !== idxA; i = wrap(i+1)) {
94012               length += dist(nodes[i], nodes[wrap(i-1)]);
94013               lengths[i] = length;
94014           }
94015
94016           length = 0;
94017           for (i = wrap(idxA-1); i !== idxA; i = wrap(i-1)) {
94018               length += dist(nodes[i], nodes[wrap(i+1)]);
94019               if (length < lengths[i])
94020                   lengths[i] = length;
94021           }
94022
94023           // determine best opposite node to split
94024           for (i = 0; i < nodes.length; i++) {
94025               var cost = lengths[i] / dist(nodes[idxA], nodes[i]);
94026               if (cost > best) {
94027                   idxB = i;
94028                   best = cost;
94029               }
94030           }
94031
94032           return idxB;
94033       }
94034
94035
94036       function split(graph, wayA, newWayId) {
94037           var wayB = osmWay({id: newWayId, tags: wayA.tags});   // `wayB` is the NEW way
94038           var origNodes = wayA.nodes.slice();
94039           var nodesA;
94040           var nodesB;
94041           var isArea = wayA.isArea();
94042           var isOuter = osmIsSimpleMultipolygonOuterMember(wayA, graph);
94043
94044           if (wayA.isClosed()) {
94045               var nodes = wayA.nodes.slice(0, -1);
94046               var idxA = indexOf(nodes, nodeId);
94047               var idxB = splitArea(nodes, idxA, graph);
94048
94049               if (idxB < idxA) {
94050                   nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
94051                   nodesB = nodes.slice(idxB, idxA + 1);
94052               } else {
94053                   nodesA = nodes.slice(idxA, idxB + 1);
94054                   nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
94055               }
94056           } else {
94057               var idx = indexOf(wayA.nodes, nodeId, 1);
94058               nodesA = wayA.nodes.slice(0, idx + 1);
94059               nodesB = wayA.nodes.slice(idx);
94060           }
94061
94062           wayA = wayA.update({nodes: nodesA});
94063           wayB = wayB.update({nodes: nodesB});
94064
94065           graph = graph.replace(wayA);
94066           graph = graph.replace(wayB);
94067
94068           graph.parentRelations(wayA).forEach(function(relation) {
94069               var member;
94070
94071               // Turn restrictions - make sure:
94072               // 1. Splitting a FROM/TO way - only `wayA` OR `wayB` remains in relation
94073               //    (whichever one is connected to the VIA node/ways)
94074               // 2. Splitting a VIA way - `wayB` remains in relation as a VIA way
94075               if (relation.isRestriction()) {
94076                   var f = relation.memberByRole('from');
94077                   var v = relation.membersByRole('via');
94078                   var t = relation.memberByRole('to');
94079                   var i;
94080
94081                   // 1. split a FROM/TO
94082                   if (f.id === wayA.id || t.id === wayA.id) {
94083                       var keepB = false;
94084                       if (v.length === 1 && v[0].type === 'node') {   // check via node
94085                           keepB = wayB.contains(v[0].id);
94086                       } else {                                        // check via way(s)
94087                           for (i = 0; i < v.length; i++) {
94088                               if (v[i].type === 'way') {
94089                                   var wayVia = graph.hasEntity(v[i].id);
94090                                   if (wayVia && intersection(wayB.nodes, wayVia.nodes).length) {
94091                                       keepB = true;
94092                                       break;
94093                                   }
94094                               }
94095                           }
94096                       }
94097
94098                       if (keepB) {
94099                           relation = relation.replaceMember(wayA, wayB);
94100                           graph = graph.replace(relation);
94101                       }
94102
94103                   // 2. split a VIA
94104                   } else {
94105                       for (i = 0; i < v.length; i++) {
94106                           if (v[i].type === 'way' && v[i].id === wayA.id) {
94107                               member = {
94108                                   id: wayB.id,
94109                                   type: 'way',
94110                                   role: 'via'
94111                               };
94112                               graph = actionAddMember(relation.id, member, v[i].index + 1)(graph);
94113                               break;
94114                           }
94115                       }
94116                   }
94117
94118               // All other relations (Routes, Multipolygons, etc):
94119               // 1. Both `wayA` and `wayB` remain in the relation
94120               // 2. But must be inserted as a pair (see `actionAddMember` for details)
94121               } else {
94122                   if (relation === isOuter) {
94123                       graph = graph.replace(relation.mergeTags(wayA.tags));
94124                       graph = graph.replace(wayA.update({tags: {}}));
94125                       graph = graph.replace(wayB.update({tags: {}}));
94126                   }
94127
94128                   member = {
94129                       id: wayB.id,
94130                       type: 'way',
94131                       role: relation.memberById(wayA.id).role
94132                   };
94133
94134                   var insertPair = {
94135                       originalID: wayA.id,
94136                       insertedID: wayB.id,
94137                       nodes: origNodes
94138                   };
94139
94140                   graph = actionAddMember(relation.id, member, undefined, insertPair)(graph);
94141               }
94142           });
94143
94144           if (!isOuter && isArea) {
94145               var multipolygon = osmRelation({
94146                   tags: assignIn({}, wayA.tags, {type: 'multipolygon'}),
94147                   members: [
94148                       {id: wayA.id, role: 'outer', type: 'way'},
94149                       {id: wayB.id, role: 'outer', type: 'way'}
94150                   ]
94151               });
94152
94153               graph = graph.replace(multipolygon);
94154               graph = graph.replace(wayA.update({tags: {}}));
94155               graph = graph.replace(wayB.update({tags: {}}));
94156           }
94157
94158           return graph;
94159       }
94160
94161
94162       var action = function(graph) {
94163           var candidates = action.ways(graph);
94164           for (var i = 0; i < candidates.length; i++) {
94165               graph = split(graph, candidates[i], newWayIds && newWayIds[i]);
94166           }
94167           return graph;
94168       };
94169
94170
94171       action.ways = function(graph) {
94172           var node = graph.entity(nodeId);
94173           var parents = graph.parentWays(node);
94174           var hasLines = some(parents, function(parent) { return parent.geometry(graph) === 'line'; });
94175
94176           return parents.filter(function(parent) {
94177               if (_wayIDs && _wayIDs.indexOf(parent.id) === -1)
94178                   return false;
94179
94180               if (!_wayIDs && hasLines && parent.geometry(graph) !== 'line')
94181                   return false;
94182
94183               if (parent.isClosed()) {
94184                   return true;
94185               }
94186
94187               for (var i = 1; i < parent.nodes.length - 1; i++) {
94188                   if (parent.nodes[i] === nodeId) {
94189                       return true;
94190                   }
94191               }
94192
94193               return false;
94194           });
94195       };
94196
94197
94198       action.disabled = function(graph) {
94199           var candidates = action.ways(graph);
94200           if (candidates.length === 0 || (_wayIDs && _wayIDs.length !== candidates.length))
94201               return 'not_eligible';
94202       };
94203
94204
94205       action.limitWays = function(_) {
94206           if (!arguments.length) return _wayIDs;
94207           _wayIDs = _;
94208           return action;
94209       };
94210
94211
94212       return action;
94213   }
94214
94215   /*
94216    * Based on https://github.com/openstreetmap/potlatch2/net/systemeD/potlatch2/tools/Straighten.as
94217    */
94218   function actionStraighten(wayId, projection) {
94219
94220       function positionAlongWay(n, s, e) {
94221           return ((n[0] - s[0]) * (e[0] - s[0]) + (n[1] - s[1]) * (e[1] - s[1])) /
94222                   (Math.pow(e[0] - s[0], 2) + Math.pow(e[1] - s[1], 2));
94223       }
94224
94225
94226       var action = function(graph, t) {
94227           if (t === null || !isFinite(t)) t = 1;
94228           t = Math.min(Math.max(+t, 0), 1);
94229
94230           var way = graph.entity(wayId),
94231               nodes = graph.childNodes(way),
94232               points = nodes.map(function(n) { return projection(n.loc); }),
94233               startPoint = points[0],
94234               endPoint = points[points.length-1],
94235               toDelete = [],
94236               i;
94237
94238           for (i = 1; i < points.length-1; i++) {
94239               var node = nodes[i],
94240                   point = points[i];
94241
94242               if (t < 1 || graph.parentWays(node).length > 1 ||
94243                   graph.parentRelations(node).length ||
94244                   node.hasInterestingTags()) {
94245
94246                   var u = positionAlongWay(point, startPoint, endPoint),
94247                       p = [
94248                           startPoint[0] + u * (endPoint[0] - startPoint[0]),
94249                           startPoint[1] + u * (endPoint[1] - startPoint[1])
94250                       ],
94251                       loc2 = projection.invert(p);
94252
94253                   graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
94254
94255               } else {
94256                   // safe to delete
94257                   if (toDelete.indexOf(node) === -1) {
94258                       toDelete.push(node);
94259                   }
94260               }
94261           }
94262
94263           for (i = 0; i < toDelete.length; i++) {
94264               graph = actionDeleteNode(toDelete[i].id)(graph);
94265           }
94266
94267           return graph;
94268       };
94269
94270
94271       action.disabled = function(graph) {
94272           // check way isn't too bendy
94273           var way = graph.entity(wayId),
94274               nodes = graph.childNodes(way),
94275               points = nodes.map(function(n) { return projection(n.loc); }),
94276               startPoint = points[0],
94277               endPoint = points[points.length-1],
94278               threshold = 0.2 * geoVecLength(startPoint, endPoint),
94279               i;
94280
94281           if (threshold === 0) {
94282               return 'too_bendy';
94283           }
94284
94285           for (i = 1; i < points.length-1; i++) {
94286               var point = points[i],
94287                   u = positionAlongWay(point, startPoint, endPoint),
94288                   p0 = startPoint[0] + u * (endPoint[0] - startPoint[0]),
94289                   p1 = startPoint[1] + u * (endPoint[1] - startPoint[1]),
94290                   dist = Math.sqrt(Math.pow(p0 - point[0], 2) + Math.pow(p1 - point[1], 2));
94291
94292               // to bendy if point is off by 20% of total start/end distance in projected space
94293               if (isNaN(dist) || dist > threshold) {
94294                   return 'too_bendy';
94295               }
94296           }
94297       };
94298
94299
94300       action.transitionable = true;
94301
94302
94303       return action;
94304   }
94305
94306   // `actionUnrestrictTurn` deletes a turn restriction relation.
94307   //
94308   // `turn` must be an `osmTurn` object with a `restrictionID` property.
94309   // see osm/intersection.js, pathToTurn()
94310   //
94311   function actionUnrestrictTurn(turn) {
94312       return function(graph) {
94313           return actionDeleteRelation(turn.restrictionID)(graph);
94314       };
94315   }
94316
94317   /* Reflect the given area around its axis of symmetry */
94318   function actionReflect(reflectIds, projection) {
94319       var useLongAxis = true;
94320
94321
94322       // http://gis.stackexchange.com/questions/22895/finding-minimum-area-rectangle-for-given-points
94323       // http://gis.stackexchange.com/questions/3739/generalisation-strategies-for-building-outlines/3756#3756
94324       function getSmallestSurroundingRectangle(graph, nodes) {
94325           var points = nodes.map(function(n) { return projection(n.loc); }),
94326               hull = d3_polygonHull(points),
94327               centroid = d3_polygonCentroid(hull),
94328               minArea = Infinity,
94329               ssrExtent = [],
94330               ssrAngle = 0,
94331               c1 = hull[0];
94332
94333           for (var i = 0; i <= hull.length - 1; i++) {
94334               var c2 = (i === hull.length - 1) ? hull[0] : hull[i + 1],
94335                   angle = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]),
94336                   poly = geoRotate(hull, -angle, centroid),
94337                   extent = poly.reduce(function(extent, point) {
94338                           return extent.extend(geoExtent$$1(point));
94339                       }, geoExtent$$1()),
94340                   area = extent.area();
94341
94342               if (area < minArea) {
94343                   minArea = area;
94344                   ssrExtent = extent;
94345                   ssrAngle = angle;
94346               }
94347               c1 = c2;
94348           }
94349
94350           return {
94351               poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid),
94352               angle: ssrAngle
94353           };
94354       }
94355
94356
94357       var action = function(graph, t) {
94358           if (t === null || !isFinite(t)) t = 1;
94359           t = Math.min(Math.max(+t, 0), 1);
94360
94361           var nodes = utilGetAllNodes(reflectIds, graph),
94362               ssr = getSmallestSurroundingRectangle(graph, nodes);
94363
94364           // Choose line pq = axis of symmetry.
94365           // The shape's surrounding rectangle has 2 axes of symmetry.
94366           // Reflect across the longer axis by default.
94367           var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ],
94368               q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ],
94369               p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ],
94370               q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ],
94371               p, q;
94372
94373           var isLong = (geoVecLength(p1, q1) > geoVecLength(p2, q2));
94374           if ((useLongAxis && isLong) || (!useLongAxis && !isLong)) {
94375               p = p1;
94376               q = q1;
94377           } else {
94378               p = p2;
94379               q = q2;
94380           }
94381
94382           // reflect c across pq
94383           // http://math.stackexchange.com/questions/65503/point-reflection-over-a-line
94384           var dx = q[0] - p[0];
94385           var dy = q[1] - p[1];
94386           var a = (dx * dx - dy * dy) / (dx * dx + dy * dy);
94387           var b = 2 * dx * dy / (dx * dx + dy * dy);
94388           for (var i = 0; i < nodes.length; i++) {
94389               var node = nodes[i];
94390               var c = projection(node.loc);
94391               var c2 = [
94392                   a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0],
94393                   b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1]
94394               ];
94395               var loc2 = projection.invert(c2);
94396               node = node.move(geoVecInterp(node.loc, loc2, t));
94397               graph = graph.replace(node);
94398           }
94399
94400           return graph;
94401       };
94402
94403
94404       action.useLongAxis = function(_) {
94405           if (!arguments.length) return useLongAxis;
94406           useLongAxis = _;
94407           return action;
94408       };
94409
94410
94411       action.transitionable = true;
94412
94413
94414       return action;
94415   }
94416
94417   function actionDetachNode(nodeID) {
94418
94419       var action = function(graph) {
94420           var node = graph.entity(nodeID);
94421
94422           // Create a new node to replace the one we will detach
94423           var replacement = osmNode({ loc: node.loc });
94424           graph = graph.replace(replacement);
94425
94426           // Process each way in turn, updating the graph as we go
94427           graph = graph.parentWays(node)
94428               .reduce(function(accGraph, parentWay) {
94429                   return accGraph.replace(parentWay.replaceNode(nodeID, replacement.id));
94430               }, graph);
94431
94432           // Process any relations too
94433           return graph.parentRelations(node)
94434               .reduce(function(accGraph, parentRel) {
94435                   return accGraph.replace(parentRel.replaceMember(node, replacement));
94436               }, graph);
94437       };
94438
94439
94440       action.disabled = function(graph) {
94441           var node = graph.entity(nodeID);
94442           var parentRels = graph.parentRelations(node);
94443
94444           for (var i = 0; i < parentRels.length; i++) {
94445               var relation = parentRels[i];
94446               if (!relation.isValidRestriction()) continue;
94447
94448               for (var j = 0; j < relation.members.length; j++) {
94449                   var m = relation.members[j];
94450                   if (m.id === nodeID && (m.role === 'via' || m.role === 'location_hint')) {
94451                       return 'restriction';
94452                   }
94453               }
94454           }
94455
94456           return false;
94457       };
94458
94459
94460       return action;
94461   }
94462
94463   var Connection = services.osm;
94464
94465   var debug = false;
94466
94467   var iD = /*#__PURE__*/Object.freeze({
94468     Connection: Connection,
94469     debug: debug,
94470     d3: index$3,
94471     Context: coreContext,
94472     setAreaKeys: setAreaKeys,
94473     Difference: coreDifference,
94474     Graph: coreGraph$$1,
94475     History: coreHistory,
94476     Tree: coreTree,
94477     geoCross: geoVecCross,
94478     geoInterp: geoVecInterp,
94479     geoRoundCoordinates: geoVecFloor,
94480     geoEuclideanDistance: geoVecLength,
94481     Entity: osmEntity$$1,
94482     Node: osmNode,
94483     Relation: osmRelation,
94484     Way: osmWay,
94485     BackgroundSource: rendererBackgroundSource,
94486     Background: rendererBackground,
94487     Features: rendererFeatures,
94488     Map: rendererMap,
94489     TileLayer: rendererTileLayer,
94490     Detect: utilDetect,
94491     uiPreset: uiPresetEditor,
94492     actionAddEntity: actionAddEntity,
94493     actionAddMember: actionAddMember,
94494     actionAddMidpoint: actionAddMidpoint,
94495     actionAddVertex: actionAddVertex,
94496     actionChangeMember: actionChangeMember,
94497     actionChangePreset: actionChangePreset,
94498     actionChangeTags: actionChangeTags,
94499     actionCircularize: actionCircularize,
94500     actionConnect: actionConnect,
94501     actionCopyEntities: actionCopyEntities,
94502     actionDeleteMember: actionDeleteMember,
94503     actionDeleteMultiple: actionDeleteMultiple,
94504     actionDeleteNode: actionDeleteNode,
94505     actionDeleteRelation: actionDeleteRelation,
94506     actionDeleteWay: actionDeleteWay,
94507     actionDeprecateTags: actionDeprecateTags,
94508     actionDiscardTags: actionDiscardTags,
94509     actionDisconnect: actionDisconnect,
94510     actionJoin: actionJoin,
94511     actionMerge: actionMerge,
94512     actionMergeNodes: actionMergeNodes,
94513     actionMergePolygon: actionMergePolygon,
94514     actionMergeRemoteChanges: actionMergeRemoteChanges,
94515     actionMove: actionMove,
94516     actionMoveNode: actionMoveNode,
94517     actionNoop: actionNoop,
94518     actionOrthogonalize: actionOrthogonalize,
94519     actionRestrictTurn: actionRestrictTurn,
94520     actionReverse: actionReverse,
94521     actionRevert: actionRevert,
94522     actionRotate: actionRotate,
94523     actionSplit: actionSplit,
94524     actionStraighten: actionStraighten,
94525     actionUnrestrictTurn: actionUnrestrictTurn,
94526     actionReflect: actionReflect,
94527     actionDetachNode: actionDetachNode,
94528     behaviorAddWay: behaviorAddWay,
94529     behaviorBreathe: behaviorBreathe,
94530     behaviorCopy: behaviorCopy,
94531     behaviorDrag: behaviorDrag,
94532     behaviorDrawWay: behaviorDrawWay,
94533     behaviorDraw: behaviorDraw,
94534     behaviorEdit: behaviorEdit,
94535     behaviorHash: behaviorHash,
94536     behaviorHover: behaviorHover,
94537     behaviorLasso: behaviorLasso,
94538     behaviorOperation: behaviorOperation,
94539     behaviorPaste: behaviorPaste,
94540     behaviorSelect: behaviorSelect,
94541     behaviorTail: behaviorTail,
94542     coreContext: coreContext,
94543     coreDifference: coreDifference,
94544     coreGraph: coreGraph$$1,
94545     coreHistory: coreHistory,
94546     coreTree: coreTree,
94547     data: data,
94548     dataWikipedia: wikipedia$2,
94549     dataAddressFormats: dataAddressFormats,
94550     dataDeprecated: dataDeprecated,
94551     dataDiscarded: dataDiscarded,
94552     dataLocales: dataLocales,
94553     dataPhoneFormats: dataPhoneFormats,
94554     dataShortcuts: dataShortcuts,
94555     dataImperial: dataImperial,
94556     dataDriveLeft: dataDriveLeft,
94557     dataEn: en,
94558     geoExtent: geoExtent$$1,
94559     geoLatToMeters: geoLatToMeters,
94560     geoLonToMeters: geoLonToMeters,
94561     geoMetersToLat: geoMetersToLat,
94562     geoMetersToLon: geoMetersToLon,
94563     geoMetersToOffset: geoMetersToOffset,
94564     geoOffsetToMeters: geoOffsetToMeters,
94565     geoScaleToZoom: geoScaleToZoom,
94566     geoSphericalDistance: geoSphericalDistance,
94567     geoZoomToScale: geoZoomToScale,
94568     geoAngle: geoAngle,
94569     geoChooseEdge: geoChooseEdge,
94570     geoEdgeEqual: geoEdgeEqual,
94571     geoHasLineIntersections: geoHasLineIntersections,
94572     geoHasSelfIntersections: geoHasSelfIntersections,
94573     geoRotate: geoRotate,
94574     geoLineIntersection: geoLineIntersection,
94575     geoPathHasIntersections: geoPathHasIntersections,
94576     geoPathIntersections: geoPathIntersections,
94577     geoPathLength: geoPathLength,
94578     geoPointInPolygon: geoPointInPolygon,
94579     geoPolygonContainsPolygon: geoPolygonContainsPolygon,
94580     geoPolygonIntersectsPolygon: geoPolygonIntersectsPolygon,
94581     geoViewportEdge: geoViewportEdge,
94582     geoRawMercator: geoRawMercator,
94583     geoVecAdd: geoVecAdd,
94584     geoVecAngle: geoVecAngle,
94585     geoVecCross: geoVecCross,
94586     geoVecDot: geoVecDot,
94587     geoVecEqual: geoVecEqual,
94588     geoVecFloor: geoVecFloor,
94589     geoVecInterp: geoVecInterp,
94590     geoVecLength: geoVecLength,
94591     geoVecSubtract: geoVecSubtract,
94592     geoVecScale: geoVecScale,
94593     modeAddArea: modeAddArea$$1,
94594     modeAddLine: modeAddLine$$1,
94595     modeAddPoint: modeAddPoint$$1,
94596     modeAddNote: modeAddNote$$1,
94597     modeBrowse: modeBrowse,
94598     modeDragNode: modeDragNode$$1,
94599     modeDragNote: modeDragNote$$1,
94600     modeDrawArea: modeDrawArea,
94601     modeDrawLine: modeDrawLine,
94602     modeMove: modeMove$$1,
94603     modeRotate: modeRotate$$1,
94604     modeSave: modeSave$$1,
94605     modeSelect: modeSelect,
94606     modeSelectData: modeSelectData$$1,
94607     modeSelectError: modeSelectError$$1,
94608     modeSelectNote: modeSelectNote$$1,
94609     operationCircularize: operationCircularize,
94610     operationContinue: operationContinue,
94611     operationDelete: operationDelete,
94612     operationDisconnect: operationDisconnect,
94613     operationMerge: operationMerge,
94614     operationMove: operationMove,
94615     operationOrthogonalize: operationOrthogonalize,
94616     operationReflectShort: operationReflectShort,
94617     operationReflectLong: operationReflectLong,
94618     operationReverse: operationReverse,
94619     operationRotate: operationRotate,
94620     operationSplit: operationSplit,
94621     operationStraighten: operationStraighten,
94622     operationDetachNode: operationDetachNode,
94623     osmChangeset: osmChangeset,
94624     osmEntity: osmEntity$$1,
94625     krError: krError,
94626     osmNode: osmNode,
94627     osmNote: osmNote,
94628     osmRelation: osmRelation,
94629     osmWay: osmWay,
94630     osmIntersection: osmIntersection,
94631     osmTurn: osmTurn,
94632     osmInferRestriction: osmInferRestriction,
94633     osmLanes: osmLanes,
94634     osmIsSimpleMultipolygonOuterMember: osmIsSimpleMultipolygonOuterMember,
94635     osmSimpleMultipolygonOuterMember: osmSimpleMultipolygonOuterMember,
94636     osmJoinWays: osmJoinWays,
94637     osmOneWayTags: osmOneWayTags,
94638     osmPavedTags: osmPavedTags,
94639     osmIsInterestingTag: osmIsInterestingTag,
94640     presetCategory: presetCategory,
94641     presetCollection: presetCollection,
94642     presetField: presetField,
94643     presetPreset: presetPreset,
94644     presetIndex: presetIndex,
94645     rendererBackgroundSource: rendererBackgroundSource,
94646     rendererBackground: rendererBackground,
94647     rendererFeatures: rendererFeatures,
94648     rendererMap: rendererMap,
94649     rendererTileLayer: rendererTileLayer,
94650     services: services,
94651     serviceKeepRight: serviceKeepRight,
94652     serviceMapillary: serviceMapillary,
94653     serviceMapRules: serviceMapRules,
94654     serviceNominatim: serviceNominatim,
94655     serviceOpenstreetcam: serviceOpenstreetcam,
94656     serviceOsm: serviceOsm,
94657     serviceOsmWikibase: serviceOsmWikibase,
94658     serviceStreetside: serviceStreetside,
94659     serviceTaginfo: serviceTaginfo,
94660     serviceVectorTile: serviceVectorTile,
94661     serviceWikidata: serviceWikidata,
94662     serviceWikipedia: serviceWikipedia,
94663     svgAreas: svgAreas$$1,
94664     svgData: svgData$$1,
94665     svgDebug: svgDebug$$1,
94666     svgDefs: svgDefs,
94667     svgKeepRight: svgKeepRight$$1,
94668     svgIcon: svgIcon,
94669     svgGeolocate: svgGeolocate,
94670     svgLabels: svgLabels,
94671     svgLayers: svgLayers,
94672     svgLines: svgLines$$1,
94673     svgMapillaryImages: svgMapillaryImages$$1,
94674     svgMapillarySigns: svgMapillarySigns$$1,
94675     svgMidpoints: svgMidpoints$$1,
94676     svgNotes: svgNotes$$1,
94677     svgMarkerSegments: svgMarkerSegments,
94678     svgOpenstreetcamImages: svgOpenstreetcamImages$$1,
94679     svgOsm: svgOsm,
94680     svgPassiveVertex: svgPassiveVertex,
94681     svgPath: svgPath,
94682     svgPointTransform: svgPointTransform,
94683     svgPoints: svgPoints$$1,
94684     svgRelationMemberTags: svgRelationMemberTags,
94685     svgSegmentWay: svgSegmentWay,
94686     svgStreetside: svgStreetside$$1,
94687     svgTagClasses: svgTagClasses,
94688     svgTouch: svgTouch,
94689     svgTurns: svgTurns,
94690     svgVertices: svgVertices$$1,
94691     uiFields: uiFields,
94692     uiFieldDefaultCheck: uiFieldCheck,
94693     uiFieldOnewayCheck: uiFieldCheck,
94694     uiFieldCheck: uiFieldCheck,
94695     uiFieldMultiCombo: uiFieldCombo,
94696     uiFieldNetworkCombo: uiFieldCombo,
94697     uiFieldSemiCombo: uiFieldCombo,
94698     uiFieldTypeCombo: uiFieldCombo,
94699     uiFieldCombo: uiFieldCombo,
94700     uiFieldUrl: uiFieldText,
94701     uiFieldNumber: uiFieldText,
94702     uiFieldTel: uiFieldText,
94703     uiFieldEmail: uiFieldText,
94704     uiFieldText: uiFieldText,
94705     uiFieldAccess: uiFieldAccess,
94706     uiFieldAddress: uiFieldAddress,
94707     uiFieldCycleway: uiFieldCycleway,
94708     uiFieldLanes: uiFieldLanes,
94709     uiFieldLocalized: uiFieldLocalized,
94710     uiFieldMaxspeed: uiFieldMaxspeed,
94711     uiFieldStructureRadio: uiFieldRadio,
94712     uiFieldRadio: uiFieldRadio,
94713     uiFieldRestrictions: uiFieldRestrictions,
94714     uiFieldTextarea: uiFieldTextarea,
94715     uiFieldWikidata: uiFieldWikidata,
94716     uiFieldWikipedia: uiFieldWikipedia,
94717     uiIntro: uiIntro,
94718     uiInfoPanels: uiInfoPanels,
94719     uiPanelBackground: uiPanelBackground,
94720     uiPanelHistory: uiPanelHistory,
94721     uiPanelLocation: uiPanelLocation,
94722     uiPanelMeasurement: uiPanelMeasurement,
94723     uiSettingsCustomBackground: uiSettingsCustomBackground,
94724     uiSettingsCustomData: uiSettingsCustomData,
94725     uiInit: uiInit,
94726     uiAccount: uiAccount,
94727     uiAttribution: uiAttribution,
94728     uiBackground: uiBackground,
94729     uiBackgroundDisplayOptions: uiBackgroundDisplayOptions,
94730     uiBackgroundOffset: uiBackgroundOffset,
94731     uiChangesetEditor: uiChangesetEditor$$1,
94732     uiCmd: uiCmd,
94733     uiCombobox: uiCombobox,
94734     uiCommit: uiCommit,
94735     uiCommitChanges: uiCommitChanges,
94736     uiCommitWarnings: uiCommitWarnings,
94737     uiConfirm: uiConfirm,
94738     uiConflicts: uiConflicts,
94739     uiContributors: uiContributors,
94740     uiCurtain: uiCurtain,
94741     uiDataEditor: uiDataEditor$$1,
94742     uiDataHeader: uiDataHeader,
94743     uiDisclosure: uiDisclosure,
94744     uiEditMenu: uiEditMenu,
94745     uiEntityEditor: uiEntityEditor,
94746     uiFeatureInfo: uiFeatureInfo,
94747     uiFeatureList: uiFeatureList,
94748     uiField: uiField,
94749     uiFieldHelp: uiFieldHelp,
94750     uiFlash: uiFlash,
94751     uiFormFields: uiFormFields$$1,
94752     uiFullScreen: uiFullScreen,
94753     uiGeolocate: uiGeolocate,
94754     uiHelp: uiHelp,
94755     uiInfo: uiInfo,
94756     uiInspector: uiInspector,
94757     uiKeepRightDetails: uiKeepRightDetails,
94758     uiKeepRightEditor: uiKeepRightEditor$$1,
94759     uiKeepRightHeader: uiKeepRightHeader,
94760     uiLasso: uiLasso,
94761     uiLoading: uiLoading,
94762     uiMapData: uiMapData,
94763     uiMapInMap: uiMapInMap,
94764     uiModal: uiModal,
94765     uiModes: uiModes,
94766     uiNotice: uiNotice,
94767     uiNoteComments: uiNoteComments,
94768     uiNoteEditor: uiNoteEditor$$1,
94769     uiNoteHeader: uiNoteHeader,
94770     uiNoteReport: uiNoteReport,
94771     uiPresetEditor: uiPresetEditor,
94772     uiPresetIcon: uiPresetIcon,
94773     uiPresetList: uiPresetList,
94774     uiQuickLinks: uiQuickLinks,
94775     uiRadialMenu: uiRadialMenu,
94776     uiRawMemberEditor: uiRawMemberEditor$$1,
94777     uiRawMembershipEditor: uiRawMembershipEditor$$1,
94778     uiRawTagEditor: uiRawTagEditor$$1,
94779     uiRestore: uiRestore,
94780     uiSave: uiSave,
94781     uiScale: uiScale,
94782     uiSelectionList: uiSelectionList,
94783     uiSidebar: uiSidebar$$1,
94784     uiSourceSwitch: uiSourceSwitch,
94785     uiSpinner: uiSpinner,
94786     uiSplash: uiSplash,
94787     uiStatus: uiStatus,
94788     uiSuccess: uiSuccess$$1,
94789     uiTagReference: uiTagReference,
94790     uiToggle: uiToggle,
94791     uiTooltipHtml: uiTooltipHtml,
94792     uiUndoRedo: uiUndoRedo,
94793     uiVersion: uiVersion,
94794     uiViewOnOSM: uiViewOnOSM,
94795     uiViewOnKeepRight: uiViewOnKeepRight,
94796     uiZoom: uiZoom,
94797     utilAsyncMap: utilAsyncMap,
94798     utilCallWhenIdle: utilCallWhenIdle,
94799     utilCleanTags: utilCleanTags,
94800     utilDisplayName: utilDisplayName,
94801     utilDisplayNameForPath: utilDisplayNameForPath,
94802     utilDisplayType: utilDisplayType,
94803     utilEntityRoot: utilEntityRoot,
94804     utilEditDistance: utilEditDistance,
94805     utilEntitySelector: utilEntitySelector,
94806     utilEntityOrMemberSelector: utilEntityOrMemberSelector,
94807     utilEntityOrDeepMemberSelector: utilEntityOrDeepMemberSelector,
94808     utilFastMouse: utilFastMouse,
94809     utilFunctor: utilFunctor,
94810     utilGetAllNodes: utilGetAllNodes,
94811     utilGetPrototypeOf: utilGetPrototypeOf,
94812     utilGetSetValue: utilGetSetValue,
94813     utilHashcode: utilHashcode,
94814     utilHighlightEntity: utilHighlightEntity,
94815     utilIdleWorker: utilIdleWorker,
94816     utilKeybinding: utilKeybinding,
94817     utilNoAuto: utilNoAuto,
94818     utilPrefixCSSProperty: utilPrefixCSSProperty,
94819     utilPrefixDOMProperty: utilPrefixDOMProperty,
94820     utilQsString: utilQsString,
94821     utilRebind: utilRebind,
94822     utilSetTransform: utilSetTransform,
94823     utilSessionMutex: utilSessionMutex,
94824     utilStringQs: utilStringQs,
94825     utilTagText: utilTagText,
94826     utilTiler: utilTiler,
94827     utilTriggerEvent: utilTriggerEvent,
94828     utilWrap: utilWrap,
94829     validationDeprecatedTag: validationDeprecatedTag,
94830     validationDisconnectedHighway: validationDisconnectedHighway,
94831     validationGenericName: validationGenericName,
94832     validationManyDeletions: validationManyDeletions,
94833     validationMapCSSChecks: validationMapCSSChecks,
94834     validationMissingTag: validationMissingTag,
94835     validationOldMultipolygon: validationOldMultipolygon,
94836     validationTagSuggestsArea: validationTagSuggestsArea
94837   });
94838
94839   window.iD = iD;
94840
94841 }());
94842 //# sourceMappingURL=iD.js.map