]> git.openstreetmap.org Git - rails.git/blob - vendor/assets/iD/iD.js
Update to iD v2.13.0
[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 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"},"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"},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:"fountain,potable"},"amenity/driving_school":{name:"Driving School",terms:""},"amenity/embassy":{name:"Embassy",terms:""},"amenity/fast_food":{name:"Fast Food",terms:"restaurant,takeaway"},"amenity/fast_food/burger":{name:"Burger Fast Food",terms:"breakfast,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/fast_food/chicken":{name:"Chicken Fast Food",terms:"breakfast,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/fast_food/fish_and_chips":{name:"Fish & Chips Fast Food",terms:"breakfast,cafe,café,dine,dining,dinner,drive-in,eat,grill,lunch,table,french fries"},"amenity/fast_food/kebab":{name:"Kebab Fast Food",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/fast_food/pizza":{name:"Pizza Fast Food",terms:"dine,dining,dinner,drive-in,eat,lunch,table,deep dish,thin crust,slice"},"amenity/fast_food/sandwich":{name:"Sandwich Fast Food",terms:"breakfast,cafe,café,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/fire_station":{name:"Fire Station",terms:""},"amenity/food_court":{name:"Food Court",terms:"fast food,restaurant,food"},"amenity/fountain":{name:"Fountain",terms:""},"amenity/fuel":{name:"Gas Station",terms:"petrol,fuel,gasoline,propane,diesel,lng,cng,biodiesel"},"amenity/grave_yard":{name:"Graveyard",terms:""},"amenity/grit_bin":{name:"Grit Bin",terms:"salt,sand"},"amenity/hospital":{name:"Hospital Grounds",terms:"clinic,doctor,emergency room,health,infirmary,institution,sanatorium,sanitarium,sick,surgery,ward"},"amenity/hunting_stand":{name:"Hunting Stand",terms:"game,gun,lookout,rifle,shoot*,wild,watch"},"amenity/ice_cream":{name:"Ice Cream Shop",terms:"gelato,sorbet,sherbet,frozen,yogurt"},"amenity/internet_cafe":{name:"Internet Cafe",terms:"cybercafe,taxiphone,teleboutique,coffee,cafe,net,lanhouse"},"amenity/kindergarten":{name:"Preschool/Kindergarten Grounds",terms:"kindergarden,pre-school"},"amenity/language_school":{name:"Language School",terms:"esl"},"amenity/library":{name:"Library",terms:"book"},"amenity/love_hotel":{name:"Love Hotel",terms:""},"amenity/marketplace":{name:"Marketplace",terms:""},"amenity/monastery":{name:"Monastery Grounds",terms:"abbey,basilica,bethel,cathedral,chancel,chantry,chapel,church,fold,house of God,house of prayer,house of worship,minster,mission,monastery,mosque,oratory,parish,sacellum,sanctuary,shrine,synagogue,tabernacle,temple"},"amenity/money_transfer":{name:"Money Transfer Station",terms:"money order,check,bill,currency,finance,wire transfer,cable,person to person,cash to cash,exchange"},"amenity/motorcycle_parking":{name:"Motorcycle Parking",terms:""},"amenity/music_school":{name:"Music School",terms:"school of music"},"amenity/nightclub":{name:"Nightclub",terms:"disco*,night club,dancing,dance club"},"amenity/parking_entrance":{name:"Parking Garage Entrance/Exit",terms:""},"amenity/parking_space":{name:"Parking Space",terms:""},"amenity/parking":{name:"Parking Lot",terms:"automobile parking,car lot,car parking,rv parking,truck parking,vehicle parking"},"amenity/parking/multi-storey":{name:"Multilevel Parking Garage",terms:"car,indoor parking,multistorey car park,parkade,parking building,parking deck,parking garage,parking ramp,parking structure"},"amenity/payment_centre":{name:"Payment Center",terms:"check,tax pay,bill pay,currency,finance,cash,money"},"amenity/payment_terminal":{name:"Payment Terminal",terms:"interactive kiosk,ekiosk,atm,bill pay,tax pay,phone pay,finance,cash,money transfer,card"},"amenity/pharmacy":{name:"Pharmacy 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,lumber,tree"},"landuse/garages":{name:"Garage Landuse",terms:""},"landuse/grass":{name:"Grass",terms:""},"landuse/greenfield":{name:"Greenfield",terms:""},"landuse/greenhouse_horticulture":{name:"Greenhouse Horticulture",terms:"flower,greenhouse,horticulture,grow,vivero"},"landuse/harbour":{name:"Harbor",terms:"boat"},"landuse/industrial":{name:"Industrial Area",terms:""},"landuse/industrial/scrap_yard":{name:"Scrap Yard",terms:"car,junk,metal,salvage,scrap,u-pull-it,vehicle,wreck,yard"},"landuse/industrial/slaughterhouse":{name:"Slaughterhouse",terms:"abattoir,beef,butchery,calf,chicken,cow,killing house,meat,pig,pork,poultry,shambles,stockyard"},"landuse/landfill":{name:"Landfill",terms:"dump"},"landuse/meadow":{name:"Meadow",terms:""},"landuse/military":{name:"Military Area",terms:""},"landuse/military/airfield":{name:"Military Airfield",terms:"aerodrome,aeroway,air force,airplane,airport,army,base,bomb,fight,force,guard,heli*,jet,marine,navy,plane,troop,war"},"landuse/military/barracks":{name:"Barracks",terms:"air force,army,base,fight,force,guard,marine,navy,troop,war"},"landuse/military/bunker":{name:"Military Bunker",terms:"air force,army,base,fight,force,guard,marine,navy,troop,war"},"landuse/military/checkpoint":{name:"Checkpoint",terms:"air force,army,base,force,guard,marine,navy,troop,war"},"landuse/military/danger_area":{name:"Danger Area",terms:"air force,army,base,blast,bomb,explo*,force,guard,mine,marine,navy,troop,war"},"landuse/military/naval_base":{name:"Naval Base",terms:"base,fight,force,guard,marine,navy,ship,sub,troop,war"},"landuse/military/nuclear_explosion_site":{name:"Nuclear Explosion Site",terms:"atom,blast,bomb,detonat*,nuke,site,test"},"landuse/military/obstacle_course":{name:"Obstacle Course",terms:"army,base,force,guard,marine,navy,troop,war"},"landuse/military/office":{name:"Military Office",terms:"air force,army,base,enlist,fight,force,guard,marine,navy,recruit,troop,war"},"landuse/military/range":{name:"Military Range",terms:"air force,army,base,fight,fire,force,guard,gun,marine,navy,rifle,shoot*,snip*,train,troop,war"},"landuse/military/training_area":{name:"Training Area",terms:"air force,army,base,fight,fire,force,guard,gun,marine,navy,rifle,shoot*,snip*,train,troop,war"},"landuse/orchard":{name:"Orchard",terms:"fruit"},"landuse/plant_nursery":{name:"Plant Nursery",terms:"flower,garden,grow,vivero"},"landuse/quarry":{name:"Quarry",terms:""},"landuse/railway":{name:"Railway Corridor",terms:"rail,train,track"},"landuse/recreation_ground":{name:"Recreation Ground",terms:"playing fields"},"landuse/religious":{name:"Religious Area",terms:""},"landuse/residential":{name:"Residential Area",terms:""},"landuse/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/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,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","wheelchair"],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:["lit","access_simple"],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"],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"],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"],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"],geometry:["point"],tags:{amenity:"drinking_water"},terms:["fountain","potable"],name:"Drinking Water"},"amenity/driving_school":{icon:"maki-car",fields:["name","operator","address","building_area","opening_hours"],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"],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"],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:["operator","fee","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",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",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:["building/material","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",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","lumber","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:["water"],geometry:["area"],tags:{natural:"water"},name:"Water"},"natural/water/canal":{icon:"maki-water",fields:["name","intermittent"],geometry:["area"],tags:{natural:"water",water:"canal"},reference:{key:"water",value:"canal"},name:"Canal"},"natural/water/lake":{icon:"maki-water",fields:["name","intermittent"],geometry:["area"],tags:{natural:"water",water:"lake"},reference:{key:"water",value:"lake"},terms:["lakelet","loch","mere"],name:"Lake"},"natural/water/pond":{icon:"maki-water",fields:["name","intermittent"],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",fields:["name","intermittent"],geometry:["area"],tags:{natural:"water",water:"reservoir"},reference:{key:"water",value:"reservoir"},name:"Reservoir"},"natural/water/river":{icon:"maki-water",fields:["name","intermittent"],geometry:["area"],tags:{natural:"water",water:"river"},reference:{key:"water",value:"river"},terms:["beck","branch","brook","course","creek","estuary","rill","rivulet","run","runnel","stream","tributary","watercourse"],name:"River"},"natural/water/stream":{icon:"maki-water",fields:["name","intermittent"],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"],geometry:["line"],tags:{railway:"abandoned"},terms:[],name:"Abandoned Railway"},"railway/buffer_stop":{icon:"temaki-buffer_stop",geometry:["vertex"],tags:{railway:"buffer_stop"},terms:["stop","halt","buffer"],name:"Buffer Stop"},"railway/crossing":{icon:"temaki-pedestrian",geometry:["vertex"],tags:{railway:"crossing"},terms:["crossing","pedestrian crossing","railroad crossing","level crossing","grade crossing","path through railroad","train crossing"],name:"Railway Crossing (Path)"},"railway/derail":{icon:"maki-roadblock",geometry:["vertex"],tags:{railway:"derail"},terms:["derailer"],name:"Railway Derailer"},"railway/disused":{icon:"iD-railway-disused",fields:["structure","service_rail","usage_rail"],geometry:["line"],tags:{railway:"disused"},terms:[],name:"Disused Railway"},"railway/funicular":{icon:"iD-railway-rail",geometry:["line"],terms:["venicular","cliff railway","cable car","cable railway","funicular railway"],fields:["structure","gauge","service_rail"],tags:{railway:"funicular"},name:"Funicular"},"railway/level_crossing":{icon:"maki-cross",geometry:["vertex"],tags:{railway:"level_crossing"},terms:["crossing","railroad crossing","level crossing","grade crossing","road through railroad","train crossing"],name:"Railway Crossing (Road)"},"railway/light_rail":{icon:"iD-railway-light-rail",fields:["name","structure","gauge","electrified","service_rail","usage_rail"],moreFields:["maxspeed","voltage_electrified","frequency_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:["maxspeed","voltage_electrified","frequency_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:["maxspeed","voltage_electrified","frequency_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:["maxspeed","voltage_electrified","frequency_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:["maxspeed","voltage_electrified","frequency_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:["maxspeed","voltage_electrified","frequency_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","payment_multi"],moreFields:["opening_hours","brand","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:{fields:["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/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/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":{name:"UnionBank",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":"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":"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":"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":"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 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",name:"Patisserie Valerie"},removeTags:{amenity:"cafe",brand:"Patisserie Valerie","brand:wikidata":"Q22101966","brand:wikipedia":"en:Patisserie Valerie",name:"Patisserie Valerie"},matchScore:2,suggestion:true},"amenity/cafe/Peet's Coffee":{name:"Peet's Coffee",icon:"maki-cafe",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/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/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/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/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/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":"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/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/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/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/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/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/Красное & Белое":{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/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/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/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/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/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/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/뚜레쥬르":{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/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/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/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/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/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/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/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/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/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":"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/Родинна ковбаска":{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_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/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/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/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/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/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/Kolporter":{name:"Kolporter",icon:"maki-shop",geometry:["point","area"],tags:{shop:"kiosk","brand:wikidata":"Q6427874"},addTags:{brand:"Kolporter","brand:wikidata":"Q6427874","brand:wikipedia":"pl:Kolporter (przedsiębiorstwo)",name:"Kolporter",shop:"kiosk"},removeTags:{brand:"Kolporter","brand:wikidata":"Q6427874","brand:wikipedia":"pl:Kolporter (przedsiębiorstwo)",name:"Kolporter",shop:"kiosk"},matchScore:2,suggestion:true},"shop/kiosk/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/読売新聞":{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"},"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: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"},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           .attr('autocomplete', 'off')
30090           .attr('autocorrect', 'off')
30091           .attr('autocapitalize', 'off')
30092           .attr('spellcheck', isText ? 'true' : 'false');
30093   }
30094
30095
30096   // https://stackoverflow.com/questions/194846/is-there-any-kind-of-hash-code-function-in-javascript
30097   // https://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/
30098   function utilHashcode(str) {
30099       var hash = 0;
30100       if (str.length === 0) {
30101           return hash;
30102       }
30103       for (var i = 0; i < str.length; i++) {
30104           var char = str.charCodeAt(i);
30105           hash = ((hash << 5) - hash) + char;
30106           hash = hash & hash; // Convert to 32bit integer
30107       }
30108       return hash;
30109   }
30110
30111   // Adds or removes highlight styling for the specified entity's SVG elements in the map.
30112   function utilHighlightEntity(id, highlighted, context) {
30113       context.surface()
30114           .selectAll(utilEntityOrDeepMemberSelector([id], context.graph()))
30115           .classed('highlighted', highlighted);
30116   }
30117
30118   // note the function should be of low priority
30119   // and should not be returning a value.
30120   function utilCallWhenIdle(func, timeout) {
30121       return function() {
30122           var args = arguments;
30123           var that = this;
30124           window.requestIdleCallback(function() {
30125               func.apply(that, args);
30126           }, {timeout: timeout});
30127       };
30128   }
30129
30130   function utilCleanTags(tags) {
30131       var out = {};
30132       for (var k in tags) {
30133           if (!k) continue;
30134           var v = tags[k];
30135           if (v !== undefined) {
30136               out[k] = cleanValue(k, v);
30137           }
30138       }
30139
30140       return out;
30141
30142
30143       function cleanValue(k, v) {
30144           function keepSpaces(k) {
30145               return /_hours|_times|:conditional$/.test(k);
30146           }
30147
30148           function skip(k) {
30149               return /^(description|note|fixme)$/.test(k);
30150           }
30151
30152           if (skip(k)) return v;
30153
30154           var cleaned = v
30155               .split(';')
30156               .map(function(s) { return s.trim(); })
30157               .join(keepSpaces(k) ? '; ' : ';');
30158
30159           // The code below is not intended to validate websites and emails.
30160           // It is only intended to prevent obvious copy-paste errors. (#2323)
30161           // clean website- and email-like tags
30162           if (k.indexOf('website') !== -1 ||
30163               k.indexOf('email') !== -1 ||
30164               cleaned.indexOf('http') === 0) {
30165               cleaned = cleaned
30166                   .replace(/[\u200B-\u200F\uFEFF]/g, '');  // strip LRM and other zero width chars
30167
30168           }
30169
30170           return cleaned;
30171       }
30172   }
30173
30174   // Like selection.property('value', ...), but avoids no-op value sets,
30175   // which can result in layout/repaint thrashing in some situations.
30176   function utilGetSetValue(selection, value) {
30177       function d3_selection_value(value) {
30178           function valueNull() {
30179               delete this.value;
30180           }
30181
30182           function valueConstant() {
30183               if (this.value !== value) {
30184                   this.value = value;
30185               }
30186           }
30187
30188           function valueFunction() {
30189               var x = value.apply(this, arguments);
30190               if (x == null) {
30191                   delete this.value;
30192               } else if (this.value !== x) {
30193                   this.value = x;
30194               }
30195           }
30196
30197           return value == null
30198               ? valueNull : (typeof value === 'function'
30199               ? valueFunction : valueConstant);
30200       }
30201
30202       if (arguments.length === 1) {
30203           return selection.property('value');
30204       }
30205
30206       return selection.each(d3_selection_value(value));
30207   }
30208
30209   function utilIdleWorker(tasks, processor, callback) {
30210       var results = [], result;
30211       for (var i = 0; i < tasks.length; i++) {
30212           result = processor(tasks[i]);
30213           if (result) results.push(result);
30214       }
30215       callback(results);
30216
30217       // var processed = [];
30218       // var currentPos = 0;
30219       // var totalTasks = tasks.length;
30220
30221       // function worker(deadline) {
30222       //     while (deadline.timeRemaining() > 0 && currentPos < totalTasks) {
30223       //         var result = processor(tasks[currentPos]);
30224
30225       //         // if falsy dont add to the processed list
30226       //         if (result) processed.push(result);
30227       //         currentPos++;
30228       //     }
30229
30230       //     // more tasks are left, we might need more idleCallbacks
30231       //     if (currentPos < totalTasks) {
30232       //         return window.requestIdleCallback(function(deadline) {worker(deadline);});
30233       //     }
30234
30235       //     // tasks are completed
30236       //     return callback(processed);
30237       // }
30238
30239       // window.requestIdleCallback(function(deadline) {worker(deadline);});
30240   }
30241
30242   // shim
30243   window.requestIdleCallback =
30244       window.requestIdleCallback ||
30245       function(cb) {
30246           var start = Date.now();
30247           return setTimeout(function() {
30248               cb({
30249                   didTimeout: false,
30250                   timeRemaining: function() {
30251                       return Math.max(0, 50 - (Date.now() - start));
30252                   }
30253               });
30254           }, 1);
30255       };
30256
30257   window.cancelIdleCallback =
30258       window.cancelIdleCallback ||
30259       function(id) {
30260           clearTimeout(id);
30261       };
30262
30263   function utilKeybinding(namespace$$1) {
30264       var _keybindings = {};
30265
30266
30267       function testBindings(isCapturing) {
30268           var didMatch = false;
30269           var bindings = Object.keys(_keybindings).map(function(id) { return _keybindings[id]; });
30270           var i, binding;
30271
30272           // Most key shortcuts will accept either lower or uppercase ('h' or 'H'),
30273           // so we don't strictly match on the shift key, but we prioritize
30274           // shifted keybindings first, and fallback to unshifted only if no match.
30275           // (This lets us differentiate between '←'/'⇧←' or '⌘Z'/'⌘⇧Z')
30276
30277           // priority match shifted keybindings first
30278           for (i = 0; i < bindings.length; i++) {
30279               binding = bindings[i];
30280               if (!binding.event.modifiers.shiftKey) continue;  // no shift
30281               if (!!binding.capture !== isCapturing) continue;
30282               if (matches(binding, true)) {
30283                   binding.callback();
30284                   didMatch = true;
30285               }
30286           }
30287
30288           // then unshifted keybindings
30289           if (didMatch) return;
30290           for (i = 0; i < bindings.length; i++) {
30291               binding = bindings[i];
30292               if (binding.event.modifiers.shiftKey) continue;   // shift
30293               if (!!binding.capture !== isCapturing) continue;
30294               if (matches(binding, false)) {
30295                   binding.callback();
30296               }
30297           }
30298
30299
30300           function matches(binding, testShift) {
30301               var event$$1 = event;
30302               var isMatch = false;
30303               var tryKeyCode = true;
30304
30305               // Prefer a match on `KeyboardEvent.key`
30306               if (event$$1.key !== undefined) {
30307                   tryKeyCode = (event$$1.key.charCodeAt(0) > 255);  // outside ISO-Latin-1
30308                   isMatch = true;
30309
30310                   if (binding.event.key === undefined) {
30311                       isMatch = false;
30312                   } else if (Array.isArray(binding.event.key)) {
30313                       if (binding.event.key.map(function(s) { return s.toLowerCase(); }).indexOf(event$$1.key.toLowerCase()) === -1)
30314                           isMatch = false;
30315                   } else {
30316                       if (event$$1.key.toLowerCase() !== binding.event.key.toLowerCase())
30317                           isMatch = false;
30318                   }
30319               }
30320
30321               // Fallback match on `KeyboardEvent.keyCode`, can happen if:
30322               // - browser doesn't support `KeyboardEvent.key`
30323               // - `KeyboardEvent.key` is outside ISO-Latin-1 range (cyrillic?)
30324               if (!isMatch && tryKeyCode) {
30325                   isMatch = (event$$1.keyCode === binding.event.keyCode);
30326               }
30327
30328               if (!isMatch) return false;
30329
30330               // test modifier keys
30331               if (!(event$$1.ctrlKey && event$$1.altKey)) {  // if both are set, assume AltGr and skip it - #4096
30332                   if (event$$1.ctrlKey !== binding.event.modifiers.ctrlKey) return false;
30333                   if (event$$1.altKey !== binding.event.modifiers.altKey) return false;
30334               }
30335               if (event$$1.metaKey !== binding.event.modifiers.metaKey) return false;
30336               if (testShift && event$$1.shiftKey !== binding.event.modifiers.shiftKey) return false;
30337
30338               return true;
30339           }
30340       }
30341
30342
30343       function capture() {
30344           testBindings(true);
30345       }
30346
30347
30348       function bubble() {
30349           var tagName = select(event.target).node().tagName;
30350           if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') {
30351               return;
30352           }
30353           testBindings(false);
30354       }
30355
30356
30357       function keybinding(selection$$1) {
30358           selection$$1 = selection$$1 || select(document);
30359           selection$$1.on('keydown.capture.' + namespace$$1, capture, true);
30360           selection$$1.on('keydown.bubble.' + namespace$$1, bubble, false);
30361           return keybinding;
30362       }
30363
30364       // was: keybinding.off()
30365       keybinding.unbind = function(selection$$1) {
30366           _keybindings = [];
30367           selection$$1 = selection$$1 || select(document);
30368           selection$$1.on('keydown.capture.' + namespace$$1, null);
30369           selection$$1.on('keydown.bubble.' + namespace$$1, null);
30370           return keybinding;
30371       };
30372
30373
30374       keybinding.clear = function() {
30375           _keybindings = {};
30376           return keybinding;
30377       };
30378
30379
30380       // Remove one or more keycode bindings.
30381       keybinding.off = function(codes, capture) {
30382           var arr = uniq([].concat(codes));
30383
30384           for (var i = 0; i < arr.length; i++) {
30385               var id = arr[i] + (capture ? '-capture' : '-bubble');
30386               delete _keybindings[id];
30387           }
30388           return keybinding;
30389       };
30390
30391
30392       // Add one or more keycode bindings.
30393       keybinding.on = function(codes, callback, capture) {
30394           if (!isFunction(callback)) {
30395               return keybinding.off(codes, capture);
30396           }
30397
30398           var arr = uniq([].concat(codes));
30399
30400           for (var i = 0; i < arr.length; i++) {
30401               var id = arr[i] + (capture ? '-capture' : '-bubble');
30402               var binding = {
30403                   id: id,
30404                   capture: capture,
30405                   callback: callback,
30406                   event: {
30407                       key: undefined,  // preferred
30408                       keyCode: 0,      // fallback
30409                       modifiers: {
30410                           shiftKey: false,
30411                           ctrlKey: false,
30412                           altKey: false,
30413                           metaKey: false
30414                       }
30415                   }
30416               };
30417
30418               if (_keybindings[id]) {
30419                   console.warn('warning: duplicate keybinding for "' + id + '"'); // eslint-disable-line no-console
30420               }
30421
30422               _keybindings[id] = binding;
30423
30424               var matches = arr[i].toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g);
30425               for (var j = 0; j < matches.length; j++) {
30426                   // Normalise matching errors
30427                   if (matches[j] === '++') matches[j] = '+';
30428
30429                   if (matches[j] in utilKeybinding.modifierCodes) {
30430                       var prop = utilKeybinding.modifierProperties[utilKeybinding.modifierCodes[matches[j]]];
30431                       binding.event.modifiers[prop] = true;
30432                   } else {
30433                       binding.event.key = utilKeybinding.keys[matches[j]] || matches[j];
30434                       if (matches[j] in utilKeybinding.keyCodes) {
30435                           binding.event.keyCode = utilKeybinding.keyCodes[matches[j]];
30436                       }
30437                   }
30438               }
30439           }
30440
30441           return keybinding;
30442       };
30443
30444
30445       return keybinding;
30446   }
30447
30448
30449   /*
30450    * See https://github.com/keithamus/jwerty
30451    */
30452
30453   utilKeybinding.modifierCodes = {
30454       // Shift key, ⇧
30455       '⇧': 16, shift: 16,
30456       // CTRL key, on Mac: ⌃
30457       '⌃': 17, ctrl: 17,
30458       // ALT key, on Mac: ⌥ (Alt)
30459       '⌥': 18, alt: 18, option: 18,
30460       // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super)
30461       '⌘': 91, meta: 91, cmd: 91, 'super': 91, win: 91
30462   };
30463
30464   utilKeybinding.modifierProperties = {
30465       16: 'shiftKey',
30466       17: 'ctrlKey',
30467       18: 'altKey',
30468       91: 'metaKey'
30469   };
30470
30471   utilKeybinding.keys = {
30472       // Backspace key, on Mac: ⌫ (Backspace)
30473       '⌫': 'Backspace', backspace: 'Backspace',
30474       // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
30475       '⇥': 'Tab', '⇆': 'Tab', tab: 'Tab',
30476       // Return key, ↩
30477       '↩': 'Enter', 'return': 'Enter', enter: 'Enter', '⌅': 'Enter',
30478       // Pause/Break key
30479       'pause': 'Pause', 'pause-break': 'Pause',
30480       // Caps Lock key, ⇪
30481       '⇪': 'CapsLock', caps: 'CapsLock', 'caps-lock': 'CapsLock',
30482       // Escape key, on Mac: ⎋, on Windows: Esc
30483       '⎋': ['Escape', 'Esc'], escape: ['Escape', 'Esc'], esc: ['Escape', 'Esc'],
30484       // Space key
30485       space: [' ', 'Spacebar'],
30486       // Page-Up key, or pgup, on Mac: ↖
30487       '↖': 'PageUp', pgup: 'PageUp', 'page-up': 'PageUp',
30488       // Page-Down key, or pgdown, on Mac: ↘
30489       '↘': 'PageDown', pgdown: 'PageDown', 'page-down': 'PageDown',
30490       // END key, on Mac: ⇟
30491       '⇟': 'End', end: 'End',
30492       // HOME key, on Mac: ⇞
30493       '⇞': 'Home', home: 'Home',
30494       // Insert key, or ins
30495       ins: 'Insert', insert: 'Insert',
30496       // Delete key, on Mac: ⌦ (Delete)
30497       '⌦': ['Delete', 'Del'], del: ['Delete', 'Del'], 'delete': ['Delete', 'Del'],
30498       // Left Arrow Key, or ←
30499       '←': ['ArrowLeft', 'Left'], left: ['ArrowLeft', 'Left'], 'arrow-left': ['ArrowLeft', 'Left'],
30500       // Up Arrow Key, or ↑
30501       '↑': ['ArrowUp', 'Up'], up: ['ArrowUp', 'Up'], 'arrow-up': ['ArrowUp', 'Up'],
30502       // Right Arrow Key, or →
30503       '→': ['ArrowRight', 'Right'], right: ['ArrowRight', 'Right'], 'arrow-right': ['ArrowRight', 'Right'],
30504       // Up Arrow Key, or ↓
30505       '↓': ['ArrowDown', 'Down'], down: ['ArrowDown', 'Down'], 'arrow-down': ['ArrowDown', 'Down'],
30506       // odities, stuff for backward compatibility (browsers and code):
30507       // Num-Multiply, or *
30508       '*': ['*', 'Multiply'], star: ['*', 'Multiply'], asterisk: ['*', 'Multiply'], multiply: ['*', 'Multiply'],
30509       // Num-Plus or +
30510       '+': ['+', 'Add'], 'plus': ['+', 'Add'],
30511       // Num-Subtract, or -
30512       '-': ['-', 'Subtract'], subtract: ['-', 'Subtract'], 'dash': ['-', 'Subtract'],
30513       // Semicolon
30514       semicolon: ';',
30515       // = or equals
30516       equals: '=',
30517       // Comma, or ,
30518       comma: ',',
30519       // Period, or ., or full-stop
30520       period: '.', 'full-stop': '.',
30521       // Slash, or /, or forward-slash
30522       slash: '/', 'forward-slash': '/',
30523       // Tick, or `, or back-quote
30524       tick: '`', 'back-quote': '`',
30525       // Open bracket, or [
30526       'open-bracket': '[',
30527       // Back slash, or \
30528       'back-slash': '\\',
30529       // Close backet, or ]
30530       'close-bracket': ']',
30531       // Apostrophe, or Quote, or '
30532       quote: '\'', apostrophe: '\'',
30533       // NUMPAD 0-9
30534       'num-0': '0',
30535       'num-1': '1',
30536       'num-2': '2',
30537       'num-3': '3',
30538       'num-4': '4',
30539       'num-5': '5',
30540       'num-6': '6',
30541       'num-7': '7',
30542       'num-8': '8',
30543       'num-9': '9',
30544       // F1-F25
30545       f1: 'F1',
30546       f2: 'F2',
30547       f3: 'F3',
30548       f4: 'F4',
30549       f5: 'F5',
30550       f6: 'F6',
30551       f7: 'F7',
30552       f8: 'F8',
30553       f9: 'F9',
30554       f10: 'F10',
30555       f11: 'F11',
30556       f12: 'F12',
30557       f13: 'F13',
30558       f14: 'F14',
30559       f15: 'F15',
30560       f16: 'F16',
30561       f17: 'F17',
30562       f18: 'F18',
30563       f19: 'F19',
30564       f20: 'F20',
30565       f21: 'F21',
30566       f22: 'F22',
30567       f23: 'F23',
30568       f24: 'F24',
30569       f25: 'F25'
30570   };
30571
30572   utilKeybinding.keyCodes = {
30573       // Backspace key, on Mac: ⌫ (Backspace)
30574       '⌫': 8, backspace: 8,
30575       // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
30576       '⇥': 9, '⇆': 9, tab: 9,
30577       // Return key, ↩
30578       '↩': 13, 'return': 13, enter: 13, '⌅': 13,
30579       // Pause/Break key
30580       'pause': 19, 'pause-break': 19,
30581       // Caps Lock key, ⇪
30582       '⇪': 20, caps: 20, 'caps-lock': 20,
30583       // Escape key, on Mac: ⎋, on Windows: Esc
30584       '⎋': 27, escape: 27, esc: 27,
30585       // Space key
30586       space: 32,
30587       // Page-Up key, or pgup, on Mac: ↖
30588       '↖': 33, pgup: 33, 'page-up': 33,
30589       // Page-Down key, or pgdown, on Mac: ↘
30590       '↘': 34, pgdown: 34, 'page-down': 34,
30591       // END key, on Mac: ⇟
30592       '⇟': 35, end: 35,
30593       // HOME key, on Mac: ⇞
30594       '⇞': 36, home: 36,
30595       // Insert key, or ins
30596       ins: 45, insert: 45,
30597       // Delete key, on Mac: ⌦ (Delete)
30598       '⌦': 46, del: 46, 'delete': 46,
30599       // Left Arrow Key, or ←
30600       '←': 37, left: 37, 'arrow-left': 37,
30601       // Up Arrow Key, or ↑
30602       '↑': 38, up: 38, 'arrow-up': 38,
30603       // Right Arrow Key, or →
30604       '→': 39, right: 39, 'arrow-right': 39,
30605       // Up Arrow Key, or ↓
30606       '↓': 40, down: 40, 'arrow-down': 40,
30607       // odities, printing characters that come out wrong:
30608       // Firefox Equals
30609       'ffequals': 61,
30610       // Num-Multiply, or *
30611       '*': 106, star: 106, asterisk: 106, multiply: 106,
30612       // Num-Plus or +
30613       '+': 107, 'plus': 107,
30614       // Num-Subtract, or -
30615       '-': 109, subtract: 109,
30616       // Firefox Plus
30617       'ffplus': 171,
30618       // Firefox Minus
30619       'ffminus': 173,
30620       // Semicolon
30621       ';': 186, semicolon: 186,
30622       // = or equals
30623       '=': 187, 'equals': 187,
30624       // Comma, or ,
30625       ',': 188, comma: 188,
30626       // Dash / Underscore key
30627       'dash': 189,
30628       // Period, or ., or full-stop
30629       '.': 190, period: 190, 'full-stop': 190,
30630       // Slash, or /, or forward-slash
30631       '/': 191, slash: 191, 'forward-slash': 191,
30632       // Tick, or `, or back-quote
30633       '`': 192, tick: 192, 'back-quote': 192,
30634       // Open bracket, or [
30635       '[': 219, 'open-bracket': 219,
30636       // Back slash, or \
30637       '\\': 220, 'back-slash': 220,
30638       // Close backet, or ]
30639       ']': 221, 'close-bracket': 221,
30640       // Apostrophe, or Quote, or '
30641       '\'': 222, quote: 222, apostrophe: 222
30642   };
30643
30644   // NUMPAD 0-9
30645   var i$1 = 95, n = 0;
30646   while (++i$1 < 106) {
30647       utilKeybinding.keyCodes['num-' + n] = i$1;
30648       ++n;
30649   }
30650
30651   // 0-9
30652   i$1 = 47; n = 0;
30653   while (++i$1 < 58) {
30654       utilKeybinding.keyCodes[n] = i$1;
30655       ++n;
30656   }
30657
30658   // F1-F25
30659   i$1 = 111; n = 1;
30660   while (++i$1 < 136) {
30661       utilKeybinding.keyCodes['f' + n] = i$1;
30662       ++n;
30663   }
30664
30665   // a-z
30666   i$1 = 64;
30667   while (++i$1 < 91) {
30668       utilKeybinding.keyCodes[String.fromCharCode(i$1).toLowerCase()] = i$1;
30669   }
30670
30671   // Copies a variable number of methods from source to target.
30672   function utilRebind(target, source) {
30673       var i = 1, n = arguments.length, method;
30674       while (++i < n) {
30675           target[method = arguments[i]] = d3_rebind(target, source, source[method]);
30676       }
30677       return target;
30678   }
30679
30680   // Method is assumed to be a standard D3 getter-setter:
30681   // If passed with no arguments, gets the value.
30682   // If passed with arguments, sets the value and returns the target.
30683   function d3_rebind(target, source, method) {
30684       return function() {
30685           var value = method.apply(source, arguments);
30686           return value === source ? target : value;
30687       };
30688   }
30689
30690   // A per-domain session mutex backed by a cookie and dead man's
30691   // switch. If the session crashes, the mutex will auto-release
30692   // after 5 seconds.
30693
30694   // This accepts a string and returns an object that complies with utilSessionMutexType
30695   function utilSessionMutex(name) {
30696       var mutex = {};
30697       var intervalID;
30698
30699       function renew() {
30700           var expires = new Date();
30701           expires.setSeconds(expires.getSeconds() + 5);
30702           document.cookie = name + '=1; expires=' + expires.toUTCString();
30703       }
30704
30705       mutex.lock = function () {
30706           if (intervalID) return true;
30707           var cookie = document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1');
30708           if (cookie) return false;
30709           renew();
30710           intervalID = window.setInterval(renew, 4000);
30711           return true;
30712       };
30713
30714       mutex.unlock = function () {
30715           if (!intervalID) return;
30716           document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT';
30717           clearInterval(intervalID);
30718           intervalID = null;
30719       };
30720
30721       mutex.locked = function () {
30722           return !!intervalID;
30723       };
30724
30725       return mutex;
30726   }
30727
30728   function utilTiler() {
30729       var _size = [256, 256];
30730       var _scale = 256;
30731       var _tileSize = 256;
30732       var _zoomExtent = [0, 20];
30733       var _translate = [_size[0] / 2, _size[1] / 2];
30734       var _margin = 0;
30735       var _skipNullIsland = false;
30736
30737
30738       function clamp(num, min$$1, max$$1) {
30739           return Math.max(min$$1, Math.min(num, max$$1));
30740       }
30741
30742
30743       function nearNullIsland(tile) {
30744           var x = tile[0];
30745           var y = tile[1];
30746           var z = tile[2];
30747           if (z >= 7) {
30748               var center = Math.pow(2, z - 1);
30749               var width = Math.pow(2, z - 6);
30750               var min$$1 = center - (width / 2);
30751               var max$$1 = center + (width / 2) - 1;
30752               return x >= min$$1 && x <= max$$1 && y >= min$$1 && y <= max$$1;
30753           }
30754           return false;
30755       }
30756
30757
30758       function tiler() {
30759           var z = geoScaleToZoom(_scale / (2 * Math.PI), _tileSize);
30760           var z0 = clamp(Math.round(z), _zoomExtent[0], _zoomExtent[1]);
30761           var tileMin = 0;
30762           var tileMax = Math.pow(2, z0) - 1;
30763           var log2ts = Math.log(_tileSize) * Math.LOG2E;
30764           var k = Math.pow(2, z - z0 + log2ts);
30765           var origin = [
30766               (_translate[0] - _scale / 2) / k,
30767               (_translate[1] - _scale / 2) / k
30768           ];
30769
30770           var cols = range(
30771               clamp(Math.floor(-origin[0]) - _margin,               tileMin, tileMax + 1),
30772               clamp(Math.ceil(_size[0] / k - origin[0]) + _margin,  tileMin, tileMax + 1)
30773           );
30774           var rows = range(
30775               clamp(Math.floor(-origin[1]) - _margin,               tileMin, tileMax + 1),
30776               clamp(Math.ceil(_size[1] / k - origin[1]) + _margin,  tileMin, tileMax + 1)
30777           );
30778
30779           var tiles = [];
30780           for (var i = 0; i < rows.length; i++) {
30781               var y = rows[i];
30782               for (var j = 0; j < cols.length; j++) {
30783                   var x = cols[j];
30784
30785                   if (i >= _margin && i <= rows.length - _margin &&
30786                       j >= _margin && j <= cols.length - _margin) {
30787                       tiles.unshift([x, y, z0]);  // tiles in view at beginning
30788                   } else {
30789                       tiles.push([x, y, z0]);     // tiles in margin at the end
30790                   }
30791               }
30792           }
30793
30794           tiles.translate = origin;
30795           tiles.scale = k;
30796
30797           return tiles;
30798       }
30799
30800
30801       /**
30802        * getTiles() returns an array of tiles that cover the map view
30803        */
30804       tiler.getTiles = function(projection) {
30805           var origin = [
30806               projection.scale() * Math.PI - projection.translate()[0],
30807               projection.scale() * Math.PI - projection.translate()[1]
30808           ];
30809
30810           this
30811               .size(projection.clipExtent()[1])
30812               .scale(projection.scale() * 2 * Math.PI)
30813               .translate(projection.translate());
30814
30815           var tiles = tiler();
30816           var ts = tiles.scale;
30817
30818           return tiles
30819               .map(function(tile) {
30820                   if (_skipNullIsland && nearNullIsland(tile)) {
30821                       return false;
30822                   }
30823                   var x = tile[0] * ts - origin[0];
30824                   var y = tile[1] * ts - origin[1];
30825                   return {
30826                       id: tile.toString(),
30827                       xyz: tile,
30828                       extent: geoExtent$$1(
30829                           projection.invert([x, y + ts]),
30830                           projection.invert([x + ts, y])
30831                       )
30832                   };
30833               }).filter(Boolean);
30834       };
30835
30836
30837       /**
30838        * getGeoJSON() returns a FeatureCollection for debugging tiles
30839        */
30840       tiler.getGeoJSON = function(projection) {
30841           var features = tiler.getTiles(projection).map(function(tile) {
30842               return {
30843                   type: 'Feature',
30844                   properties: {
30845                       id: tile.id,
30846                       name: tile.id
30847                   },
30848                   geometry: {
30849                       type: 'Polygon',
30850                       coordinates: [ tile.extent.polygon() ]
30851                   }
30852               };
30853           });
30854
30855           return {
30856               type: 'FeatureCollection',
30857               features: features
30858           };
30859       };
30860
30861
30862       tiler.tileSize = function(val) {
30863           if (!arguments.length) return _tileSize;
30864           _tileSize = val;
30865           return tiler;
30866       };
30867
30868
30869       tiler.zoomExtent = function(val) {
30870           if (!arguments.length) return _zoomExtent;
30871           _zoomExtent = val;
30872           return tiler;
30873       };
30874
30875
30876       tiler.size = function(val) {
30877           if (!arguments.length) return _size;
30878           _size = val;
30879           return tiler;
30880       };
30881
30882
30883       tiler.scale = function(val) {
30884           if (!arguments.length) return _scale;
30885           _scale = val;
30886           return tiler;
30887       };
30888
30889
30890       tiler.translate = function(val) {
30891           if (!arguments.length) return _translate;
30892           _translate = val;
30893           return tiler;
30894       };
30895
30896
30897       // number to extend the rows/columns beyond those covering the viewport
30898       tiler.margin = function(val) {
30899           if (!arguments.length) return _margin;
30900           _margin = +val;
30901           return tiler;
30902       };
30903
30904
30905       tiler.skipNullIsland = function(val) {
30906           if (!arguments.length) return _skipNullIsland;
30907           _skipNullIsland = val;
30908           return tiler;
30909       };
30910
30911
30912       return tiler;
30913   }
30914
30915   function utilTriggerEvent(target, type) {
30916       target.each(function() {
30917           var evt = document.createEvent('HTMLEvents');
30918           evt.initEvent(type, true, true);
30919           this.dispatchEvent(evt);
30920       });
30921   }
30922
30923   function validationDeprecatedTag() {
30924
30925       var validation = function(changes) {
30926           var warnings = [];
30927           for (var i = 0; i < changes.created.length; i++) {
30928               var change = changes.created[i];
30929               var deprecatedTags = change.deprecatedTags();
30930
30931               if (!isEmpty(deprecatedTags)) {
30932                   var tags = utilTagText({ tags: deprecatedTags });
30933                   warnings.push({
30934                       id: 'deprecated_tags',
30935                       message: t('validations.deprecated_tags', { tags: tags }),
30936                       entity: change
30937                   });
30938               }
30939           }
30940
30941           return warnings;
30942       };
30943
30944
30945       return validation;
30946   }
30947
30948   function validationDisconnectedHighway() {
30949
30950       function isDisconnectedHighway(entity, graph) {
30951           if (!entity.tags.highway) return false;
30952           if (entity.geometry(graph) !== 'line') return false;
30953
30954           return graph.childNodes(entity)
30955               .every(function(vertex) {
30956                   var parents = graph.parentWays(vertex);
30957                   if (parents.length === 1) {  // standalone vertex
30958                       return true;
30959                   } else {                     // shared vertex
30960                       return !vertex.tags.entrance &&
30961                           parents.filter(function(parent) {
30962                               return parent.tags.highway && parent !== entity;
30963                           }).length === 0;
30964                   }
30965               });
30966       }
30967
30968
30969       var validation = function(changes, graph) {
30970           var warnings = [];
30971           for (var i = 0; i < changes.created.length; i++) {
30972               var entity = changes.created[i];
30973
30974               if (isDisconnectedHighway(entity, graph)) {
30975                   warnings.push({
30976                       id: 'disconnected_highway',
30977                       message: t('validations.disconnected_highway'),
30978                       tooltip: t('validations.disconnected_highway_tooltip'),
30979                       entity: entity
30980                   });
30981               }
30982           }
30983
30984           return warnings;
30985       };
30986
30987
30988       return validation;
30989   }
30990
30991   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\\)","^דלק$","^カフェ$","^ポスト$","^珈琲館$","^加油站$","^郵局$","^食堂$","^(自動販売機|自販機)$","^体育館$"];
30992
30993   function validationGenericName() {
30994
30995       function isGenericName(entity) {
30996           var name = entity.tags.name;
30997           if (!name) return false;
30998
30999           var i, re;
31000
31001           // test if the name is just the tag value (e.g. "park")
31002           var keys = ['amenity', 'leisure', 'shop', 'man_made', 'tourism'];
31003           for (i = 0; i < keys.length; i++) {
31004               var val = entity.tags[keys[i]];
31005               if (val && val.replace(/\_/g, ' ').toLowerCase() === name.toLowerCase()) {
31006                   return name;
31007               }
31008           }
31009
31010           // test if the name is a generic name (e.g. "pizzaria")
31011           for (i = 0; i < discardNames.length; i++) {
31012               re = new RegExp(discardNames[i], 'i');
31013               if (re.test(name)) {
31014                   return name;
31015               }
31016           }
31017
31018           return false;
31019       }
31020
31021
31022       return function validation(changes) {
31023           var warnings = [];
31024
31025           for (var i = 0; i < changes.created.length; i++) {
31026               var change = changes.created[i];
31027               var generic = isGenericName(change);
31028               if (generic) {
31029                   warnings.push({
31030                       id: 'generic_name',
31031                       message: t('validations.generic_name'),
31032                       tooltip: t('validations.generic_name_tooltip', { name: generic }),
31033                       entity: change
31034                   });
31035               }
31036           }
31037
31038           return warnings;
31039       };
31040   }
31041
31042   function validationManyDeletions() {
31043       var threshold = 100;
31044
31045       var validation = function(changes, graph) {
31046           var warnings = [];
31047           var nodes = 0, ways = 0, areas = 0, relations = 0;
31048
31049           changes.deleted.forEach(function(c) {
31050               if (c.type === 'node') { nodes++; }
31051               else if (c.type === 'way' && c.geometry(graph) === 'line') { ways++; }
31052               else if (c.type === 'way' && c.geometry(graph) === 'area') { areas++; }
31053               else if (c.type === 'relation') { relations++; }
31054           });
31055           if (changes.deleted.length > threshold) {
31056               warnings.push({
31057                   id: 'many_deletions',
31058                   message: t('validations.many_deletions',
31059                       { n: changes.deleted.length, p: nodes, l: ways, a:areas, r: relations }
31060                   )
31061               });
31062           }
31063
31064           return warnings;
31065       };
31066
31067
31068       return validation;
31069   }
31070
31071   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"};
31072   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: \\((.+)\\)"}};
31073
31074   var tiler = utilTiler();
31075   var dispatch$1 = dispatch('loaded');
31076
31077   var _krCache;
31078   var _krZoom = 14;
31079   var _krUrlRoot = 'https://www.keepright.at/';
31080
31081   var _krRuleset = [
31082       // no 20 - multiple node on same spot - these are mostly boundaries overlapping roads
31083       30, 40, 50, 60, 70, 90, 100, 110, 120, 130, 150, 160, 170, 180,
31084       190, 191, 192, 193, 194, 195, 196, 197, 198,
31085       200, 201, 202, 203, 204, 205, 206, 207, 208, 210, 220,
31086       230, 231, 232, 270, 280, 281, 282, 283, 284, 285,
31087       290, 291, 292, 293, 294, 295, 296, 297, 298, 300, 310, 311, 312, 313,
31088       320, 350, 360, 370, 380, 390, 400, 401, 402, 410, 411, 412, 413
31089   ];
31090
31091
31092   function abortRequest(i) {
31093       if (i) {
31094           i.abort();
31095       }
31096   }
31097
31098   function abortUnwantedRequests(cache, tiles) {
31099       forEach(cache.inflightTile, function(v, k) {
31100           var wanted = find$1(tiles, function(tile) {
31101               return k === tile.id;
31102           });
31103           if (!wanted) {
31104               abortRequest(v);
31105               delete cache.inflightTile[k];
31106           }
31107       });
31108   }
31109
31110
31111   function encodeErrorRtree(d) {
31112       return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d };
31113   }
31114
31115
31116   // replace or remove error from rtree
31117   function updateRtree(item, replace) {
31118       _krCache.rtree.remove(item, function isEql(a, b) {
31119           return a.data.id === b.data.id;
31120       });
31121
31122       if (replace) {
31123           _krCache.rtree.insert(item);
31124       }
31125   }
31126
31127
31128   function tokenReplacements(d) {
31129       if (!(d instanceof krError)) return;
31130
31131       var htmlRegex = new RegExp(/<\/[a-z][\s\S]*>/);
31132       var replacements = {};
31133
31134       var errorTemplate = errorTypes[d.which_type];
31135       if (!errorTemplate) {
31136           /* eslint-disable no-console */
31137           console.log('No Template: ', d.which_type);
31138           console.log('  ', d.description);
31139           /* eslint-enable no-console */
31140           return;
31141       }
31142
31143       // some descriptions are just fixed text
31144       if (!errorTemplate.regex) return;
31145
31146       // regex pattern should match description with variable details captured
31147       var errorRegex = new RegExp(errorTemplate.regex, 'i');
31148       var errorMatch = errorRegex.exec(d.description);
31149       if (!errorMatch) {
31150           /* eslint-disable no-console */
31151           console.log('Unmatched: ', d.which_type);
31152           console.log('  ', d.description);
31153           console.log('  ', errorRegex);
31154           /* eslint-enable no-console */
31155           return;
31156       }
31157
31158       for (var i = 1; i < errorMatch.length; i++) {   // skip first
31159           var capture = errorMatch[i];
31160           var idType;
31161
31162           idType = 'IDs' in errorTemplate ? errorTemplate.IDs[i-1] : '';
31163           if (idType && capture) {   // link IDs if present in the capture
31164               capture = parseError(capture, idType);
31165           } else if (htmlRegex.test(capture)) {   // escape any html in non-IDs
31166               capture = '\\' +  capture + '\\';
31167           } else {
31168               var compare = capture.toLowerCase();
31169               if (localizeStrings[compare]) {   // some replacement strings can be localized
31170                   capture = t('QA.keepRight.error_parts.' + localizeStrings[compare]);
31171               }
31172           }
31173
31174           replacements['var' + i] = capture;
31175       }
31176
31177       return replacements;
31178   }
31179
31180
31181   function parseError(capture, idType) {
31182       var compare = capture.toLowerCase();
31183       if (localizeStrings[compare]) {   // some replacement strings can be localized
31184           capture = t('QA.keepRight.error_parts.' + localizeStrings[compare]);
31185       }
31186
31187       switch (idType) {
31188           // link a string like "this node"
31189           case 'this':
31190               capture = linkErrorObject(capture);
31191               break;
31192
31193           case 'url':
31194               capture = linkURL(capture);
31195               break;
31196
31197           // link an entity ID
31198           case 'n':
31199           case 'w':
31200           case 'r':
31201               capture = linkEntity(idType + capture);
31202               break;
31203
31204           // some errors have more complex ID lists/variance
31205           case '20':
31206               capture = parse20(capture);
31207               break;
31208           case '211':
31209               capture = parse211(capture);
31210               break;
31211           case '231':
31212               capture = parse231(capture);
31213               break;
31214           case '294':
31215               capture = parse294(capture);
31216               break;
31217           case '370':
31218               capture = parse370(capture);
31219               break;
31220       }
31221
31222       return capture;
31223
31224
31225       function linkErrorObject(d) {
31226           return '<a class="kr_error_object_link">' + d + '</a>';
31227       }
31228
31229       function linkEntity(d) {
31230           return '<a class="kr_error_entity_link">' + d + '</a>';
31231       }
31232
31233       function linkURL(d) {
31234           return '<a class="kr_external_link" target="_blank" href="' + d + '">' + d + '</a>';
31235       }
31236
31237       // arbitrary node list of form: #ID, #ID, #ID...
31238       function parse211(capture) {
31239           var newList = [];
31240           var items = capture.split(', ');
31241
31242           items.forEach(function(item) {
31243               // ID has # at the front
31244               var id = linkEntity('n' + item.slice(1));
31245               newList.push(id);
31246           });
31247
31248           return newList.join(', ');
31249       }
31250
31251       // arbitrary way list of form: #ID(layer),#ID(layer),#ID(layer)...
31252       function parse231(capture) {
31253           var newList = [];
31254           // unfortunately 'layer' can itself contain commas, so we split on '),'
31255           var items = capture.split('),');
31256
31257           items.forEach(function(item) {
31258               var match = item.match(/\#(\d+)\((.+)\)?/);
31259               if (match !== null && match.length > 2) {
31260                   newList.push(linkEntity('w' + match[1]) + ' ' +
31261                       t('QA.keepRight.errorTypes.231.layer', { layer: match[2] })
31262                   );
31263               }
31264           });
31265
31266           return newList.join(', ');
31267       }
31268
31269       // arbitrary node/relation list of form: from node #ID,to relation #ID,to node #ID...
31270       function parse294(capture) {
31271           var newList = [];
31272           var items = capture.split(',');
31273
31274           items.forEach(function(item) {
31275               var role;
31276               var idType;
31277               var id;
31278
31279               // item of form "from/to node/relation #ID"
31280               item = item.split(' ');
31281
31282               // to/from role is more clear in quotes
31283               role = '"' + item[0] + '"';
31284
31285               // first letter of node/relation provides the type
31286               idType = item[1].slice(0,1);
31287
31288               // ID has # at the front
31289               id = item[2].slice(1);
31290               id = linkEntity(idType + id);
31291
31292               item = [role, item[1], id].join(' ');
31293               newList.push(item);
31294           });
31295
31296           return newList.join(', ');
31297       }
31298
31299       // may or may not include the string "(including the name 'name')"
31300       function parse370(capture) {
31301           if (!capture) return '';
31302
31303           var match = capture.match(/\(including the name (\'.+\')\)/);
31304           if (match !== null && match.length) {
31305               return t('QA.keepRight.errorTypes.370.including_the_name', { name: match[1] });
31306           }
31307           return '';
31308       }
31309
31310       // arbitrary node list of form: #ID,#ID,#ID...
31311       function parse20(capture) {
31312           var newList = [];
31313           var items = capture.split(',');
31314
31315           items.forEach(function(item) {
31316               // ID has # at the front
31317               var id = linkEntity('n' + item.slice(1));
31318               newList.push(id);
31319           });
31320
31321           return newList.join(', ');
31322       }
31323   }
31324
31325
31326   var serviceKeepRight = {
31327       init: function() {
31328           if (!_krCache) {
31329               this.reset();
31330           }
31331
31332           this.event = utilRebind(this, dispatch$1, 'on');
31333       },
31334
31335       reset: function() {
31336           if (_krCache) {
31337               forEach(_krCache.inflightTile, abortRequest);
31338           }
31339           _krCache = {
31340               data: {},
31341               loadedTile: {},
31342               inflightTile: {},
31343               inflightPost: {},
31344               closed: {},
31345               rtree: rbush_1()
31346           };
31347       },
31348
31349
31350       // KeepRight API:  http://osm.mueschelsoft.de/keepright/interfacing.php
31351       loadErrors: function(projection) {
31352           var options = { format: 'geojson' };
31353           var rules = _krRuleset.join();
31354
31355           // determine the needed tiles to cover the view
31356           var tiles = tiler
31357               .zoomExtent([_krZoom, _krZoom])
31358               .getTiles(projection);
31359
31360           // abort inflight requests that are no longer needed
31361           abortUnwantedRequests(_krCache, tiles);
31362
31363           // issue new requests..
31364           tiles.forEach(function(tile) {
31365               if (_krCache.loadedTile[tile.id] || _krCache.inflightTile[tile.id]) return;
31366
31367               var rect = tile.extent.rectangle();
31368               var params = assignIn({}, options, { left: rect[0], bottom: rect[3], right: rect[2], top: rect[1] });
31369               var url = _krUrlRoot + 'export.php?' + utilQsString(params) + '&ch=' + rules;
31370
31371               _krCache.inflightTile[tile.id] = d3_json(url,
31372                   function(err, data) {
31373                       delete _krCache.inflightTile[tile.id];
31374
31375                       if (err) return;
31376                       _krCache.loadedTile[tile.id] = true;
31377
31378                       if (!data.features || !data.features.length) return;
31379
31380                       data.features.forEach(function(feature) {
31381                           var loc = feature.geometry.coordinates;
31382                           var props = feature.properties;
31383
31384                           // if there is a parent, save its error type e.g.:
31385                           //  Error 191 = "highway-highway"
31386                           //  Error 190 = "intersections without junctions"  (parent)
31387                           var errorType = props.error_type;
31388                           var errorTemplate = errorTypes[errorType];
31389                           var parentErrorType = (Math.floor(errorType / 10) * 10).toString();
31390
31391                           // try to handle error type directly, fallback to parent error type.
31392                           var whichType = errorTemplate ? errorType : parentErrorType;
31393                           var whichTemplate = errorTypes[whichType];
31394
31395                           // Rewrite a few of the errors at this point..
31396                           // This is done to make them easier to linkify and translate.
31397                           switch (whichType) {
31398                               case '170':
31399                                   props.description = 'This feature has a FIXME tag: ' + props.description;
31400                                   break;
31401                               case '292':
31402                               case '293':
31403                                   props.description = props.description.replace('A turn-', 'This turn-');
31404                                   break;
31405                               case '294':
31406                               case '295':
31407                               case '296':
31408                               case '297':
31409                               case '298':
31410                                   props.description = 'This turn-restriction~' + props.description;
31411                                   break;
31412                               case '300':
31413                                   props.description = 'This highway is missing a maxspeed tag';
31414                                   break;
31415                               case '411':
31416                               case '412':
31417                               case '413':
31418                                   props.description = 'This feature~' + props.description;
31419                                   break;
31420                           }
31421
31422                           // - move markers slightly so it doesn't obscure the geometry,
31423                           // - then move markers away from other coincident markers
31424                           var coincident = false;
31425                           do {
31426                               // first time, move marker up. after that, move marker right.
31427                               var delta = coincident ? [0.00001, 0] : [0, 0.00001];
31428                               loc = geoVecAdd(loc, delta);
31429                               var bbox = geoExtent$$1(loc).bbox();
31430                               coincident = _krCache.rtree.search(bbox).length;
31431                           } while (coincident);
31432
31433                           var d = new krError({
31434                               loc: loc,
31435                               id: props.error_id,
31436                               comment: props.comment || null,
31437                               description: props.description || '',
31438                               error_id: props.error_id,
31439                               which_type: whichType,
31440                               error_type: errorType,
31441                               parent_error_type: parentErrorType,
31442                               severity: whichTemplate.severity || 'error',
31443                               object_id: props.object_id,
31444                               object_type: props.object_type,
31445                               schema: props.schema,
31446                               title: props.title
31447                           });
31448
31449                           d.replacements = tokenReplacements(d);
31450
31451                           _krCache.data[d.id] = d;
31452                           _krCache.rtree.insert(encodeErrorRtree(d));
31453                       });
31454
31455                       dispatch$1.call('loaded');
31456                   }
31457               );
31458           });
31459       },
31460
31461
31462       postKeepRightUpdate: function(d, callback) {
31463           if (_krCache.inflightPost[d.id]) {
31464               return callback({ message: 'Error update already inflight', status: -2 }, d);
31465           }
31466
31467           var that = this;
31468           var params = { schema: d.schema, id: d.error_id };
31469
31470           if (d.state) {
31471               params.st = d.state;
31472           }
31473           if (d.newComment !== undefined) {
31474               params.co = d.newComment;
31475           }
31476
31477           // NOTE: This throws a CORS err, but it seems successful.
31478           // We don't care too much about the response, so this is fine.
31479           var url = _krUrlRoot + 'comment.php?' + utilQsString(params);
31480           _krCache.inflightPost[d.id] = request(url)
31481               .post(function(err) {
31482                   delete _krCache.inflightPost[d.id];
31483
31484                   if (d.state === 'ignore') {   // ignore permanently (false positive)
31485                       that.removeError(d);
31486
31487                   } else if (d.state === 'ignore_t') {  // ignore temporarily (error fixed)
31488                       that.removeError(d);
31489                       _krCache.closed[d.schema + ':' + d.error_id] = true;
31490
31491                   } else {
31492                       d = that.replaceError(d.update({
31493                           comment: d.newComment,
31494                           newComment: undefined,
31495                           state: undefined
31496                       }));
31497                   }
31498
31499                   return callback(err, d);
31500               });
31501
31502       },
31503
31504
31505       // get all cached errors covering the viewport
31506       getErrors: function(projection) {
31507           var viewport = projection.clipExtent();
31508           var min = [viewport[0][0], viewport[1][1]];
31509           var max = [viewport[1][0], viewport[0][1]];
31510           var bbox = geoExtent$$1(projection.invert(min), projection.invert(max)).bbox();
31511
31512           return _krCache.rtree.search(bbox).map(function(d) {
31513               return d.data;
31514           });
31515       },
31516
31517
31518       // get a single error from the cache
31519       getError: function(id) {
31520           return _krCache.data[id];
31521       },
31522
31523
31524       // replace a single error in the cache
31525       replaceError: function(error) {
31526           if (!(error instanceof krError) || !error.id) return;
31527
31528           _krCache.data[error.id] = error;
31529           updateRtree(encodeErrorRtree(error), true); // true = replace
31530           return error;
31531       },
31532
31533
31534       // remove a single error from the cache
31535       removeError: function(error) {
31536           if (!(error instanceof krError) || !error.id) return;
31537
31538           delete _krCache.data[error.id];
31539           updateRtree(encodeErrorRtree(error), false); // false = remove
31540       },
31541
31542
31543       errorURL: function(error) {
31544           return _krUrlRoot + 'report_map.php?schema=' + error.schema + '&error=' + error.id;
31545       },
31546
31547
31548       // Get an array of errors closed during this session.
31549       // Used to populate `closed:keepright` changeset tag
31550       getClosedIDs: function() {
31551           return Object.keys(_krCache.closed).sort();
31552       }
31553
31554   };
31555
31556   function svgAreas$$1(projection, context) {
31557       // Patterns only work in Firefox when set directly on element.
31558       // (This is not a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=750632)
31559       var patterns = {
31560           // tag - pattern name
31561           // -or-
31562           // tag - value - pattern name
31563           // -or-
31564           // tag - value - rules (optional tag-values, pattern name)
31565           // (matches earlier rules first, so fallback should be last entry)
31566           amenity: {
31567               grave_yard: 'cemetery',
31568               fountain: 'water_standing'
31569           },
31570           landuse: {
31571               cemetery: [
31572                   { religion: 'christian', pattern: 'cemetery_christian' },
31573                   { religion: 'buddhist', pattern: 'cemetery_buddhist' },
31574                   { religion: 'muslim', pattern: 'cemetery_muslim' },
31575                   { religion: 'jewish', pattern: 'cemetery_jewish' },
31576                   { pattern: 'cemetery' }
31577               ],
31578               construction: 'construction',
31579               farmland: 'farmland',
31580               farmyard: 'farmyard',
31581               forest: [
31582                   { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' },
31583                   { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' },
31584                   { leaf_type: 'leafless', pattern: 'forest_leafless' },
31585                   { pattern: 'forest' } // same as 'leaf_type:mixed'
31586               ],
31587               grave_yard: 'cemetery',
31588               grass: 'grass',
31589               landfill: 'landfill',
31590               meadow: 'meadow',
31591               military: 'construction',
31592               orchard: 'orchard',
31593               reservoir: 'water_standing',
31594               quarry: 'quarry',
31595               vineyard: 'vineyard'
31596           },
31597           natural: {
31598               beach: 'beach',
31599               grassland: 'grass',
31600               sand: 'beach',
31601               scrub: 'scrub',
31602               water: [
31603                   { water: 'pond', pattern: 'pond' },
31604                   { water: 'reservoir', pattern: 'water_standing' },
31605                   { pattern: 'waves' }
31606               ],
31607               wetland: [
31608                   { wetland: 'marsh', pattern: 'wetland_marsh' },
31609                   { wetland: 'swamp', pattern: 'wetland_swamp' },
31610                   { wetland: 'bog', pattern: 'wetland_bog' },
31611                   { wetland: 'reedbed', pattern: 'wetland_reedbed' },
31612                   { pattern: 'wetland' }
31613               ],
31614               wood: [
31615                   { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' },
31616                   { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' },
31617                   { leaf_type: 'leafless', pattern: 'forest_leafless' },
31618                   { pattern: 'forest' } // same as 'leaf_type:mixed'
31619               ]
31620           },
31621           traffic_calming: {
31622               island: [
31623                   { surface: 'grass', pattern: 'grass' },
31624               ],
31625               chicane: [
31626                   { surface: 'grass', pattern: 'grass' },
31627               ],
31628               choker: [
31629                   { surface: 'grass', pattern: 'grass' },
31630               ]
31631           }
31632       };
31633
31634       function setPattern(entity) {
31635           // Skip pattern filling if this is a building (buildings don't get patterns applied)
31636           if (entity.tags.building && entity.tags.building !== 'no') {
31637               this.style.fill = this.style.stroke = '';
31638               return;
31639           }
31640
31641           for (var tag in patterns) {
31642               var entityValue = entity.tags[tag];
31643               if (!entityValue) continue;
31644
31645               if (typeof patterns[tag] === 'string') { // extra short syntax (just tag) - pattern name
31646                   this.style.fill = this.style.stroke = 'url("#pattern-' + patterns[tag] + '")';
31647                   return;
31648               } else {
31649                   var values = patterns[tag];
31650                   for (var value in values) {
31651                       if (entityValue !== value) continue;
31652
31653                       var rules = values[value];
31654                       if (typeof rules === 'string') { // short syntax - pattern name
31655                           this.style.fill = this.style.stroke = 'url("#pattern-' + rules + '")';
31656                           return;
31657                       } else { // long syntax - rule array
31658                           for (var ruleKey in rules) {
31659                               var rule = rules[ruleKey];
31660
31661                               var pass = true;
31662                               for (var criterion in rule) {
31663                                   if (criterion !== 'pattern') { // reserved for pattern name
31664                                       // The only rule is a required tag-value pair
31665                                       var v = entity.tags[criterion];
31666                                       if (!v || v !== rule[criterion]) {
31667                                           pass = false;
31668                                           break;
31669                                       }
31670                                   }
31671                               }
31672
31673                               if (pass) {
31674                                   this.style.fill = this.style.stroke = 'url("#pattern-' + rule.pattern + '")';
31675                                   return;
31676                               }
31677                           }
31678                       }
31679                   }
31680               }
31681           }
31682
31683           this.style.fill = this.style.stroke = '';
31684       }
31685
31686
31687       function drawTargets(selection, graph, entities, filter) {
31688           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
31689           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
31690           var getPath = svgPath(projection).geojson;
31691           var activeID = context.activeID();
31692
31693           // The targets and nopes will be MultiLineString sub-segments of the ways
31694           var data = { targets: [], nopes: [] };
31695
31696           entities.forEach(function(way) {
31697               var features = svgSegmentWay(way, graph, activeID);
31698               data.targets.push.apply(data.targets, features.passive);
31699               data.nopes.push.apply(data.nopes, features.active);
31700           });
31701
31702
31703           // Targets allow hover and vertex snapping
31704           var targetData = data.targets.filter(getPath);
31705           var targets = selection.selectAll('.area.target-allowed')
31706               .filter(function(d) { return filter(d.properties.entity); })
31707               .data(targetData, function key(d) { return d.id; });
31708
31709           // exit
31710           targets.exit()
31711               .remove();
31712
31713           // enter/update
31714           targets.enter()
31715               .append('path')
31716               .merge(targets)
31717               .attr('d', getPath)
31718               .attr('class', function(d) { return 'way area target target-allowed ' + targetClass + d.id; });
31719
31720
31721           // NOPE
31722           var nopeData = data.nopes.filter(getPath);
31723           var nopes = selection.selectAll('.area.target-nope')
31724               .filter(function(d) { return filter(d.properties.entity); })
31725               .data(nopeData, function key(d) { return d.id; });
31726
31727           // exit
31728           nopes.exit()
31729               .remove();
31730
31731           // enter/update
31732           nopes.enter()
31733               .append('path')
31734               .merge(nopes)
31735               .attr('d', getPath)
31736               .attr('class', function(d) { return 'way area target target-nope ' + nopeClass + d.id; });
31737       }
31738
31739
31740       function drawAreas(selection, graph, entities, filter) {
31741           var path = svgPath(projection, graph, true);
31742           var areas = {};
31743           var multipolygon;
31744
31745           for (var i = 0; i < entities.length; i++) {
31746               var entity = entities[i];
31747               if (entity.geometry(graph) !== 'area') continue;
31748
31749               multipolygon = osmIsSimpleMultipolygonOuterMember(entity, graph);
31750               if (multipolygon) {
31751                   areas[multipolygon.id] = {
31752                       entity: multipolygon.mergeTags(entity.tags),
31753                       area: Math.abs(entity.area(graph))
31754                   };
31755               } else if (!areas[entity.id]) {
31756                   areas[entity.id] = {
31757                       entity: entity,
31758                       area: Math.abs(entity.area(graph))
31759                   };
31760               }
31761           }
31762
31763           areas = values$1(areas).filter(function hasPath(a) { return path(a.entity); });
31764           areas.sort(function areaSort(a, b) { return b.area - a.area; });
31765           areas = map$3(areas, 'entity');
31766
31767           var strokes = areas.filter(function(area) {
31768               return area.type === 'way';
31769           });
31770
31771           var data = {
31772               clip: areas,
31773               shadow: strokes,
31774               stroke: strokes,
31775               fill: areas
31776           };
31777
31778           var clipPaths = context.surface().selectAll('defs').selectAll('.clipPath-osm')
31779              .filter(filter)
31780              .data(data.clip, osmEntity$$1.key);
31781
31782           clipPaths.exit()
31783              .remove();
31784
31785           var clipPathsEnter = clipPaths.enter()
31786              .append('clipPath')
31787              .attr('class', 'clipPath-osm')
31788              .attr('id', function(entity) { return entity.id + '-clippath'; });
31789
31790           clipPathsEnter
31791              .append('path');
31792
31793           clipPaths.merge(clipPathsEnter)
31794              .selectAll('path')
31795              .attr('d', path);
31796
31797
31798           var drawLayer = selection.selectAll('.layer-osm.areas');
31799           var touchLayer = selection.selectAll('.layer-touch.areas');
31800
31801           // Draw areas..
31802           var areagroup = drawLayer
31803               .selectAll('g.areagroup')
31804               .data(['fill', 'shadow', 'stroke']);
31805
31806           areagroup = areagroup.enter()
31807               .append('g')
31808               .attr('class', function(d) { return 'areagroup area-' + d; })
31809               .merge(areagroup);
31810
31811           var paths = areagroup
31812               .selectAll('path')
31813               .filter(filter)
31814               .data(function(layer) { return data[layer]; }, osmEntity$$1.key);
31815
31816           paths.exit()
31817               .remove();
31818
31819           var fills = selection.selectAll('.area-fill path.area').nodes();
31820
31821           var bisect = bisector(function(node) {
31822               return -node.__data__.area(graph);
31823           }).left;
31824
31825           function sortedByArea(entity) {
31826               if (this._parent.__data__ === 'fill') {
31827                   return fills[bisect(fills, -entity.area(graph))];
31828               }
31829           }
31830
31831           paths = paths.enter()
31832               .insert('path', sortedByArea)
31833               .merge(paths)
31834               .each(function(entity) {
31835                   var layer = this.parentNode.__data__;
31836                   this.setAttribute('class', entity.type + ' area ' + layer + ' ' + entity.id);
31837
31838                   if (layer === 'fill') {
31839                       this.setAttribute('clip-path', 'url(#' + entity.id + '-clippath)');
31840                       setPattern.call(this, entity);
31841                   }
31842               })
31843               .call(svgTagClasses())
31844               .attr('d', path);
31845
31846
31847           // Draw touch targets..
31848           touchLayer
31849               .call(drawTargets, graph, data.stroke, filter);
31850       }
31851
31852       return drawAreas;
31853   }
31854
31855   /**
31856    * A specialized version of `_.reduce` for arrays without support for
31857    * iteratee shorthands.
31858    *
31859    * @private
31860    * @param {Array} [array] The array to iterate over.
31861    * @param {Function} iteratee The function invoked per iteration.
31862    * @param {*} [accumulator] The initial value.
31863    * @param {boolean} [initAccum] Specify using the first element of `array` as
31864    *  the initial value.
31865    * @returns {*} Returns the accumulated value.
31866    */
31867   function arrayReduce(array, iteratee, accumulator, initAccum) {
31868     var index = -1,
31869         length = array == null ? 0 : array.length;
31870
31871     if (initAccum && length) {
31872       accumulator = array[++index];
31873     }
31874     while (++index < length) {
31875       accumulator = iteratee(accumulator, array[index], index, array);
31876     }
31877     return accumulator;
31878   }
31879
31880   /**
31881    * The base implementation of `_.reduce` and `_.reduceRight`, without support
31882    * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
31883    *
31884    * @private
31885    * @param {Array|Object} collection The collection to iterate over.
31886    * @param {Function} iteratee The function invoked per iteration.
31887    * @param {*} accumulator The initial value.
31888    * @param {boolean} initAccum Specify using the first or last element of
31889    *  `collection` as the initial value.
31890    * @param {Function} eachFunc The function to iterate over `collection`.
31891    * @returns {*} Returns the accumulated value.
31892    */
31893   function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
31894     eachFunc(collection, function(value, index, collection) {
31895       accumulator = initAccum
31896         ? (initAccum = false, value)
31897         : iteratee(accumulator, value, index, collection);
31898     });
31899     return accumulator;
31900   }
31901
31902   /**
31903    * Reduces `collection` to a value which is the accumulated result of running
31904    * each element in `collection` thru `iteratee`, where each successive
31905    * invocation is supplied the return value of the previous. If `accumulator`
31906    * is not given, the first element of `collection` is used as the initial
31907    * value. The iteratee is invoked with four arguments:
31908    * (accumulator, value, index|key, collection).
31909    *
31910    * Many lodash methods are guarded to work as iteratees for methods like
31911    * `_.reduce`, `_.reduceRight`, and `_.transform`.
31912    *
31913    * The guarded methods are:
31914    * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
31915    * and `sortBy`
31916    *
31917    * @static
31918    * @memberOf _
31919    * @since 0.1.0
31920    * @category Collection
31921    * @param {Array|Object} collection The collection to iterate over.
31922    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
31923    * @param {*} [accumulator] The initial value.
31924    * @returns {*} Returns the accumulated value.
31925    * @see _.reduceRight
31926    * @example
31927    *
31928    * _.reduce([1, 2], function(sum, n) {
31929    *   return sum + n;
31930    * }, 0);
31931    * // => 3
31932    *
31933    * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
31934    *   (result[value] || (result[value] = [])).push(key);
31935    *   return result;
31936    * }, {});
31937    * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
31938    */
31939   function reduce(collection, iteratee, accumulator) {
31940     var func = isArray(collection) ? arrayReduce : baseReduce,
31941         initAccum = arguments.length < 3;
31942
31943     return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);
31944   }
31945
31946   /** Error message constants. */
31947   var FUNC_ERROR_TEXT$3 = 'Expected a function';
31948
31949   /**
31950    * Creates a throttled function that only invokes `func` at most once per
31951    * every `wait` milliseconds. The throttled function comes with a `cancel`
31952    * method to cancel delayed `func` invocations and a `flush` method to
31953    * immediately invoke them. Provide `options` to indicate whether `func`
31954    * should be invoked on the leading and/or trailing edge of the `wait`
31955    * timeout. The `func` is invoked with the last arguments provided to the
31956    * throttled function. Subsequent calls to the throttled function return the
31957    * result of the last `func` invocation.
31958    *
31959    * **Note:** If `leading` and `trailing` options are `true`, `func` is
31960    * invoked on the trailing edge of the timeout only if the throttled function
31961    * is invoked more than once during the `wait` timeout.
31962    *
31963    * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
31964    * until to the next tick, similar to `setTimeout` with a timeout of `0`.
31965    *
31966    * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
31967    * for details over the differences between `_.throttle` and `_.debounce`.
31968    *
31969    * @static
31970    * @memberOf _
31971    * @since 0.1.0
31972    * @category Function
31973    * @param {Function} func The function to throttle.
31974    * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
31975    * @param {Object} [options={}] The options object.
31976    * @param {boolean} [options.leading=true]
31977    *  Specify invoking on the leading edge of the timeout.
31978    * @param {boolean} [options.trailing=true]
31979    *  Specify invoking on the trailing edge of the timeout.
31980    * @returns {Function} Returns the new throttled function.
31981    * @example
31982    *
31983    * // Avoid excessively updating the position while scrolling.
31984    * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
31985    *
31986    * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
31987    * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
31988    * jQuery(element).on('click', throttled);
31989    *
31990    * // Cancel the trailing throttled invocation.
31991    * jQuery(window).on('popstate', throttled.cancel);
31992    */
31993   function throttle(func, wait, options) {
31994     var leading = true,
31995         trailing = true;
31996
31997     if (typeof func != 'function') {
31998       throw new TypeError(FUNC_ERROR_TEXT$3);
31999     }
32000     if (isObject(options)) {
32001       leading = 'leading' in options ? !!options.leading : leading;
32002       trailing = 'trailing' in options ? !!options.trailing : trailing;
32003     }
32004     return debounce(func, wait, {
32005       'leading': leading,
32006       'maxWait': wait,
32007       'trailing': trailing
32008     });
32009   }
32010
32011   var fastJsonStableStringify = function (data, opts) {
32012       if (!opts) opts = {};
32013       if (typeof opts === 'function') opts = { cmp: opts };
32014       var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false;
32015
32016       var cmp = opts.cmp && (function (f) {
32017           return function (node) {
32018               return function (a, b) {
32019                   var aobj = { key: a, value: node[a] };
32020                   var bobj = { key: b, value: node[b] };
32021                   return f(aobj, bobj);
32022               };
32023           };
32024       })(opts.cmp);
32025
32026       var seen = [];
32027       return (function stringify (node) {
32028           if (node && node.toJSON && typeof node.toJSON === 'function') {
32029               node = node.toJSON();
32030           }
32031
32032           if (node === undefined) return;
32033           if (typeof node == 'number') return isFinite(node) ? '' + node : 'null';
32034           if (typeof node !== 'object') return JSON.stringify(node);
32035
32036           var i, out;
32037           if (Array.isArray(node)) {
32038               out = '[';
32039               for (i = 0; i < node.length; i++) {
32040                   if (i) out += ',';
32041                   out += stringify(node[i]) || 'null';
32042               }
32043               return out + ']';
32044           }
32045
32046           if (node === null) return 'null';
32047
32048           if (seen.indexOf(node) !== -1) {
32049               if (cycles) return JSON.stringify('__cycle__');
32050               throw new TypeError('Converting circular structure to JSON');
32051           }
32052
32053           var seenIndex = seen.push(node) - 1;
32054           var keys = Object.keys(node).sort(cmp && cmp(node));
32055           out = '';
32056           for (i = 0; i < keys.length; i++) {
32057               var key = keys[i];
32058               var value = stringify(node[key]);
32059
32060               if (!value) continue;
32061               if (out) out += ',';
32062               out += JSON.stringify(key) + ':' + value;
32063           }
32064           seen.splice(seenIndex, 1);
32065           return '{' + out + '}';
32066       })(data);
32067   };
32068
32069   //[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]
32070   //[4a]        NameChar           ::=          NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
32071   //[5]         Name       ::=          NameStartChar (NameChar)*
32072   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
32073   var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
32074   var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
32075   //var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
32076   //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(',')
32077
32078   //S_TAG,      S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
32079   //S_ATTR_SPACE,       S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
32080   var S_TAG = 0;//tag name offerring
32081   var S_ATTR = 1;//attr name offerring 
32082   var S_ATTR_SPACE=2;//attr name end and space offer
32083   var S_EQ = 3;//=space?
32084   var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
32085   var S_ATTR_END = 5;//attr value end and no space(quot end)
32086   var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
32087   var S_TAG_CLOSE = 7;//closed el<el />
32088
32089   function XMLReader(){
32090         
32091   }
32092
32093   XMLReader.prototype = {
32094         parse:function(source,defaultNSMap,entityMap){
32095                 var domBuilder = this.domBuilder;
32096                 domBuilder.startDocument();
32097                 _copy(defaultNSMap ,defaultNSMap = {});
32098                 parse(source,defaultNSMap,entityMap,
32099                                 domBuilder,this.errorHandler);
32100                 domBuilder.endDocument();
32101         }
32102   };
32103   function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
32104         function fixedFromCharCode(code) {
32105                 // String.prototype.fromCharCode does not supports
32106                 // > 2 bytes unicode chars directly
32107                 if (code > 0xffff) {
32108                         code -= 0x10000;
32109                         var surrogate1 = 0xd800 + (code >> 10)
32110                                 , surrogate2 = 0xdc00 + (code & 0x3ff);
32111
32112                         return String.fromCharCode(surrogate1, surrogate2);
32113                 } else {
32114                         return String.fromCharCode(code);
32115                 }
32116         }
32117         function entityReplacer(a){
32118                 var k = a.slice(1,-1);
32119                 if(k in entityMap){
32120                         return entityMap[k]; 
32121                 }else if(k.charAt(0) === '#'){
32122                         return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
32123                 }else{
32124                         errorHandler.error('entity not found:'+a);
32125                         return a;
32126                 }
32127         }
32128         function appendText(end){//has some bugs
32129                 if(end>start){
32130                         var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
32131                         locator&&position(start);
32132                         domBuilder.characters(xt,0,end-start);
32133                         start = end;
32134                 }
32135         }
32136         function position(p,m){
32137                 while(p>=lineEnd && (m = linePattern.exec(source))){
32138                         lineStart = m.index;
32139                         lineEnd = lineStart + m[0].length;
32140                         locator.lineNumber++;
32141                         //console.log('line++:',locator,startPos,endPos)
32142                 }
32143                 locator.columnNumber = p-lineStart+1;
32144         }
32145         var lineStart = 0;
32146         var lineEnd = 0;
32147         var linePattern = /.*(?:\r\n?|\n)|.*$/g;
32148         var locator = domBuilder.locator;
32149         
32150         var parseStack = [{currentNSMap:defaultNSMapCopy}];
32151         var closeMap = {};
32152         var start = 0;
32153         while(true){
32154                 try{
32155                         var tagStart = source.indexOf('<',start);
32156                         if(tagStart<0){
32157                                 if(!source.substr(start).match(/^\s*$/)){
32158                                         var doc = domBuilder.doc;
32159                                 var text = doc.createTextNode(source.substr(start));
32160                                 doc.appendChild(text);
32161                                 domBuilder.currentElement = text;
32162                                 }
32163                                 return;
32164                         }
32165                         if(tagStart>start){
32166                                 appendText(tagStart);
32167                         }
32168                         switch(source.charAt(tagStart+1)){
32169                         case '/':
32170                                 var end = source.indexOf('>',tagStart+3);
32171                                 var tagName = source.substring(tagStart+2,end);
32172                                 var config = parseStack.pop();
32173                                 if(end<0){
32174                                         
32175                                 tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
32176                                 //console.error('#@@@@@@'+tagName)
32177                                 errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
32178                                 end = tagStart+1+tagName.length;
32179                         }else if(tagName.match(/\s</)){
32180                                 tagName = tagName.replace(/[\s<].*/,'');
32181                                 errorHandler.error("end tag name: "+tagName+' maybe not complete');
32182                                 end = tagStart+1+tagName.length;
32183                                 }
32184                                 //console.error(parseStack.length,parseStack)
32185                                 //console.error(config);
32186                                 var localNSMap = config.localNSMap;
32187                                 var endMatch = config.tagName == tagName;
32188                                 var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase();
32189                         if(endIgnoreCaseMach){
32190                                 domBuilder.endElement(config.uri,config.localName,tagName);
32191                                         if(localNSMap){
32192                                                 for(var prefix in localNSMap){
32193                                                         domBuilder.endPrefixMapping(prefix) ;
32194                                                 }
32195                                         }
32196                                         if(!endMatch){
32197                                 errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
32198                                         }
32199                         }else{
32200                                 parseStack.push(config);
32201                         }
32202                                 
32203                                 end++;
32204                                 break;
32205                                 // end elment
32206                         case '?':// <?...?>
32207                                 locator&&position(tagStart);
32208                                 end = parseInstruction(source,tagStart,domBuilder);
32209                                 break;
32210                         case '!':// <!doctype,<![CDATA,<!--
32211                                 locator&&position(tagStart);
32212                                 end = parseDCC(source,tagStart,domBuilder,errorHandler);
32213                                 break;
32214                         default:
32215                                 locator&&position(tagStart);
32216                                 var el = new ElementAttributes();
32217                                 var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
32218                                 //elStartEnd
32219                                 var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
32220                                 var len = el.length;
32221                                 
32222                                 
32223                                 if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
32224                                         el.closed = true;
32225                                         if(!entityMap.nbsp){
32226                                                 errorHandler.warning('unclosed xml attribute');
32227                                         }
32228                                 }
32229                                 if(locator && len){
32230                                         var locator2 = copyLocator(locator,{});
32231                                         //try{//attribute position fixed
32232                                         for(var i = 0;i<len;i++){
32233                                                 var a = el[i];
32234                                                 position(a.offset);
32235                                                 a.locator = copyLocator(locator,{});
32236                                         }
32237                                         //}catch(e){console.error('@@@@@'+e)}
32238                                         domBuilder.locator = locator2;
32239                                         if(appendElement(el,domBuilder,currentNSMap)){
32240                                                 parseStack.push(el);
32241                                         }
32242                                         domBuilder.locator = locator;
32243                                 }else{
32244                                         if(appendElement(el,domBuilder,currentNSMap)){
32245                                                 parseStack.push(el);
32246                                         }
32247                                 }
32248                                 
32249                                 
32250                                 
32251                                 if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
32252                                         end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder);
32253                                 }else{
32254                                         end++;
32255                                 }
32256                         }
32257                 }catch(e){
32258                         errorHandler.error('element parse error: '+e);
32259                         //errorHandler.error('element parse error: '+e);
32260                         end = -1;
32261                         //throw e;
32262                 }
32263                 if(end>start){
32264                         start = end;
32265                 }else{
32266                         //TODO: 这里有可能sax回退,有位置错误风险
32267                         appendText(Math.max(tagStart,start)+1);
32268                 }
32269         }
32270   }
32271   function copyLocator(f,t){
32272         t.lineNumber = f.lineNumber;
32273         t.columnNumber = f.columnNumber;
32274         return t;
32275   }
32276
32277   /**
32278    * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
32279    * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
32280    */
32281   function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
32282         var attrName;
32283         var value;
32284         var p = ++start;
32285         var s = S_TAG;//status
32286         while(true){
32287                 var c = source.charAt(p);
32288                 switch(c){
32289                 case '=':
32290                         if(s === S_ATTR){//attrName
32291                                 attrName = source.slice(start,p);
32292                                 s = S_EQ;
32293                         }else if(s === S_ATTR_SPACE){
32294                                 s = S_EQ;
32295                         }else{
32296                                 //fatalError: equal must after attrName or space after attrName
32297                                 throw new Error('attribute equal must after attrName');
32298                         }
32299                         break;
32300                 case '\'':
32301                 case '"':
32302                         if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
32303                                 ){//equal
32304                                 if(s === S_ATTR){
32305                                         errorHandler.warning('attribute value must after "="');
32306                                         attrName = source.slice(start,p);
32307                                 }
32308                                 start = p+1;
32309                                 p = source.indexOf(c,start);
32310                                 if(p>0){
32311                                         value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
32312                                         el.add(attrName,value,start-1);
32313                                         s = S_ATTR_END;
32314                                 }else{
32315                                         //fatalError: no end quot match
32316                                         throw new Error('attribute value no end \''+c+'\' match');
32317                                 }
32318                         }else if(s == S_ATTR_NOQUOT_VALUE){
32319                                 value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
32320                                 //console.log(attrName,value,start,p)
32321                                 el.add(attrName,value,start);
32322                                 //console.dir(el)
32323                                 errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
32324                                 start = p+1;
32325                                 s = S_ATTR_END;
32326                         }else{
32327                                 //fatalError: no equal before
32328                                 throw new Error('attribute value must after "="');
32329                         }
32330                         break;
32331                 case '/':
32332                         switch(s){
32333                         case S_TAG:
32334                                 el.setTagName(source.slice(start,p));
32335                         case S_ATTR_END:
32336                         case S_TAG_SPACE:
32337                         case S_TAG_CLOSE:
32338                                 s =S_TAG_CLOSE;
32339                                 el.closed = true;
32340                         case S_ATTR_NOQUOT_VALUE:
32341                         case S_ATTR:
32342                         case S_ATTR_SPACE:
32343                                 break;
32344                         //case S_EQ:
32345                         default:
32346                                 throw new Error("attribute invalid close char('/')")
32347                         }
32348                         break;
32349                 case ''://end document
32350                         //throw new Error('unexpected end of input')
32351                         errorHandler.error('unexpected end of input');
32352                         if(s == S_TAG){
32353                                 el.setTagName(source.slice(start,p));
32354                         }
32355                         return p;
32356                 case '>':
32357                         switch(s){
32358                         case S_TAG:
32359                                 el.setTagName(source.slice(start,p));
32360                         case S_ATTR_END:
32361                         case S_TAG_SPACE:
32362                         case S_TAG_CLOSE:
32363                                 break;//normal
32364                         case S_ATTR_NOQUOT_VALUE://Compatible state
32365                         case S_ATTR:
32366                                 value = source.slice(start,p);
32367                                 if(value.slice(-1) === '/'){
32368                                         el.closed  = true;
32369                                         value = value.slice(0,-1);
32370                                 }
32371                         case S_ATTR_SPACE:
32372                                 if(s === S_ATTR_SPACE){
32373                                         value = attrName;
32374                                 }
32375                                 if(s == S_ATTR_NOQUOT_VALUE){
32376                                         errorHandler.warning('attribute "'+value+'" missed quot(")!!');
32377                                         el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start);
32378                                 }else{
32379                                         if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
32380                                                 errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!');
32381                                         }
32382                                         el.add(value,value,start);
32383                                 }
32384                                 break;
32385                         case S_EQ:
32386                                 throw new Error('attribute value missed!!');
32387                         }
32388   //                    console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
32389                         return p;
32390                 /*xml space '\x20' | #x9 | #xD | #xA; */
32391                 case '\u0080':
32392                         c = ' ';
32393                 default:
32394                         if(c<= ' '){//space
32395                                 switch(s){
32396                                 case S_TAG:
32397                                         el.setTagName(source.slice(start,p));//tagName
32398                                         s = S_TAG_SPACE;
32399                                         break;
32400                                 case S_ATTR:
32401                                         attrName = source.slice(start,p);
32402                                         s = S_ATTR_SPACE;
32403                                         break;
32404                                 case S_ATTR_NOQUOT_VALUE:
32405                                         var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
32406                                         errorHandler.warning('attribute "'+value+'" missed quot(")!!');
32407                                         el.add(attrName,value,start);
32408                                 case S_ATTR_END:
32409                                         s = S_TAG_SPACE;
32410                                         break;
32411                                 //case S_TAG_SPACE:
32412                                 //case S_EQ:
32413                                 //case S_ATTR_SPACE:
32414                                 //      void();break;
32415                                 //case S_TAG_CLOSE:
32416                                         //ignore warning
32417                                 }
32418                         }else{//not space
32419   //S_TAG,      S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
32420   //S_ATTR_SPACE,       S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
32421                                 switch(s){
32422                                 //case S_TAG:void();break;
32423                                 //case S_ATTR:void();break;
32424                                 //case S_ATTR_NOQUOT_VALUE:void();break;
32425                                 case S_ATTR_SPACE:
32426                                         var tagName =  el.tagName;
32427                                         if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
32428                                                 errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!');
32429                                         }
32430                                         el.add(attrName,attrName,start);
32431                                         start = p;
32432                                         s = S_ATTR;
32433                                         break;
32434                                 case S_ATTR_END:
32435                                         errorHandler.warning('attribute space is required"'+attrName+'"!!');
32436                                 case S_TAG_SPACE:
32437                                         s = S_ATTR;
32438                                         start = p;
32439                                         break;
32440                                 case S_EQ:
32441                                         s = S_ATTR_NOQUOT_VALUE;
32442                                         start = p;
32443                                         break;
32444                                 case S_TAG_CLOSE:
32445                                         throw new Error("elements closed character '/' and '>' must be connected to");
32446                                 }
32447                         }
32448                 }//end outer switch
32449                 //console.log('p++',p)
32450                 p++;
32451         }
32452   }
32453   /**
32454    * @return true if has new namespace define
32455    */
32456   function appendElement(el,domBuilder,currentNSMap){
32457         var tagName = el.tagName;
32458         var localNSMap = null;
32459         //var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
32460         var i = el.length;
32461         while(i--){
32462                 var a = el[i];
32463                 var qName = a.qName;
32464                 var value = a.value;
32465                 var nsp = qName.indexOf(':');
32466                 if(nsp>0){
32467                         var prefix = a.prefix = qName.slice(0,nsp);
32468                         var localName = qName.slice(nsp+1);
32469                         var nsPrefix = prefix === 'xmlns' && localName;
32470                 }else{
32471                         localName = qName;
32472                         prefix = null;
32473                         nsPrefix = qName === 'xmlns' && '';
32474                 }
32475                 //can not set prefix,because prefix !== ''
32476                 a.localName = localName ;
32477                 //prefix == null for no ns prefix attribute 
32478                 if(nsPrefix !== false){//hack!!
32479                         if(localNSMap == null){
32480                                 localNSMap = {};
32481                                 //console.log(currentNSMap,0)
32482                                 _copy(currentNSMap,currentNSMap={});
32483                                 //console.log(currentNSMap,1)
32484                         }
32485                         currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
32486                         a.uri = 'http://www.w3.org/2000/xmlns/';
32487                         domBuilder.startPrefixMapping(nsPrefix, value); 
32488                 }
32489         }
32490         var i = el.length;
32491         while(i--){
32492                 a = el[i];
32493                 var prefix = a.prefix;
32494                 if(prefix){//no prefix attribute has no namespace
32495                         if(prefix === 'xml'){
32496                                 a.uri = 'http://www.w3.org/XML/1998/namespace';
32497                         }if(prefix !== 'xmlns'){
32498                                 a.uri = currentNSMap[prefix || ''];
32499                                 
32500                                 //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
32501                         }
32502                 }
32503         }
32504         var nsp = tagName.indexOf(':');
32505         if(nsp>0){
32506                 prefix = el.prefix = tagName.slice(0,nsp);
32507                 localName = el.localName = tagName.slice(nsp+1);
32508         }else{
32509                 prefix = null;//important!!
32510                 localName = el.localName = tagName;
32511         }
32512         //no prefix element has default namespace
32513         var ns = el.uri = currentNSMap[prefix || ''];
32514         domBuilder.startElement(ns,localName,tagName,el);
32515         //endPrefixMapping and startPrefixMapping have not any help for dom builder
32516         //localNSMap = null
32517         if(el.closed){
32518                 domBuilder.endElement(ns,localName,tagName);
32519                 if(localNSMap){
32520                         for(prefix in localNSMap){
32521                                 domBuilder.endPrefixMapping(prefix); 
32522                         }
32523                 }
32524         }else{
32525                 el.currentNSMap = currentNSMap;
32526                 el.localNSMap = localNSMap;
32527                 //parseStack.push(el);
32528                 return true;
32529         }
32530   }
32531   function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
32532         if(/^(?:script|textarea)$/i.test(tagName)){
32533                 var elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);
32534                 var text = source.substring(elStartEnd+1,elEndStart);
32535                 if(/[&<]/.test(text)){
32536                         if(/^script$/i.test(tagName)){
32537                                 //if(!/\]\]>/.test(text)){
32538                                         //lexHandler.startCDATA();
32539                                         domBuilder.characters(text,0,text.length);
32540                                         //lexHandler.endCDATA();
32541                                         return elEndStart;
32542                                 //}
32543                         }//}else{//text area
32544                                 text = text.replace(/&#?\w+;/g,entityReplacer);
32545                                 domBuilder.characters(text,0,text.length);
32546                                 return elEndStart;
32547                         //}
32548                         
32549                 }
32550         }
32551         return elStartEnd+1;
32552   }
32553   function fixSelfClosed(source,elStartEnd,tagName,closeMap){
32554         //if(tagName in closeMap){
32555         var pos = closeMap[tagName];
32556         if(pos == null){
32557                 //console.log(tagName)
32558                 pos =  source.lastIndexOf('</'+tagName+'>');
32559                 if(pos<elStartEnd){//忘记闭合
32560                         pos = source.lastIndexOf('</'+tagName);
32561                 }
32562                 closeMap[tagName] =pos;
32563         }
32564         return pos<elStartEnd;
32565         //} 
32566   }
32567   function _copy(source,target){
32568         for(var n in source){target[n] = source[n];}
32569   }
32570   function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
32571         var next= source.charAt(start+2);
32572         switch(next){
32573         case '-':
32574                 if(source.charAt(start + 3) === '-'){
32575                         var end = source.indexOf('-->',start+4);
32576                         //append comment source.substring(4,end)//<!--
32577                         if(end>start){
32578                                 domBuilder.comment(source,start+4,end-start-4);
32579                                 return end+3;
32580                         }else{
32581                                 errorHandler.error("Unclosed comment");
32582                                 return -1;
32583                         }
32584                 }else{
32585                         //error
32586                         return -1;
32587                 }
32588         default:
32589                 if(source.substr(start+3,6) == 'CDATA['){
32590                         var end = source.indexOf(']]>',start+9);
32591                         domBuilder.startCDATA();
32592                         domBuilder.characters(source,start+9,end-start-9);
32593                         domBuilder.endCDATA(); 
32594                         return end+3;
32595                 }
32596                 //<!DOCTYPE
32597                 //startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) 
32598                 var matchs = split(source,start);
32599                 var len = matchs.length;
32600                 if(len>1 && /!doctype/i.test(matchs[0][0])){
32601                         var name = matchs[1][0];
32602                         var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0];
32603                         var sysid = len>4 && matchs[4][0];
32604                         var lastMatch = matchs[len-1];
32605                         domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
32606                                         sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
32607                         domBuilder.endDTD();
32608                         
32609                         return lastMatch.index+lastMatch[0].length
32610                 }
32611         }
32612         return -1;
32613   }
32614
32615
32616
32617   function parseInstruction(source,start,domBuilder){
32618         var end = source.indexOf('?>',start);
32619         if(end){
32620                 var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
32621                 if(match){
32622                         var len = match[0].length;
32623                         domBuilder.processingInstruction(match[1], match[2]) ;
32624                         return end+2;
32625                 }else{//error
32626                         return -1;
32627                 }
32628         }
32629         return -1;
32630   }
32631
32632   /**
32633    * @param source
32634    */
32635   function ElementAttributes(source){
32636         
32637   }
32638   ElementAttributes.prototype = {
32639         setTagName:function(tagName){
32640                 if(!tagNamePattern.test(tagName)){
32641                         throw new Error('invalid tagName:'+tagName)
32642                 }
32643                 this.tagName = tagName;
32644         },
32645         add:function(qName,value,offset){
32646                 if(!tagNamePattern.test(qName)){
32647                         throw new Error('invalid attribute:'+qName)
32648                 }
32649                 this[this.length++] = {qName:qName,value:value,offset:offset};
32650         },
32651         length:0,
32652         getLocalName:function(i){return this[i].localName},
32653         getLocator:function(i){return this[i].locator},
32654         getQName:function(i){return this[i].qName},
32655         getURI:function(i){return this[i].uri},
32656         getValue:function(i){return this[i].value}
32657   //    ,getIndex:function(uri, localName)){
32658   //            if(localName){
32659   //                    
32660   //            }else{
32661   //                    var qName = uri
32662   //            }
32663   //    },
32664   //    getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
32665   //    getType:function(uri,localName){}
32666   //    getType:function(i){},
32667   };
32668
32669
32670
32671
32672   function _set_proto_(thiz,parent){
32673         thiz.__proto__ = parent;
32674         return thiz;
32675   }
32676   if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
32677         _set_proto_ = function(thiz,parent){
32678                 function p(){}          p.prototype = parent;
32679                 p = new p();
32680                 for(parent in thiz){
32681                         p[parent] = thiz[parent];
32682                 }
32683                 return p;
32684         };
32685   }
32686
32687   function split(source,start){
32688         var match;
32689         var buf = [];
32690         var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
32691         reg.lastIndex = start;
32692         reg.exec(source);//skip <
32693         while(match = reg.exec(source)){
32694                 buf.push(match);
32695                 if(match[1])return buf;
32696         }
32697   }
32698
32699   var XMLReader_1 = XMLReader;
32700
32701   var sax = {
32702         XMLReader: XMLReader_1
32703   };
32704
32705   /*
32706    * DOM Level 2
32707    * Object DOMException
32708    * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
32709    * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
32710    */
32711
32712   function copy$1(src,dest){
32713         for(var p in src){
32714                 dest[p] = src[p];
32715         }
32716   }
32717   /**
32718   ^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
32719   ^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
32720    */
32721   function _extends(Class,Super){
32722         var pt = Class.prototype;
32723         if(Object.create){
32724                 var ppt = Object.create(Super.prototype);
32725                 pt.__proto__ = ppt;
32726         }
32727         if(!(pt instanceof Super)){
32728                 function t(){}          t.prototype = Super.prototype;
32729                 t = new t();
32730                 copy$1(pt,t);
32731                 Class.prototype = pt = t;
32732         }
32733         if(pt.constructor != Class){
32734                 if(typeof Class != 'function'){
32735                         console.error("unknow Class:"+Class);
32736                 }
32737                 pt.constructor = Class;
32738         }
32739   }
32740   var htmlns = 'http://www.w3.org/1999/xhtml' ;
32741   // Node Types
32742   var NodeType = {};
32743   var ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;
32744   var ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;
32745   var TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;
32746   var CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;
32747   var ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;
32748   var ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;
32749   var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
32750   var COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;
32751   var DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;
32752   var DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;
32753   var DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;
32754   var NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;
32755
32756   // ExceptionCode
32757   var ExceptionCode = {};
32758   var ExceptionMessage = {};
32759   var INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = ((ExceptionMessage[1]="Index size error"),1);
32760   var DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = ((ExceptionMessage[2]="DOMString size error"),2);
32761   var HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = ((ExceptionMessage[3]="Hierarchy request error"),3);
32762   var WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = ((ExceptionMessage[4]="Wrong document"),4);
32763   var INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = ((ExceptionMessage[5]="Invalid character"),5);
32764   var NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = ((ExceptionMessage[6]="No data allowed"),6);
32765   var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
32766   var NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = ((ExceptionMessage[8]="Not found"),8);
32767   var NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = ((ExceptionMessage[9]="Not supported"),9);
32768   var INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = ((ExceptionMessage[10]="Attribute in use"),10);
32769   //level2
32770   var INVALID_STATE_ERR         = ExceptionCode.INVALID_STATE_ERR               = ((ExceptionMessage[11]="Invalid state"),11);
32771   var SYNTAX_ERR                = ExceptionCode.SYNTAX_ERR                      = ((ExceptionMessage[12]="Syntax error"),12);
32772   var INVALID_MODIFICATION_ERR  = ExceptionCode.INVALID_MODIFICATION_ERR        = ((ExceptionMessage[13]="Invalid modification"),13);
32773   var NAMESPACE_ERR             = ExceptionCode.NAMESPACE_ERR                   = ((ExceptionMessage[14]="Invalid namespace"),14);
32774   var INVALID_ACCESS_ERR        = ExceptionCode.INVALID_ACCESS_ERR              = ((ExceptionMessage[15]="Invalid access"),15);
32775
32776
32777   function DOMException(code, message) {
32778         if(message instanceof Error){
32779                 var error = message;
32780         }else{
32781                 error = this;
32782                 Error.call(this, ExceptionMessage[code]);
32783                 this.message = ExceptionMessage[code];
32784                 if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
32785         }
32786         error.code = code;
32787         if(message) this.message = this.message + ": " + message;
32788         return error;
32789   }DOMException.prototype = Error.prototype;
32790   copy$1(ExceptionCode,DOMException);
32791   /**
32792    * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
32793    * 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.
32794    * The items in the NodeList are accessible via an integral index, starting from 0.
32795    */
32796   function NodeList() {
32797   }NodeList.prototype = {
32798         /**
32799          * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
32800          * @standard level1
32801          */
32802         length:0, 
32803         /**
32804          * 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.
32805          * @standard level1
32806          * @param index  unsigned long 
32807          *   Index into the collection.
32808          * @return Node
32809          *      The node at the indexth position in the NodeList, or null if that is not a valid index. 
32810          */
32811         item: function(index) {
32812                 return this[index] || null;
32813         },
32814         toString:function(isHTML,nodeFilter){
32815                 for(var buf = [], i = 0;i<this.length;i++){
32816                         serializeToString(this[i],buf,isHTML,nodeFilter);
32817                 }
32818                 return buf.join('');
32819         }
32820   };
32821   function LiveNodeList(node,refresh){
32822         this._node = node;
32823         this._refresh = refresh;
32824         _updateLiveList(this);
32825   }
32826   function _updateLiveList(list){
32827         var inc = list._node._inc || list._node.ownerDocument._inc;
32828         if(list._inc != inc){
32829                 var ls = list._refresh(list._node);
32830                 //console.log(ls.length)
32831                 __set__(list,'length',ls.length);
32832                 copy$1(ls,list);
32833                 list._inc = inc;
32834         }
32835   }
32836   LiveNodeList.prototype.item = function(i){
32837         _updateLiveList(this);
32838         return this[i];
32839   };
32840
32841   _extends(LiveNodeList,NodeList);
32842   /**
32843    * 
32844    * 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.
32845    * NamedNodeMap objects in the DOM are live.
32846    * used for attributes or DocumentType entities 
32847    */
32848   function NamedNodeMap() {
32849   }
32850   function _findNodeIndex(list,node){
32851         var i = list.length;
32852         while(i--){
32853                 if(list[i] === node){return i}
32854         }
32855   }
32856
32857   function _addNamedNode(el,list,newAttr,oldAttr){
32858         if(oldAttr){
32859                 list[_findNodeIndex(list,oldAttr)] = newAttr;
32860         }else{
32861                 list[list.length++] = newAttr;
32862         }
32863         if(el){
32864                 newAttr.ownerElement = el;
32865                 var doc = el.ownerDocument;
32866                 if(doc){
32867                         oldAttr && _onRemoveAttribute(doc,el,oldAttr);
32868                         _onAddAttribute(doc,el,newAttr);
32869                 }
32870         }
32871   }
32872   function _removeNamedNode(el,list,attr){
32873         //console.log('remove attr:'+attr)
32874         var i = _findNodeIndex(list,attr);
32875         if(i>=0){
32876                 var lastIndex = list.length-1;
32877                 while(i<lastIndex){
32878                         list[i] = list[++i];
32879                 }
32880                 list.length = lastIndex;
32881                 if(el){
32882                         var doc = el.ownerDocument;
32883                         if(doc){
32884                                 _onRemoveAttribute(doc,el,attr);
32885                                 attr.ownerElement = null;
32886                         }
32887                 }
32888         }else{
32889                 throw DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
32890         }
32891   }
32892   NamedNodeMap.prototype = {
32893         length:0,
32894         item:NodeList.prototype.item,
32895         getNamedItem: function(key) {
32896   //            if(key.indexOf(':')>0 || key == 'xmlns'){
32897   //                    return null;
32898   //            }
32899                 //console.log()
32900                 var i = this.length;
32901                 while(i--){
32902                         var attr = this[i];
32903                         //console.log(attr.nodeName,key)
32904                         if(attr.nodeName == key){
32905                                 return attr;
32906                         }
32907                 }
32908         },
32909         setNamedItem: function(attr) {
32910                 var el = attr.ownerElement;
32911                 if(el && el!=this._ownerElement){
32912                         throw new DOMException(INUSE_ATTRIBUTE_ERR);
32913                 }
32914                 var oldAttr = this.getNamedItem(attr.nodeName);
32915                 _addNamedNode(this._ownerElement,this,attr,oldAttr);
32916                 return oldAttr;
32917         },
32918         /* returns Node */
32919         setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
32920                 var el = attr.ownerElement, oldAttr;
32921                 if(el && el!=this._ownerElement){
32922                         throw new DOMException(INUSE_ATTRIBUTE_ERR);
32923                 }
32924                 oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
32925                 _addNamedNode(this._ownerElement,this,attr,oldAttr);
32926                 return oldAttr;
32927         },
32928
32929         /* returns Node */
32930         removeNamedItem: function(key) {
32931                 var attr = this.getNamedItem(key);
32932                 _removeNamedNode(this._ownerElement,this,attr);
32933                 return attr;
32934                 
32935                 
32936         },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
32937         
32938         //for level2
32939         removeNamedItemNS:function(namespaceURI,localName){
32940                 var attr = this.getNamedItemNS(namespaceURI,localName);
32941                 _removeNamedNode(this._ownerElement,this,attr);
32942                 return attr;
32943         },
32944         getNamedItemNS: function(namespaceURI, localName) {
32945                 var i = this.length;
32946                 while(i--){
32947                         var node = this[i];
32948                         if(node.localName == localName && node.namespaceURI == namespaceURI){
32949                                 return node;
32950                         }
32951                 }
32952                 return null;
32953         }
32954   };
32955   /**
32956    * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
32957    */
32958   function DOMImplementation(/* Object */ features) {
32959         this._features = {};
32960         if (features) {
32961                 for (var feature in features) {
32962                          this._features = features[feature];
32963                 }
32964         }
32965   }
32966   DOMImplementation.prototype = {
32967         hasFeature: function(/* string */ feature, /* string */ version) {
32968                 var versions = this._features[feature.toLowerCase()];
32969                 if (versions && (!version || version in versions)) {
32970                         return true;
32971                 } else {
32972                         return false;
32973                 }
32974         },
32975         // Introduced in DOM Level 2:
32976         createDocument:function(namespaceURI,  qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
32977                 var doc = new Document();
32978                 doc.implementation = this;
32979                 doc.childNodes = new NodeList();
32980                 doc.doctype = doctype;
32981                 if(doctype){
32982                         doc.appendChild(doctype);
32983                 }
32984                 if(qualifiedName){
32985                         var root = doc.createElementNS(namespaceURI,qualifiedName);
32986                         doc.appendChild(root);
32987                 }
32988                 return doc;
32989         },
32990         // Introduced in DOM Level 2:
32991         createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
32992                 var node = new DocumentType();
32993                 node.name = qualifiedName;
32994                 node.nodeName = qualifiedName;
32995                 node.publicId = publicId;
32996                 node.systemId = systemId;
32997                 // Introduced in DOM Level 2:
32998                 //readonly attribute DOMString        internalSubset;
32999                 
33000                 //TODO:..
33001                 //  readonly attribute NamedNodeMap     entities;
33002                 //  readonly attribute NamedNodeMap     notations;
33003                 return node;
33004         }
33005   };
33006
33007
33008   /**
33009    * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
33010    */
33011
33012   function Node$2() {
33013   }
33014   Node$2.prototype = {
33015         firstChild : null,
33016         lastChild : null,
33017         previousSibling : null,
33018         nextSibling : null,
33019         attributes : null,
33020         parentNode : null,
33021         childNodes : null,
33022         ownerDocument : null,
33023         nodeValue : null,
33024         namespaceURI : null,
33025         prefix : null,
33026         localName : null,
33027         // Modified in DOM Level 2:
33028         insertBefore:function(newChild, refChild){//raises 
33029                 return _insertBefore(this,newChild,refChild);
33030         },
33031         replaceChild:function(newChild, oldChild){//raises 
33032                 this.insertBefore(newChild,oldChild);
33033                 if(oldChild){
33034                         this.removeChild(oldChild);
33035                 }
33036         },
33037         removeChild:function(oldChild){
33038                 return _removeChild(this,oldChild);
33039         },
33040         appendChild:function(newChild){
33041                 return this.insertBefore(newChild,null);
33042         },
33043         hasChildNodes:function(){
33044                 return this.firstChild != null;
33045         },
33046         cloneNode:function(deep){
33047                 return cloneNode(this.ownerDocument||this,this,deep);
33048         },
33049         // Modified in DOM Level 2:
33050         normalize:function(){
33051                 var child = this.firstChild;
33052                 while(child){
33053                         var next = child.nextSibling;
33054                         if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
33055                                 this.removeChild(next);
33056                                 child.appendData(next.data);
33057                         }else{
33058                                 child.normalize();
33059                                 child = next;
33060                         }
33061                 }
33062         },
33063         // Introduced in DOM Level 2:
33064         isSupported:function(feature, version){
33065                 return this.ownerDocument.implementation.hasFeature(feature,version);
33066         },
33067       // Introduced in DOM Level 2:
33068       hasAttributes:function(){
33069         return this.attributes.length>0;
33070       },
33071       lookupPrefix:function(namespaceURI){
33072         var el = this;
33073         while(el){
33074                 var map = el._nsMap;
33075                 //console.dir(map)
33076                 if(map){
33077                         for(var n in map){
33078                                 if(map[n] == namespaceURI){
33079                                         return n;
33080                                 }
33081                         }
33082                 }
33083                 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
33084         }
33085         return null;
33086       },
33087       // Introduced in DOM Level 3:
33088       lookupNamespaceURI:function(prefix){
33089         var el = this;
33090         while(el){
33091                 var map = el._nsMap;
33092                 //console.dir(map)
33093                 if(map){
33094                         if(prefix in map){
33095                                 return map[prefix] ;
33096                         }
33097                 }
33098                 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
33099         }
33100         return null;
33101       },
33102       // Introduced in DOM Level 3:
33103       isDefaultNamespace:function(namespaceURI){
33104         var prefix = this.lookupPrefix(namespaceURI);
33105         return prefix == null;
33106       }
33107   };
33108
33109
33110   function _xmlEncoder(c){
33111         return c == '<' && '&lt;' ||
33112            c == '>' && '&gt;' ||
33113            c == '&' && '&amp;' ||
33114            c == '"' && '&quot;' ||
33115            '&#'+c.charCodeAt()+';'
33116   }
33117
33118
33119   copy$1(NodeType,Node$2);
33120   copy$1(NodeType,Node$2.prototype);
33121
33122   /**
33123    * @param callback return true for continue,false for break
33124    * @return boolean true: break visit;
33125    */
33126   function _visitNode(node,callback){
33127         if(callback(node)){
33128                 return true;
33129         }
33130         if(node = node.firstChild){
33131                 do{
33132                         if(_visitNode(node,callback)){return true}
33133           }while(node=node.nextSibling)
33134       }
33135   }
33136
33137
33138
33139   function Document(){
33140   }
33141   function _onAddAttribute(doc,el,newAttr){
33142         doc && doc._inc++;
33143         var ns = newAttr.namespaceURI ;
33144         if(ns == 'http://www.w3.org/2000/xmlns/'){
33145                 //update namespace
33146                 el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value;
33147         }
33148   }
33149   function _onRemoveAttribute(doc,el,newAttr,remove){
33150         doc && doc._inc++;
33151         var ns = newAttr.namespaceURI ;
33152         if(ns == 'http://www.w3.org/2000/xmlns/'){
33153                 //update namespace
33154                 delete el._nsMap[newAttr.prefix?newAttr.localName:''];
33155         }
33156   }
33157   function _onUpdateChild(doc,el,newChild){
33158         if(doc && doc._inc){
33159                 doc._inc++;
33160                 //update childNodes
33161                 var cs = el.childNodes;
33162                 if(newChild){
33163                         cs[cs.length++] = newChild;
33164                 }else{
33165                         //console.log(1)
33166                         var child = el.firstChild;
33167                         var i = 0;
33168                         while(child){
33169                                 cs[i++] = child;
33170                                 child =child.nextSibling;
33171                         }
33172                         cs.length = i;
33173                 }
33174         }
33175   }
33176
33177   /**
33178    * attributes;
33179    * children;
33180    * 
33181    * writeable properties:
33182    * nodeValue,Attr:value,CharacterData:data
33183    * prefix
33184    */
33185   function _removeChild(parentNode,child){
33186         var previous = child.previousSibling;
33187         var next = child.nextSibling;
33188         if(previous){
33189                 previous.nextSibling = next;
33190         }else{
33191                 parentNode.firstChild = next;
33192         }
33193         if(next){
33194                 next.previousSibling = previous;
33195         }else{
33196                 parentNode.lastChild = previous;
33197         }
33198         _onUpdateChild(parentNode.ownerDocument,parentNode);
33199         return child;
33200   }
33201   /**
33202    * preformance key(refChild == null)
33203    */
33204   function _insertBefore(parentNode,newChild,nextChild){
33205         var cp = newChild.parentNode;
33206         if(cp){
33207                 cp.removeChild(newChild);//remove and update
33208         }
33209         if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
33210                 var newFirst = newChild.firstChild;
33211                 if (newFirst == null) {
33212                         return newChild;
33213                 }
33214                 var newLast = newChild.lastChild;
33215         }else{
33216                 newFirst = newLast = newChild;
33217         }
33218         var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
33219
33220         newFirst.previousSibling = pre;
33221         newLast.nextSibling = nextChild;
33222         
33223         
33224         if(pre){
33225                 pre.nextSibling = newFirst;
33226         }else{
33227                 parentNode.firstChild = newFirst;
33228         }
33229         if(nextChild == null){
33230                 parentNode.lastChild = newLast;
33231         }else{
33232                 nextChild.previousSibling = newLast;
33233         }
33234         do{
33235                 newFirst.parentNode = parentNode;
33236         }while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
33237         _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
33238         //console.log(parentNode.lastChild.nextSibling == null)
33239         if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
33240                 newChild.firstChild = newChild.lastChild = null;
33241         }
33242         return newChild;
33243   }
33244   function _appendSingleChild(parentNode,newChild){
33245         var cp = newChild.parentNode;
33246         if(cp){
33247                 var pre = parentNode.lastChild;
33248                 cp.removeChild(newChild);//remove and update
33249                 var pre = parentNode.lastChild;
33250         }
33251         var pre = parentNode.lastChild;
33252         newChild.parentNode = parentNode;
33253         newChild.previousSibling = pre;
33254         newChild.nextSibling = null;
33255         if(pre){
33256                 pre.nextSibling = newChild;
33257         }else{
33258                 parentNode.firstChild = newChild;
33259         }
33260         parentNode.lastChild = newChild;
33261         _onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
33262         return newChild;
33263         //console.log("__aa",parentNode.lastChild.nextSibling == null)
33264   }
33265   Document.prototype = {
33266         //implementation : null,
33267         nodeName :  '#document',
33268         nodeType :  DOCUMENT_NODE,
33269         doctype :  null,
33270         documentElement :  null,
33271         _inc : 1,
33272         
33273         insertBefore :  function(newChild, refChild){//raises 
33274                 if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
33275                         var child = newChild.firstChild;
33276                         while(child){
33277                                 var next = child.nextSibling;
33278                                 this.insertBefore(child,refChild);
33279                                 child = next;
33280                         }
33281                         return newChild;
33282                 }
33283                 if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
33284                         this.documentElement = newChild;
33285                 }
33286                 
33287                 return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
33288         },
33289         removeChild :  function(oldChild){
33290                 if(this.documentElement == oldChild){
33291                         this.documentElement = null;
33292                 }
33293                 return _removeChild(this,oldChild);
33294         },
33295         // Introduced in DOM Level 2:
33296         importNode : function(importedNode,deep){
33297                 return importNode(this,importedNode,deep);
33298         },
33299         // Introduced in DOM Level 2:
33300         getElementById :        function(id){
33301                 var rtv = null;
33302                 _visitNode(this.documentElement,function(node){
33303                         if(node.nodeType == ELEMENT_NODE){
33304                                 if(node.getAttribute('id') == id){
33305                                         rtv = node;
33306                                         return true;
33307                                 }
33308                         }
33309                 });
33310                 return rtv;
33311         },
33312         
33313         //document factory method:
33314         createElement : function(tagName){
33315                 var node = new Element();
33316                 node.ownerDocument = this;
33317                 node.nodeName = tagName;
33318                 node.tagName = tagName;
33319                 node.childNodes = new NodeList();
33320                 var attrs       = node.attributes = new NamedNodeMap();
33321                 attrs._ownerElement = node;
33322                 return node;
33323         },
33324         createDocumentFragment :        function(){
33325                 var node = new DocumentFragment();
33326                 node.ownerDocument = this;
33327                 node.childNodes = new NodeList();
33328                 return node;
33329         },
33330         createTextNode :        function(data){
33331                 var node = new Text();
33332                 node.ownerDocument = this;
33333                 node.appendData(data);
33334                 return node;
33335         },
33336         createComment : function(data){
33337                 var node = new Comment();
33338                 node.ownerDocument = this;
33339                 node.appendData(data);
33340                 return node;
33341         },
33342         createCDATASection :    function(data){
33343                 var node = new CDATASection();
33344                 node.ownerDocument = this;
33345                 node.appendData(data);
33346                 return node;
33347         },
33348         createProcessingInstruction :   function(target,data){
33349                 var node = new ProcessingInstruction();
33350                 node.ownerDocument = this;
33351                 node.tagName = node.target = target;
33352                 node.nodeValue= node.data = data;
33353                 return node;
33354         },
33355         createAttribute :       function(name){
33356                 var node = new Attr();
33357                 node.ownerDocument      = this;
33358                 node.name = name;
33359                 node.nodeName   = name;
33360                 node.localName = name;
33361                 node.specified = true;
33362                 return node;
33363         },
33364         createEntityReference : function(name){
33365                 var node = new EntityReference();
33366                 node.ownerDocument      = this;
33367                 node.nodeName   = name;
33368                 return node;
33369         },
33370         // Introduced in DOM Level 2:
33371         createElementNS :       function(namespaceURI,qualifiedName){
33372                 var node = new Element();
33373                 var pl = qualifiedName.split(':');
33374                 var attrs       = node.attributes = new NamedNodeMap();
33375                 node.childNodes = new NodeList();
33376                 node.ownerDocument = this;
33377                 node.nodeName = qualifiedName;
33378                 node.tagName = qualifiedName;
33379                 node.namespaceURI = namespaceURI;
33380                 if(pl.length == 2){
33381                         node.prefix = pl[0];
33382                         node.localName = pl[1];
33383                 }else{
33384                         //el.prefix = null;
33385                         node.localName = qualifiedName;
33386                 }
33387                 attrs._ownerElement = node;
33388                 return node;
33389         },
33390         // Introduced in DOM Level 2:
33391         createAttributeNS :     function(namespaceURI,qualifiedName){
33392                 var node = new Attr();
33393                 var pl = qualifiedName.split(':');
33394                 node.ownerDocument = this;
33395                 node.nodeName = qualifiedName;
33396                 node.name = qualifiedName;
33397                 node.namespaceURI = namespaceURI;
33398                 node.specified = true;
33399                 if(pl.length == 2){
33400                         node.prefix = pl[0];
33401                         node.localName = pl[1];
33402                 }else{
33403                         //el.prefix = null;
33404                         node.localName = qualifiedName;
33405                 }
33406                 return node;
33407         }
33408   };
33409   _extends(Document,Node$2);
33410
33411
33412   function Element() {
33413         this._nsMap = {};
33414   }Element.prototype = {
33415         nodeType : ELEMENT_NODE,
33416         hasAttribute : function(name){
33417                 return this.getAttributeNode(name)!=null;
33418         },
33419         getAttribute : function(name){
33420                 var attr = this.getAttributeNode(name);
33421                 return attr && attr.value || '';
33422         },
33423         getAttributeNode : function(name){
33424                 return this.attributes.getNamedItem(name);
33425         },
33426         setAttribute : function(name, value){
33427                 var attr = this.ownerDocument.createAttribute(name);
33428                 attr.value = attr.nodeValue = "" + value;
33429                 this.setAttributeNode(attr);
33430         },
33431         removeAttribute : function(name){
33432                 var attr = this.getAttributeNode(name);
33433                 attr && this.removeAttributeNode(attr);
33434         },
33435         
33436         //four real opeartion method
33437         appendChild:function(newChild){
33438                 if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
33439                         return this.insertBefore(newChild,null);
33440                 }else{
33441                         return _appendSingleChild(this,newChild);
33442                 }
33443         },
33444         setAttributeNode : function(newAttr){
33445                 return this.attributes.setNamedItem(newAttr);
33446         },
33447         setAttributeNodeNS : function(newAttr){
33448                 return this.attributes.setNamedItemNS(newAttr);
33449         },
33450         removeAttributeNode : function(oldAttr){
33451                 //console.log(this == oldAttr.ownerElement)
33452                 return this.attributes.removeNamedItem(oldAttr.nodeName);
33453         },
33454         //get real attribute name,and remove it by removeAttributeNode
33455         removeAttributeNS : function(namespaceURI, localName){
33456                 var old = this.getAttributeNodeNS(namespaceURI, localName);
33457                 old && this.removeAttributeNode(old);
33458         },
33459         
33460         hasAttributeNS : function(namespaceURI, localName){
33461                 return this.getAttributeNodeNS(namespaceURI, localName)!=null;
33462         },
33463         getAttributeNS : function(namespaceURI, localName){
33464                 var attr = this.getAttributeNodeNS(namespaceURI, localName);
33465                 return attr && attr.value || '';
33466         },
33467         setAttributeNS : function(namespaceURI, qualifiedName, value){
33468                 var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
33469                 attr.value = attr.nodeValue = "" + value;
33470                 this.setAttributeNode(attr);
33471         },
33472         getAttributeNodeNS : function(namespaceURI, localName){
33473                 return this.attributes.getNamedItemNS(namespaceURI, localName);
33474         },
33475         
33476         getElementsByTagName : function(tagName){
33477                 return new LiveNodeList(this,function(base){
33478                         var ls = [];
33479                         _visitNode(base,function(node){
33480                                 if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
33481                                         ls.push(node);
33482                                 }
33483                         });
33484                         return ls;
33485                 });
33486         },
33487         getElementsByTagNameNS : function(namespaceURI, localName){
33488                 return new LiveNodeList(this,function(base){
33489                         var ls = [];
33490                         _visitNode(base,function(node){
33491                                 if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
33492                                         ls.push(node);
33493                                 }
33494                         });
33495                         return ls;
33496                         
33497                 });
33498         }
33499   };
33500   Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
33501   Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
33502
33503
33504   _extends(Element,Node$2);
33505   function Attr() {
33506   }Attr.prototype.nodeType = ATTRIBUTE_NODE;
33507   _extends(Attr,Node$2);
33508
33509
33510   function CharacterData() {
33511   }CharacterData.prototype = {
33512         data : '',
33513         substringData : function(offset, count) {
33514                 return this.data.substring(offset, offset+count);
33515         },
33516         appendData: function(text) {
33517                 text = this.data+text;
33518                 this.nodeValue = this.data = text;
33519                 this.length = text.length;
33520         },
33521         insertData: function(offset,text) {
33522                 this.replaceData(offset,0,text);
33523         
33524         },
33525         appendChild:function(newChild){
33526                 throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
33527         },
33528         deleteData: function(offset, count) {
33529                 this.replaceData(offset,count,"");
33530         },
33531         replaceData: function(offset, count, text) {
33532                 var start = this.data.substring(0,offset);
33533                 var end = this.data.substring(offset+count);
33534                 text = start + text + end;
33535                 this.nodeValue = this.data = text;
33536                 this.length = text.length;
33537         }
33538   };
33539   _extends(CharacterData,Node$2);
33540   function Text() {
33541   }Text.prototype = {
33542         nodeName : "#text",
33543         nodeType : TEXT_NODE,
33544         splitText : function(offset) {
33545                 var text = this.data;
33546                 var newText = text.substring(offset);
33547                 text = text.substring(0, offset);
33548                 this.data = this.nodeValue = text;
33549                 this.length = text.length;
33550                 var newNode = this.ownerDocument.createTextNode(newText);
33551                 if(this.parentNode){
33552                         this.parentNode.insertBefore(newNode, this.nextSibling);
33553                 }
33554                 return newNode;
33555         }
33556   };
33557   _extends(Text,CharacterData);
33558   function Comment() {
33559   }Comment.prototype = {
33560         nodeName : "#comment",
33561         nodeType : COMMENT_NODE
33562   };
33563   _extends(Comment,CharacterData);
33564
33565   function CDATASection() {
33566   }CDATASection.prototype = {
33567         nodeName : "#cdata-section",
33568         nodeType : CDATA_SECTION_NODE
33569   };
33570   _extends(CDATASection,CharacterData);
33571
33572
33573   function DocumentType() {
33574   }DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
33575   _extends(DocumentType,Node$2);
33576
33577   function Notation() {
33578   }Notation.prototype.nodeType = NOTATION_NODE;
33579   _extends(Notation,Node$2);
33580
33581   function Entity() {
33582   }Entity.prototype.nodeType = ENTITY_NODE;
33583   _extends(Entity,Node$2);
33584
33585   function EntityReference() {
33586   }EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
33587   _extends(EntityReference,Node$2);
33588
33589   function DocumentFragment() {
33590   }DocumentFragment.prototype.nodeName =        "#document-fragment";
33591   DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE;
33592   _extends(DocumentFragment,Node$2);
33593
33594
33595   function ProcessingInstruction() {
33596   }
33597   ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
33598   _extends(ProcessingInstruction,Node$2);
33599   function XMLSerializer$1(){}
33600   XMLSerializer$1.prototype.serializeToString = function(node,isHtml,nodeFilter){
33601         return nodeSerializeToString.call(node,isHtml,nodeFilter);
33602   };
33603   Node$2.prototype.toString = nodeSerializeToString;
33604   function nodeSerializeToString(isHtml,nodeFilter){
33605         var buf = [];
33606         var refNode = this.nodeType == 9?this.documentElement:this;
33607         var prefix = refNode.prefix;
33608         var uri = refNode.namespaceURI;
33609         
33610         if(uri && prefix == null){
33611                 //console.log(prefix)
33612                 var prefix = refNode.lookupPrefix(uri);
33613                 if(prefix == null){
33614                         //isHTML = true;
33615                         var visibleNamespaces=[
33616                         {namespace:uri,prefix:null}
33617                         //{namespace:uri,prefix:''}
33618                         ];
33619                 }
33620         }
33621         serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
33622         //console.log('###',this.nodeType,uri,prefix,buf.join(''))
33623         return buf.join('');
33624   }
33625   function needNamespaceDefine(node,isHTML, visibleNamespaces) {
33626         var prefix = node.prefix||'';
33627         var uri = node.namespaceURI;
33628         if (!prefix && !uri){
33629                 return false;
33630         }
33631         if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" 
33632                 || uri == 'http://www.w3.org/2000/xmlns/'){
33633                 return false;
33634         }
33635         
33636         var i = visibleNamespaces.length; 
33637         //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
33638         while (i--) {
33639                 var ns = visibleNamespaces[i];
33640                 // get namespace prefix
33641                 //console.log(node.nodeType,node.tagName,ns.prefix,prefix)
33642                 if (ns.prefix == prefix){
33643                         return ns.namespace != uri;
33644                 }
33645         }
33646         //console.log(isHTML,uri,prefix=='')
33647         //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
33648         //      return false;
33649         //}
33650         //node.flag = '11111'
33651         //console.error(3,true,node.flag,node.prefix,node.namespaceURI)
33652         return true;
33653   }
33654   function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
33655         if(nodeFilter){
33656                 node = nodeFilter(node);
33657                 if(node){
33658                         if(typeof node == 'string'){
33659                                 buf.push(node);
33660                                 return;
33661                         }
33662                 }else{
33663                         return;
33664                 }
33665                 //buf.sort.apply(attrs, attributeSorter);
33666         }
33667         switch(node.nodeType){
33668         case ELEMENT_NODE:
33669                 if (!visibleNamespaces) visibleNamespaces = [];
33670                 var startVisibleNamespaces = visibleNamespaces.length;
33671                 var attrs = node.attributes;
33672                 var len = attrs.length;
33673                 var child = node.firstChild;
33674                 var nodeName = node.tagName;
33675                 
33676                 isHTML =  (htmlns === node.namespaceURI) ||isHTML; 
33677                 buf.push('<',nodeName);
33678                 
33679                 
33680                 
33681                 for(var i=0;i<len;i++){
33682                         // add namespaces for attributes
33683                         var attr = attrs.item(i);
33684                         if (attr.prefix == 'xmlns') {
33685                                 visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
33686                         }else if(attr.nodeName == 'xmlns'){
33687                                 visibleNamespaces.push({ prefix: '', namespace: attr.value });
33688                         }
33689                 }
33690                 for(var i=0;i<len;i++){
33691                         var attr = attrs.item(i);
33692                         if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
33693                                 var prefix = attr.prefix||'';
33694                                 var uri = attr.namespaceURI;
33695                                 var ns = prefix ? ' xmlns:' + prefix : " xmlns";
33696                                 buf.push(ns, '="' , uri , '"');
33697                                 visibleNamespaces.push({ prefix: prefix, namespace:uri });
33698                         }
33699                         serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
33700                 }
33701                 // add namespace for current node               
33702                 if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
33703                         var prefix = node.prefix||'';
33704                         var uri = node.namespaceURI;
33705                         var ns = prefix ? ' xmlns:' + prefix : " xmlns";
33706                         buf.push(ns, '="' , uri , '"');
33707                         visibleNamespaces.push({ prefix: prefix, namespace:uri });
33708                 }
33709                 
33710                 if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
33711                         buf.push('>');
33712                         //if is cdata child node
33713                         if(isHTML && /^script$/i.test(nodeName)){
33714                                 while(child){
33715                                         if(child.data){
33716                                                 buf.push(child.data);
33717                                         }else{
33718                                                 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
33719                                         }
33720                                         child = child.nextSibling;
33721                                 }
33722                         }else
33723                         {
33724                                 while(child){
33725                                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
33726                                         child = child.nextSibling;
33727                                 }
33728                         }
33729                         buf.push('</',nodeName,'>');
33730                 }else{
33731                         buf.push('/>');
33732                 }
33733                 // remove added visible namespaces
33734                 //visibleNamespaces.length = startVisibleNamespaces;
33735                 return;
33736         case DOCUMENT_NODE:
33737         case DOCUMENT_FRAGMENT_NODE:
33738                 var child = node.firstChild;
33739                 while(child){
33740                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
33741                         child = child.nextSibling;
33742                 }
33743                 return;
33744         case ATTRIBUTE_NODE:
33745                 return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
33746         case TEXT_NODE:
33747                 return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
33748         case CDATA_SECTION_NODE:
33749                 return buf.push( '<![CDATA[',node.data,']]>');
33750         case COMMENT_NODE:
33751                 return buf.push( "<!--",node.data,"-->");
33752         case DOCUMENT_TYPE_NODE:
33753                 var pubid = node.publicId;
33754                 var sysid = node.systemId;
33755                 buf.push('<!DOCTYPE ',node.name);
33756                 if(pubid){
33757                         buf.push(' PUBLIC "',pubid);
33758                         if (sysid && sysid!='.') {
33759                                 buf.push( '" "',sysid);
33760                         }
33761                         buf.push('">');
33762                 }else if(sysid && sysid!='.'){
33763                         buf.push(' SYSTEM "',sysid,'">');
33764                 }else{
33765                         var sub = node.internalSubset;
33766                         if(sub){
33767                                 buf.push(" [",sub,"]");
33768                         }
33769                         buf.push(">");
33770                 }
33771                 return;
33772         case PROCESSING_INSTRUCTION_NODE:
33773                 return buf.push( "<?",node.target," ",node.data,"?>");
33774         case ENTITY_REFERENCE_NODE:
33775                 return buf.push( '&',node.nodeName,';');
33776         //case ENTITY_NODE:
33777         //case NOTATION_NODE:
33778         default:
33779                 buf.push('??',node.nodeName);
33780         }
33781   }
33782   function importNode(doc,node,deep){
33783         var node2;
33784         switch (node.nodeType) {
33785         case ELEMENT_NODE:
33786                 node2 = node.cloneNode(false);
33787                 node2.ownerDocument = doc;
33788                 //var attrs = node2.attributes;
33789                 //var len = attrs.length;
33790                 //for(var i=0;i<len;i++){
33791                         //node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
33792                 //}
33793         case DOCUMENT_FRAGMENT_NODE:
33794                 break;
33795         case ATTRIBUTE_NODE:
33796                 deep = true;
33797                 break;
33798         //case ENTITY_REFERENCE_NODE:
33799         //case PROCESSING_INSTRUCTION_NODE:
33800         ////case TEXT_NODE:
33801         //case CDATA_SECTION_NODE:
33802         //case COMMENT_NODE:
33803         //      deep = false;
33804         //      break;
33805         //case DOCUMENT_NODE:
33806         //case DOCUMENT_TYPE_NODE:
33807         //cannot be imported.
33808         //case ENTITY_NODE:
33809         //case NOTATION_NODE:
33810         //can not hit in level3
33811         //default:throw e;
33812         }
33813         if(!node2){
33814                 node2 = node.cloneNode(false);//false
33815         }
33816         node2.ownerDocument = doc;
33817         node2.parentNode = null;
33818         if(deep){
33819                 var child = node.firstChild;
33820                 while(child){
33821                         node2.appendChild(importNode(doc,child,deep));
33822                         child = child.nextSibling;
33823                 }
33824         }
33825         return node2;
33826   }
33827   //
33828   //var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
33829   //                                    attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
33830   function cloneNode(doc,node,deep){
33831         var node2 = new node.constructor();
33832         for(var n in node){
33833                 var v = node[n];
33834                 if(typeof v != 'object' ){
33835                         if(v != node2[n]){
33836                                 node2[n] = v;
33837                         }
33838                 }
33839         }
33840         if(node.childNodes){
33841                 node2.childNodes = new NodeList();
33842         }
33843         node2.ownerDocument = doc;
33844         switch (node2.nodeType) {
33845         case ELEMENT_NODE:
33846                 var attrs       = node.attributes;
33847                 var attrs2      = node2.attributes = new NamedNodeMap();
33848                 var len = attrs.length;
33849                 attrs2._ownerElement = node2;
33850                 for(var i=0;i<len;i++){
33851                         node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
33852                 }
33853                 break;
33854         case ATTRIBUTE_NODE:
33855                 deep = true;
33856         }
33857         if(deep){
33858                 var child = node.firstChild;
33859                 while(child){
33860                         node2.appendChild(cloneNode(doc,child,deep));
33861                         child = child.nextSibling;
33862                 }
33863         }
33864         return node2;
33865   }
33866
33867   function __set__(object,key,value){
33868         object[key] = value;
33869   }
33870   //do dynamic
33871   try{
33872         if(Object.defineProperty){
33873                 Object.defineProperty(LiveNodeList.prototype,'length',{
33874                         get:function(){
33875                                 _updateLiveList(this);
33876                                 return this.$$length;
33877                         }
33878                 });
33879                 Object.defineProperty(Node$2.prototype,'textContent',{
33880                         get:function(){
33881                                 return getTextContent(this);
33882                         },
33883                         set:function(data){
33884                                 switch(this.nodeType){
33885                                 case ELEMENT_NODE:
33886                                 case DOCUMENT_FRAGMENT_NODE:
33887                                         while(this.firstChild){
33888                                                 this.removeChild(this.firstChild);
33889                                         }
33890                                         if(data || String(data)){
33891                                                 this.appendChild(this.ownerDocument.createTextNode(data));
33892                                         }
33893                                         break;
33894                                 default:
33895                                         //TODO:
33896                                         this.data = data;
33897                                         this.value = data;
33898                                         this.nodeValue = data;
33899                                 }
33900                         }
33901                 });
33902                 
33903                 function getTextContent(node){
33904                         switch(node.nodeType){
33905                         case ELEMENT_NODE:
33906                         case DOCUMENT_FRAGMENT_NODE:
33907                                 var buf = [];
33908                                 node = node.firstChild;
33909                                 while(node){
33910                                         if(node.nodeType!==7 && node.nodeType !==8){
33911                                                 buf.push(getTextContent(node));
33912                                         }
33913                                         node = node.nextSibling;
33914                                 }
33915                                 return buf.join('');
33916                         default:
33917                                 return node.nodeValue;
33918                         }
33919                 }
33920                 __set__ = function(object,key,value){
33921                         //console.log(value)
33922                         object['$$'+key] = value;
33923                 };
33924         }
33925   }catch(e){//ie8
33926   }
33927
33928   //if(typeof require == 'function'){
33929         var DOMImplementation_1 = DOMImplementation;
33930         var XMLSerializer_1 = XMLSerializer$1;
33931   //}
33932
33933   var dom = {
33934         DOMImplementation: DOMImplementation_1,
33935         XMLSerializer: XMLSerializer_1
33936   };
33937
33938   var domParser = createCommonjsModule(function (module, exports) {
33939   function DOMParser(options){
33940         this.options = options ||{locator:{}};
33941         
33942   }
33943   DOMParser.prototype.parseFromString = function(source,mimeType){
33944         var options = this.options;
33945         var sax$$1 =  new XMLReader();
33946         var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
33947         var errorHandler = options.errorHandler;
33948         var locator = options.locator;
33949         var defaultNSMap = options.xmlns||{};
33950         var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"};
33951         if(locator){
33952                 domBuilder.setDocumentLocator(locator);
33953         }
33954         
33955         sax$$1.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
33956         sax$$1.domBuilder = options.domBuilder || domBuilder;
33957         if(/\/x?html?$/.test(mimeType)){
33958                 entityMap.nbsp = '\xa0';
33959                 entityMap.copy = '\xa9';
33960                 defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
33961         }
33962         defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
33963         if(source){
33964                 sax$$1.parse(source,defaultNSMap,entityMap);
33965         }else{
33966                 sax$$1.errorHandler.error("invalid doc source");
33967         }
33968         return domBuilder.doc;
33969   };
33970   function buildErrorHandler(errorImpl,domBuilder,locator){
33971         if(!errorImpl){
33972                 if(domBuilder instanceof DOMHandler){
33973                         return domBuilder;
33974                 }
33975                 errorImpl = domBuilder ;
33976         }
33977         var errorHandler = {};
33978         var isCallback = errorImpl instanceof Function;
33979         locator = locator||{};
33980         function build(key){
33981                 var fn = errorImpl[key];
33982                 if(!fn && isCallback){
33983                         fn = errorImpl.length == 2?function(msg){errorImpl(key,msg);}:errorImpl;
33984                 }
33985                 errorHandler[key] = fn && function(msg){
33986                         fn('[xmldom '+key+']\t'+msg+_locator(locator));
33987                 }||function(){};
33988         }
33989         build('warning');
33990         build('error');
33991         build('fatalError');
33992         return errorHandler;
33993   }
33994
33995   //console.log('#\n\n\n\n\n\n\n####')
33996   /**
33997    * +ContentHandler+ErrorHandler
33998    * +LexicalHandler+EntityResolver2
33999    * -DeclHandler-DTDHandler 
34000    * 
34001    * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
34002    * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
34003    * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
34004    */
34005   function DOMHandler() {
34006       this.cdata = false;
34007   }
34008   function position(locator,node){
34009         node.lineNumber = locator.lineNumber;
34010         node.columnNumber = locator.columnNumber;
34011   }
34012   /**
34013    * @see org.xml.sax.ContentHandler#startDocument
34014    * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
34015    */ 
34016   DOMHandler.prototype = {
34017         startDocument : function() {
34018         this.doc = new DOMImplementation().createDocument(null, null, null);
34019         if (this.locator) {
34020                 this.doc.documentURI = this.locator.systemId;
34021         }
34022         },
34023         startElement:function(namespaceURI, localName, qName, attrs) {
34024                 var doc = this.doc;
34025             var el = doc.createElementNS(namespaceURI, qName||localName);
34026             var len = attrs.length;
34027             appendElement(this, el);
34028             this.currentElement = el;
34029             
34030                 this.locator && position(this.locator,el);
34031             for (var i = 0 ; i < len; i++) {
34032                 var namespaceURI = attrs.getURI(i);
34033                 var value = attrs.getValue(i);
34034                 var qName = attrs.getQName(i);
34035                         var attr = doc.createAttributeNS(namespaceURI, qName);
34036                         this.locator &&position(attrs.getLocator(i),attr);
34037                         attr.value = attr.nodeValue = value;
34038                         el.setAttributeNode(attr);
34039             }
34040         },
34041         endElement:function(namespaceURI, localName, qName) {
34042                 var current = this.currentElement;
34043                 var tagName = current.tagName;
34044                 this.currentElement = current.parentNode;
34045         },
34046         startPrefixMapping:function(prefix, uri) {
34047         },
34048         endPrefixMapping:function(prefix) {
34049         },
34050         processingInstruction:function(target, data) {
34051             var ins = this.doc.createProcessingInstruction(target, data);
34052             this.locator && position(this.locator,ins);
34053             appendElement(this, ins);
34054         },
34055         ignorableWhitespace:function(ch, start, length) {
34056         },
34057         characters:function(chars, start, length) {
34058                 chars = _toString.apply(this,arguments);
34059                 //console.log(chars)
34060                 if(chars){
34061                         if (this.cdata) {
34062                                 var charNode = this.doc.createCDATASection(chars);
34063                         } else {
34064                                 var charNode = this.doc.createTextNode(chars);
34065                         }
34066                         if(this.currentElement){
34067                                 this.currentElement.appendChild(charNode);
34068                         }else if(/^\s*$/.test(chars)){
34069                                 this.doc.appendChild(charNode);
34070                                 //process xml
34071                         }
34072                         this.locator && position(this.locator,charNode);
34073                 }
34074         },
34075         skippedEntity:function(name) {
34076         },
34077         endDocument:function() {
34078                 this.doc.normalize();
34079         },
34080         setDocumentLocator:function (locator) {
34081             if(this.locator = locator){// && !('lineNumber' in locator)){
34082                 locator.lineNumber = 0;
34083             }
34084         },
34085         //LexicalHandler
34086         comment:function(chars, start, length) {
34087                 chars = _toString.apply(this,arguments);
34088             var comm = this.doc.createComment(chars);
34089             this.locator && position(this.locator,comm);
34090             appendElement(this, comm);
34091         },
34092         
34093         startCDATA:function() {
34094             //used in characters() methods
34095             this.cdata = true;
34096         },
34097         endCDATA:function() {
34098             this.cdata = false;
34099         },
34100         
34101         startDTD:function(name, publicId, systemId) {
34102                 var impl = this.doc.implementation;
34103             if (impl && impl.createDocumentType) {
34104                 var dt = impl.createDocumentType(name, publicId, systemId);
34105                 this.locator && position(this.locator,dt);
34106                 appendElement(this, dt);
34107             }
34108         },
34109         /**
34110          * @see org.xml.sax.ErrorHandler
34111          * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
34112          */
34113         warning:function(error) {
34114                 console.warn('[xmldom warning]\t'+error,_locator(this.locator));
34115         },
34116         error:function(error) {
34117                 console.error('[xmldom error]\t'+error,_locator(this.locator));
34118         },
34119         fatalError:function(error) {
34120                 console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
34121             throw error;
34122         }
34123   };
34124   function _locator(l){
34125         if(l){
34126                 return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
34127         }
34128   }
34129   function _toString(chars,start,length){
34130         if(typeof chars == 'string'){
34131                 return chars.substr(start,length)
34132         }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
34133                 if(chars.length >= start+length || start){
34134                         return new java.lang.String(chars,start,length)+'';
34135                 }
34136                 return chars;
34137         }
34138   }
34139
34140   /*
34141    * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
34142    * used method of org.xml.sax.ext.LexicalHandler:
34143    *  #comment(chars, start, length)
34144    *  #startCDATA()
34145    *  #endCDATA()
34146    *  #startDTD(name, publicId, systemId)
34147    *
34148    *
34149    * IGNORED method of org.xml.sax.ext.LexicalHandler:
34150    *  #endDTD()
34151    *  #startEntity(name)
34152    *  #endEntity(name)
34153    *
34154    *
34155    * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
34156    * IGNORED method of org.xml.sax.ext.DeclHandler
34157    *    #attributeDecl(eName, aName, type, mode, value)
34158    *  #elementDecl(name, model)
34159    *  #externalEntityDecl(name, publicId, systemId)
34160    *  #internalEntityDecl(name, value)
34161    * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
34162    * IGNORED method of org.xml.sax.EntityResolver2
34163    *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
34164    *  #resolveEntity(publicId, systemId)
34165    *  #getExternalSubset(name, baseURI)
34166    * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
34167    * IGNORED method of org.xml.sax.DTDHandler
34168    *  #notationDecl(name, publicId, systemId) {};
34169    *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
34170    */
34171   "endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
34172         DOMHandler.prototype[key] = function(){return null};
34173   });
34174
34175   /* 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 */
34176   function appendElement (hander,node) {
34177       if (!hander.currentElement) {
34178           hander.doc.appendChild(node);
34179       } else {
34180           hander.currentElement.appendChild(node);
34181       }
34182   }//appendChild and setAttributeNS are preformance key
34183
34184   //if(typeof require == 'function'){
34185         var XMLReader = sax.XMLReader;
34186         var DOMImplementation = exports.DOMImplementation = dom.DOMImplementation;
34187         exports.XMLSerializer = dom.XMLSerializer ;
34188         exports.DOMParser = DOMParser;
34189   //}
34190   });
34191   var domParser_1 = domParser.DOMImplementation;
34192   var domParser_2 = domParser.XMLSerializer;
34193   var domParser_3 = domParser.DOMParser;
34194
34195   var togeojson = createCommonjsModule(function (module, exports) {
34196   var toGeoJSON = (function() {
34197
34198       var removeSpace = /\s*/g,
34199           trimSpace = /^\s*|\s*$/g,
34200           splitSpace = /\s+/;
34201       // generate a short, numeric hash of a string
34202       function okhash(x) {
34203           if (!x || !x.length) return 0;
34204           for (var i = 0, h = 0; i < x.length; i++) {
34205               h = ((h << 5) - h) + x.charCodeAt(i) | 0;
34206           } return h;
34207       }
34208       // all Y children of X
34209       function get(x, y) { return x.getElementsByTagName(y); }
34210       function attr(x, y) { return x.getAttribute(y); }
34211       function attrf(x, y) { return parseFloat(attr(x, y)); }
34212       // one Y child of X, if any, otherwise null
34213       function get1(x, y) { var n = get(x, y); return n.length ? n[0] : null; }
34214       // https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize
34215       function norm(el) { if (el.normalize) { el.normalize(); } return el; }
34216       // cast array x into numbers
34217       function numarray(x) {
34218           for (var j = 0, o = []; j < x.length; j++) { o[j] = parseFloat(x[j]); }
34219           return o;
34220       }
34221       // get the content of a text node, if any
34222       function nodeVal(x) {
34223           if (x) { norm(x); }
34224           return (x && x.textContent) || '';
34225       }
34226       // get the contents of multiple text nodes, if present
34227       function getMulti(x, ys) {
34228           var o = {}, n, k;
34229           for (k = 0; k < ys.length; k++) {
34230               n = get1(x, ys[k]);
34231               if (n) o[ys[k]] = nodeVal(n);
34232           }
34233           return o;
34234       }
34235       // add properties of Y to X, overwriting if present in both
34236       function extend(x, y) { for (var k in y) x[k] = y[k]; }
34237       // get one coordinate from a coordinate array, if any
34238       function coord1(v) { return numarray(v.replace(removeSpace, '').split(',')); }
34239       // get all coordinates from a coordinate array as [[],[]]
34240       function coord(v) {
34241           var coords = v.replace(trimSpace, '').split(splitSpace),
34242               o = [];
34243           for (var i = 0; i < coords.length; i++) {
34244               o.push(coord1(coords[i]));
34245           }
34246           return o;
34247       }
34248       function coordPair(x) {
34249           var ll = [attrf(x, 'lon'), attrf(x, 'lat')],
34250               ele = get1(x, 'ele'),
34251               // handle namespaced attribute in browser
34252               heartRate = get1(x, 'gpxtpx:hr') || get1(x, 'hr'),
34253               time = get1(x, 'time'),
34254               e;
34255           if (ele) {
34256               e = parseFloat(nodeVal(ele));
34257               if (!isNaN(e)) {
34258                   ll.push(e);
34259               }
34260           }
34261           return {
34262               coordinates: ll,
34263               time: time ? nodeVal(time) : null,
34264               heartRate: heartRate ? parseFloat(nodeVal(heartRate)) : null
34265           };
34266       }
34267
34268       // create a new feature collection parent object
34269       function fc() {
34270           return {
34271               type: 'FeatureCollection',
34272               features: []
34273           };
34274       }
34275
34276       var serializer;
34277       if (typeof XMLSerializer !== 'undefined') {
34278           /* istanbul ignore next */
34279           serializer = new XMLSerializer();
34280       // only require xmldom in a node environment
34281       } else if (typeof process === 'object' && !process.browser) {
34282           serializer = new (domParser.XMLSerializer)();
34283       }
34284       function xml2str(str) {
34285           // IE9 will create a new XMLSerializer but it'll crash immediately.
34286           // This line is ignored because we don't run coverage tests in IE9
34287           /* istanbul ignore next */
34288           if (str.xml !== undefined) return str.xml;
34289           return serializer.serializeToString(str);
34290       }
34291
34292       var t = {
34293           kml: function(doc) {
34294
34295               var gj = fc(),
34296                   // styleindex keeps track of hashed styles in order to match features
34297                   styleIndex = {}, styleByHash = {},
34298                   // stylemapindex keeps track of style maps to expose in properties
34299                   styleMapIndex = {},
34300                   // atomic geospatial types supported by KML - MultiGeometry is
34301                   // handled separately
34302                   geotypes = ['Polygon', 'LineString', 'Point', 'Track', 'gx:Track'],
34303                   // all root placemarks in the file
34304                   placemarks = get(doc, 'Placemark'),
34305                   styles = get(doc, 'Style'),
34306                   styleMaps = get(doc, 'StyleMap');
34307
34308               for (var k = 0; k < styles.length; k++) {
34309                   var hash = okhash(xml2str(styles[k])).toString(16);
34310                   styleIndex['#' + attr(styles[k], 'id')] = hash;
34311                   styleByHash[hash] = styles[k];
34312               }
34313               for (var l = 0; l < styleMaps.length; l++) {
34314                   styleIndex['#' + attr(styleMaps[l], 'id')] = okhash(xml2str(styleMaps[l])).toString(16);
34315                   var pairs = get(styleMaps[l], 'Pair');
34316                   var pairsMap = {};
34317                   for (var m = 0; m < pairs.length; m++) {
34318                       pairsMap[nodeVal(get1(pairs[m], 'key'))] = nodeVal(get1(pairs[m], 'styleUrl'));
34319                   }
34320                   styleMapIndex['#' + attr(styleMaps[l], 'id')] = pairsMap;
34321
34322               }
34323               for (var j = 0; j < placemarks.length; j++) {
34324                   gj.features = gj.features.concat(getPlacemark(placemarks[j]));
34325               }
34326               function kmlColor(v) {
34327                   var color, opacity;
34328                   v = v || '';
34329                   if (v.substr(0, 1) === '#') { v = v.substr(1); }
34330                   if (v.length === 6 || v.length === 3) { color = v; }
34331                   if (v.length === 8) {
34332                       opacity = parseInt(v.substr(0, 2), 16) / 255;
34333                       color = '#' + v.substr(6, 2) +
34334                           v.substr(4, 2) +
34335                           v.substr(2, 2);
34336                   }
34337                   return [color, isNaN(opacity) ? undefined : opacity];
34338               }
34339               function gxCoord(v) { return numarray(v.split(' ')); }
34340               function gxCoords(root) {
34341                   var elems = get(root, 'coord', 'gx'), coords = [], times = [];
34342                   if (elems.length === 0) elems = get(root, 'gx:coord');
34343                   for (var i = 0; i < elems.length; i++) coords.push(gxCoord(nodeVal(elems[i])));
34344                   var timeElems = get(root, 'when');
34345                   for (var j = 0; j < timeElems.length; j++) times.push(nodeVal(timeElems[j]));
34346                   return {
34347                       coords: coords,
34348                       times: times
34349                   };
34350               }
34351               function getGeometry(root) {
34352                   var geomNode, geomNodes, i, j, k, geoms = [], coordTimes = [];
34353                   if (get1(root, 'MultiGeometry')) { return getGeometry(get1(root, 'MultiGeometry')); }
34354                   if (get1(root, 'MultiTrack')) { return getGeometry(get1(root, 'MultiTrack')); }
34355                   if (get1(root, 'gx:MultiTrack')) { return getGeometry(get1(root, 'gx:MultiTrack')); }
34356                   for (i = 0; i < geotypes.length; i++) {
34357                       geomNodes = get(root, geotypes[i]);
34358                       if (geomNodes) {
34359                           for (j = 0; j < geomNodes.length; j++) {
34360                               geomNode = geomNodes[j];
34361                               if (geotypes[i] === 'Point') {
34362                                   geoms.push({
34363                                       type: 'Point',
34364                                       coordinates: coord1(nodeVal(get1(geomNode, 'coordinates')))
34365                                   });
34366                               } else if (geotypes[i] === 'LineString') {
34367                                   geoms.push({
34368                                       type: 'LineString',
34369                                       coordinates: coord(nodeVal(get1(geomNode, 'coordinates')))
34370                                   });
34371                               } else if (geotypes[i] === 'Polygon') {
34372                                   var rings = get(geomNode, 'LinearRing'),
34373                                       coords = [];
34374                                   for (k = 0; k < rings.length; k++) {
34375                                       coords.push(coord(nodeVal(get1(rings[k], 'coordinates'))));
34376                                   }
34377                                   geoms.push({
34378                                       type: 'Polygon',
34379                                       coordinates: coords
34380                                   });
34381                               } else if (geotypes[i] === 'Track' ||
34382                                   geotypes[i] === 'gx:Track') {
34383                                   var track = gxCoords(geomNode);
34384                                   geoms.push({
34385                                       type: 'LineString',
34386                                       coordinates: track.coords
34387                                   });
34388                                   if (track.times.length) coordTimes.push(track.times);
34389                               }
34390                           }
34391                       }
34392                   }
34393                   return {
34394                       geoms: geoms,
34395                       coordTimes: coordTimes
34396                   };
34397               }
34398               function getPlacemark(root) {
34399                   var geomsAndTimes = getGeometry(root), i, properties = {},
34400                       name = nodeVal(get1(root, 'name')),
34401                       address = nodeVal(get1(root, 'address')),
34402                       styleUrl = nodeVal(get1(root, 'styleUrl')),
34403                       description = nodeVal(get1(root, 'description')),
34404                       timeSpan = get1(root, 'TimeSpan'),
34405                       timeStamp = get1(root, 'TimeStamp'),
34406                       extendedData = get1(root, 'ExtendedData'),
34407                       lineStyle = get1(root, 'LineStyle'),
34408                       polyStyle = get1(root, 'PolyStyle'),
34409                       visibility = get1(root, 'visibility');
34410
34411                   if (!geomsAndTimes.geoms.length) return [];
34412                   if (name) properties.name = name;
34413                   if (address) properties.address = address;
34414                   if (styleUrl) {
34415                       if (styleUrl[0] !== '#') {
34416                           styleUrl = '#' + styleUrl;
34417                       }
34418
34419                       properties.styleUrl = styleUrl;
34420                       if (styleIndex[styleUrl]) {
34421                           properties.styleHash = styleIndex[styleUrl];
34422                       }
34423                       if (styleMapIndex[styleUrl]) {
34424                           properties.styleMapHash = styleMapIndex[styleUrl];
34425                           properties.styleHash = styleIndex[styleMapIndex[styleUrl].normal];
34426                       }
34427                       // Try to populate the lineStyle or polyStyle since we got the style hash
34428                       var style = styleByHash[properties.styleHash];
34429                       if (style) {
34430                           if (!lineStyle) lineStyle = get1(style, 'LineStyle');
34431                           if (!polyStyle) polyStyle = get1(style, 'PolyStyle');
34432                       }
34433                   }
34434                   if (description) properties.description = description;
34435                   if (timeSpan) {
34436                       var begin = nodeVal(get1(timeSpan, 'begin'));
34437                       var end = nodeVal(get1(timeSpan, 'end'));
34438                       properties.timespan = { begin: begin, end: end };
34439                   }
34440                   if (timeStamp) {
34441                       properties.timestamp = nodeVal(get1(timeStamp, 'when'));
34442                   }
34443                   if (lineStyle) {
34444                       var linestyles = kmlColor(nodeVal(get1(lineStyle, 'color'))),
34445                           color = linestyles[0],
34446                           opacity = linestyles[1],
34447                           width = parseFloat(nodeVal(get1(lineStyle, 'width')));
34448                       if (color) properties.stroke = color;
34449                       if (!isNaN(opacity)) properties['stroke-opacity'] = opacity;
34450                       if (!isNaN(width)) properties['stroke-width'] = width;
34451                   }
34452                   if (polyStyle) {
34453                       var polystyles = kmlColor(nodeVal(get1(polyStyle, 'color'))),
34454                           pcolor = polystyles[0],
34455                           popacity = polystyles[1],
34456                           fill = nodeVal(get1(polyStyle, 'fill')),
34457                           outline = nodeVal(get1(polyStyle, 'outline'));
34458                       if (pcolor) properties.fill = pcolor;
34459                       if (!isNaN(popacity)) properties['fill-opacity'] = popacity;
34460                       if (fill) properties['fill-opacity'] = fill === '1' ? properties['fill-opacity'] || 1 : 0;
34461                       if (outline) properties['stroke-opacity'] = outline === '1' ? properties['stroke-opacity'] || 1 : 0;
34462                   }
34463                   if (extendedData) {
34464                       var datas = get(extendedData, 'Data'),
34465                           simpleDatas = get(extendedData, 'SimpleData');
34466
34467                       for (i = 0; i < datas.length; i++) {
34468                           properties[datas[i].getAttribute('name')] = nodeVal(get1(datas[i], 'value'));
34469                       }
34470                       for (i = 0; i < simpleDatas.length; i++) {
34471                           properties[simpleDatas[i].getAttribute('name')] = nodeVal(simpleDatas[i]);
34472                       }
34473                   }
34474                   if (visibility) {
34475                       properties.visibility = nodeVal(visibility);
34476                   }
34477                   if (geomsAndTimes.coordTimes.length) {
34478                       properties.coordTimes = (geomsAndTimes.coordTimes.length === 1) ?
34479                           geomsAndTimes.coordTimes[0] : geomsAndTimes.coordTimes;
34480                   }
34481                   var feature = {
34482                       type: 'Feature',
34483                       geometry: (geomsAndTimes.geoms.length === 1) ? geomsAndTimes.geoms[0] : {
34484                           type: 'GeometryCollection',
34485                           geometries: geomsAndTimes.geoms
34486                       },
34487                       properties: properties
34488                   };
34489                   if (attr(root, 'id')) feature.id = attr(root, 'id');
34490                   return [feature];
34491               }
34492               return gj;
34493           },
34494           gpx: function(doc) {
34495               var i,
34496                   tracks = get(doc, 'trk'),
34497                   routes = get(doc, 'rte'),
34498                   waypoints = get(doc, 'wpt'),
34499                   // a feature collection
34500                   gj = fc(),
34501                   feature;
34502               for (i = 0; i < tracks.length; i++) {
34503                   feature = getTrack(tracks[i]);
34504                   if (feature) gj.features.push(feature);
34505               }
34506               for (i = 0; i < routes.length; i++) {
34507                   feature = getRoute(routes[i]);
34508                   if (feature) gj.features.push(feature);
34509               }
34510               for (i = 0; i < waypoints.length; i++) {
34511                   gj.features.push(getPoint(waypoints[i]));
34512               }
34513               function getPoints(node, pointname) {
34514                   var pts = get(node, pointname),
34515                       line = [],
34516                       times = [],
34517                       heartRates = [],
34518                       l = pts.length;
34519                   if (l < 2) return {};  // Invalid line in GeoJSON
34520                   for (var i = 0; i < l; i++) {
34521                       var c = coordPair(pts[i]);
34522                       line.push(c.coordinates);
34523                       if (c.time) times.push(c.time);
34524                       if (c.heartRate) heartRates.push(c.heartRate);
34525                   }
34526                   return {
34527                       line: line,
34528                       times: times,
34529                       heartRates: heartRates
34530                   };
34531               }
34532               function getTrack(node) {
34533                   var segments = get(node, 'trkseg'),
34534                       track = [],
34535                       times = [],
34536                       heartRates = [],
34537                       line;
34538                   for (var i = 0; i < segments.length; i++) {
34539                       line = getPoints(segments[i], 'trkpt');
34540                       if (line) {
34541                           if (line.line) track.push(line.line);
34542                           if (line.times && line.times.length) times.push(line.times);
34543                           if (line.heartRates && line.heartRates.length) heartRates.push(line.heartRates);
34544                       }
34545                   }
34546                   if (track.length === 0) return;
34547                   var properties = getProperties(node);
34548                   extend(properties, getLineStyle(get1(node, 'extensions')));
34549                   if (times.length) properties.coordTimes = track.length === 1 ? times[0] : times;
34550                   if (heartRates.length) properties.heartRates = track.length === 1 ? heartRates[0] : heartRates;
34551                   return {
34552                       type: 'Feature',
34553                       properties: properties,
34554                       geometry: {
34555                           type: track.length === 1 ? 'LineString' : 'MultiLineString',
34556                           coordinates: track.length === 1 ? track[0] : track
34557                       }
34558                   };
34559               }
34560               function getRoute(node) {
34561                   var line = getPoints(node, 'rtept');
34562                   if (!line.line) return;
34563                   var prop = getProperties(node);
34564                   extend(prop, getLineStyle(get1(node, 'extensions')));
34565                   var routeObj = {
34566                       type: 'Feature',
34567                       properties: prop,
34568                       geometry: {
34569                           type: 'LineString',
34570                           coordinates: line.line
34571                       }
34572                   };
34573                   return routeObj;
34574               }
34575               function getPoint(node) {
34576                   var prop = getProperties(node);
34577                   extend(prop, getMulti(node, ['sym']));
34578                   return {
34579                       type: 'Feature',
34580                       properties: prop,
34581                       geometry: {
34582                           type: 'Point',
34583                           coordinates: coordPair(node).coordinates
34584                       }
34585                   };
34586               }
34587               function getLineStyle(extensions) {
34588                   var style = {};
34589                   if (extensions) {
34590                       var lineStyle = get1(extensions, 'line');
34591                       if (lineStyle) {
34592                           var color = nodeVal(get1(lineStyle, 'color')),
34593                               opacity = parseFloat(nodeVal(get1(lineStyle, 'opacity'))),
34594                               width = parseFloat(nodeVal(get1(lineStyle, 'width')));
34595                           if (color) style.stroke = color;
34596                           if (!isNaN(opacity)) style['stroke-opacity'] = opacity;
34597                           // GPX width is in mm, convert to px with 96 px per inch
34598                           if (!isNaN(width)) style['stroke-width'] = width * 96 / 25.4;
34599                       }
34600                   }
34601                   return style;
34602               }
34603               function getProperties(node) {
34604                   var prop = getMulti(node, ['name', 'cmt', 'desc', 'type', 'time', 'keywords']),
34605                       links = get(node, 'link');
34606                   if (links.length) prop.links = [];
34607                   for (var i = 0, link; i < links.length; i++) {
34608                       link = { href: attr(links[i], 'href') };
34609                       extend(link, getMulti(links[i], ['text', 'type']));
34610                       prop.links.push(link);
34611                   }
34612                   return prop;
34613               }
34614               return gj;
34615           }
34616       };
34617       return t;
34618   })();
34619
34620   module.exports = toGeoJSON;
34621   });
34622
34623   var _initialized = false;
34624   var _enabled = false;
34625   var _geojson;
34626
34627
34628   function svgData$$1(projection$$1, context, dispatch) {
34629       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
34630       var _showLabels = true;
34631       var detected = utilDetect();
34632       var layer = select(null);
34633       var _vtService;
34634       var _fileList;
34635       var _template;
34636       var _src;
34637
34638
34639       function init() {
34640           if (_initialized) return;  // run once
34641
34642           _geojson = {};
34643           _enabled = true;
34644
34645           function over() {
34646               event.stopPropagation();
34647               event.preventDefault();
34648               event.dataTransfer.dropEffect = 'copy';
34649           }
34650
34651           select('body')
34652               .attr('dropzone', 'copy')
34653               .on('drop.svgData', function() {
34654                   event.stopPropagation();
34655                   event.preventDefault();
34656                   if (!detected.filedrop) return;
34657                   drawData.fileList(event.dataTransfer.files);
34658               })
34659               .on('dragenter.svgData', over)
34660               .on('dragexit.svgData', over)
34661               .on('dragover.svgData', over);
34662
34663           _initialized = true;
34664       }
34665
34666
34667       function getService() {
34668           if (services.vectorTile && !_vtService) {
34669               _vtService = services.vectorTile;
34670               _vtService.event.on('loadedData', throttledRedraw);
34671           } else if (!services.vectorTile && _vtService) {
34672               _vtService = null;
34673           }
34674
34675           return _vtService;
34676       }
34677
34678
34679       function showLayer() {
34680           layerOn();
34681
34682           layer
34683               .style('opacity', 0)
34684               .transition()
34685               .duration(250)
34686               .style('opacity', 1)
34687               .on('end', function () { dispatch.call('change'); });
34688       }
34689
34690
34691       function hideLayer() {
34692           throttledRedraw.cancel();
34693
34694           layer
34695               .transition()
34696               .duration(250)
34697               .style('opacity', 0)
34698               .on('end', layerOff);
34699       }
34700
34701
34702       function layerOn() {
34703           layer.style('display', 'block');
34704       }
34705
34706
34707       function layerOff() {
34708           layer.selectAll('.viewfield-group').remove();
34709           layer.style('display', 'none');
34710       }
34711
34712
34713       // ensure that all geojson features in a collection have IDs
34714       function ensureIDs(gj) {
34715           if (!gj) return null;
34716
34717           if (gj.type === 'FeatureCollection') {
34718               for (var i = 0; i < gj.features.length; i++) {
34719                   ensureFeatureID(gj.features[i]);
34720               }
34721           } else {
34722               ensureFeatureID(gj);
34723           }
34724           return gj;
34725       }
34726
34727
34728       // ensure that each single Feature object has a unique ID
34729       function ensureFeatureID(feature) {
34730           if (!feature) return;
34731           feature.__featurehash__ = utilHashcode(fastJsonStableStringify(feature));
34732           return feature;
34733       }
34734
34735
34736       // Prefer an array of Features instead of a FeatureCollection
34737       function getFeatures(gj) {
34738           if (!gj) return [];
34739
34740           if (gj.type === 'FeatureCollection') {
34741               return gj.features;
34742           } else {
34743               return [gj];
34744           }
34745       }
34746
34747
34748       function featureKey(d) {
34749           return d.__featurehash__;
34750       }
34751
34752
34753       function isPolygon(d) {
34754           return d.geometry.type === 'Polygon' || d.geometry.type === 'MultiPolygon';
34755       }
34756
34757
34758       function clipPathID(d) {
34759           return 'data-' + d.__featurehash__ + '-clippath';
34760       }
34761
34762
34763       function featureClasses(d) {
34764           return [
34765               'data' + d.__featurehash__,
34766               d.geometry.type,
34767               isPolygon(d) ? 'area' : '',
34768               d.__layerID__ || ''
34769           ].filter(Boolean).join(' ');
34770       }
34771
34772
34773       function drawData(selection$$1) {
34774           var vtService = getService();
34775           var getPath = svgPath(projection$$1).geojson;
34776           var getAreaPath = svgPath(projection$$1, null, true).geojson;
34777           var hasData = drawData.hasData();
34778
34779           layer = selection$$1.selectAll('.layer-mapdata')
34780               .data(_enabled && hasData ? [0] : []);
34781
34782           layer.exit()
34783               .remove();
34784
34785           layer = layer.enter()
34786               .append('g')
34787               .attr('class', 'layer-mapdata')
34788               .merge(layer);
34789
34790           var surface = context.surface();
34791           if (!surface || surface.empty()) return;  // not ready to draw yet, starting up
34792
34793
34794           // Gather data
34795           var geoData, polygonData;
34796           if (_template && vtService) {   // fetch data from vector tile service
34797               var sourceID = _template;
34798               vtService.loadTiles(sourceID, _template, projection$$1);
34799               geoData = vtService.data(sourceID, projection$$1);
34800           } else {
34801               geoData = getFeatures(_geojson);
34802           }
34803           geoData = geoData.filter(getPath);
34804           polygonData = geoData.filter(isPolygon);
34805
34806
34807           // Draw clip paths for polygons
34808           var clipPaths = surface.selectAll('defs').selectAll('.clipPath-data')
34809              .data(polygonData, featureKey);
34810
34811           clipPaths.exit()
34812              .remove();
34813
34814           var clipPathsEnter = clipPaths.enter()
34815              .append('clipPath')
34816              .attr('class', 'clipPath-data')
34817              .attr('id', clipPathID);
34818
34819           clipPathsEnter
34820              .append('path');
34821
34822           clipPaths.merge(clipPathsEnter)
34823              .selectAll('path')
34824              .attr('d', getAreaPath);
34825
34826
34827           // Draw fill, shadow, stroke layers
34828           var datagroups = layer
34829               .selectAll('g.datagroup')
34830               .data(['fill', 'shadow', 'stroke']);
34831
34832           datagroups = datagroups.enter()
34833               .append('g')
34834               .attr('class', function(d) { return 'datagroup datagroup-' + d; })
34835               .merge(datagroups);
34836
34837
34838           // Draw paths
34839           var pathData = {
34840               fill: polygonData,
34841               shadow: geoData,
34842               stroke: geoData
34843           };
34844
34845           var paths = datagroups
34846               .selectAll('path')
34847               .data(function(layer) { return pathData[layer]; }, featureKey);
34848
34849           // exit
34850           paths.exit()
34851               .remove();
34852
34853           // enter/update
34854           paths = paths.enter()
34855               .append('path')
34856               .attr('class', function(d) {
34857                   var datagroup = this.parentNode.__data__;
34858                   return 'pathdata ' + datagroup + ' ' + featureClasses(d);
34859               })
34860               .attr('clip-path', function(d) {
34861                   var datagroup = this.parentNode.__data__;
34862                   return datagroup === 'fill' ? ('url(#' + clipPathID(d) + ')') : null;
34863               })
34864               .merge(paths)
34865               .attr('d', function(d) {
34866                   var datagroup = this.parentNode.__data__;
34867                   return datagroup === 'fill' ? getAreaPath(d) : getPath(d);
34868               });
34869
34870
34871           // Draw labels
34872           layer
34873               .call(drawLabels, 'label-halo', geoData)
34874               .call(drawLabels, 'label', geoData);
34875
34876
34877           function drawLabels(selection$$1, textClass, data) {
34878               var labelPath = d3_geoPath(projection$$1);
34879               var labelData = data.filter(function(d) {
34880                   return _showLabels && d.properties && (d.properties.desc || d.properties.name);
34881               });
34882
34883               var labels = selection$$1.selectAll('text.' + textClass)
34884                   .data(labelData, featureKey);
34885
34886               // exit
34887               labels.exit()
34888                   .remove();
34889
34890               // enter/update
34891               labels = labels.enter()
34892                   .append('text')
34893                   .attr('class', function(d) { return textClass + ' ' + featureClasses(d); })
34894                   .merge(labels)
34895                   .text(function(d) {
34896                       return d.properties.desc || d.properties.name;
34897                   })
34898                   .attr('x', function(d) {
34899                       var centroid = labelPath.centroid(d);
34900                       return centroid[0] + 11;
34901                   })
34902                   .attr('y', function(d) {
34903                       var centroid = labelPath.centroid(d);
34904                       return centroid[1];
34905                   });
34906           }
34907       }
34908
34909
34910       function getExtension(fileName) {
34911           if (!fileName) return;
34912
34913           var re = /\.(gpx|kml|(geo)?json)$/i;
34914           var match = fileName.toLowerCase().match(re);
34915           return match && match.length && match[0];
34916       }
34917
34918
34919       function xmlToDom(textdata) {
34920           return (new DOMParser()).parseFromString(textdata, 'text/xml');
34921       }
34922
34923
34924       drawData.setFile = function(extension, data) {
34925           _template = null;
34926           _fileList = null;
34927           _geojson = null;
34928           _src = null;
34929
34930           var gj;
34931           switch (extension) {
34932               case '.gpx':
34933                   gj = togeojson.gpx(xmlToDom(data));
34934                   break;
34935               case '.kml':
34936                   gj = togeojson.kml(xmlToDom(data));
34937                   break;
34938               case '.geojson':
34939               case '.json':
34940                   gj = JSON.parse(data);
34941                   break;
34942           }
34943
34944           if (!isEmpty(gj)) {
34945               _geojson = ensureIDs(gj);
34946               _src = extension + ' data file';
34947               this.fitZoom();
34948           }
34949
34950           dispatch.call('change');
34951           return this;
34952       };
34953
34954
34955       drawData.showLabels = function(val) {
34956           if (!arguments.length) return _showLabels;
34957
34958           _showLabels = val;
34959           return this;
34960       };
34961
34962
34963       drawData.enabled = function(val) {
34964           if (!arguments.length) return _enabled;
34965
34966           _enabled = val;
34967           if (_enabled) {
34968               showLayer();
34969           } else {
34970               hideLayer();
34971           }
34972
34973           dispatch.call('change');
34974           return this;
34975       };
34976
34977
34978       drawData.hasData = function() {
34979           return !!(_template || !isEmpty(_geojson));
34980       };
34981
34982
34983       drawData.template = function(val, src) {
34984           if (!arguments.length) return _template;
34985
34986           // test source against OSM imagery blacklists..
34987           var osm = context.connection();
34988           if (osm) {
34989               var blacklists = osm.imageryBlacklists();
34990               var fail = false;
34991               var tested = 0;
34992               var regex;
34993
34994               for (var i = 0; i < blacklists.length; i++) {
34995                   try {
34996                       regex = new RegExp(blacklists[i]);
34997                       fail = regex.test(val);
34998                       tested++;
34999                       if (fail) break;
35000                   } catch (e) {
35001                       /* noop */
35002                   }
35003               }
35004
35005               // ensure at least one test was run.
35006               if (!tested) {
35007                   regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
35008                   fail = regex.test(val);
35009               }
35010           }
35011
35012           _template = val;
35013           _fileList = null;
35014           _geojson = null;
35015
35016           // strip off the querystring/hash from the template,
35017           // it often includes the access token
35018           _src = src || ('vectortile:' + val.split(/[?#]/)[0]);
35019
35020           dispatch.call('change');
35021           return this;
35022       };
35023
35024
35025       drawData.geojson = function(gj, src) {
35026           if (!arguments.length) return _geojson;
35027
35028           _template = null;
35029           _fileList = null;
35030           _geojson = null;
35031           _src = null;
35032
35033           if (!isEmpty(gj)) {
35034               _geojson = ensureIDs(gj);
35035               _src = src || 'unknown.geojson';
35036           }
35037
35038           dispatch.call('change');
35039           return this;
35040       };
35041
35042
35043       drawData.fileList = function(fileList) {
35044           if (!arguments.length) return _fileList;
35045
35046           _template = null;
35047           _fileList = fileList;
35048           _geojson = null;
35049           _src = null;
35050
35051           if (!fileList || !fileList.length) return this;
35052           var f = fileList[0];
35053           var extension = getExtension(f.name);
35054           var reader = new FileReader();
35055           reader.onload = (function() {
35056               return function(e) {
35057                   drawData.setFile(extension, e.target.result);
35058               };
35059           })(f);
35060
35061           reader.readAsText(f);
35062
35063           return this;
35064       };
35065
35066
35067       drawData.url = function(url, defaultExtension) {
35068           _template = null;
35069           _fileList = null;
35070           _geojson = null;
35071           _src = null;
35072
35073           // strip off any querystring/hash from the url before checking extension
35074           var testUrl = url.split(/[?#]/)[0];
35075           var extension = getExtension(testUrl) || defaultExtension;
35076           if (extension) {
35077               _template = null;
35078               d3_text(url, function(err, data) {
35079                   if (err) return;
35080                   drawData.setFile(extension, data);
35081               });
35082           } else {
35083               drawData.template(url);
35084           }
35085
35086           return this;
35087       };
35088
35089
35090       drawData.getSrc = function() {
35091           return _src || '';
35092       };
35093
35094
35095       drawData.fitZoom = function() {
35096           var features = getFeatures(_geojson);
35097           if (!features.length) return;
35098
35099           var map = context.map();
35100           var viewport = map.trimmedExtent().polygon();
35101           var coords = reduce(features, function(coords, feature) {
35102               var c = feature.geometry.coordinates;
35103
35104               /* eslint-disable no-fallthrough */
35105               switch (feature.geometry.type) {
35106                   case 'Point':
35107                       c = [c];
35108                   case 'MultiPoint':
35109                   case 'LineString':
35110                       break;
35111
35112                   case 'MultiPolygon':
35113                       c = flatten(c);
35114                   case 'Polygon':
35115                   case 'MultiLineString':
35116                       c = flatten(c);
35117                       break;
35118               }
35119               /* eslint-enable no-fallthrough */
35120
35121               return union(coords, c);
35122           }, []);
35123
35124           if (!geoPolygonIntersectsPolygon(viewport, coords, true)) {
35125               var extent = geoExtent$$1(d3_geoBounds({ type: 'LineString', coordinates: coords }));
35126               map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
35127           }
35128
35129           return this;
35130       };
35131
35132
35133       init();
35134       return drawData;
35135   }
35136
35137   function svgDebug$$1(projection, context) {
35138
35139       function drawDebug(selection$$1) {
35140           var showsTile = context.getDebug('tile');
35141           var showsCollision = context.getDebug('collision');
35142           var showsImagery = context.getDebug('imagery');
35143           var showsCommunity = context.getDebug('community');
35144           var showsImperial = context.getDebug('imperial');
35145           var showsDriveLeft = context.getDebug('driveLeft');
35146           var showsTouchTargets = context.getDebug('target');
35147
35148           var debugData = [];
35149           if (showsTile) {
35150               debugData.push({ class: 'red', label: 'tile' });
35151           }
35152           if (showsCollision) {
35153               debugData.push({ class: 'yellow', label: 'collision' });
35154           }
35155           if (showsImagery) {
35156               debugData.push({ class: 'orange', label: 'imagery' });
35157           }
35158           if (showsCommunity) {
35159               debugData.push({ class: 'blue', label: 'community' });
35160           }
35161           if (showsImperial) {
35162               debugData.push({ class: 'cyan', label: 'imperial' });
35163           }
35164           if (showsDriveLeft) {
35165               debugData.push({ class: 'green', label: 'driveLeft' });
35166           }
35167           if (showsTouchTargets) {
35168               debugData.push({ class: 'pink', label: 'touchTargets' });
35169           }
35170
35171
35172           var legend = select('#content')
35173               .selectAll('.debug-legend')
35174               .data(debugData.length ? [0] : []);
35175
35176           legend.exit()
35177               .remove();
35178
35179           legend = legend.enter()
35180               .append('div')
35181               .attr('class', 'fillD debug-legend')
35182               .merge(legend);
35183
35184
35185           var legendItems = legend.selectAll('.debug-legend-item')
35186               .data(debugData, function(d) { return d.label; });
35187
35188           legendItems.exit()
35189               .remove();
35190
35191           legendItems.enter()
35192               .append('span')
35193               .attr('class', function(d) { return 'debug-legend-item ' + d.class; })
35194               .text(function(d) { return d.label; });
35195
35196
35197           var layer = selection$$1.selectAll('.layer-debug')
35198               .data(showsImagery || showsCommunity || showsImperial || showsDriveLeft ? [0] : []);
35199
35200           layer.exit()
35201               .remove();
35202
35203           layer = layer.enter()
35204               .append('g')
35205               .attr('class', 'layer-debug')
35206               .merge(layer);
35207
35208
35209           var extent = context.map().extent();
35210           var matchImagery = (showsImagery && data.imagery.query.bbox(extent.rectangle(), true)) || [];
35211           var features = matchImagery.map(function(d) { return data.imagery.features[d.id]; });
35212
35213           var imagery = layer.selectAll('path.debug-imagery')
35214               .data(features);
35215
35216           imagery.exit()
35217               .remove();
35218
35219           imagery.enter()
35220               .append('path')
35221               .attr('class', 'debug-imagery debug orange');
35222
35223
35224           var community = layer.selectAll('path.debug-community')
35225               .data(showsCommunity ? values$1(data.community.features) : []);
35226
35227           community.exit()
35228               .remove();
35229
35230           community.enter()
35231               .append('path')
35232               .attr('class', 'debug-community debug blue');
35233
35234
35235           var imperial = layer
35236               .selectAll('path.debug-imperial')
35237               .data(showsImperial ? [dataImperial] : []);
35238
35239           imperial.exit()
35240               .remove();
35241
35242           imperial.enter()
35243               .append('path')
35244               .attr('class', 'debug-imperial debug cyan');
35245
35246
35247           var driveLeft = layer
35248               .selectAll('path.debug-drive-left')
35249               .data(showsDriveLeft ? [dataDriveLeft] : []);
35250
35251           driveLeft.exit()
35252               .remove();
35253
35254           driveLeft.enter()
35255               .append('path')
35256               .attr('class', 'debug-drive-left debug green');
35257
35258
35259           // update
35260           layer.selectAll('path')
35261               .attr('d', svgPath(projection).geojson);
35262       }
35263
35264
35265       // This looks strange because `enabled` methods on other layers are
35266       // chainable getter/setters, and this one is just a getter.
35267       drawDebug.enabled = function() {
35268           if (!arguments.length) {
35269               return context.getDebug('tile') ||
35270                   context.getDebug('collision') ||
35271                   context.getDebug('imagery') ||
35272                   context.getDebug('imperial') ||
35273                   context.getDebug('driveLeft') ||
35274                   context.getDebug('target');
35275           } else {
35276               return this;
35277           }
35278       };
35279
35280
35281       return drawDebug;
35282   }
35283
35284   /*
35285       A standalone SVG element that contains only a `defs` sub-element. To be
35286       used once globally, since defs IDs must be unique within a document.
35287   */
35288   function svgDefs(context) {
35289
35290       function drawDefs(selection$$1) {
35291           var defs = selection$$1.append('defs');
35292
35293           // add markers
35294           defs
35295               .append('marker')
35296               .attr('id', 'oneway-marker')
35297               .attr('viewBox', '0 0 10 5')
35298               .attr('refX', 2.5)
35299               .attr('refY', 2.5)
35300               .attr('markerWidth', 2)
35301               .attr('markerHeight', 2)
35302               .attr('markerUnits', 'strokeWidth')
35303               .attr('orient', 'auto')
35304               .append('path')
35305               .attr('class', 'oneway-marker-path')
35306               .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')
35307               .attr('stroke', 'none')
35308               .attr('fill', '#000')
35309               .attr('opacity', '0.75');
35310
35311           // SVG markers have to be given a colour where they're defined
35312           // (they can't inherit it from the line they're attached to),
35313           // so we need to manually define markers for each color of tag
35314           // (also, it's slightly nicer if we can control the
35315           // positioning for different tags)
35316           function addSidedMarker(name, color, offset) {
35317               defs
35318                   .append('marker')
35319                   .attr('id', 'sided-marker-' + name)
35320                   .attr('viewBox', '0 0 2 2')
35321                   .attr('refX', 1)
35322                   .attr('refY', -offset)
35323                   .attr('markerWidth', 1.5)
35324                   .attr('markerHeight', 1.5)
35325                   .attr('markerUnits', 'strokeWidth')
35326                   .attr('orient', 'auto')
35327                   .append('path')
35328                   .attr('class', 'sided-marker-path sided-marker-' + name + '-path')
35329                   .attr('d', 'M 0,0 L 1,1 L 2,0 z')
35330                   .attr('stroke', 'none')
35331                   .attr('fill', color);
35332           }
35333           addSidedMarker('natural', 'rgb(140, 208, 95)', 0);
35334           // for a coastline, the arrows are (somewhat unintuitively) on
35335           // the water side, so let's color them blue (with a gap) to
35336           // give a stronger indication
35337           addSidedMarker('coastline', '#77dede', 1);
35338           // barriers have a dashed line, and separating the triangle
35339           // from the line visually suits that
35340           addSidedMarker('barrier', '#ddd', 1);
35341           addSidedMarker('man_made', '#fff', 0);
35342
35343           defs
35344               .append('marker')
35345               .attr('id', 'viewfield-marker')
35346               .attr('viewBox', '0 0 16 16')
35347               .attr('refX', 8)
35348               .attr('refY', 16)
35349               .attr('markerWidth', 4)
35350               .attr('markerHeight', 4)
35351               .attr('markerUnits', 'strokeWidth')
35352               .attr('orient', 'auto')
35353               .append('path')
35354               .attr('class', 'viewfield-marker-path')
35355               .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')
35356               .attr('fill', '#333')
35357               .attr('fill-opacity', '0.75')
35358               .attr('stroke', '#fff')
35359               .attr('stroke-width', '0.5px')
35360               .attr('stroke-opacity', '0.75');
35361
35362           defs
35363               .append('marker')
35364               .attr('id', 'viewfield-marker-wireframe')
35365               .attr('viewBox', '0 0 16 16')
35366               .attr('refX', 8)
35367               .attr('refY', 16)
35368               .attr('markerWidth', 4)
35369               .attr('markerHeight', 4)
35370               .attr('markerUnits', 'strokeWidth')
35371               .attr('orient', 'auto')
35372               .append('path')
35373               .attr('class', 'viewfield-marker-path')
35374               .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')
35375               .attr('fill', 'none')
35376               .attr('stroke', '#fff')
35377               .attr('stroke-width', '0.5px')
35378               .attr('stroke-opacity', '0.75');
35379
35380           // add patterns
35381           var patterns = defs.selectAll('pattern')
35382               .data([
35383                   // pattern name, pattern image name
35384                   ['beach', 'dots'],
35385                   ['construction', 'construction'],
35386                   ['cemetery', 'cemetery'],
35387                   ['cemetery_christian', 'cemetery_christian'],
35388                   ['cemetery_buddhist', 'cemetery_buddhist'],
35389                   ['cemetery_muslim', 'cemetery_muslim'],
35390                   ['cemetery_jewish', 'cemetery_jewish'],
35391                   ['farmland', 'farmland'],
35392                   ['farmyard', 'farmyard'],
35393                   ['forest', 'forest'],
35394                   ['forest_broadleaved', 'forest_broadleaved'],
35395                   ['forest_needleleaved', 'forest_needleleaved'],
35396                   ['forest_leafless', 'forest_leafless'],
35397                   ['grass', 'grass'],
35398                   ['landfill', 'landfill'],
35399                   ['meadow', 'grass'],
35400                   ['orchard', 'orchard'],
35401                   ['pond', 'pond'],
35402                   ['quarry', 'quarry'],
35403                   ['scrub', 'bushes'],
35404                   ['vineyard', 'vineyard'],
35405                   ['water_standing', 'lines'],
35406                   ['waves', 'waves'],
35407                   ['wetland', 'wetland'],
35408                   ['wetland_marsh', 'wetland_marsh'],
35409                   ['wetland_swamp', 'wetland_swamp'],
35410                   ['wetland_bog', 'wetland_bog'],
35411                   ['wetland_reedbed', 'wetland_reedbed']
35412               ])
35413               .enter()
35414               .append('pattern')
35415               .attr('id', function (d) { return 'pattern-' + d[0]; })
35416               .attr('width', 32)
35417               .attr('height', 32)
35418               .attr('patternUnits', 'userSpaceOnUse');
35419
35420           patterns
35421               .append('rect')
35422               .attr('x', 0)
35423               .attr('y', 0)
35424               .attr('width', 32)
35425               .attr('height', 32)
35426               .attr('class', function (d) { return 'pattern-color-' + d[0]; });
35427
35428           patterns
35429               .append('image')
35430               .attr('x', 0)
35431               .attr('y', 0)
35432               .attr('width', 32)
35433               .attr('height', 32)
35434               .attr('xlink:href', function (d) {
35435                   return context.imagePath('pattern/' + d[1] + '.png');
35436               });
35437
35438           // add clip paths
35439           defs.selectAll('clipPath')
35440               .data([12, 18, 20, 32, 45])
35441               .enter()
35442               .append('clipPath')
35443               .attr('id', function (d) { return 'clip-square-' + d; })
35444               .append('rect')
35445               .attr('x', 0)
35446               .attr('y', 0)
35447               .attr('width', function (d) { return d; })
35448               .attr('height', function (d) { return d; });
35449
35450           // add symbol spritesheets
35451           defs
35452               .call(drawDefs.addSprites, [
35453                   'iD-sprite', 'maki-sprite', 'temaki-sprite', 'fa-sprite', 'community-sprite'
35454               ]);
35455       }
35456
35457
35458       drawDefs.addSprites = function(selection$$1, ids) {
35459           var spritesheets = selection$$1.selectAll('.spritesheet');
35460           var currData = spritesheets.data();
35461           var data = uniq(currData.concat(ids));
35462
35463           spritesheets
35464               .data(data)
35465               .enter()
35466               .append('g')
35467               .attr('class', function(d) { return 'spritesheet spritesheet-' + d; })
35468               .each(function(d) {
35469                   var url = context.imagePath(d + '.svg');
35470                   var node = select(this).node();
35471                   request(url)
35472                       .mimeType('image/svg+xml')
35473                       .response(function(xhr) { return xhr.responseXML; })
35474                       .get(function(err, svg) {
35475                           if (err) return;
35476                           node.appendChild(
35477                               select(svg.documentElement).attr('id', d).node()
35478                           );
35479                       });
35480               });
35481       };
35482
35483
35484       return drawDefs;
35485   }
35486
35487   function behaviorEdit(context) {
35488
35489       function behavior() {
35490           context.map()
35491               .minzoom(context.minEditableZoom());
35492       }
35493
35494
35495       behavior.off = function() {
35496           context.map()
35497               .minzoom(0);
35498       };
35499
35500       return behavior;
35501   }
35502
35503   /*
35504      The hover behavior adds the `.hover` class on mouseover to all elements to which
35505      the identical datum is bound, and removes it on mouseout.
35506
35507      The :hover pseudo-class is insufficient for iD's purposes because a datum's visual
35508      representation may consist of several elements scattered throughout the DOM hierarchy.
35509      Only one of these elements can have the :hover pseudo-class, but all of them will
35510      have the .hover class.
35511    */
35512   function behaviorHover(context) {
35513       var dispatch$$1 = dispatch('hover');
35514       var _selection = select(null);
35515       var _newId = null;
35516       var _buttonDown;
35517       var _altDisables;
35518       var _target;
35519
35520
35521       function keydown() {
35522           if (_altDisables && event.keyCode === utilKeybinding.modifierCodes.alt) {
35523               _selection.selectAll('.hover')
35524                   .classed('hover-suppressed', true)
35525                   .classed('hover', false);
35526
35527               _selection
35528                   .classed('hover-disabled', true);
35529
35530               dispatch$$1.call('hover', this, null);
35531           }
35532       }
35533
35534
35535       function keyup() {
35536           if (_altDisables && event.keyCode === utilKeybinding.modifierCodes.alt) {
35537               _selection.selectAll('.hover-suppressed')
35538                   .classed('hover-suppressed', false)
35539                   .classed('hover', true);
35540
35541               _selection
35542                   .classed('hover-disabled', false);
35543
35544               dispatch$$1.call('hover', this, _target ? _target.id : null);
35545           }
35546       }
35547
35548
35549       function behavior(selection$$1) {
35550           _selection = selection$$1;
35551           _newId = null;
35552
35553           _selection
35554               .on('mouseover.hover', mouseover)
35555               .on('mouseout.hover', mouseout)
35556               .on('mousedown.hover', mousedown);
35557
35558           select(window)
35559               .on('keydown.hover', keydown)
35560               .on('keyup.hover', keyup);
35561
35562
35563           function mouseover() {
35564               if (_buttonDown) return;
35565               var target = event.target;
35566               enter(target ? target.__data__ : null);
35567           }
35568
35569
35570           function mouseout() {
35571               if (_buttonDown) return;
35572               var target = event.relatedTarget;
35573               enter(target ? target.__data__ : null);
35574           }
35575
35576
35577           function mousedown() {
35578               _buttonDown = true;
35579               select(window)
35580                   .on('mouseup.hover', mouseup, true);
35581           }
35582
35583
35584           function mouseup() {
35585               _buttonDown = false;
35586               select(window)
35587                   .on('mouseup.hover', null, true);
35588           }
35589
35590
35591           function enter(datum) {
35592               if (datum === _target) return;
35593               _target = datum;
35594
35595               _selection.selectAll('.hover')
35596                   .classed('hover', false);
35597               _selection.selectAll('.hover-suppressed')
35598                   .classed('hover-suppressed', false);
35599
35600               // What are we hovering over?
35601               var entity, selector$$1;
35602               if (datum && datum.__featurehash__) {
35603                   entity = datum;
35604                   selector$$1 = '.data' + datum.__featurehash__;
35605
35606               } else if (datum instanceof krError) {
35607                   entity = datum;
35608                   selector$$1 = '.kr_error-' + datum.id;
35609
35610               } else if (datum instanceof osmNote) {
35611                   entity = datum;
35612                   selector$$1 = '.note-' + datum.id;
35613
35614               } else if (datum instanceof osmEntity$$1) {
35615                   entity = datum;
35616                   selector$$1 = '.' + entity.id;
35617                   if (entity.type === 'relation') {
35618                       entity.members.forEach(function(member) { selector$$1 += ', .' + member.id; });
35619                   }
35620
35621               } else if (datum && datum.properties && (datum.properties.entity instanceof osmEntity$$1)) {
35622                   entity = datum.properties.entity;
35623                   selector$$1 = '.' + entity.id;
35624                   if (entity.type === 'relation') {
35625                       entity.members.forEach(function(member) { selector$$1 += ', .' + member.id; });
35626                   }
35627               }
35628
35629               // Update hover state and dispatch event
35630               if (entity && entity.id !== _newId) {
35631                   // If drawing a way, don't hover on a node that was just placed. #3974
35632                   var mode = context.mode() && context.mode().id;
35633                   if ((mode === 'draw-line' || mode === 'draw-area') && !_newId && entity.type === 'node') {
35634                       _newId = entity.id;
35635                       return;
35636                   }
35637
35638                   var suppressed = _altDisables && event && event.altKey;
35639                   _selection.selectAll(selector$$1)
35640                       .classed(suppressed ? 'hover-suppressed' : 'hover', true);
35641
35642                   dispatch$$1.call('hover', this, !suppressed && entity);
35643
35644               } else {
35645                   dispatch$$1.call('hover', this, null);
35646               }
35647           }
35648       }
35649
35650
35651       behavior.off = function(selection$$1) {
35652           selection$$1.selectAll('.hover')
35653               .classed('hover', false);
35654           selection$$1.selectAll('.hover-suppressed')
35655               .classed('hover-suppressed', false);
35656           selection$$1
35657               .classed('hover-disabled', false);
35658
35659           selection$$1
35660               .on('mouseover.hover', null)
35661               .on('mouseout.hover', null)
35662               .on('mousedown.hover', null);
35663
35664           select(window)
35665               .on('keydown.hover', null)
35666               .on('keyup.hover', null);
35667       };
35668
35669
35670       behavior.altDisables = function(val) {
35671           if (!arguments.length) return _altDisables;
35672           _altDisables = val;
35673           return behavior;
35674       };
35675
35676
35677       return utilRebind(behavior, dispatch$$1, 'on');
35678   }
35679
35680   function refresh(selection, node) {
35681       var cr = node.getBoundingClientRect();
35682       var prop = [cr.width, cr.height];
35683       selection.property('__dimensions__', prop);
35684       return prop;
35685   }
35686
35687   function utilGetDimensions(selection, force) {
35688       if (!selection || selection.empty()) {
35689           return [0, 0];
35690       }
35691       var node = selection.node(),
35692           cached = selection.property('__dimensions__');
35693       return (!cached || force) ? refresh(selection, node) : cached;
35694   }
35695
35696
35697   function utilSetDimensions(selection, dimensions) {
35698       if (!selection || selection.empty()) {
35699           return selection;
35700       }
35701       var node = selection.node();
35702       if (dimensions === null) {
35703           refresh(selection, node);
35704           return selection;
35705       }
35706       return selection
35707           .property('__dimensions__', [dimensions[0], dimensions[1]])
35708           .attr('width', dimensions[0])
35709           .attr('height', dimensions[1]);
35710   }
35711
35712   function behaviorTail() {
35713       var container;
35714       var xmargin = 25;
35715       var tooltipSize = [0, 0];
35716       var selectionSize = [0, 0];
35717       var _text;
35718
35719
35720       function behavior(selection$$1) {
35721           if (!_text) return;
35722
35723           select(window)
35724               .on('resize.tail', function() { selectionSize = utilGetDimensions(selection$$1); });
35725
35726           container = select(document.body)
35727               .append('div')
35728               .style('display', 'none')
35729               .attr('class', 'tail tooltip-inner');
35730
35731           container.append('div')
35732               .text(_text);
35733
35734           selection$$1
35735               .on('mousemove.tail', mousemove)
35736               .on('mouseenter.tail', mouseenter)
35737               .on('mouseleave.tail', mouseleave);
35738
35739           container
35740               .on('mousemove.tail', mousemove);
35741
35742           tooltipSize = utilGetDimensions(container);
35743           selectionSize = utilGetDimensions(selection$$1);
35744
35745
35746           function show() {
35747               container.style('display', 'block');
35748               tooltipSize = utilGetDimensions(container);
35749           }
35750
35751
35752           function mousemove() {
35753               if (container.style('display') === 'none') show();
35754               var xoffset = ((event.clientX + tooltipSize[0] + xmargin) > selectionSize[0]) ?
35755                   -tooltipSize[0] - xmargin : xmargin;
35756               container.classed('left', xoffset > 0);
35757               utilSetTransform(container, event.clientX + xoffset, event.clientY);
35758           }
35759
35760
35761           function mouseleave() {
35762               if (event.relatedTarget !== container.node()) {
35763                   container.style('display', 'none');
35764               }
35765           }
35766
35767
35768           function mouseenter() {
35769               if (event.relatedTarget !== container.node()) {
35770                   show();
35771               }
35772           }
35773       }
35774
35775
35776       behavior.off = function(selection$$1) {
35777           if (!_text) return;
35778
35779           container
35780               .on('mousemove.tail', null)
35781               .remove();
35782
35783           selection$$1
35784               .on('mousemove.tail', null)
35785               .on('mouseenter.tail', null)
35786               .on('mouseleave.tail', null);
35787
35788           select(window)
35789               .on('resize.tail', null);
35790       };
35791
35792
35793       behavior.text = function(val) {
35794           if (!arguments.length) return _text;
35795           _text = val;
35796           return behavior;
35797       };
35798
35799
35800       return behavior;
35801   }
35802
35803   var _usedTails = {};
35804   var _disableSpace = false;
35805   var _lastSpace = null;
35806
35807
35808   function behaviorDraw(context) {
35809       var dispatch$$1 = dispatch(
35810           'move', 'click', 'clickWay', 'clickNode', 'undo', 'cancel', 'finish'
35811       );
35812
35813       var keybinding = utilKeybinding('draw');
35814
35815       var hover = behaviorHover(context).altDisables(true)
35816           .on('hover', context.ui().sidebar.hover);
35817       var tail = behaviorTail();
35818       var edit = behaviorEdit(context);
35819
35820       var closeTolerance = 4;
35821       var tolerance = 12;
35822       var _mouseLeave = false;
35823       var _lastMouse = null;
35824
35825
35826       // related code
35827       // - `mode/drag_node.js` `datum()`
35828       function datum() {
35829           var mode = context.mode();
35830           var isNote = mode && (mode.id.indexOf('note') !== -1);
35831           if (event.altKey || isNote) return {};
35832
35833           var element;
35834           if (event.type === 'keydown') {
35835               element = _lastMouse && _lastMouse.target;
35836           } else {
35837               element = event.target;
35838           }
35839
35840           // When drawing, snap only to touch targets..
35841           // (this excludes area fills and active drawing elements)
35842           var d = element.__data__;
35843           return (d && d.properties && d.properties.target) ? d : {};
35844       }
35845
35846
35847       function mousedown() {
35848
35849           function point$$1() {
35850               var p = context.container().node();
35851               return touchId !== null ? d3_touches(p).filter(function(p) {
35852                   return p.identifier === touchId;
35853               })[0] : mouse(p);
35854           }
35855
35856           var element = select(this);
35857           var touchId = event.touches ? event.changedTouches[0].identifier : null;
35858           var t1 = +new Date();
35859           var p1 = point$$1();
35860
35861           element.on('mousemove.draw', null);
35862
35863           select(window).on('mouseup.draw', function() {
35864               var t2 = +new Date();
35865               var p2 = point$$1();
35866               var dist = geoVecLength(p1, p2);
35867
35868               element.on('mousemove.draw', mousemove);
35869               select(window).on('mouseup.draw', null);
35870
35871               if (dist < closeTolerance || (dist < tolerance && (t2 - t1) < 500)) {
35872                   // Prevent a quick second click
35873                   select(window).on('click.draw-block', function() {
35874                       event.stopPropagation();
35875                   }, true);
35876
35877                   context.map().dblclickEnable(false);
35878
35879                   window.setTimeout(function() {
35880                       context.map().dblclickEnable(true);
35881                       select(window).on('click.draw-block', null);
35882                   }, 500);
35883
35884                   click();
35885               }
35886           }, true);
35887       }
35888
35889
35890       function mousemove() {
35891           _lastMouse = event;
35892           dispatch$$1.call('move', this, datum());
35893       }
35894
35895
35896       function mouseenter() {
35897           _mouseLeave = false;
35898       }
35899
35900
35901       function mouseleave() {
35902           _mouseLeave = true;
35903       }
35904
35905
35906       // related code
35907       // - `mode/drag_node.js`     `doMode()`
35908       // - `behavior/draw.js`      `click()`
35909       // - `behavior/draw_way.js`  `move()`
35910       function click() {
35911           var d = datum();
35912           var target = d && d.properties && d.properties.entity;
35913
35914           if (target && target.type === 'node') {   // Snap to a node
35915               dispatch$$1.call('clickNode', this, target, d);
35916               return;
35917
35918           } else if (target && target.type === 'way') {   // Snap to a way
35919               var choice = geoChooseEdge(
35920                   context.childNodes(target), context.mouse(), context.projection, context.activeID()
35921               );
35922               if (choice) {
35923                   var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]];
35924                   dispatch$$1.call('clickWay', this, choice.loc, edge, d);
35925                   return;
35926               }
35927           }
35928           dispatch$$1.call('click', this, context.map().mouseCoordinates(), d);
35929       }
35930
35931
35932       function space() {
35933           event.preventDefault();
35934           event.stopPropagation();
35935
35936           var currSpace = context.mouse();
35937           if (_disableSpace && _lastSpace) {
35938               var dist = geoVecLength(_lastSpace, currSpace);
35939               if (dist > tolerance) {
35940                   _disableSpace = false;
35941               }
35942           }
35943
35944           if (_disableSpace || _mouseLeave || !_lastMouse) return;
35945
35946           // user must move mouse or release space bar to allow another click
35947           _lastSpace = currSpace;
35948           _disableSpace = true;
35949
35950           select(window).on('keyup.space-block', function() {
35951               event.preventDefault();
35952               event.stopPropagation();
35953               _disableSpace = false;
35954               select(window).on('keyup.space-block', null);
35955           });
35956
35957           click();
35958       }
35959
35960
35961       function backspace() {
35962           event.preventDefault();
35963           dispatch$$1.call('undo');
35964       }
35965
35966
35967       function del() {
35968           event.preventDefault();
35969           dispatch$$1.call('cancel');
35970       }
35971
35972
35973       function ret() {
35974           event.preventDefault();
35975           dispatch$$1.call('finish');
35976       }
35977
35978
35979       function behavior(selection$$1) {
35980           context.install(hover);
35981           context.install(edit);
35982
35983           if (!context.inIntro() && !_usedTails[tail.text()]) {
35984               context.install(tail);
35985           }
35986
35987           keybinding
35988               .on('⌫', backspace)
35989               .on('⌦', del)
35990               .on('⎋', ret)
35991               .on('↩', ret)
35992               .on('space', space)
35993               .on('⌥space', space);
35994
35995           selection$$1
35996               .on('mouseenter.draw', mouseenter)
35997               .on('mouseleave.draw', mouseleave)
35998               .on('mousedown.draw', mousedown)
35999               .on('mousemove.draw', mousemove);
36000
36001           select(document)
36002               .call(keybinding);
36003
36004           return behavior;
36005       }
36006
36007
36008       behavior.off = function(selection$$1) {
36009           context.ui().sidebar.hover.cancel();
36010           context.uninstall(hover);
36011           context.uninstall(edit);
36012
36013           if (!context.inIntro() && !_usedTails[tail.text()]) {
36014               context.uninstall(tail);
36015               _usedTails[tail.text()] = true;
36016           }
36017
36018           selection$$1
36019               .on('mouseenter.draw', null)
36020               .on('mouseleave.draw', null)
36021               .on('mousedown.draw', null)
36022               .on('mousemove.draw', null);
36023
36024           select(window)
36025               .on('mouseup.draw', null);
36026               // note: keyup.space-block, click.draw-block should remain
36027
36028           select(document)
36029               .call(keybinding.unbind);
36030       };
36031
36032
36033       behavior.tail = function(_) {
36034           tail.text(_);
36035           return behavior;
36036       };
36037
36038
36039       return utilRebind(behavior, dispatch$$1, 'on');
36040   }
36041
36042   function behaviorAddWay(context) {
36043       var dispatch$$1 = dispatch('start', 'startFromWay', 'startFromNode');
36044       var draw = behaviorDraw(context);
36045
36046       function behavior(surface) {
36047           draw.on('click', function() { dispatch$$1.apply('start', this, arguments); })
36048               .on('clickWay', function() { dispatch$$1.apply('startFromWay', this, arguments); })
36049               .on('clickNode', function() { dispatch$$1.apply('startFromNode', this, arguments); })
36050               .on('cancel', behavior.cancel)
36051               .on('finish', behavior.cancel);
36052
36053           context.map()
36054               .dblclickEnable(false);
36055
36056           surface.call(draw);
36057       }
36058
36059
36060       behavior.off = function(surface) {
36061           surface.call(draw.off);
36062       };
36063
36064
36065       behavior.cancel = function() {
36066           window.setTimeout(function() {
36067               context.map().dblclickEnable(true);
36068           }, 1000);
36069
36070           context.enter(modeBrowse(context));
36071       };
36072
36073
36074       behavior.tail = function(text) {
36075           draw.tail(text);
36076           return behavior;
36077       };
36078
36079
36080       return utilRebind(behavior, dispatch$$1, 'on');
36081   }
36082
36083   /**
36084    * Performs a deep comparison between two values to determine if they are
36085    * equivalent.
36086    *
36087    * **Note:** This method supports comparing arrays, array buffers, booleans,
36088    * date objects, error objects, maps, numbers, `Object` objects, regexes,
36089    * sets, strings, symbols, and typed arrays. `Object` objects are compared
36090    * by their own, not inherited, enumerable properties. Functions and DOM
36091    * nodes are compared by strict equality, i.e. `===`.
36092    *
36093    * @static
36094    * @memberOf _
36095    * @since 0.1.0
36096    * @category Lang
36097    * @param {*} value The value to compare.
36098    * @param {*} other The other value to compare.
36099    * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
36100    * @example
36101    *
36102    * var object = { 'a': 1 };
36103    * var other = { 'a': 1 };
36104    *
36105    * _.isEqual(object, other);
36106    * // => true
36107    *
36108    * object === other;
36109    * // => false
36110    */
36111   function isEqual(value, other) {
36112     return baseIsEqual(value, other);
36113   }
36114
36115   function behaviorBreathe() {
36116       var duration = 800;
36117       var steps = 4;
36118       var selector$$1 = '.selected.shadow, .selected .shadow';
36119       var _selected = select(null);
36120       var _classed = '';
36121       var _params = {};
36122       var _done = false;
36123       var _timer;
36124
36125
36126       function ratchetyInterpolator(a, b, steps, units) {
36127           a = parseFloat(a);
36128           b = parseFloat(b);
36129           var sample = quantize()
36130               .domain([0, 1])
36131               .range(d3_quantize(interpolateNumber(a, b), steps));
36132
36133           return function(t) {
36134               return String(sample(t)) + (units || '');
36135           };
36136       }
36137
36138
36139       function reset(selection$$1) {
36140           selection$$1
36141               .style('stroke-opacity', null)
36142               .style('stroke-width', null)
36143               .style('fill-opacity', null)
36144               .style('r', null);
36145       }
36146
36147
36148       function setAnimationParams(transition, fromTo) {
36149           var toFrom = (fromTo === 'from' ? 'to' : 'from');
36150
36151           transition
36152               .styleTween('stroke-opacity', function(d) {
36153                   return ratchetyInterpolator(
36154                       _params[d.id][toFrom].opacity,
36155                       _params[d.id][fromTo].opacity,
36156                       steps
36157                   );
36158               })
36159               .styleTween('stroke-width', function(d) {
36160                   return ratchetyInterpolator(
36161                       _params[d.id][toFrom].width,
36162                       _params[d.id][fromTo].width,
36163                       steps,
36164                       'px'
36165                   );
36166               })
36167               .styleTween('fill-opacity', function(d) {
36168                   return ratchetyInterpolator(
36169                       _params[d.id][toFrom].opacity,
36170                       _params[d.id][fromTo].opacity,
36171                       steps
36172                   );
36173               })
36174               .styleTween('r', function(d) {
36175                   return ratchetyInterpolator(
36176                       _params[d.id][toFrom].width,
36177                       _params[d.id][fromTo].width,
36178                       steps,
36179                       'px'
36180                   );
36181               });
36182       }
36183
36184
36185       function calcAnimationParams(selection$$1) {
36186           selection$$1
36187               .call(reset)
36188               .each(function(d) {
36189                   var s = select(this);
36190                   var tag = s.node().tagName;
36191                   var p = {'from': {}, 'to': {}};
36192                   var opacity;
36193                   var width;
36194
36195                   // determine base opacity and width
36196                   if (tag === 'circle') {
36197                       opacity = parseFloat(s.style('fill-opacity') || 0.5);
36198                       width = parseFloat(s.style('r') || 15.5);
36199                   } else {
36200                       opacity = parseFloat(s.style('stroke-opacity') || 0.7);
36201                       width = parseFloat(s.style('stroke-width') || 10);
36202                   }
36203
36204                   // calculate from/to interpolation params..
36205                   p.tag = tag;
36206                   p.from.opacity = opacity * 0.6;
36207                   p.to.opacity = opacity * 1.25;
36208                   p.from.width = width * 0.7;
36209                   p.to.width = width * (tag === 'circle' ? 1.5 : 1);
36210                   _params[d.id] = p;
36211               });
36212       }
36213
36214
36215       function run(surface, fromTo) {
36216           var toFrom = (fromTo === 'from' ? 'to' : 'from');
36217           var currSelected = surface.selectAll(selector$$1);
36218           var currClassed = surface.attr('class');
36219
36220           if (_done || currSelected.empty()) {
36221               _selected.call(reset);
36222               return;
36223           }
36224
36225           if (!isEqual(currSelected.data(), _selected.data()) || currClassed !== _classed) {
36226               _selected.call(reset);
36227               _classed = currClassed;
36228               _selected = currSelected.call(calcAnimationParams);
36229           }
36230
36231           _selected
36232               .transition()
36233               .duration(duration)
36234               .call(setAnimationParams, fromTo)
36235               .on('end', function() {
36236                   surface.call(run, toFrom);
36237               });
36238       }
36239
36240
36241       function behavior(surface) {
36242           _done = false;
36243           _timer = timer(function() {
36244               // wait for elements to actually become selected
36245               if (surface.selectAll(selector$$1).empty()) {
36246                   return false;
36247               }
36248
36249               surface.call(run, 'from');
36250               _timer.stop();
36251               return true;
36252           }, 20);
36253       }
36254
36255
36256       behavior.off = function() {
36257           _done = true;
36258           if (_timer) {
36259               _timer.stop();
36260           }
36261           _selected
36262               .interrupt()
36263               .call(reset);
36264       };
36265
36266
36267       return behavior;
36268   }
36269
36270   var _tooltipID = 0;
36271
36272   function tooltip() {
36273       var _id = _tooltipID++;
36274       var tooltip = function(selection$$1) {
36275           selection$$1.each(setup);
36276       };
36277       var _animation = utilFunctor(false);
36278       var _title = function() {
36279           var title = this.getAttribute('data-original-title');
36280           if (title) {
36281               return title;
36282           } else {
36283               title = this.getAttribute('title');
36284               this.removeAttribute('title');
36285               this.setAttribute('data-original-title', title);
36286           }
36287           return title;
36288       };
36289       var _html = utilFunctor(false);
36290       var _placement = utilFunctor('top');
36291
36292
36293       tooltip.title = function(val) {
36294           if (arguments.length) {
36295               _title = utilFunctor(val);
36296               return tooltip;
36297           } else {
36298               return _title;
36299           }
36300       };
36301
36302
36303       tooltip.html = function(val) {
36304           if (arguments.length) {
36305               _html = utilFunctor(val);
36306               return tooltip;
36307           } else {
36308               return _html;
36309           }
36310       };
36311
36312
36313       tooltip.placement = function(val) {
36314           if (arguments.length) {
36315               _placement = utilFunctor(val);
36316               return tooltip;
36317           } else {
36318               return _placement;
36319           }
36320       };
36321
36322
36323       tooltip.show = function(selection$$1) {
36324           selection$$1.each(show);
36325       };
36326
36327
36328       tooltip.hide = function(selection$$1) {
36329           selection$$1.each(hide);
36330       };
36331
36332
36333       tooltip.toggle = function(selection$$1) {
36334           selection$$1.each(toggle);
36335       };
36336
36337
36338       tooltip.destroy = function(selection$$1, selector$$1) {
36339           // by default, just destroy the current tooltip
36340           selector$$1 = selector$$1 || '.tooltip-' + _id;
36341
36342           selection$$1
36343               .on('mouseenter.tooltip', null)
36344               .on('mouseleave.tooltip', null)
36345               .attr('title', function() {
36346                   return this.getAttribute('data-original-title') || this.getAttribute('title');
36347               })
36348               .attr('data-original-title', null)
36349               .selectAll(selector$$1)
36350               .remove();
36351       };
36352
36353
36354       tooltip.destroyAny = function(selection$$1) {
36355           selection$$1.call(tooltip.destroy, '.tooltip');
36356       };
36357
36358
36359       function setup() {
36360           var root = select(this);
36361           var animate = _animation.apply(this, arguments);
36362           var tip = root.selectAll('.tooltip-' + _id)
36363               .data([0]);
36364
36365           var enter = tip.enter()
36366               .append('div')
36367               .attr('class', 'tooltip tooltip-' + _id);
36368
36369           enter
36370               .append('div')
36371               .attr('class', 'tooltip-arrow');
36372
36373           enter
36374               .append('div')
36375               .attr('class', 'tooltip-inner');
36376
36377           tip = enter
36378               .merge(tip);
36379
36380           if (animate) {
36381               tip.classed('fade', true);
36382           }
36383
36384           var place = _placement.apply(this, arguments);
36385           tip.classed(place, true);
36386
36387           root.on('mouseenter.tooltip', show);
36388           root.on('mouseleave.tooltip', hide);
36389       }
36390
36391
36392       function show() {
36393           var root = select(this);
36394           var content = _title.apply(this, arguments);
36395           var tip = root.selectAll('.tooltip-' + _id);
36396
36397           if (tip.empty()) {   // tooltip was removed somehow, put it back
36398               root.call(tooltip.destroy);
36399               root.each(setup);
36400               tip = root.selectAll('.tooltip-' + _id);
36401           }
36402
36403           tip.classed('in', true);
36404           var markup = _html.apply(this, arguments);
36405
36406           tip.selectAll('.tooltip-inner')[markup ? 'html' : 'text'](content);
36407           var place = _placement.apply(this, arguments);
36408           var outer = getPosition(root.node());
36409           var inner = getPosition(tip.node());
36410           var pos;
36411
36412           switch (place) {
36413               case 'top':
36414               pos = { x: outer.x + (outer.w - inner.w) / 2, y: outer.y - inner.h };
36415               break;
36416               case 'right':
36417               pos = { x: outer.x + outer.w, y: outer.y + (outer.h - inner.h) / 2 };
36418               break;
36419               case 'left':
36420               pos = { x: outer.x - inner.w, y: outer.y + (outer.h - inner.h) / 2 };
36421               break;
36422               case 'bottom':
36423               pos = { x: Math.max(0, outer.x + (outer.w - inner.w) / 2), y: outer.y + outer.h };
36424               break;
36425           }
36426
36427           if (pos) {
36428               tip.style('left', ~~pos.x + 'px').style('top', ~~pos.y + 'px');
36429           } else {
36430               tip.style('left', null).style('top', null);
36431           }
36432
36433           this.tooltipVisible = true;
36434
36435
36436           function getPosition(node) {
36437               var mode = select(node).style('position');
36438               if (mode === 'absolute' || mode === 'static') {
36439                   return {
36440                       x: node.offsetLeft,
36441                       y: node.offsetTop,
36442                       w: node.offsetWidth,
36443                       h: node.offsetHeight
36444                   };
36445               } else {
36446                   return {
36447                       x: 0,
36448                       y: 0,
36449                       w: node.offsetWidth,
36450                       h: node.offsetHeight
36451                   };
36452               }
36453           }
36454       }
36455
36456
36457       function hide() {
36458           select(this).selectAll('.tooltip-' + _id).classed('in', false);
36459           this.tooltipVisible = false;
36460       }
36461
36462
36463       function toggle() {
36464           if (this.tooltipVisible) {
36465               hide.apply(this, arguments);
36466           } else {
36467               show.apply(this, arguments);
36468           }
36469       }
36470
36471
36472       return tooltip;
36473   }
36474
36475   function uiAccount(context) {
36476       var osm = context.connection();
36477
36478
36479       function update(selection$$1) {
36480           if (!osm) return;
36481
36482           if (!osm.authenticated()) {
36483               selection$$1.selectAll('#userLink, #logoutLink')
36484                   .classed('hide', true);
36485               return;
36486           }
36487
36488           osm.userDetails(function(err, details) {
36489               var userLink = selection$$1.select('#userLink'),
36490                   logoutLink = selection$$1.select('#logoutLink');
36491
36492               userLink.html('');
36493               logoutLink.html('');
36494
36495               if (err) return;
36496
36497               selection$$1.selectAll('#userLink, #logoutLink')
36498                   .classed('hide', false);
36499
36500               // Link
36501               userLink.append('a')
36502                   .attr('href', osm.userURL(details.display_name))
36503                   .attr('target', '_blank');
36504
36505               // Add thumbnail or dont
36506               if (details.image_url) {
36507                   userLink.append('img')
36508                       .attr('class', 'icon pre-text user-icon')
36509                       .attr('src', details.image_url);
36510               } else {
36511                   userLink
36512                       .call(svgIcon('#iD-icon-avatar', 'pre-text light'));
36513               }
36514
36515               // Add user name
36516               userLink.append('span')
36517                   .attr('class', 'label')
36518                   .text(details.display_name);
36519
36520               logoutLink.append('a')
36521                   .attr('class', 'logout')
36522                   .attr('href', '#')
36523                   .text(t('logout'))
36524                   .on('click.logout', function() {
36525                       event.preventDefault();
36526                       osm.logout();
36527                   });
36528           });
36529       }
36530
36531
36532       return function(selection$$1) {
36533           selection$$1.append('li')
36534               .attr('id', 'logoutLink')
36535               .classed('hide', true);
36536
36537           selection$$1.append('li')
36538               .attr('id', 'userLink')
36539               .classed('hide', true);
36540
36541           if (osm) {
36542               osm.on('change.account', function() { update(selection$$1); });
36543               update(selection$$1);
36544           }
36545       };
36546   }
36547
36548   function uiAttribution(context) {
36549       var selection$$1;
36550
36551
36552       function attribution(data, klass) {
36553           var div = selection$$1.selectAll('.' + klass)
36554               .data([0]);
36555
36556           div = div.enter()
36557               .append('div')
36558               .attr('class', klass)
36559               .merge(div);
36560
36561
36562           var background = div.selectAll('.attribution')
36563               .data(data, function(d) { return d.name(); });
36564
36565           background.exit()
36566               .remove();
36567
36568           background = background.enter()
36569               .append('span')
36570               .attr('class', 'attribution')
36571               .each(function(d) {
36572                   if (d.terms_html) {
36573                       select(this)
36574                           .html(d.terms_html);
36575                       return;
36576                   }
36577
36578                   var selection$$1;
36579                   if (d.terms_url) {
36580                       selection$$1 = select(this)
36581                           .append('a')
36582                           .attr('href', d.terms_url)
36583                           .attr('target', '_blank');
36584                   } else {
36585                       selection$$1 = select(this);
36586                   }
36587
36588
36589                   var id_safe = d.id.replace(/\./g, '<TX_DOT>');
36590                   var terms_text = t('imagery.' + id_safe + '.attribution.text',
36591                       { default: d.terms_text || d.id || d.name() }
36592                   );
36593
36594                   if (d.icon && !d.overlay) {
36595                       selection$$1
36596                           .append('img')
36597                           .attr('class', 'source-image')
36598                           .attr('src', d.icon);
36599                   }
36600
36601                   selection$$1
36602                       .append('span')
36603                       .attr('class', 'attribution-text')
36604                       .text(terms_text);
36605               })
36606               .merge(background);
36607
36608
36609           var copyright = background.selectAll('.copyright-notice')
36610               .data(function(d) {
36611                   var notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
36612                   return notice ? [notice] : [];
36613               });
36614
36615           copyright.exit()
36616               .remove();
36617
36618           copyright = copyright.enter()
36619               .append('span')
36620               .attr('class', 'copyright-notice')
36621               .merge(copyright);
36622
36623           copyright
36624               .text(String);
36625       }
36626
36627
36628       function update() {
36629           attribution([context.background().baseLayerSource()], 'base-layer-attribution');
36630           attribution(context.background().overlayLayerSources().filter(function (s) {
36631               return s.validZoom(context.map().zoom());
36632           }), 'overlay-layer-attribution');
36633       }
36634
36635
36636       return function(select$$1) {
36637           selection$$1 = select$$1;
36638
36639           context.background()
36640               .on('change.attribution', update);
36641
36642           context.map()
36643               .on('move.attribution', throttle(update, 400, {leading: false}));
36644
36645           update();
36646       };
36647   }
36648
36649   // toggles the visibility of ui elements, using a combination of the
36650   // hide class, which sets display=none, and a d3 transition for opacity.
36651   // this will cause blinking when called repeatedly, so check that the
36652   // value actually changes between calls.
36653   function uiToggle(show, callback) {
36654       return function(selection$$1) {
36655           selection$$1
36656               .style('opacity', show ? 0 : 1)
36657               .classed('hide', false)
36658               .transition()
36659               .style('opacity', show ? 1 : 0)
36660               .on('end', function() {
36661                   select(this)
36662                       .classed('hide', !show)
36663                       .style('opacity', null);
36664                   if (callback) callback.apply(this);
36665               });
36666       };
36667   }
36668
36669   function uiDisclosure(context, key, expandedDefault) {
36670       var dispatch$$1 = dispatch('toggled');
36671       var _preference = (context.storage('disclosure.' + key + '.expanded'));
36672       var _expanded = (_preference === null ? !!expandedDefault : (_preference === 'true'));
36673       var _title;
36674       var _updatePreference = true;
36675       var _content = function () {};
36676
36677
36678       var disclosure = function(selection$$1) {
36679           var hideToggle = selection$$1.selectAll('.hide-toggle-' + key)
36680               .data([0]);
36681
36682           // enter
36683           var hideToggleEnter = hideToggle.enter()
36684               .append('a')
36685               .attr('href', '#')
36686               .attr('class', 'hide-toggle hide-toggle-' + key)
36687               .call(svgIcon('', 'pre-text', 'hide-toggle-icon'));
36688
36689           hideToggleEnter
36690               .append('span')
36691               .attr('class', 'hide-toggle-text');
36692
36693           // update
36694           hideToggle = hideToggleEnter
36695               .merge(hideToggle);
36696
36697           hideToggle
36698               .on('click', toggle)
36699               .classed('expanded', _expanded);
36700
36701           hideToggle.selectAll('.hide-toggle-text')
36702               .text(_title);
36703
36704           hideToggle.selectAll('.hide-toggle-icon')
36705               .attr('xlink:href', _expanded ? '#iD-icon-down'
36706                   : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
36707               );
36708
36709
36710           var wrap = selection$$1.selectAll('.disclosure-wrap')
36711               .data([0]);
36712
36713           // enter/update
36714           wrap = wrap.enter()
36715               .append('div')
36716               .attr('class', 'disclosure-wrap disclosure-wrap-' + key)
36717               .merge(wrap)
36718               .classed('hide', !_expanded);
36719
36720           if (_expanded) {
36721               wrap
36722                   .call(_content);
36723           }
36724
36725
36726           function toggle() {
36727               event.preventDefault();
36728
36729               _expanded = !_expanded;
36730
36731               if (_updatePreference) {
36732                   context.storage('disclosure.' + key + '.expanded', _expanded);
36733               }
36734
36735               hideToggle
36736                   .classed('expanded', _expanded);
36737
36738               hideToggle.selectAll('.hide-toggle-icon')
36739                   .attr('xlink:href', _expanded ? '#iD-icon-down'
36740                       : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
36741                   );
36742
36743               if (_expanded) {
36744                   wrap
36745                       .call(_content);
36746               }
36747
36748               wrap
36749                   .call(uiToggle(_expanded));
36750
36751               dispatch$$1.call('toggled', this, _expanded);
36752           }
36753       };
36754
36755
36756       disclosure.title = function(val) {
36757           if (!arguments.length) return _title;
36758           _title = val;
36759           return disclosure;
36760       };
36761
36762
36763       disclosure.expanded = function(val) {
36764           if (!arguments.length) return _expanded;
36765           _expanded = val;
36766           return disclosure;
36767       };
36768
36769
36770       disclosure.updatePreference = function(val) {
36771           if (!arguments.length) return _updatePreference;
36772           _updatePreference = val;
36773           return disclosure;
36774       };
36775
36776
36777       disclosure.content = function(val) {
36778           if (!arguments.length) return _content;
36779           _content = val;
36780           return disclosure;
36781       };
36782
36783
36784       return utilRebind(disclosure, dispatch$$1, 'on');
36785   }
36786
36787   function uiBackgroundDisplayOptions(context) {
36788       var detected = utilDetect();
36789       var storedOpacity = context.storage('background-opacity');
36790       var minVal = 0.25;
36791       var maxVal = detected.cssfilters ? 2 : 1;
36792
36793       var sliders = detected.cssfilters
36794           ? ['brightness', 'contrast', 'saturation', 'sharpness']
36795           : ['brightness'];
36796
36797       var _options = {
36798           brightness: (storedOpacity !== null ? (+storedOpacity) : 1),
36799           contrast: 1,
36800           saturation: 1,
36801           sharpness: 1
36802       };
36803
36804       var _selection = select(null);
36805
36806
36807       function clamp(x, min, max) {
36808           return Math.max(min, Math.min(x, max));
36809       }
36810
36811
36812       function updateValue(d, val) {
36813           if (!val && event && event.target) {
36814               val = event.target.value;
36815           }
36816
36817           val = clamp(val, minVal, maxVal);
36818
36819           _options[d] = val;
36820           context.background()[d](val);
36821
36822           if (d === 'brightness') {
36823               context.storage('background-opacity', val);
36824           }
36825
36826           _selection
36827               .call(render);
36828       }
36829
36830
36831       function render(selection$$1) {
36832           var container = selection$$1.selectAll('.display-options-container')
36833               .data([0]);
36834
36835           var containerEnter = container.enter()
36836               .append('div')
36837               .attr('class', 'display-options-container controls-list');
36838
36839           // add slider controls
36840           var slidersEnter = containerEnter.selectAll('.display-control')
36841               .data(sliders)
36842               .enter()
36843               .append('div')
36844               .attr('class', function(d) { return 'display-control display-control-' + d; });
36845
36846           slidersEnter
36847               .append('h5')
36848               .text(function(d) { return t('background.' + d); })
36849               .append('span')
36850               .attr('class', function(d) { return 'display-option-value display-option-value-' + d; });
36851
36852           slidersEnter
36853               .append('input')
36854               .attr('class', function(d) { return 'display-option-input display-option-input-' + d; })
36855               .attr('type', 'range')
36856               .attr('min', minVal)
36857               .attr('max', maxVal)
36858               .attr('step', '0.05')
36859               .on('input', function(d) {
36860                   var val = select(this).property('value');
36861                   updateValue(d, val);
36862               });
36863
36864           slidersEnter
36865               .append('button')
36866               .attr('title', t('background.reset'))
36867               .attr('class', function(d) { return 'display-option-reset display-option-reset-' + d; })
36868               .on('click', function(d) {
36869                   if (event.button !== 0) return;
36870                   updateValue(d, 1);
36871               })
36872               .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
36873
36874
36875           // update
36876           container = containerEnter
36877               .merge(container);
36878
36879           container.selectAll('.display-option-input')
36880               .property('value', function(d) { return _options[d]; });
36881
36882           container.selectAll('.display-option-value')
36883               .text(function(d) { return Math.floor(_options[d] * 100) + '%'; });
36884
36885           container.selectAll('.display-option-reset')
36886               .classed('disabled', function(d) { return _options[d] === 1; });
36887
36888           // first time only, set brightness if needed
36889           if (containerEnter.size() && _options.brightness !== 1) {
36890               context.background().brightness(_options.brightness);
36891           }
36892       }
36893
36894
36895       function backgroundDisplayOptions(selection$$1) {
36896           _selection = selection$$1;
36897
36898           selection$$1
36899               .call(uiDisclosure(context, 'background_display_options', true)
36900                   .title(t('background.display_options'))
36901                   .content(render)
36902               );
36903       }
36904
36905
36906       return backgroundDisplayOptions;
36907   }
36908
36909   function uiBackgroundOffset(context) {
36910       var directions = [
36911           ['right', [0.5, 0]],
36912           ['top', [0, -0.5]],
36913           ['left', [-0.5, 0]],
36914           ['bottom', [0, 0.5]]
36915       ];
36916
36917
36918       function d3_eventCancel() {
36919           event.stopPropagation();
36920           event.preventDefault();
36921       }
36922
36923
36924       function updateValue() {
36925           var meters = geoOffsetToMeters(context.background().offset());
36926           var x = +meters[0].toFixed(2);
36927           var y = +meters[1].toFixed(2);
36928
36929           d3_selectAll('.nudge-inner-rect')
36930               .select('input')
36931               .classed('error', false)
36932               .property('value', x + ', ' + y);
36933
36934           d3_selectAll('.nudge-reset')
36935               .classed('disabled', function() {
36936                   return (x === 0 && y === 0);
36937               });
36938       }
36939
36940
36941       function resetOffset() {
36942           context.background().offset([0, 0]);
36943           updateValue();
36944       }
36945
36946
36947       function nudge(d) {
36948           context.background().nudge(d, context.map().zoom());
36949           updateValue();
36950       }
36951
36952
36953       function clickNudgeButton(d) {
36954           var interval;
36955           var timeout = window.setTimeout(function() {
36956                   interval = window.setInterval(nudge.bind(null, d), 100);
36957               }, 500);
36958
36959           function doneNudge() {
36960               window.clearTimeout(timeout);
36961               window.clearInterval(interval);
36962               select(window)
36963                   .on('mouseup.buttonoffset', null, true)
36964                   .on('mousedown.buttonoffset', null, true);
36965           }
36966
36967           select(window)
36968               .on('mouseup.buttonoffset', doneNudge, true)
36969               .on('mousedown.buttonoffset', doneNudge, true);
36970
36971           nudge(d);
36972       }
36973
36974
36975       function inputOffset() {
36976           var input = select(this);
36977           var d = input.node().value;
36978
36979           if (d === '') return resetOffset();
36980
36981           d = d.replace(/;/g, ',').split(',').map(function(n) {
36982               // if n is NaN, it will always get mapped to false.
36983               return !isNaN(n) && n;
36984           });
36985
36986           if (d.length !== 2 || !d[0] || !d[1]) {
36987               input.classed('error', true);
36988               return;
36989           }
36990
36991           context.background().offset(geoMetersToOffset(d));
36992           updateValue();
36993       }
36994
36995
36996       function dragOffset() {
36997           event.preventDefault();
36998           if (event.button !== 0) return;
36999
37000           var origin = [event.clientX, event.clientY];
37001
37002           context.container()
37003               .append('div')
37004               .attr('class', 'nudge-surface');
37005
37006           select(window)
37007               .on('mousemove.offset', function() {
37008                   var latest = [event.clientX, event.clientY];
37009                   var d = [
37010                       -(origin[0] - latest[0]) / 4,
37011                       -(origin[1] - latest[1]) / 4
37012                   ];
37013
37014                   origin = latest;
37015                   nudge(d);
37016               })
37017               .on('mouseup.offset', function() {
37018                   if (event.button !== 0) return;
37019                   d3_selectAll('.nudge-surface')
37020                       .remove();
37021
37022                   select(window)
37023                       .on('mousemove.offset', null)
37024                       .on('mouseup.offset', null);
37025               });
37026       }
37027
37028
37029       function render(selection$$1) {
37030           var container = selection$$1.selectAll('.nudge-container')
37031               .data([0]);
37032
37033           var containerEnter = container.enter()
37034               .append('div')
37035               .attr('class', 'nudge-container cf');
37036
37037           containerEnter
37038               .append('div')
37039               .attr('class', 'nudge-instructions')
37040               .text(t('background.offset'));
37041
37042           var nudgeEnter = containerEnter
37043               .append('div')
37044               .attr('class', 'nudge-outer-rect')
37045               .on('mousedown', dragOffset);
37046
37047           nudgeEnter
37048               .append('div')
37049               .attr('class', 'nudge-inner-rect')
37050               .append('input')
37051               .on('change', inputOffset);
37052
37053           containerEnter
37054               .append('div')
37055               .selectAll('button')
37056               .data(directions).enter()
37057               .append('button')
37058               .attr('class', function(d) { return d[0] + ' nudge'; })
37059               .on('contextmenu', d3_eventCancel)
37060               .on('mousedown', function(d) {
37061                   if (event.button !== 0) return;
37062                   clickNudgeButton(d[1]);
37063               });
37064
37065           containerEnter
37066               .append('button')
37067               .attr('title', t('background.reset'))
37068               .attr('class', 'nudge-reset disabled')
37069               .on('contextmenu', d3_eventCancel)
37070               .on('click', function() {
37071                   if (event.button !== 0) return;
37072                   resetOffset();
37073               })
37074               .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
37075
37076           updateValue();
37077       }
37078
37079
37080       function backgroundOffset(selection$$1) {
37081           selection$$1
37082               .call(uiDisclosure(context, 'background_offset', false)
37083                   .title(t('background.fix_misalignment'))
37084                   .content(render)
37085               );
37086       }
37087
37088
37089       context.background()
37090           .on('change.backgroundOffset-update', updateValue);
37091
37092       return backgroundOffset;
37093   }
37094
37095   // Translate a MacOS key command into the appropriate Windows/Linux equivalent.
37096   // For example, ⌘Z -> Ctrl+Z
37097   var uiCmd = function (code) {
37098       var detected = utilDetect();
37099
37100       if (detected.os === 'mac') {
37101           return code;
37102       }
37103
37104       if (detected.os === 'win') {
37105           if (code === '⌘⇧Z') return 'Ctrl+Y';
37106       }
37107
37108       var result = '',
37109           replacements = {
37110               '⌘': 'Ctrl',
37111               '⇧': 'Shift',
37112               '⌥': 'Alt',
37113               '⌫': 'Backspace',
37114               '⌦': 'Delete'
37115           };
37116
37117       for (var i = 0; i < code.length; i++) {
37118           if (code[i] in replacements) {
37119               result += replacements[code[i]] + (i < code.length - 1 ? '+' : '');
37120           } else {
37121               result += code[i];
37122           }
37123       }
37124
37125       return result;
37126   };
37127
37128
37129   // return a display-focused string for a given keyboard code
37130   uiCmd.display = function(code) {
37131       if (code.length !== 1) return code;
37132
37133       var detected = utilDetect();
37134       var mac = (detected.os === 'mac');
37135       var replacements = {
37136           '⌘': mac ? '⌘ ' + t('shortcuts.key.cmd')    : t('shortcuts.key.ctrl'),
37137           '⇧': mac ? '⇧ ' + t('shortcuts.key.shift')  : t('shortcuts.key.shift'),
37138           '⌥': mac ? '⌥ ' + t('shortcuts.key.option') : t('shortcuts.key.alt'),
37139           '⌃': mac ? '⌃ ' + t('shortcuts.key.ctrl')   : t('shortcuts.key.ctrl'),
37140           '⌫': mac ? '⌫ ' + t('shortcuts.key.delete') : t('shortcuts.key.backspace'),
37141           '⌦': mac ? '⌦ ' + t('shortcuts.key.del')    : t('shortcuts.key.del'),
37142           '↖': mac ? '↖ ' + t('shortcuts.key.pgup')   : t('shortcuts.key.pgup'),
37143           '↘': mac ? '↘ ' + t('shortcuts.key.pgdn')   : t('shortcuts.key.pgdn'),
37144           '⇞': mac ? '⇞ ' + t('shortcuts.key.home')   : t('shortcuts.key.home'),
37145           '⇟': mac ? '⇟ ' + t('shortcuts.key.end')    : t('shortcuts.key.end'),
37146           '↵': mac ? '↵ ' + t('shortcuts.key.return') : t('shortcuts.key.enter'),
37147           '⎋': mac ? '⎋ ' + t('shortcuts.key.esc')    : t('shortcuts.key.esc'),
37148       };
37149
37150       return replacements[code] || code;
37151   };
37152
37153   var marked = createCommonjsModule(function (module, exports) {
37154   (function(root) {
37155
37156   /**
37157    * Block-Level Grammar
37158    */
37159
37160   var block = {
37161     newline: /^\n+/,
37162     code: /^( {4}[^\n]+\n*)+/,
37163     fences: noop,
37164     hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
37165     heading: /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,
37166     nptable: noop,
37167     blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
37168     list: /^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
37169     html: '^ {0,3}(?:' // optional indentation
37170       + '<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1)
37171       + '|comment[^\\n]*(\\n+|$)' // (2)
37172       + '|<\\?[\\s\\S]*?\\?>\\n*' // (3)
37173       + '|<![A-Z][\\s\\S]*?>\\n*' // (4)
37174       + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*' // (5)
37175       + '|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)' // (6)
37176       + '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) open tag
37177       + '|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag
37178       + ')',
37179     def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
37180     table: noop,
37181     lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
37182     paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,
37183     text: /^[^\n]+/
37184   };
37185
37186   block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
37187   block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
37188   block.def = edit(block.def)
37189     .replace('label', block._label)
37190     .replace('title', block._title)
37191     .getRegex();
37192
37193   block.bullet = /(?:[*+-]|\d{1,9}\.)/;
37194   block.item = /^( *)(bull) ?[^\n]*(?:\n(?!\1bull ?)[^\n]*)*/;
37195   block.item = edit(block.item, 'gm')
37196     .replace(/bull/g, block.bullet)
37197     .getRegex();
37198
37199   block.list = edit(block.list)
37200     .replace(/bull/g, block.bullet)
37201     .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))')
37202     .replace('def', '\\n+(?=' + block.def.source + ')')
37203     .getRegex();
37204
37205   block._tag = 'address|article|aside|base|basefont|blockquote|body|caption'
37206     + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'
37207     + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'
37208     + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'
37209     + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'
37210     + '|track|ul';
37211   block._comment = /<!--(?!-?>)[\s\S]*?-->/;
37212   block.html = edit(block.html, 'i')
37213     .replace('comment', block._comment)
37214     .replace('tag', block._tag)
37215     .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/)
37216     .getRegex();
37217
37218   block.paragraph = edit(block.paragraph)
37219     .replace('hr', block.hr)
37220     .replace('heading', block.heading)
37221     .replace('lheading', block.lheading)
37222     .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks
37223     .getRegex();
37224
37225   block.blockquote = edit(block.blockquote)
37226     .replace('paragraph', block.paragraph)
37227     .getRegex();
37228
37229   /**
37230    * Normal Block Grammar
37231    */
37232
37233   block.normal = merge({}, block);
37234
37235   /**
37236    * GFM Block Grammar
37237    */
37238
37239   block.gfm = merge({}, block.normal, {
37240     fences: /^ {0,3}(`{3,}|~{3,})([^`\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,
37241     paragraph: /^/,
37242     heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
37243   });
37244
37245   block.gfm.paragraph = edit(block.paragraph)
37246     .replace('(?!', '(?!'
37247       + block.gfm.fences.source.replace('\\1', '\\2') + '|'
37248       + block.list.source.replace('\\1', '\\3') + '|')
37249     .getRegex();
37250
37251   /**
37252    * GFM + Tables Block Grammar
37253    */
37254
37255   block.tables = merge({}, block.gfm, {
37256     nptable: /^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,
37257     table: /^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/
37258   });
37259
37260   /**
37261    * Pedantic grammar
37262    */
37263
37264   block.pedantic = merge({}, block.normal, {
37265     html: edit(
37266       '^ *(?:comment *(?:\\n|\\s*$)'
37267       + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
37268       + '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))')
37269       .replace('comment', block._comment)
37270       .replace(/tag/g, '(?!(?:'
37271         + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'
37272         + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'
37273         + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b')
37274       .getRegex(),
37275     def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/
37276   });
37277
37278   /**
37279    * Block Lexer
37280    */
37281
37282   function Lexer(options) {
37283     this.tokens = [];
37284     this.tokens.links = Object.create(null);
37285     this.options = options || marked.defaults;
37286     this.rules = block.normal;
37287
37288     if (this.options.pedantic) {
37289       this.rules = block.pedantic;
37290     } else if (this.options.gfm) {
37291       if (this.options.tables) {
37292         this.rules = block.tables;
37293       } else {
37294         this.rules = block.gfm;
37295       }
37296     }
37297   }
37298
37299   /**
37300    * Expose Block Rules
37301    */
37302
37303   Lexer.rules = block;
37304
37305   /**
37306    * Static Lex Method
37307    */
37308
37309   Lexer.lex = function(src, options) {
37310     var lexer = new Lexer(options);
37311     return lexer.lex(src);
37312   };
37313
37314   /**
37315    * Preprocessing
37316    */
37317
37318   Lexer.prototype.lex = function(src) {
37319     src = src
37320       .replace(/\r\n|\r/g, '\n')
37321       .replace(/\t/g, '    ')
37322       .replace(/\u00a0/g, ' ')
37323       .replace(/\u2424/g, '\n');
37324
37325     return this.token(src, true);
37326   };
37327
37328   /**
37329    * Lexing
37330    */
37331
37332   Lexer.prototype.token = function(src, top) {
37333     src = src.replace(/^ +$/gm, '');
37334     var next,
37335         loose,
37336         cap,
37337         bull,
37338         b,
37339         item,
37340         listStart,
37341         listItems,
37342         t,
37343         space,
37344         i,
37345         tag,
37346         l,
37347         isordered,
37348         istask,
37349         ischecked;
37350
37351     while (src) {
37352       // newline
37353       if (cap = this.rules.newline.exec(src)) {
37354         src = src.substring(cap[0].length);
37355         if (cap[0].length > 1) {
37356           this.tokens.push({
37357             type: 'space'
37358           });
37359         }
37360       }
37361
37362       // code
37363       if (cap = this.rules.code.exec(src)) {
37364         src = src.substring(cap[0].length);
37365         cap = cap[0].replace(/^ {4}/gm, '');
37366         this.tokens.push({
37367           type: 'code',
37368           text: !this.options.pedantic
37369             ? rtrim(cap, '\n')
37370             : cap
37371         });
37372         continue;
37373       }
37374
37375       // fences (gfm)
37376       if (cap = this.rules.fences.exec(src)) {
37377         src = src.substring(cap[0].length);
37378         this.tokens.push({
37379           type: 'code',
37380           lang: cap[2] ? cap[2].trim() : cap[2],
37381           text: cap[3] || ''
37382         });
37383         continue;
37384       }
37385
37386       // heading
37387       if (cap = this.rules.heading.exec(src)) {
37388         src = src.substring(cap[0].length);
37389         this.tokens.push({
37390           type: 'heading',
37391           depth: cap[1].length,
37392           text: cap[2]
37393         });
37394         continue;
37395       }
37396
37397       // table no leading pipe (gfm)
37398       if (top && (cap = this.rules.nptable.exec(src))) {
37399         item = {
37400           type: 'table',
37401           header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
37402           align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
37403           cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
37404         };
37405
37406         if (item.header.length === item.align.length) {
37407           src = src.substring(cap[0].length);
37408
37409           for (i = 0; i < item.align.length; i++) {
37410             if (/^ *-+: *$/.test(item.align[i])) {
37411               item.align[i] = 'right';
37412             } else if (/^ *:-+: *$/.test(item.align[i])) {
37413               item.align[i] = 'center';
37414             } else if (/^ *:-+ *$/.test(item.align[i])) {
37415               item.align[i] = 'left';
37416             } else {
37417               item.align[i] = null;
37418             }
37419           }
37420
37421           for (i = 0; i < item.cells.length; i++) {
37422             item.cells[i] = splitCells(item.cells[i], item.header.length);
37423           }
37424
37425           this.tokens.push(item);
37426
37427           continue;
37428         }
37429       }
37430
37431       // hr
37432       if (cap = this.rules.hr.exec(src)) {
37433         src = src.substring(cap[0].length);
37434         this.tokens.push({
37435           type: 'hr'
37436         });
37437         continue;
37438       }
37439
37440       // blockquote
37441       if (cap = this.rules.blockquote.exec(src)) {
37442         src = src.substring(cap[0].length);
37443
37444         this.tokens.push({
37445           type: 'blockquote_start'
37446         });
37447
37448         cap = cap[0].replace(/^ *> ?/gm, '');
37449
37450         // Pass `top` to keep the current
37451         // "toplevel" state. This is exactly
37452         // how markdown.pl works.
37453         this.token(cap, top);
37454
37455         this.tokens.push({
37456           type: 'blockquote_end'
37457         });
37458
37459         continue;
37460       }
37461
37462       // list
37463       if (cap = this.rules.list.exec(src)) {
37464         src = src.substring(cap[0].length);
37465         bull = cap[2];
37466         isordered = bull.length > 1;
37467
37468         listStart = {
37469           type: 'list_start',
37470           ordered: isordered,
37471           start: isordered ? +bull : '',
37472           loose: false
37473         };
37474
37475         this.tokens.push(listStart);
37476
37477         // Get each top-level item.
37478         cap = cap[0].match(this.rules.item);
37479
37480         listItems = [];
37481         next = false;
37482         l = cap.length;
37483         i = 0;
37484
37485         for (; i < l; i++) {
37486           item = cap[i];
37487
37488           // Remove the list item's bullet
37489           // so it is seen as the next token.
37490           space = item.length;
37491           item = item.replace(/^ *([*+-]|\d+\.) */, '');
37492
37493           // Outdent whatever the
37494           // list item contains. Hacky.
37495           if (~item.indexOf('\n ')) {
37496             space -= item.length;
37497             item = !this.options.pedantic
37498               ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
37499               : item.replace(/^ {1,4}/gm, '');
37500           }
37501
37502           // Determine whether the next list item belongs here.
37503           // Backpedal if it does not belong in this list.
37504           if (i !== l - 1) {
37505             b = block.bullet.exec(cap[i + 1])[0];
37506             if (bull.length > 1 ? b.length === 1
37507               : (b.length > 1 || (this.options.smartLists && b !== bull))) {
37508               src = cap.slice(i + 1).join('\n') + src;
37509               i = l - 1;
37510             }
37511           }
37512
37513           // Determine whether item is loose or not.
37514           // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
37515           // for discount behavior.
37516           loose = next || /\n\n(?!\s*$)/.test(item);
37517           if (i !== l - 1) {
37518             next = item.charAt(item.length - 1) === '\n';
37519             if (!loose) loose = next;
37520           }
37521
37522           if (loose) {
37523             listStart.loose = true;
37524           }
37525
37526           // Check for task list items
37527           istask = /^\[[ xX]\] /.test(item);
37528           ischecked = undefined;
37529           if (istask) {
37530             ischecked = item[1] !== ' ';
37531             item = item.replace(/^\[[ xX]\] +/, '');
37532           }
37533
37534           t = {
37535             type: 'list_item_start',
37536             task: istask,
37537             checked: ischecked,
37538             loose: loose
37539           };
37540
37541           listItems.push(t);
37542           this.tokens.push(t);
37543
37544           // Recurse.
37545           this.token(item, false);
37546
37547           this.tokens.push({
37548             type: 'list_item_end'
37549           });
37550         }
37551
37552         if (listStart.loose) {
37553           l = listItems.length;
37554           i = 0;
37555           for (; i < l; i++) {
37556             listItems[i].loose = true;
37557           }
37558         }
37559
37560         this.tokens.push({
37561           type: 'list_end'
37562         });
37563
37564         continue;
37565       }
37566
37567       // html
37568       if (cap = this.rules.html.exec(src)) {
37569         src = src.substring(cap[0].length);
37570         this.tokens.push({
37571           type: this.options.sanitize
37572             ? 'paragraph'
37573             : 'html',
37574           pre: !this.options.sanitizer
37575             && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
37576           text: cap[0]
37577         });
37578         continue;
37579       }
37580
37581       // def
37582       if (top && (cap = this.rules.def.exec(src))) {
37583         src = src.substring(cap[0].length);
37584         if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
37585         tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
37586         if (!this.tokens.links[tag]) {
37587           this.tokens.links[tag] = {
37588             href: cap[2],
37589             title: cap[3]
37590           };
37591         }
37592         continue;
37593       }
37594
37595       // table (gfm)
37596       if (top && (cap = this.rules.table.exec(src))) {
37597         item = {
37598           type: 'table',
37599           header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
37600           align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
37601           cells: cap[3] ? cap[3].replace(/(?: *\| *)?\n$/, '').split('\n') : []
37602         };
37603
37604         if (item.header.length === item.align.length) {
37605           src = src.substring(cap[0].length);
37606
37607           for (i = 0; i < item.align.length; i++) {
37608             if (/^ *-+: *$/.test(item.align[i])) {
37609               item.align[i] = 'right';
37610             } else if (/^ *:-+: *$/.test(item.align[i])) {
37611               item.align[i] = 'center';
37612             } else if (/^ *:-+ *$/.test(item.align[i])) {
37613               item.align[i] = 'left';
37614             } else {
37615               item.align[i] = null;
37616             }
37617           }
37618
37619           for (i = 0; i < item.cells.length; i++) {
37620             item.cells[i] = splitCells(
37621               item.cells[i].replace(/^ *\| *| *\| *$/g, ''),
37622               item.header.length);
37623           }
37624
37625           this.tokens.push(item);
37626
37627           continue;
37628         }
37629       }
37630
37631       // lheading
37632       if (cap = this.rules.lheading.exec(src)) {
37633         src = src.substring(cap[0].length);
37634         this.tokens.push({
37635           type: 'heading',
37636           depth: cap[2] === '=' ? 1 : 2,
37637           text: cap[1]
37638         });
37639         continue;
37640       }
37641
37642       // top-level paragraph
37643       if (top && (cap = this.rules.paragraph.exec(src))) {
37644         src = src.substring(cap[0].length);
37645         this.tokens.push({
37646           type: 'paragraph',
37647           text: cap[1].charAt(cap[1].length - 1) === '\n'
37648             ? cap[1].slice(0, -1)
37649             : cap[1]
37650         });
37651         continue;
37652       }
37653
37654       // text
37655       if (cap = this.rules.text.exec(src)) {
37656         // Top-level should never reach here.
37657         src = src.substring(cap[0].length);
37658         this.tokens.push({
37659           type: 'text',
37660           text: cap[0]
37661         });
37662         continue;
37663       }
37664
37665       if (src) {
37666         throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
37667       }
37668     }
37669
37670     return this.tokens;
37671   };
37672
37673   /**
37674    * Inline-Level Grammar
37675    */
37676
37677   var inline = {
37678     escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
37679     autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
37680     url: noop,
37681     tag: '^comment'
37682       + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
37683       + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
37684       + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?>
37685       + '|^<![a-zA-Z]+\\s[\\s\\S]*?>' // declaration, e.g. <!DOCTYPE html>
37686       + '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>', // CDATA section
37687     link: /^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,
37688     reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
37689     nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
37690     strong: /^__([^\s_])__(?!_)|^\*\*([^\s*])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,
37691     em: /^_([^\s_])_(?!_)|^\*([^\s*"<\[])\*(?!\*)|^_([^\s][\s\S]*?[^\s_])_(?!_|[^\spunctuation])|^_([^\s_][\s\S]*?[^\s])_(?!_|[^\spunctuation])|^\*([^\s"<\[][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,
37692     code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
37693     br: /^( {2,}|\\)\n(?!\s*$)/,
37694     del: noop,
37695     text: /^(`+|[^`])[\s\S]*?(?=[\\<!\[`*]|\b_| {2,}\n|$)/
37696   };
37697
37698   // list of punctuation marks from common mark spec
37699   // without ` and ] to workaround Rule 17 (inline code blocks/links)
37700   inline._punctuation = '!"#$%&\'()*+,\\-./:;<=>?@\\[^_{|}~';
37701   inline.em = edit(inline.em).replace(/punctuation/g, inline._punctuation).getRegex();
37702
37703   inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
37704
37705   inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
37706   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])?)+(?![-_])/;
37707   inline.autolink = edit(inline.autolink)
37708     .replace('scheme', inline._scheme)
37709     .replace('email', inline._email)
37710     .getRegex();
37711
37712   inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
37713
37714   inline.tag = edit(inline.tag)
37715     .replace('comment', block._comment)
37716     .replace('attribute', inline._attribute)
37717     .getRegex();
37718
37719   inline._label = /(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|[^\[\]\\])*?/;
37720   inline._href = /\s*(<(?:\\[<>]?|[^\s<>\\])*>|(?:\\[()]?|\([^\s\x00-\x1f\\]*\)|[^\s\x00-\x1f()\\])*?)/;
37721   inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
37722
37723   inline.link = edit(inline.link)
37724     .replace('label', inline._label)
37725     .replace('href', inline._href)
37726     .replace('title', inline._title)
37727     .getRegex();
37728
37729   inline.reflink = edit(inline.reflink)
37730     .replace('label', inline._label)
37731     .getRegex();
37732
37733   /**
37734    * Normal Inline Grammar
37735    */
37736
37737   inline.normal = merge({}, inline);
37738
37739   /**
37740    * Pedantic Inline Grammar
37741    */
37742
37743   inline.pedantic = merge({}, inline.normal, {
37744     strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
37745     em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,
37746     link: edit(/^!?\[(label)\]\((.*?)\)/)
37747       .replace('label', inline._label)
37748       .getRegex(),
37749     reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/)
37750       .replace('label', inline._label)
37751       .getRegex()
37752   });
37753
37754   /**
37755    * GFM Inline Grammar
37756    */
37757
37758   inline.gfm = merge({}, inline.normal, {
37759     escape: edit(inline.escape).replace('])', '~|])').getRegex(),
37760     _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,
37761     url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
37762     _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
37763     del: /^~+(?=\S)([\s\S]*?\S)~+/,
37764     text: edit(inline.text)
37765       .replace(']|', '~]|')
37766       .replace('|$', '|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&\'*+/=?^_`{\\|}~-]+@|$')
37767       .getRegex()
37768   });
37769
37770   inline.gfm.url = edit(inline.gfm.url, 'i')
37771     .replace('email', inline.gfm._extended_email)
37772     .getRegex();
37773   /**
37774    * GFM + Line Breaks Inline Grammar
37775    */
37776
37777   inline.breaks = merge({}, inline.gfm, {
37778     br: edit(inline.br).replace('{2,}', '*').getRegex(),
37779     text: edit(inline.gfm.text).replace('{2,}', '*').getRegex()
37780   });
37781
37782   /**
37783    * Inline Lexer & Compiler
37784    */
37785
37786   function InlineLexer(links, options) {
37787     this.options = options || marked.defaults;
37788     this.links = links;
37789     this.rules = inline.normal;
37790     this.renderer = this.options.renderer || new Renderer();
37791     this.renderer.options = this.options;
37792
37793     if (!this.links) {
37794       throw new Error('Tokens array requires a `links` property.');
37795     }
37796
37797     if (this.options.pedantic) {
37798       this.rules = inline.pedantic;
37799     } else if (this.options.gfm) {
37800       if (this.options.breaks) {
37801         this.rules = inline.breaks;
37802       } else {
37803         this.rules = inline.gfm;
37804       }
37805     }
37806   }
37807
37808   /**
37809    * Expose Inline Rules
37810    */
37811
37812   InlineLexer.rules = inline;
37813
37814   /**
37815    * Static Lexing/Compiling Method
37816    */
37817
37818   InlineLexer.output = function(src, links, options) {
37819     var inline = new InlineLexer(links, options);
37820     return inline.output(src);
37821   };
37822
37823   /**
37824    * Lexing/Compiling
37825    */
37826
37827   InlineLexer.prototype.output = function(src) {
37828     var out = '',
37829         link,
37830         text,
37831         href,
37832         title,
37833         cap,
37834         prevCapZero;
37835
37836     while (src) {
37837       // escape
37838       if (cap = this.rules.escape.exec(src)) {
37839         src = src.substring(cap[0].length);
37840         out += escape(cap[1]);
37841         continue;
37842       }
37843
37844       // tag
37845       if (cap = this.rules.tag.exec(src)) {
37846         if (!this.inLink && /^<a /i.test(cap[0])) {
37847           this.inLink = true;
37848         } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
37849           this.inLink = false;
37850         }
37851         if (!this.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
37852           this.inRawBlock = true;
37853         } else if (this.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
37854           this.inRawBlock = false;
37855         }
37856
37857         src = src.substring(cap[0].length);
37858         out += this.options.sanitize
37859           ? this.options.sanitizer
37860             ? this.options.sanitizer(cap[0])
37861             : escape(cap[0])
37862           : cap[0];
37863         continue;
37864       }
37865
37866       // link
37867       if (cap = this.rules.link.exec(src)) {
37868         src = src.substring(cap[0].length);
37869         this.inLink = true;
37870         href = cap[2];
37871         if (this.options.pedantic) {
37872           link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
37873
37874           if (link) {
37875             href = link[1];
37876             title = link[3];
37877           } else {
37878             title = '';
37879           }
37880         } else {
37881           title = cap[3] ? cap[3].slice(1, -1) : '';
37882         }
37883         href = href.trim().replace(/^<([\s\S]*)>$/, '$1');
37884         out += this.outputLink(cap, {
37885           href: InlineLexer.escapes(href),
37886           title: InlineLexer.escapes(title)
37887         });
37888         this.inLink = false;
37889         continue;
37890       }
37891
37892       // reflink, nolink
37893       if ((cap = this.rules.reflink.exec(src))
37894           || (cap = this.rules.nolink.exec(src))) {
37895         src = src.substring(cap[0].length);
37896         link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
37897         link = this.links[link.toLowerCase()];
37898         if (!link || !link.href) {
37899           out += cap[0].charAt(0);
37900           src = cap[0].substring(1) + src;
37901           continue;
37902         }
37903         this.inLink = true;
37904         out += this.outputLink(cap, link);
37905         this.inLink = false;
37906         continue;
37907       }
37908
37909       // strong
37910       if (cap = this.rules.strong.exec(src)) {
37911         src = src.substring(cap[0].length);
37912         out += this.renderer.strong(this.output(cap[4] || cap[3] || cap[2] || cap[1]));
37913         continue;
37914       }
37915
37916       // em
37917       if (cap = this.rules.em.exec(src)) {
37918         src = src.substring(cap[0].length);
37919         out += this.renderer.em(this.output(cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1]));
37920         continue;
37921       }
37922
37923       // code
37924       if (cap = this.rules.code.exec(src)) {
37925         src = src.substring(cap[0].length);
37926         out += this.renderer.codespan(escape(cap[2].trim(), true));
37927         continue;
37928       }
37929
37930       // br
37931       if (cap = this.rules.br.exec(src)) {
37932         src = src.substring(cap[0].length);
37933         out += this.renderer.br();
37934         continue;
37935       }
37936
37937       // del (gfm)
37938       if (cap = this.rules.del.exec(src)) {
37939         src = src.substring(cap[0].length);
37940         out += this.renderer.del(this.output(cap[1]));
37941         continue;
37942       }
37943
37944       // autolink
37945       if (cap = this.rules.autolink.exec(src)) {
37946         src = src.substring(cap[0].length);
37947         if (cap[2] === '@') {
37948           text = escape(this.mangle(cap[1]));
37949           href = 'mailto:' + text;
37950         } else {
37951           text = escape(cap[1]);
37952           href = text;
37953         }
37954         out += this.renderer.link(href, null, text);
37955         continue;
37956       }
37957
37958       // url (gfm)
37959       if (!this.inLink && (cap = this.rules.url.exec(src))) {
37960         if (cap[2] === '@') {
37961           text = escape(cap[0]);
37962           href = 'mailto:' + text;
37963         } else {
37964           // do extended autolink path validation
37965           do {
37966             prevCapZero = cap[0];
37967             cap[0] = this.rules._backpedal.exec(cap[0])[0];
37968           } while (prevCapZero !== cap[0]);
37969           text = escape(cap[0]);
37970           if (cap[1] === 'www.') {
37971             href = 'http://' + text;
37972           } else {
37973             href = text;
37974           }
37975         }
37976         src = src.substring(cap[0].length);
37977         out += this.renderer.link(href, null, text);
37978         continue;
37979       }
37980
37981       // text
37982       if (cap = this.rules.text.exec(src)) {
37983         src = src.substring(cap[0].length);
37984         if (this.inRawBlock) {
37985           out += this.renderer.text(cap[0]);
37986         } else {
37987           out += this.renderer.text(escape(this.smartypants(cap[0])));
37988         }
37989         continue;
37990       }
37991
37992       if (src) {
37993         throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
37994       }
37995     }
37996
37997     return out;
37998   };
37999
38000   InlineLexer.escapes = function(text) {
38001     return text ? text.replace(InlineLexer.rules._escapes, '$1') : text;
38002   };
38003
38004   /**
38005    * Compile Link
38006    */
38007
38008   InlineLexer.prototype.outputLink = function(cap, link) {
38009     var href = link.href,
38010         title = link.title ? escape(link.title) : null;
38011
38012     return cap[0].charAt(0) !== '!'
38013       ? this.renderer.link(href, title, this.output(cap[1]))
38014       : this.renderer.image(href, title, escape(cap[1]));
38015   };
38016
38017   /**
38018    * Smartypants Transformations
38019    */
38020
38021   InlineLexer.prototype.smartypants = function(text) {
38022     if (!this.options.smartypants) return text;
38023     return text
38024       // em-dashes
38025       .replace(/---/g, '\u2014')
38026       // en-dashes
38027       .replace(/--/g, '\u2013')
38028       // opening singles
38029       .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
38030       // closing singles & apostrophes
38031       .replace(/'/g, '\u2019')
38032       // opening doubles
38033       .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
38034       // closing doubles
38035       .replace(/"/g, '\u201d')
38036       // ellipses
38037       .replace(/\.{3}/g, '\u2026');
38038   };
38039
38040   /**
38041    * Mangle Links
38042    */
38043
38044   InlineLexer.prototype.mangle = function(text) {
38045     if (!this.options.mangle) return text;
38046     var out = '',
38047         l = text.length,
38048         i = 0,
38049         ch;
38050
38051     for (; i < l; i++) {
38052       ch = text.charCodeAt(i);
38053       if (Math.random() > 0.5) {
38054         ch = 'x' + ch.toString(16);
38055       }
38056       out += '&#' + ch + ';';
38057     }
38058
38059     return out;
38060   };
38061
38062   /**
38063    * Renderer
38064    */
38065
38066   function Renderer(options) {
38067     this.options = options || marked.defaults;
38068   }
38069
38070   Renderer.prototype.code = function(code, infostring, escaped) {
38071     var lang = (infostring || '').match(/\S*/)[0];
38072     if (this.options.highlight) {
38073       var out = this.options.highlight(code, lang);
38074       if (out != null && out !== code) {
38075         escaped = true;
38076         code = out;
38077       }
38078     }
38079
38080     if (!lang) {
38081       return '<pre><code>'
38082         + (escaped ? code : escape(code, true))
38083         + '</code></pre>';
38084     }
38085
38086     return '<pre><code class="'
38087       + this.options.langPrefix
38088       + escape(lang, true)
38089       + '">'
38090       + (escaped ? code : escape(code, true))
38091       + '</code></pre>\n';
38092   };
38093
38094   Renderer.prototype.blockquote = function(quote) {
38095     return '<blockquote>\n' + quote + '</blockquote>\n';
38096   };
38097
38098   Renderer.prototype.html = function(html) {
38099     return html;
38100   };
38101
38102   Renderer.prototype.heading = function(text, level, raw, slugger) {
38103     if (this.options.headerIds) {
38104       return '<h'
38105         + level
38106         + ' id="'
38107         + this.options.headerPrefix
38108         + slugger.slug(raw)
38109         + '">'
38110         + text
38111         + '</h'
38112         + level
38113         + '>\n';
38114     }
38115     // ignore IDs
38116     return '<h' + level + '>' + text + '</h' + level + '>\n';
38117   };
38118
38119   Renderer.prototype.hr = function() {
38120     return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
38121   };
38122
38123   Renderer.prototype.list = function(body, ordered, start) {
38124     var type = ordered ? 'ol' : 'ul',
38125         startatt = (ordered && start !== 1) ? (' start="' + start + '"') : '';
38126     return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
38127   };
38128
38129   Renderer.prototype.listitem = function(text) {
38130     return '<li>' + text + '</li>\n';
38131   };
38132
38133   Renderer.prototype.checkbox = function(checked) {
38134     return '<input '
38135       + (checked ? 'checked="" ' : '')
38136       + 'disabled="" type="checkbox"'
38137       + (this.options.xhtml ? ' /' : '')
38138       + '> ';
38139   };
38140
38141   Renderer.prototype.paragraph = function(text) {
38142     return '<p>' + text + '</p>\n';
38143   };
38144
38145   Renderer.prototype.table = function(header, body) {
38146     if (body) body = '<tbody>' + body + '</tbody>';
38147
38148     return '<table>\n'
38149       + '<thead>\n'
38150       + header
38151       + '</thead>\n'
38152       + body
38153       + '</table>\n';
38154   };
38155
38156   Renderer.prototype.tablerow = function(content) {
38157     return '<tr>\n' + content + '</tr>\n';
38158   };
38159
38160   Renderer.prototype.tablecell = function(content, flags) {
38161     var type = flags.header ? 'th' : 'td';
38162     var tag = flags.align
38163       ? '<' + type + ' align="' + flags.align + '">'
38164       : '<' + type + '>';
38165     return tag + content + '</' + type + '>\n';
38166   };
38167
38168   // span level renderer
38169   Renderer.prototype.strong = function(text) {
38170     return '<strong>' + text + '</strong>';
38171   };
38172
38173   Renderer.prototype.em = function(text) {
38174     return '<em>' + text + '</em>';
38175   };
38176
38177   Renderer.prototype.codespan = function(text) {
38178     return '<code>' + text + '</code>';
38179   };
38180
38181   Renderer.prototype.br = function() {
38182     return this.options.xhtml ? '<br/>' : '<br>';
38183   };
38184
38185   Renderer.prototype.del = function(text) {
38186     return '<del>' + text + '</del>';
38187   };
38188
38189   Renderer.prototype.link = function(href, title, text) {
38190     href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
38191     if (href === null) {
38192       return text;
38193     }
38194     var out = '<a href="' + escape(href) + '"';
38195     if (title) {
38196       out += ' title="' + title + '"';
38197     }
38198     out += '>' + text + '</a>';
38199     return out;
38200   };
38201
38202   Renderer.prototype.image = function(href, title, text) {
38203     href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
38204     if (href === null) {
38205       return text;
38206     }
38207
38208     var out = '<img src="' + href + '" alt="' + text + '"';
38209     if (title) {
38210       out += ' title="' + title + '"';
38211     }
38212     out += this.options.xhtml ? '/>' : '>';
38213     return out;
38214   };
38215
38216   Renderer.prototype.text = function(text) {
38217     return text;
38218   };
38219
38220   /**
38221    * TextRenderer
38222    * returns only the textual part of the token
38223    */
38224
38225   function TextRenderer() {}
38226
38227   // no need for block level renderers
38228
38229   TextRenderer.prototype.strong =
38230   TextRenderer.prototype.em =
38231   TextRenderer.prototype.codespan =
38232   TextRenderer.prototype.del =
38233   TextRenderer.prototype.text = function (text) {
38234     return text;
38235   };
38236
38237   TextRenderer.prototype.link =
38238   TextRenderer.prototype.image = function(href, title, text) {
38239     return '' + text;
38240   };
38241
38242   TextRenderer.prototype.br = function() {
38243     return '';
38244   };
38245
38246   /**
38247    * Parsing & Compiling
38248    */
38249
38250   function Parser(options) {
38251     this.tokens = [];
38252     this.token = null;
38253     this.options = options || marked.defaults;
38254     this.options.renderer = this.options.renderer || new Renderer();
38255     this.renderer = this.options.renderer;
38256     this.renderer.options = this.options;
38257     this.slugger = new Slugger();
38258   }
38259
38260   /**
38261    * Static Parse Method
38262    */
38263
38264   Parser.parse = function(src, options) {
38265     var parser = new Parser(options);
38266     return parser.parse(src);
38267   };
38268
38269   /**
38270    * Parse Loop
38271    */
38272
38273   Parser.prototype.parse = function(src) {
38274     this.inline = new InlineLexer(src.links, this.options);
38275     // use an InlineLexer with a TextRenderer to extract pure text
38276     this.inlineText = new InlineLexer(
38277       src.links,
38278       merge({}, this.options, {renderer: new TextRenderer()})
38279     );
38280     this.tokens = src.reverse();
38281
38282     var out = '';
38283     while (this.next()) {
38284       out += this.tok();
38285     }
38286
38287     return out;
38288   };
38289
38290   /**
38291    * Next Token
38292    */
38293
38294   Parser.prototype.next = function() {
38295     return this.token = this.tokens.pop();
38296   };
38297
38298   /**
38299    * Preview Next Token
38300    */
38301
38302   Parser.prototype.peek = function() {
38303     return this.tokens[this.tokens.length - 1] || 0;
38304   };
38305
38306   /**
38307    * Parse Text Tokens
38308    */
38309
38310   Parser.prototype.parseText = function() {
38311     var body = this.token.text;
38312
38313     while (this.peek().type === 'text') {
38314       body += '\n' + this.next().text;
38315     }
38316
38317     return this.inline.output(body);
38318   };
38319
38320   /**
38321    * Parse Current Token
38322    */
38323
38324   Parser.prototype.tok = function() {
38325     switch (this.token.type) {
38326       case 'space': {
38327         return '';
38328       }
38329       case 'hr': {
38330         return this.renderer.hr();
38331       }
38332       case 'heading': {
38333         return this.renderer.heading(
38334           this.inline.output(this.token.text),
38335           this.token.depth,
38336           unescape(this.inlineText.output(this.token.text)),
38337           this.slugger);
38338       }
38339       case 'code': {
38340         return this.renderer.code(this.token.text,
38341           this.token.lang,
38342           this.token.escaped);
38343       }
38344       case 'table': {
38345         var header = '',
38346             body = '',
38347             i,
38348             row,
38349             cell,
38350             j;
38351
38352         // header
38353         cell = '';
38354         for (i = 0; i < this.token.header.length; i++) {
38355           cell += this.renderer.tablecell(
38356             this.inline.output(this.token.header[i]),
38357             { header: true, align: this.token.align[i] }
38358           );
38359         }
38360         header += this.renderer.tablerow(cell);
38361
38362         for (i = 0; i < this.token.cells.length; i++) {
38363           row = this.token.cells[i];
38364
38365           cell = '';
38366           for (j = 0; j < row.length; j++) {
38367             cell += this.renderer.tablecell(
38368               this.inline.output(row[j]),
38369               { header: false, align: this.token.align[j] }
38370             );
38371           }
38372
38373           body += this.renderer.tablerow(cell);
38374         }
38375         return this.renderer.table(header, body);
38376       }
38377       case 'blockquote_start': {
38378         body = '';
38379
38380         while (this.next().type !== 'blockquote_end') {
38381           body += this.tok();
38382         }
38383
38384         return this.renderer.blockquote(body);
38385       }
38386       case 'list_start': {
38387         body = '';
38388         var ordered = this.token.ordered,
38389             start = this.token.start;
38390
38391         while (this.next().type !== 'list_end') {
38392           body += this.tok();
38393         }
38394
38395         return this.renderer.list(body, ordered, start);
38396       }
38397       case 'list_item_start': {
38398         body = '';
38399         var loose = this.token.loose;
38400
38401         if (this.token.task) {
38402           body += this.renderer.checkbox(this.token.checked);
38403         }
38404
38405         while (this.next().type !== 'list_item_end') {
38406           body += !loose && this.token.type === 'text'
38407             ? this.parseText()
38408             : this.tok();
38409         }
38410
38411         return this.renderer.listitem(body);
38412       }
38413       case 'html': {
38414         // TODO parse inline content if parameter markdown=1
38415         return this.renderer.html(this.token.text);
38416       }
38417       case 'paragraph': {
38418         return this.renderer.paragraph(this.inline.output(this.token.text));
38419       }
38420       case 'text': {
38421         return this.renderer.paragraph(this.parseText());
38422       }
38423       default: {
38424         var errMsg = 'Token with "' + this.token.type + '" type was not found.';
38425         if (this.options.silent) {
38426           console.log(errMsg);
38427         } else {
38428           throw new Error(errMsg);
38429         }
38430       }
38431     }
38432   };
38433
38434   /**
38435    * Slugger generates header id
38436    */
38437
38438   function Slugger () {
38439     this.seen = {};
38440   }
38441
38442   /**
38443    * Convert string to unique id
38444    */
38445
38446   Slugger.prototype.slug = function (value) {
38447     var slug = value
38448       .toLowerCase()
38449       .trim()
38450       .replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, '')
38451       .replace(/\s/g, '-');
38452
38453     if (this.seen.hasOwnProperty(slug)) {
38454       var originalSlug = slug;
38455       do {
38456         this.seen[originalSlug]++;
38457         slug = originalSlug + '-' + this.seen[originalSlug];
38458       } while (this.seen.hasOwnProperty(slug));
38459     }
38460     this.seen[slug] = 0;
38461
38462     return slug;
38463   };
38464
38465   /**
38466    * Helpers
38467    */
38468
38469   function escape(html, encode) {
38470     if (encode) {
38471       if (escape.escapeTest.test(html)) {
38472         return html.replace(escape.escapeReplace, function (ch) { return escape.replacements[ch]; });
38473       }
38474     } else {
38475       if (escape.escapeTestNoEncode.test(html)) {
38476         return html.replace(escape.escapeReplaceNoEncode, function (ch) { return escape.replacements[ch]; });
38477       }
38478     }
38479
38480     return html;
38481   }
38482
38483   escape.escapeTest = /[&<>"']/;
38484   escape.escapeReplace = /[&<>"']/g;
38485   escape.replacements = {
38486     '&': '&amp;',
38487     '<': '&lt;',
38488     '>': '&gt;',
38489     '"': '&quot;',
38490     "'": '&#39;'
38491   };
38492
38493   escape.escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/;
38494   escape.escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g;
38495
38496   function unescape(html) {
38497     // explicitly match decimal, hex, and named HTML entities
38498     return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n) {
38499       n = n.toLowerCase();
38500       if (n === 'colon') return ':';
38501       if (n.charAt(0) === '#') {
38502         return n.charAt(1) === 'x'
38503           ? String.fromCharCode(parseInt(n.substring(2), 16))
38504           : String.fromCharCode(+n.substring(1));
38505       }
38506       return '';
38507     });
38508   }
38509
38510   function edit(regex, opt) {
38511     regex = regex.source || regex;
38512     opt = opt || '';
38513     return {
38514       replace: function(name, val) {
38515         val = val.source || val;
38516         val = val.replace(/(^|[^\[])\^/g, '$1');
38517         regex = regex.replace(name, val);
38518         return this;
38519       },
38520       getRegex: function() {
38521         return new RegExp(regex, opt);
38522       }
38523     };
38524   }
38525
38526   function cleanUrl(sanitize, base, href) {
38527     if (sanitize) {
38528       try {
38529         var prot = decodeURIComponent(unescape(href))
38530           .replace(/[^\w:]/g, '')
38531           .toLowerCase();
38532       } catch (e) {
38533         return null;
38534       }
38535       if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
38536         return null;
38537       }
38538     }
38539     if (base && !originIndependentUrl.test(href)) {
38540       href = resolveUrl(base, href);
38541     }
38542     try {
38543       href = encodeURI(href).replace(/%25/g, '%');
38544     } catch (e) {
38545       return null;
38546     }
38547     return href;
38548   }
38549
38550   function resolveUrl(base, href) {
38551     if (!baseUrls[' ' + base]) {
38552       // we can ignore everything in base after the last slash of its path component,
38553       // but we might need to add _that_
38554       // https://tools.ietf.org/html/rfc3986#section-3
38555       if (/^[^:]+:\/*[^/]*$/.test(base)) {
38556         baseUrls[' ' + base] = base + '/';
38557       } else {
38558         baseUrls[' ' + base] = rtrim(base, '/', true);
38559       }
38560     }
38561     base = baseUrls[' ' + base];
38562
38563     if (href.slice(0, 2) === '//') {
38564       return base.replace(/:[\s\S]*/, ':') + href;
38565     } else if (href.charAt(0) === '/') {
38566       return base.replace(/(:\/*[^/]*)[\s\S]*/, '$1') + href;
38567     } else {
38568       return base + href;
38569     }
38570   }
38571   var baseUrls = {};
38572   var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
38573
38574   function noop() {}
38575   noop.exec = noop;
38576
38577   function merge(obj) {
38578     var i = 1,
38579         target,
38580         key;
38581
38582     for (; i < arguments.length; i++) {
38583       target = arguments[i];
38584       for (key in target) {
38585         if (Object.prototype.hasOwnProperty.call(target, key)) {
38586           obj[key] = target[key];
38587         }
38588       }
38589     }
38590
38591     return obj;
38592   }
38593
38594   function splitCells(tableRow, count) {
38595     // ensure that every cell-delimiting pipe has a space
38596     // before it to distinguish it from an escaped pipe
38597     var row = tableRow.replace(/\|/g, function (match, offset, str) {
38598           var escaped = false,
38599               curr = offset;
38600           while (--curr >= 0 && str[curr] === '\\') escaped = !escaped;
38601           if (escaped) {
38602             // odd number of slashes means | is escaped
38603             // so we leave it alone
38604             return '|';
38605           } else {
38606             // add space before unescaped |
38607             return ' |';
38608           }
38609         }),
38610         cells = row.split(/ \|/),
38611         i = 0;
38612
38613     if (cells.length > count) {
38614       cells.splice(count);
38615     } else {
38616       while (cells.length < count) cells.push('');
38617     }
38618
38619     for (; i < cells.length; i++) {
38620       // leading or trailing whitespace is ignored per the gfm spec
38621       cells[i] = cells[i].trim().replace(/\\\|/g, '|');
38622     }
38623     return cells;
38624   }
38625
38626   // Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').
38627   // /c*$/ is vulnerable to REDOS.
38628   // invert: Remove suffix of non-c chars instead. Default falsey.
38629   function rtrim(str, c, invert) {
38630     if (str.length === 0) {
38631       return '';
38632     }
38633
38634     // Length of suffix matching the invert condition.
38635     var suffLen = 0;
38636
38637     // Step left until we fail to match the invert condition.
38638     while (suffLen < str.length) {
38639       var currChar = str.charAt(str.length - suffLen - 1);
38640       if (currChar === c && !invert) {
38641         suffLen++;
38642       } else if (currChar !== c && invert) {
38643         suffLen++;
38644       } else {
38645         break;
38646       }
38647     }
38648
38649     return str.substr(0, str.length - suffLen);
38650   }
38651
38652   /**
38653    * Marked
38654    */
38655
38656   function marked(src, opt, callback) {
38657     // throw error in case of non string input
38658     if (typeof src === 'undefined' || src === null) {
38659       throw new Error('marked(): input parameter is undefined or null');
38660     }
38661     if (typeof src !== 'string') {
38662       throw new Error('marked(): input parameter is of type '
38663         + Object.prototype.toString.call(src) + ', string expected');
38664     }
38665
38666     if (callback || typeof opt === 'function') {
38667       if (!callback) {
38668         callback = opt;
38669         opt = null;
38670       }
38671
38672       opt = merge({}, marked.defaults, opt || {});
38673
38674       var highlight = opt.highlight,
38675           tokens,
38676           pending,
38677           i = 0;
38678
38679       try {
38680         tokens = Lexer.lex(src, opt);
38681       } catch (e) {
38682         return callback(e);
38683       }
38684
38685       pending = tokens.length;
38686
38687       var done = function(err) {
38688         if (err) {
38689           opt.highlight = highlight;
38690           return callback(err);
38691         }
38692
38693         var out;
38694
38695         try {
38696           out = Parser.parse(tokens, opt);
38697         } catch (e) {
38698           err = e;
38699         }
38700
38701         opt.highlight = highlight;
38702
38703         return err
38704           ? callback(err)
38705           : callback(null, out);
38706       };
38707
38708       if (!highlight || highlight.length < 3) {
38709         return done();
38710       }
38711
38712       delete opt.highlight;
38713
38714       if (!pending) return done();
38715
38716       for (; i < tokens.length; i++) {
38717         (function(token) {
38718           if (token.type !== 'code') {
38719             return --pending || done();
38720           }
38721           return highlight(token.text, token.lang, function(err, code) {
38722             if (err) return done(err);
38723             if (code == null || code === token.text) {
38724               return --pending || done();
38725             }
38726             token.text = code;
38727             token.escaped = true;
38728             --pending || done();
38729           });
38730         })(tokens[i]);
38731       }
38732
38733       return;
38734     }
38735     try {
38736       if (opt) opt = merge({}, marked.defaults, opt);
38737       return Parser.parse(Lexer.lex(src, opt), opt);
38738     } catch (e) {
38739       e.message += '\nPlease report this to https://github.com/markedjs/marked.';
38740       if ((opt || marked.defaults).silent) {
38741         return '<p>An error occurred:</p><pre>'
38742           + escape(e.message + '', true)
38743           + '</pre>';
38744       }
38745       throw e;
38746     }
38747   }
38748
38749   /**
38750    * Options
38751    */
38752
38753   marked.options =
38754   marked.setOptions = function(opt) {
38755     merge(marked.defaults, opt);
38756     return marked;
38757   };
38758
38759   marked.getDefaults = function () {
38760     return {
38761       baseUrl: null,
38762       breaks: false,
38763       gfm: true,
38764       headerIds: true,
38765       headerPrefix: '',
38766       highlight: null,
38767       langPrefix: 'language-',
38768       mangle: true,
38769       pedantic: false,
38770       renderer: new Renderer(),
38771       sanitize: false,
38772       sanitizer: null,
38773       silent: false,
38774       smartLists: false,
38775       smartypants: false,
38776       tables: true,
38777       xhtml: false
38778     };
38779   };
38780
38781   marked.defaults = marked.getDefaults();
38782
38783   /**
38784    * Expose
38785    */
38786
38787   marked.Parser = Parser;
38788   marked.parser = Parser.parse;
38789
38790   marked.Renderer = Renderer;
38791   marked.TextRenderer = TextRenderer;
38792
38793   marked.Lexer = Lexer;
38794   marked.lexer = Lexer.lex;
38795
38796   marked.InlineLexer = InlineLexer;
38797   marked.inlineLexer = InlineLexer.output;
38798
38799   marked.Slugger = Slugger;
38800
38801   marked.parse = marked;
38802
38803   {
38804     module.exports = marked;
38805   }
38806   })(commonjsGlobal || (typeof window !== 'undefined' ? window : commonjsGlobal));
38807   });
38808
38809   function pointBox(loc, context) {
38810       var rect = context.surfaceRect();
38811       var point$$1 = context.curtainProjection(loc);
38812       return {
38813           left: point$$1[0] + rect.left - 40,
38814           top: point$$1[1] + rect.top - 60,
38815           width: 80,
38816           height: 90
38817       };
38818   }
38819
38820
38821   function pad$1(locOrBox, padding, context) {
38822       var box;
38823       if (locOrBox instanceof Array) {
38824           var rect = context.surfaceRect();
38825           var point$$1 = context.curtainProjection(locOrBox);
38826           box = {
38827               left: point$$1[0] + rect.left,
38828               top: point$$1[1] + rect.top
38829           };
38830       } else {
38831           box = locOrBox;
38832       }
38833
38834       return {
38835           left: box.left - padding,
38836           top: box.top - padding,
38837           width: (box.width || 0) + 2 * padding,
38838           height: (box.width || 0) + 2 * padding
38839       };
38840   }
38841
38842
38843   function icon(name, svgklass, useklass) {
38844       return '<svg class="icon ' + (svgklass || '') + '">' +
38845            '<use xlink:href="' + name + '"' +
38846            (useklass ? ' class="' + useklass + '"' : '') + '></use></svg>';
38847   }
38848
38849
38850   function slugify(text) {
38851       return text.toString().toLowerCase()
38852           .replace(/\s+/g, '-')           // Replace spaces with -
38853           .replace(/[^\w\-]+/g, '')       // Remove all non-word chars
38854           .replace(/\-\-+/g, '-')         // Replace multiple - with single -
38855           .replace(/^-+/, '')             // Trim - from start of text
38856           .replace(/-+$/, '');            // Trim - from end of text
38857   }
38858
38859
38860   // console warning for missing walkthrough names
38861   var missingStrings = {};
38862   function checkKey(key, text) {
38863       if (t(key, { default: undefined}) === undefined) {
38864           if (missingStrings.hasOwnProperty(key)) return;  // warn once
38865           missingStrings[key] = text;
38866           var missing = key + ': ' + text;
38867           if (typeof console !== 'undefined') console.log(missing); // eslint-disable-line
38868       }
38869   }
38870
38871
38872   function localize(obj) {
38873       var key;
38874
38875       // Assign name if entity has one..
38876       var name = obj.tags && obj.tags.name;
38877       if (name) {
38878           key = 'intro.graph.name.' + slugify(name);
38879           obj.tags.name = t(key, { default: name });
38880           checkKey(key, name);
38881       }
38882
38883       // Assign street name if entity has one..
38884       var street = obj.tags && obj.tags['addr:street'];
38885       if (street) {
38886           key = 'intro.graph.name.' + slugify(street);
38887           obj.tags['addr:street'] = t(key, { default: street });
38888           checkKey(key, street);
38889
38890           // Add address details common across walkthrough..
38891           var addrTags = [
38892               'block_number', 'city', 'county', 'district', 'hamlet', 'neighbourhood',
38893               'postcode', 'province', 'quarter', 'state', 'subdistrict', 'suburb'
38894           ];
38895           addrTags.forEach(function(k) {
38896               var key = 'intro.graph.' + k;
38897               var tag = 'addr:' + k;
38898               var val = obj.tags && obj.tags[tag];
38899               var str = t(key, { default: val });
38900
38901               if (str) {
38902                   if (str.match(/^<.*>$/) !== null) {
38903                       delete obj.tags[tag];
38904                   } else {
38905                       obj.tags[tag] = str;
38906                   }
38907               }
38908           });
38909       }
38910
38911       return obj;
38912   }
38913
38914
38915   // Used to detect squareness.. some duplicataion of code from actionOrthogonalize.
38916   function isMostlySquare(points) {
38917       // note: uses 15 here instead of the 12 from actionOrthogonalize because
38918       // actionOrthogonalize can actually straighten some larger angles as it iterates
38919       var threshold = 15; // degrees within right or straight
38920       var lowerBound = Math.cos((90 - threshold) * Math.PI / 180);  // near right
38921       var upperBound = Math.cos(threshold * Math.PI / 180);         // near straight
38922       var mag;
38923
38924       for (var i = 0; i < points.length; i++) {
38925           mag = Math.abs(normalizedDotProduct(i, points));
38926           if (mag > lowerBound && mag < upperBound) {
38927               return false;
38928           }
38929       }
38930
38931       return true;
38932
38933
38934       function normalizedDotProduct(i, points) {
38935           var a = points[(i - 1 + points.length) % points.length];
38936           var b = points[i];
38937           var c = points[(i + 1) % points.length];
38938           var p = subtractPoints(a, b);
38939           var q = subtractPoints(c, b);
38940
38941           p = normalizePoint(p);
38942           q = normalizePoint(q);
38943
38944           return p[0] * q[0] + p[1] * q[1];
38945
38946
38947           function subtractPoints(a, b) {
38948               return [a[0] - b[0], a[1] - b[1]];
38949           }
38950
38951           function normalizePoint(point$$1) {
38952               var vector = [0, 0];
38953               var length = Math.sqrt(point$$1[0] * point$$1[0] + point$$1[1] * point$$1[1]);
38954               if (length !== 0) {
38955                   vector[0] = point$$1[0] / length;
38956                   vector[1] = point$$1[1] / length;
38957               }
38958               return vector;
38959           }
38960       }
38961   }
38962
38963
38964   function selectMenuItem(operation) {
38965       var selector$$1 = '.edit-menu .edit-menu-item-' + operation +
38966           ', .radial-menu .radial-menu-item-' + operation;
38967       return select(selector$$1);
38968   }
38969
38970
38971   function transitionTime(point1, point2) {
38972       var distance = geoSphericalDistance(point1, point2);
38973       if (distance === 0)
38974           return 0;
38975       else if (distance < 80)
38976           return 500;
38977       else
38978           return 1000;
38979   }
38980
38981   /** Used for built-in method references. */
38982   var objectProto$i = Object.prototype;
38983
38984   /** Used to check objects for own properties. */
38985   var hasOwnProperty$f = objectProto$i.hasOwnProperty;
38986
38987   /**
38988    * Assigns own enumerable string keyed properties of source objects to the
38989    * destination object. Source objects are applied from left to right.
38990    * Subsequent sources overwrite property assignments of previous sources.
38991    *
38992    * **Note:** This method mutates `object` and is loosely based on
38993    * [`Object.assign`](https://mdn.io/Object/assign).
38994    *
38995    * @static
38996    * @memberOf _
38997    * @since 0.10.0
38998    * @category Object
38999    * @param {Object} object The destination object.
39000    * @param {...Object} [sources] The source objects.
39001    * @returns {Object} Returns `object`.
39002    * @see _.assignIn
39003    * @example
39004    *
39005    * function Foo() {
39006    *   this.a = 1;
39007    * }
39008    *
39009    * function Bar() {
39010    *   this.c = 3;
39011    * }
39012    *
39013    * Foo.prototype.b = 2;
39014    * Bar.prototype.d = 4;
39015    *
39016    * _.assign({ 'a': 0 }, new Foo, new Bar);
39017    * // => { 'a': 1, 'c': 3 }
39018    */
39019   var assign = createAssigner(function(object, source) {
39020     if (isPrototype(source) || isArrayLike(source)) {
39021       copyObject(source, keys$1(source), object);
39022       return;
39023     }
39024     for (var key in source) {
39025       if (hasOwnProperty$f.call(source, key)) {
39026         assignValue(object, key, source[key]);
39027       }
39028     }
39029   });
39030
39031   /* Built-in method references for those with the same name as other `lodash` methods. */
39032   var nativeMax$3 = Math.max;
39033
39034   /**
39035    * Checks if `value` is in `collection`. If `collection` is a string, it's
39036    * checked for a substring of `value`, otherwise
39037    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
39038    * is used for equality comparisons. If `fromIndex` is negative, it's used as
39039    * the offset from the end of `collection`.
39040    *
39041    * @static
39042    * @memberOf _
39043    * @since 0.1.0
39044    * @category Collection
39045    * @param {Array|Object|string} collection The collection to inspect.
39046    * @param {*} value The value to search for.
39047    * @param {number} [fromIndex=0] The index to search from.
39048    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
39049    * @returns {boolean} Returns `true` if `value` is found, else `false`.
39050    * @example
39051    *
39052    * _.includes([1, 2, 3], 1);
39053    * // => true
39054    *
39055    * _.includes([1, 2, 3], 1, 2);
39056    * // => false
39057    *
39058    * _.includes({ 'a': 1, 'b': 2 }, 1);
39059    * // => true
39060    *
39061    * _.includes('abcd', 'bc');
39062    * // => true
39063    */
39064   function includes(collection, value, fromIndex, guard) {
39065     collection = isArrayLike(collection) ? collection : values$1(collection);
39066     fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
39067
39068     var length = collection.length;
39069     if (fromIndex < 0) {
39070       fromIndex = nativeMax$3(length + fromIndex, 0);
39071     }
39072     return isString(collection)
39073       ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
39074       : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
39075   }
39076
39077   function coreGraph$$1(other, mutable) {
39078       if (!(this instanceof coreGraph$$1)) return new coreGraph$$1(other, mutable);
39079
39080       if (other instanceof coreGraph$$1) {
39081           var base = other.base();
39082           this.entities = assign(Object.create(base.entities), other.entities);
39083           this._parentWays = assign(Object.create(base.parentWays), other._parentWays);
39084           this._parentRels = assign(Object.create(base.parentRels), other._parentRels);
39085
39086       } else {
39087           this.entities = Object.create({});
39088           this._parentWays = Object.create({});
39089           this._parentRels = Object.create({});
39090           this.rebase(other || [], [this]);
39091       }
39092
39093       this.transients = {};
39094       this._childNodes = {};
39095       this.frozen = !mutable;
39096   }
39097
39098
39099   coreGraph$$1.prototype = {
39100
39101       hasEntity: function(id) {
39102           return this.entities[id];
39103       },
39104
39105
39106       entity: function(id) {
39107           var entity = this.entities[id];
39108
39109           //https://github.com/openstreetmap/iD/issues/3973#issuecomment-307052376
39110           if (!entity) {
39111               entity = this.entities.__proto__[id];  // eslint-disable-line no-proto
39112           }
39113
39114           if (!entity) {
39115               throw new Error('entity ' + id + ' not found');
39116           }
39117           return entity;
39118       },
39119
39120
39121       transient: function(entity, key, fn) {
39122           var id = entity.id;
39123           var transients = this.transients[id] || (this.transients[id] = {});
39124
39125           if (transients[key] !== undefined) {
39126               return transients[key];
39127           }
39128
39129           transients[key] = fn.call(entity);
39130
39131           return transients[key];
39132       },
39133
39134
39135       parentWays: function(entity) {
39136           var parents = this._parentWays[entity.id];
39137           var result = [];
39138
39139           if (parents) {
39140               for (var i = 0; i < parents.length; i++) {
39141                   result.push(this.entity(parents[i]));
39142               }
39143           }
39144           return result;
39145       },
39146
39147
39148       isPoi: function(entity) {
39149           var parentWays = this._parentWays[entity.id];
39150           return !parentWays || parentWays.length === 0;
39151       },
39152
39153
39154       isShared: function(entity) {
39155           var parentWays = this._parentWays[entity.id];
39156           return parentWays && parentWays.length > 1;
39157       },
39158
39159
39160       parentRelations: function(entity) {
39161           var parents = this._parentRels[entity.id];
39162           var result = [];
39163
39164           if (parents) {
39165               for (var i = 0; i < parents.length; i++) {
39166                   result.push(this.entity(parents[i]));
39167               }
39168           }
39169           return result;
39170       },
39171
39172
39173       childNodes: function(entity) {
39174           if (this._childNodes[entity.id]) return this._childNodes[entity.id];
39175           if (!entity.nodes) return [];
39176
39177           var nodes = [];
39178           for (var i = 0; i < entity.nodes.length; i++) {
39179               nodes[i] = this.entity(entity.nodes[i]);
39180           }
39181
39182           this._childNodes[entity.id] = nodes;
39183           return this._childNodes[entity.id];
39184       },
39185
39186
39187       base: function() {
39188           return {
39189               'entities': utilGetPrototypeOf(this.entities),
39190               'parentWays': utilGetPrototypeOf(this._parentWays),
39191               'parentRels': utilGetPrototypeOf(this._parentRels)
39192           };
39193       },
39194
39195
39196       // Unlike other graph methods, rebase mutates in place. This is because it
39197       // is used only during the history operation that merges newly downloaded
39198       // data into each state. To external consumers, it should appear as if the
39199       // graph always contained the newly downloaded data.
39200       rebase: function(entities, stack, force) {
39201           var base = this.base();
39202           var i, j, k, id;
39203
39204           for (i = 0; i < entities.length; i++) {
39205               var entity = entities[i];
39206
39207               if (!entity.visible || (!force && base.entities[entity.id]))
39208                   continue;
39209
39210               // Merging data into the base graph
39211               base.entities[entity.id] = entity;
39212               this._updateCalculated(undefined, entity, base.parentWays, base.parentRels);
39213
39214               // Restore provisionally-deleted nodes that are discovered to have an extant parent
39215               if (entity.type === 'way') {
39216                   for (j = 0; j < entity.nodes.length; j++) {
39217                       id = entity.nodes[j];
39218                       for (k = 1; k < stack.length; k++) {
39219                           var ents = stack[k].entities;
39220                           if (ents.hasOwnProperty(id) && ents[id] === undefined) {
39221                               delete ents[id];
39222                           }
39223                       }
39224                   }
39225               }
39226           }
39227
39228           for (i = 0; i < stack.length; i++) {
39229               stack[i]._updateRebased();
39230           }
39231       },
39232
39233
39234       _updateRebased: function() {
39235           var base = this.base();
39236           var i, k, child, id, keys;
39237
39238           keys = Object.keys(this._parentWays);
39239           for (i = 0; i < keys.length; i++) {
39240               child = keys[i];
39241               if (base.parentWays[child]) {
39242                   for (k = 0; k < base.parentWays[child].length; k++) {
39243                       id = base.parentWays[child][k];
39244                       if (!this.entities.hasOwnProperty(id) && !includes(this._parentWays[child], id)) {
39245                           this._parentWays[child].push(id);
39246                       }
39247                   }
39248               }
39249           }
39250
39251           keys = Object.keys(this._parentRels);
39252           for (i = 0; i < keys.length; i++) {
39253               child = keys[i];
39254               if (base.parentRels[child]) {
39255                   for (k = 0; k < base.parentRels[child].length; k++) {
39256                       id = base.parentRels[child][k];
39257                       if (!this.entities.hasOwnProperty(id) && !includes(this._parentRels[child], id)) {
39258                           this._parentRels[child].push(id);
39259                       }
39260                   }
39261               }
39262           }
39263
39264           this.transients = {};
39265
39266           // this._childNodes is not updated, under the assumption that
39267           // ways are always downloaded with their child nodes.
39268       },
39269
39270
39271       // Updates calculated properties (parentWays, parentRels) for the specified change
39272       _updateCalculated: function(oldentity, entity, parentWays, parentRels) {
39273           parentWays = parentWays || this._parentWays;
39274           parentRels = parentRels || this._parentRels;
39275
39276           var type = entity && entity.type || oldentity && oldentity.type;
39277           var removed, added, ways, rels, i;
39278
39279           if (type === 'way') {   // Update parentWays
39280               if (oldentity && entity) {
39281                   removed = difference(oldentity.nodes, entity.nodes);
39282                   added = difference(entity.nodes, oldentity.nodes);
39283               } else if (oldentity) {
39284                   removed = oldentity.nodes;
39285                   added = [];
39286               } else if (entity) {
39287                   removed = [];
39288                   added = entity.nodes;
39289               }
39290               for (i = 0; i < removed.length; i++) {
39291                   parentWays[removed[i]] = without(parentWays[removed[i]], oldentity.id);
39292               }
39293               for (i = 0; i < added.length; i++) {
39294                   ways = without(parentWays[added[i]], entity.id);
39295                   ways.push(entity.id);
39296                   parentWays[added[i]] = ways;
39297               }
39298
39299           } else if (type === 'relation') {   // Update parentRels
39300               if (oldentity && entity) {
39301                   removed = difference(oldentity.members, entity.members);
39302                   added = difference(entity.members, oldentity);
39303               } else if (oldentity) {
39304                   removed = oldentity.members;
39305                   added = [];
39306               } else if (entity) {
39307                   removed = [];
39308                   added = entity.members;
39309               }
39310               for (i = 0; i < removed.length; i++) {
39311                   parentRels[removed[i].id] = without(parentRels[removed[i].id], oldentity.id);
39312               }
39313               for (i = 0; i < added.length; i++) {
39314                   rels = without(parentRels[added[i].id], entity.id);
39315                   rels.push(entity.id);
39316                   parentRels[added[i].id] = rels;
39317               }
39318           }
39319       },
39320
39321
39322       replace: function(entity) {
39323           if (this.entities[entity.id] === entity) return this;
39324
39325           return this.update(function() {
39326               this._updateCalculated(this.entities[entity.id], entity);
39327               this.entities[entity.id] = entity;
39328           });
39329       },
39330
39331
39332       remove: function(entity) {
39333           return this.update(function() {
39334               this._updateCalculated(entity, undefined);
39335               this.entities[entity.id] = undefined;
39336           });
39337       },
39338
39339
39340       revert: function(id) {
39341           var baseEntity = this.base().entities[id];
39342           var headEntity = this.entities[id];
39343           if (headEntity === baseEntity) return this;
39344
39345           return this.update(function() {
39346               this._updateCalculated(headEntity, baseEntity);
39347               delete this.entities[id];
39348           });
39349       },
39350
39351
39352       update: function() {
39353           var graph = this.frozen ? coreGraph$$1(this, true) : this;
39354           for (var i = 0; i < arguments.length; i++) {
39355               arguments[i].call(graph, graph);
39356           }
39357
39358           if (this.frozen) graph.frozen = true;
39359
39360           return graph;
39361       },
39362
39363
39364       // Obliterates any existing entities
39365       load: function(entities) {
39366           var base = this.base();
39367           this.entities = Object.create(base.entities);
39368
39369           for (var i in entities) {
39370               this.entities[i] = entities[i];
39371               this._updateCalculated(base.entities[i], this.entities[i]);
39372           }
39373
39374           return this;
39375       }
39376   };
39377
39378   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]}};
39379
39380   /* Built-in method references for those with the same name as other `lodash` methods. */
39381   var nativeMin$1 = Math.min;
39382
39383   /**
39384    * The base implementation of methods like `_.intersection`, without support
39385    * for iteratee shorthands, that accepts an array of arrays to inspect.
39386    *
39387    * @private
39388    * @param {Array} arrays The arrays to inspect.
39389    * @param {Function} [iteratee] The iteratee invoked per element.
39390    * @param {Function} [comparator] The comparator invoked per element.
39391    * @returns {Array} Returns the new array of shared values.
39392    */
39393   function baseIntersection(arrays, iteratee, comparator) {
39394     var includes = comparator ? arrayIncludesWith : arrayIncludes,
39395         length = arrays[0].length,
39396         othLength = arrays.length,
39397         othIndex = othLength,
39398         caches = Array(othLength),
39399         maxLength = Infinity,
39400         result = [];
39401
39402     while (othIndex--) {
39403       var array = arrays[othIndex];
39404       if (othIndex && iteratee) {
39405         array = arrayMap(array, baseUnary(iteratee));
39406       }
39407       maxLength = nativeMin$1(array.length, maxLength);
39408       caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
39409         ? new SetCache(othIndex && array)
39410         : undefined;
39411     }
39412     array = arrays[0];
39413
39414     var index = -1,
39415         seen = caches[0];
39416
39417     outer:
39418     while (++index < length && result.length < maxLength) {
39419       var value = array[index],
39420           computed = iteratee ? iteratee(value) : value;
39421
39422       value = (comparator || value !== 0) ? value : 0;
39423       if (!(seen
39424             ? cacheHas(seen, computed)
39425             : includes(result, computed, comparator)
39426           )) {
39427         othIndex = othLength;
39428         while (--othIndex) {
39429           var cache = caches[othIndex];
39430           if (!(cache
39431                 ? cacheHas(cache, computed)
39432                 : includes(arrays[othIndex], computed, comparator))
39433               ) {
39434             continue outer;
39435           }
39436         }
39437         if (seen) {
39438           seen.push(computed);
39439         }
39440         result.push(value);
39441       }
39442     }
39443     return result;
39444   }
39445
39446   /**
39447    * Casts `value` to an empty array if it's not an array like object.
39448    *
39449    * @private
39450    * @param {*} value The value to inspect.
39451    * @returns {Array|Object} Returns the cast array-like object.
39452    */
39453   function castArrayLikeObject(value) {
39454     return isArrayLikeObject(value) ? value : [];
39455   }
39456
39457   /**
39458    * Creates an array of unique values that are included in all given arrays
39459    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
39460    * for equality comparisons. The order and references of result values are
39461    * determined by the first array.
39462    *
39463    * @static
39464    * @memberOf _
39465    * @since 0.1.0
39466    * @category Array
39467    * @param {...Array} [arrays] The arrays to inspect.
39468    * @returns {Array} Returns the new array of intersecting values.
39469    * @example
39470    *
39471    * _.intersection([2, 1], [2, 3]);
39472    * // => [2]
39473    */
39474   var intersection = baseRest(function(arrays) {
39475     var mapped = arrayMap(arrays, castArrayLikeObject);
39476     return (mapped.length && mapped[0] === arrays[0])
39477       ? baseIntersection(mapped)
39478       : [];
39479   });
39480
39481   function modeDragNode$$1(context) {
39482       var mode = {
39483           id: 'drag-node',
39484           button: 'browse'
39485       };
39486       var hover = behaviorHover(context).altDisables(true)
39487           .on('hover', context.ui().sidebar.hover);
39488       var edit = behaviorEdit(context);
39489
39490       var _nudgeInterval;
39491       var _restoreSelectedIDs = [];
39492       var _wasMidpoint = false;
39493       var _isCancelled = false;
39494       var _activeEntity;
39495       var _startLoc;
39496       var _lastLoc;
39497
39498
39499       function startNudge(entity, nudge) {
39500           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
39501           _nudgeInterval = window.setInterval(function() {
39502               context.pan(nudge);
39503               doMove(entity, nudge);
39504           }, 50);
39505       }
39506
39507
39508       function stopNudge() {
39509           if (_nudgeInterval) {
39510               window.clearInterval(_nudgeInterval);
39511               _nudgeInterval = null;
39512           }
39513       }
39514
39515
39516       function moveAnnotation(entity) {
39517           return t('operations.move.annotation.' + entity.geometry(context.graph()));
39518       }
39519
39520
39521       function connectAnnotation(nodeEntity, targetEntity) {
39522           var nodeGeometry = nodeEntity.geometry(context.graph());
39523           var targetGeometry = targetEntity.geometry(context.graph());
39524           if (nodeGeometry === 'vertex' && targetGeometry === 'vertex') {
39525               var nodeParentWayIDs = context.graph().parentWays(nodeEntity);
39526               var targetParentWayIDs = context.graph().parentWays(targetEntity);
39527               var sharedParentWays = intersection(nodeParentWayIDs, targetParentWayIDs);
39528               // if both vertices are part of the same way
39529               if (sharedParentWays.length !== 0) {
39530                   // if the nodes are next to each other, they are merged
39531                   if (sharedParentWays[0].areAdjacent(nodeEntity.id, targetEntity.id)) {
39532                       return t('operations.connect.annotation.from_vertex.to_adjacent_vertex');
39533                   }
39534                   return t('operations.connect.annotation.from_vertex.to_sibling_vertex');
39535               }
39536           }
39537           return t('operations.connect.annotation.from_' + nodeGeometry + '.to_' + targetGeometry);
39538       }
39539
39540
39541       function origin(entity) {
39542           return context.projection(entity.loc);
39543       }
39544
39545
39546       function keydown() {
39547           if (event.keyCode === utilKeybinding.modifierCodes.alt) {
39548               if (context.surface().classed('nope')) {
39549                   context.surface()
39550                       .classed('nope-suppressed', true);
39551               }
39552               context.surface()
39553                   .classed('nope', false)
39554                   .classed('nope-disabled', true);
39555           }
39556       }
39557
39558
39559       function keyup() {
39560           if (event.keyCode === utilKeybinding.modifierCodes.alt) {
39561               if (context.surface().classed('nope-suppressed')) {
39562                   context.surface()
39563                       .classed('nope', true);
39564               }
39565               context.surface()
39566                   .classed('nope-suppressed', false)
39567                   .classed('nope-disabled', false);
39568           }
39569       }
39570
39571
39572       function start(entity) {
39573           _wasMidpoint = entity.type === 'midpoint';
39574           var hasHidden = context.features().hasHiddenConnections(entity, context.graph());
39575           _isCancelled = event.sourceEvent.shiftKey || hasHidden;
39576
39577
39578           if (_isCancelled) {
39579               if (hasHidden) {
39580                   uiFlash()
39581                       .duration(4000)
39582                       .text(t('modes.drag_node.connected_to_hidden'))();
39583               }
39584               return drag.cancel();
39585           }
39586
39587           if (_wasMidpoint) {
39588               var midpoint = entity;
39589               entity = osmNode();
39590               context.perform(actionAddMidpoint(midpoint, entity));
39591               entity = context.entity(entity.id);   // get post-action entity
39592
39593               var vertex = context.surface().selectAll('.' + entity.id);
39594               drag.target(vertex.node(), entity);
39595
39596           } else {
39597               context.perform(actionNoop());
39598           }
39599
39600           _activeEntity = entity;
39601           _startLoc = entity.loc;
39602
39603           context.surface().selectAll('.' + _activeEntity.id)
39604               .classed('active', true);
39605
39606           context.enter(mode);
39607       }
39608
39609
39610       // related code
39611       // - `behavior/draw.js` `datum()`
39612       function datum() {
39613           var event$$1 = event && event.sourceEvent;
39614           if (!event$$1 || event$$1.altKey) {
39615               return {};
39616           } else {
39617               // When dragging, snap only to touch targets..
39618               // (this excludes area fills and active drawing elements)
39619               var d = event$$1.target.__data__;
39620               return (d && d.properties && d.properties.target) ? d : {};
39621           }
39622       }
39623
39624
39625       function doMove(entity, nudge) {
39626           nudge = nudge || [0, 0];
39627
39628           var currPoint = (event && event.point) || context.projection(_lastLoc);
39629           var currMouse = geoVecSubtract(currPoint, nudge);
39630           var loc = context.projection.invert(currMouse);
39631
39632           if (!_nudgeInterval) {   // If not nudging at the edge of the viewport, try to snap..
39633               // related code
39634               // - `mode/drag_node.js`     `doMode()`
39635               // - `behavior/draw.js`      `click()`
39636               // - `behavior/draw_way.js`  `move()`
39637               var d = datum();
39638               var target = d && d.properties && d.properties.entity;
39639               var targetLoc = target && target.loc;
39640               var targetNodes = d && d.properties && d.properties.nodes;
39641               var edge;
39642
39643               if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
39644                   loc = targetLoc;
39645
39646               } else if (targetNodes) {   // snap to way - a line target with `.nodes`
39647                   edge = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
39648                   if (edge) {
39649                       loc = edge.loc;
39650                   }
39651               }
39652           }
39653
39654           context.replace(
39655               actionMoveNode(entity.id, loc),
39656               moveAnnotation(entity)
39657           );
39658
39659           // Below here: validations
39660           var isInvalid = false;
39661
39662           // Check if this connection to `target` could cause relations to break..
39663           if (target) {
39664               isInvalid = hasRelationConflict(entity, target, edge, context.graph());
39665           }
39666
39667           // Check if this drag causes the geometry to break..
39668           if (!isInvalid) {
39669               isInvalid = hasInvalidGeometry(entity, context.graph());
39670           }
39671
39672
39673           var nope = context.surface().classed('nope');
39674           if (isInvalid === 'relation' || isInvalid === 'restriction') {
39675               if (!nope) {   // about to nope - show hint
39676                   uiFlash()
39677                       .duration(4000)
39678                       .text(t('operations.connect.' + isInvalid,
39679                           { relation: context.presets().item('type/restriction').name() }
39680                       ))();
39681               }
39682           } else {
39683               if (nope) {   // about to un-nope, remove hint
39684                   uiFlash()
39685                       .duration(1)
39686                       .text('')();
39687               }
39688           }
39689
39690
39691           var nopeDisabled = context.surface().classed('nope-disabled');
39692           if (nopeDisabled) {
39693               context.surface()
39694                   .classed('nope', false)
39695                   .classed('nope-suppressed', isInvalid);
39696           } else {
39697               context.surface()
39698                   .classed('nope', isInvalid)
39699                   .classed('nope-suppressed', false);
39700           }
39701
39702           _lastLoc = loc;
39703       }
39704
39705
39706       // Uses `actionConnect.disabled()` to know whether this connection is ok..
39707       function hasRelationConflict(entity, target, edge, graph) {
39708           var testGraph = graph.update();  // copy
39709
39710           // if snapping to way - add midpoint there and consider that the target..
39711           if (edge) {
39712               var midpoint = osmNode();
39713               var action = actionAddMidpoint({
39714                   loc: edge.loc,
39715                   edge: [target.nodes[edge.index - 1], target.nodes[edge.index]]
39716               }, midpoint);
39717
39718               testGraph = action(testGraph);
39719               target = midpoint;
39720           }
39721
39722           // can we connect to it?
39723           var ids = [entity.id, target.id];
39724           return actionConnect(ids).disabled(testGraph);
39725       }
39726
39727
39728       function hasInvalidGeometry(entity, graph) {
39729           var parents = graph.parentWays(entity);
39730           var i, j, k;
39731
39732           for (i = 0; i < parents.length; i++) {
39733               var parent = parents[i];
39734               var nodes = [];
39735               var activeIndex = null;    // which multipolygon ring contains node being dragged
39736
39737               // test any parent multipolygons for valid geometry
39738               var relations = graph.parentRelations(parent);
39739               for (j = 0; j < relations.length; j++) {
39740                   if (!relations[j].isMultipolygon()) continue;
39741
39742                   var rings = osmJoinWays(relations[j].members, graph);
39743
39744                   // find active ring and test it for self intersections
39745                   for (k = 0; k < rings.length; k++) {
39746                       nodes = rings[k].nodes;
39747                       if (find$1(nodes, function(n) { return n.id === entity.id; })) {
39748                           activeIndex = k;
39749                           if (geoHasSelfIntersections(nodes, entity.id)) {
39750                               return true;
39751                           }
39752                       }
39753                       rings[k].coords = nodes.map(function(n) { return n.loc; });
39754                   }
39755
39756                   // test active ring for intersections with other rings in the multipolygon
39757                   for (k = 0; k < rings.length; k++) {
39758                       if (k === activeIndex) continue;
39759
39760                       // make sure active ring doesnt cross passive rings
39761                       if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) {
39762                           return true;
39763                       }
39764                   }
39765               }
39766
39767
39768               // If we still haven't tested this node's parent way for self-intersections.
39769               // (because it's not a member of a multipolygon), test it now.
39770               if (activeIndex === null) {
39771                   nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
39772                   if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) {
39773                       return true;
39774                   }
39775               }
39776
39777           }
39778
39779           return false;
39780       }
39781
39782
39783       function move(entity) {
39784           if (_isCancelled) return;
39785           event.sourceEvent.stopPropagation();
39786
39787           context.surface().classed('nope-disabled', event.sourceEvent.altKey);
39788
39789           _lastLoc = context.projection.invert(event.point);
39790
39791           doMove(entity);
39792           var nudge = geoViewportEdge(event.point, context.map().dimensions());
39793           if (nudge) {
39794               startNudge(entity, nudge);
39795           } else {
39796               stopNudge();
39797           }
39798       }
39799
39800
39801       function end(entity) {
39802           if (_isCancelled) return;
39803
39804           var d = datum();
39805           var nope = (d && d.properties && d.properties.nope) || context.surface().classed('nope');
39806           var target = d && d.properties && d.properties.entity;   // entity to snap to
39807
39808           if (nope) {   // bounce back
39809               context.perform(
39810                   _actionBounceBack(entity.id, _startLoc)
39811               );
39812
39813           } else if (target && target.type === 'way') {
39814               var choice = geoChooseEdge(context.childNodes(target), context.mouse(), context.projection, entity.id);
39815               context.replace(
39816                   actionAddMidpoint({
39817                       loc: choice.loc,
39818                       edge: [target.nodes[choice.index - 1], target.nodes[choice.index]]
39819                   }, entity),
39820                   connectAnnotation(entity, target)
39821               );
39822
39823           } else if (target && target.type === 'node') {
39824               context.replace(
39825                   actionConnect([target.id, entity.id]),
39826                   connectAnnotation(entity, target)
39827               );
39828
39829           } else if (_wasMidpoint) {
39830               context.replace(
39831                   actionNoop(),
39832                   t('operations.add.annotation.vertex')
39833               );
39834
39835           } else {
39836               context.replace(
39837                   actionNoop(),
39838                   moveAnnotation(entity)
39839               );
39840           }
39841
39842           var reselection = _restoreSelectedIDs.filter(function(id) {
39843               return context.graph().hasEntity(id);
39844           });
39845
39846           if (reselection.length) {
39847               context.enter(modeSelect(context, reselection));
39848           } else {
39849               context.enter(modeBrowse(context));
39850           }
39851       }
39852
39853
39854       function _actionBounceBack(nodeID, toLoc) {
39855           var moveNode = actionMoveNode(nodeID, toLoc);
39856           var action = function(graph, t$$1) {
39857               // last time through, pop off the bounceback perform.
39858               // it will then overwrite the initial perform with a moveNode that does nothing
39859               if (t$$1 === 1) context.pop();
39860               return moveNode(graph, t$$1);
39861           };
39862           action.transitionable = true;
39863           return action;
39864       }
39865
39866
39867       function cancel() {
39868           drag.cancel();
39869           context.enter(modeBrowse(context));
39870       }
39871
39872
39873       var drag = behaviorDrag()
39874           .selector('.layer-touch.points .target')
39875           .surface(select('#map').node())
39876           .origin(origin)
39877           .on('start', start)
39878           .on('move', move)
39879           .on('end', end);
39880
39881
39882       mode.enter = function() {
39883           context.install(hover);
39884           context.install(edit);
39885
39886           select(window)
39887               .on('keydown.drawWay', keydown)
39888               .on('keyup.drawWay', keyup);
39889
39890           context.history()
39891               .on('undone.drag-node', cancel);
39892       };
39893
39894
39895       mode.exit = function() {
39896           context.ui().sidebar.hover.cancel();
39897           context.uninstall(hover);
39898           context.uninstall(edit);
39899
39900           select(window)
39901               .on('keydown.hover', null)
39902               .on('keyup.hover', null);
39903
39904           context.history()
39905               .on('undone.drag-node', null);
39906
39907           _activeEntity = null;
39908
39909           context.surface()
39910               .classed('nope', false)
39911               .classed('nope-suppressed', false)
39912               .classed('nope-disabled', false)
39913               .selectAll('.active')
39914               .classed('active', false);
39915
39916           stopNudge();
39917       };
39918
39919
39920       mode.selectedIDs = function() {
39921           if (!arguments.length) return _activeEntity ? [_activeEntity.id] : [];
39922           // no assign
39923           return mode;
39924       };
39925
39926
39927       mode.activeID = function() {
39928           if (!arguments.length) return _activeEntity && _activeEntity.id;
39929           // no assign
39930           return mode;
39931       };
39932
39933
39934       mode.restoreSelectedIDs = function(_) {
39935           if (!arguments.length) return _restoreSelectedIDs;
39936           _restoreSelectedIDs = _;
39937           return mode;
39938       };
39939
39940
39941       mode.behavior = drag;
39942
39943
39944       return mode;
39945   }
39946
39947   function modeDragNote$$1(context) {
39948       var mode = {
39949           id: 'drag-note',
39950           button: 'browse'
39951       };
39952
39953       var edit = behaviorEdit(context);
39954
39955       var _nudgeInterval;
39956       var _lastLoc;
39957       var _note;    // most current note.. dragged note may have stale datum.
39958
39959
39960       function startNudge(nudge) {
39961           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
39962           _nudgeInterval = window.setInterval(function() {
39963               context.pan(nudge);
39964               doMove(nudge);
39965           }, 50);
39966       }
39967
39968
39969       function stopNudge() {
39970           if (_nudgeInterval) {
39971               window.clearInterval(_nudgeInterval);
39972               _nudgeInterval = null;
39973           }
39974       }
39975
39976
39977       function origin(note) {
39978           return context.projection(note.loc);
39979       }
39980
39981
39982       function start(note) {
39983           _note = note;
39984           var osm = services.osm;
39985           if (osm) {
39986               // Get latest note from cache.. The marker may have a stale datum bound to it
39987               // and dragging it around can sometimes delete the users note comment.
39988               _note = osm.getNote(_note.id);
39989           }
39990
39991           context.surface().selectAll('.note-' + _note.id)
39992               .classed('active', true);
39993
39994           context.perform(actionNoop());
39995           context.enter(mode);
39996           context.selectedNoteID(_note.id);
39997       }
39998
39999
40000       function move() {
40001           event.sourceEvent.stopPropagation();
40002           _lastLoc = context.projection.invert(event.point);
40003
40004           doMove();
40005           var nudge = geoViewportEdge(event.point, context.map().dimensions());
40006           if (nudge) {
40007               startNudge(nudge);
40008           } else {
40009               stopNudge();
40010           }
40011       }
40012
40013
40014       function doMove(nudge) {
40015           nudge = nudge || [0, 0];
40016
40017           var currPoint = (event && event.point) || context.projection(_lastLoc);
40018           var currMouse = geoVecSubtract(currPoint, nudge);
40019           var loc = context.projection.invert(currMouse);
40020
40021           _note = _note.move(loc);
40022
40023           var osm = services.osm;
40024           if (osm) {
40025               osm.replaceNote(_note);  // update note cache
40026           }
40027
40028           context.replace(actionNoop());   // trigger redraw
40029       }
40030
40031
40032       function end() {
40033           context.replace(actionNoop());   // trigger redraw
40034
40035           context
40036               .selectedNoteID(_note.id)
40037               .enter(modeSelectNote$$1(context, _note.id));
40038       }
40039
40040
40041       var drag = behaviorDrag()
40042           .selector('.layer-touch.markers .target.note.new')
40043           .surface(select('#map').node())
40044           .origin(origin)
40045           .on('start', start)
40046           .on('move', move)
40047           .on('end', end);
40048
40049
40050       mode.enter = function() {
40051           context.install(edit);
40052       };
40053
40054
40055       mode.exit = function() {
40056           context.ui().sidebar.hover.cancel();
40057           context.uninstall(edit);
40058
40059           context.surface()
40060               .selectAll('.active')
40061               .classed('active', false);
40062
40063           stopNudge();
40064       };
40065
40066       mode.behavior = drag;
40067
40068       return mode;
40069   }
40070
40071   function modeBrowse(context) {
40072       var mode = {
40073           button: 'browse',
40074           id: 'browse',
40075           title: t('modes.browse.title'),
40076           description: t('modes.browse.description')
40077       }, sidebar;
40078
40079       var behaviors = [
40080           behaviorPaste(context),
40081           behaviorHover(context).on('hover', context.ui().sidebar.hover),
40082           behaviorSelect(context),
40083           behaviorLasso(context),
40084           modeDragNode$$1(context).behavior,
40085           modeDragNote$$1(context).behavior
40086       ];
40087
40088
40089       mode.enter = function() {
40090           behaviors.forEach(context.install);
40091
40092           // Get focus on the body.
40093           if (document.activeElement && document.activeElement.blur) {
40094               document.activeElement.blur();
40095           }
40096
40097           if (sidebar) {
40098               context.ui().sidebar.show(sidebar);
40099           } else {
40100               context.ui().sidebar.select(null);
40101           }
40102       };
40103
40104
40105       mode.exit = function() {
40106           context.ui().sidebar.hover.cancel();
40107           behaviors.forEach(context.uninstall);
40108
40109           if (sidebar) {
40110               context.ui().sidebar.hide();
40111           }
40112       };
40113
40114
40115       mode.sidebar = function(_) {
40116           if (!arguments.length) return sidebar;
40117           sidebar = _;
40118           return mode;
40119       };
40120
40121
40122       return mode;
40123   }
40124
40125   function svgIcon(name, svgklass, useklass) {
40126       return function drawIcon(selection) {
40127           selection.selectAll('svg')
40128               .data([0])
40129               .enter()
40130               .append('svg')
40131               .attr('class', 'icon ' + (svgklass || ''))
40132               .append('use')
40133               .attr('xlink:href', name)
40134               .attr('class', useklass);
40135       };
40136   }
40137
40138   // Tooltips and svg mask used to highlight certain features
40139   function uiCurtain() {
40140
40141       var surface = select(null),
40142           tooltip = select(null),
40143           darkness = select(null);
40144
40145       function curtain(selection$$1) {
40146           surface = selection$$1
40147               .append('svg')
40148               .attr('id', 'curtain')
40149               .style('z-index', 1000)
40150               .style('pointer-events', 'none')
40151               .style('position', 'absolute')
40152               .style('top', 0)
40153               .style('left', 0);
40154
40155           darkness = surface.append('path')
40156               .attr('x', 0)
40157               .attr('y', 0)
40158               .attr('class', 'curtain-darkness');
40159
40160           select(window).on('resize.curtain', resize);
40161
40162           tooltip = selection$$1.append('div')
40163               .attr('class', 'tooltip')
40164               .style('z-index', 1002);
40165
40166           tooltip
40167               .append('div')
40168               .attr('class', 'tooltip-arrow');
40169
40170           tooltip
40171               .append('div')
40172               .attr('class', 'tooltip-inner');
40173
40174           resize();
40175
40176
40177           function resize() {
40178               surface
40179                   .attr('width', window.innerWidth)
40180                   .attr('height', window.innerHeight);
40181               curtain.cut(darkness.datum());
40182           }
40183       }
40184
40185
40186       /**
40187        * Reveal cuts the curtain to highlight the given box,
40188        * and shows a tooltip with instructions next to the box.
40189        *
40190        * @param  {String|ClientRect} [box]   box used to cut the curtain
40191        * @param  {String}    [text]          text for a tooltip
40192        * @param  {Object}    [options]
40193        * @param  {string}    [options.tooltipClass]    optional class to add to the tooltip
40194        * @param  {integer}   [options.duration]        transition time in milliseconds
40195        * @param  {string}    [options.buttonText]      if set, create a button with this text label
40196        * @param  {function}  [options.buttonCallback]  if set, the callback for the button
40197        * @param  {String|ClientRect} [options.tooltipBox]  box for tooltip position, if different from box for the curtain
40198        */
40199       curtain.reveal = function(box, text, options) {
40200           if (typeof box === 'string') {
40201               box = select(box).node();
40202           }
40203           if (box && box.getBoundingClientRect) {
40204               box = copyBox(box.getBoundingClientRect());
40205           }
40206
40207           options = options || {};
40208
40209           var tooltipBox;
40210           if (options.tooltipBox) {
40211               tooltipBox = options.tooltipBox;
40212               if (typeof tooltipBox === 'string') {
40213                   tooltipBox = select(tooltipBox).node();
40214               }
40215               if (tooltipBox && tooltipBox.getBoundingClientRect) {
40216                   tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
40217               }
40218           } else {
40219               tooltipBox = box;
40220           }
40221
40222           if (tooltipBox && text) {
40223               // pseudo markdown bold text for the instruction section..
40224               var parts = text.split('**');
40225               var html = parts[0] ? '<span>' + parts[0] + '</span>' : '';
40226               if (parts[1]) {
40227                   html += '<span class="instruction">' + parts[1] + '</span>';
40228               }
40229
40230               html = html.replace(/\*(.*?)\*/g, '<em>$1</em>');   // emphasis
40231               html = html.replace(/\{br\}/g, '<br/><br/>');       // linebreak
40232
40233               if (options.buttonText && options.buttonCallback) {
40234                   html += '<div class="button-section">' +
40235                       '<button href="#" class="button action col8">' + options.buttonText + '</button></div>';
40236               }
40237
40238               var classes = 'curtain-tooltip tooltip in ' + (options.tooltipClass || '');
40239               tooltip
40240                   .classed(classes, true)
40241                   .selectAll('.tooltip-inner')
40242                   .html(html);
40243
40244               if (options.buttonText && options.buttonCallback) {
40245                   var button = tooltip.selectAll('.button-section .button.action');
40246                   button
40247                       .on('click', function() {
40248                           event.preventDefault();
40249                           options.buttonCallback();
40250                       });
40251               }
40252
40253               var tip = copyBox(tooltip.node().getBoundingClientRect()),
40254                   w = window.innerWidth,
40255                   h = window.innerHeight,
40256                   tooltipWidth = 200,
40257                   tooltipArrow = 5,
40258                   side, pos;
40259
40260
40261               // hack: this will have bottom placement,
40262               // so need to reserve extra space for the tooltip illustration.
40263               if (options.tooltipClass === 'intro-mouse') {
40264                   tip.height += 80;
40265               }
40266
40267               // trim box dimensions to just the portion that fits in the window..
40268               if (tooltipBox.top + tooltipBox.height > h) {
40269                   tooltipBox.height -= (tooltipBox.top + tooltipBox.height - h);
40270               }
40271               if (tooltipBox.left + tooltipBox.width > w) {
40272                   tooltipBox.width -= (tooltipBox.left + tooltipBox.width - w);
40273               }
40274
40275               // determine tooltip placement..
40276
40277               if (tooltipBox.top + tooltipBox.height < 100) {
40278                   // tooltip below box..
40279                   side = 'bottom';
40280                   pos = [
40281                       tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
40282                       tooltipBox.top + tooltipBox.height
40283                   ];
40284
40285               } else if (tooltipBox.top > h - 140) {
40286                   // tooltip above box..
40287                   side = 'top';
40288                   pos = [
40289                       tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
40290                       tooltipBox.top - tip.height
40291                   ];
40292
40293               } else {
40294                   // tooltip to the side of the tooltipBox..
40295                   var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
40296
40297                   if (textDirection === 'rtl') {
40298                       if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
40299                           side = 'right';
40300                           pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
40301
40302                       } else {
40303                           side = 'left';
40304                           pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
40305                       }
40306
40307                   } else {
40308                       if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
40309                           side = 'left';
40310                           pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
40311                       }
40312                       else {
40313                           side = 'right';
40314                           pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
40315                       }
40316                   }
40317               }
40318
40319               if (options.duration !== 0 || !tooltip.classed(side)) {
40320                   tooltip.call(uiToggle(true));
40321               }
40322
40323               tooltip
40324                   .style('top', pos[1] + 'px')
40325                   .style('left', pos[0] + 'px')
40326                   .attr('class', classes + ' ' + side);
40327
40328
40329               // shift tooltip-inner if it is very close to the top or bottom edge
40330               // (doesn't affect the placement of the tooltip-arrow)
40331               var shiftY = 0;
40332               if (side === 'left' || side === 'right') {
40333                   if (pos[1] < 60) {
40334                       shiftY = 60 - pos[1];
40335                   }
40336                   else if (pos[1] + tip.height > h - 100) {
40337                       shiftY = h - pos[1] - tip.height - 100;
40338                   }
40339               }
40340               tooltip.selectAll('.tooltip-inner')
40341                   .style('top', shiftY + 'px');
40342
40343           } else {
40344               tooltip
40345                   .classed('in', false)
40346                   .call(uiToggle(false));
40347           }
40348
40349           curtain.cut(box, options.duration);
40350
40351           return tooltip;
40352       };
40353
40354
40355       curtain.cut = function(datum, duration) {
40356           darkness.datum(datum)
40357               .interrupt();
40358
40359           var selection$$1;
40360           if (duration === 0) {
40361               selection$$1 = darkness;
40362           } else {
40363               selection$$1 = darkness
40364                   .transition()
40365                   .duration(duration || 600)
40366                   .ease(linear$1);
40367           }
40368
40369           selection$$1
40370               .attr('d', function(d) {
40371                   var string = 'M 0,0 L 0,' + window.innerHeight + ' L ' +
40372                       window.innerWidth + ',' + window.innerHeight + 'L' +
40373                       window.innerWidth + ',0 Z';
40374
40375                   if (!d) return string;
40376                   return string + 'M' +
40377                       d.left + ',' + d.top + 'L' +
40378                       d.left + ',' + (d.top + d.height) + 'L' +
40379                       (d.left + d.width) + ',' + (d.top + d.height) + 'L' +
40380                       (d.left + d.width) + ',' + (d.top) + 'Z';
40381
40382               });
40383       };
40384
40385
40386       curtain.remove = function() {
40387           surface.remove();
40388           tooltip.remove();
40389           select(window).on('resize.curtain', null);
40390       };
40391
40392
40393       // ClientRects are immutable, so copy them to an object,
40394       // in case we need to trim the height/width.
40395       function copyBox(src) {
40396           return {
40397               top: src.top,
40398               right: src.right,
40399               bottom: src.bottom,
40400               left: src.left,
40401               width: src.width,
40402               height: src.height
40403           };
40404       }
40405
40406
40407       return curtain;
40408   }
40409
40410   function uiIntroWelcome(context, reveal) {
40411       var dispatch$$1 = dispatch('done');
40412       var listener = clickListener();
40413
40414       var chapter = {
40415           title: 'intro.welcome.title'
40416       };
40417
40418
40419       function welcome() {
40420           context.map().centerZoom([-85.63591, 41.94285], 19);
40421           reveal('.intro-nav-wrap .chapter-welcome',
40422               t('intro.welcome.welcome'),
40423               { buttonText: t('intro.ok'), buttonCallback: practice }
40424           );
40425       }
40426
40427       function practice() {
40428           reveal('.intro-nav-wrap .chapter-welcome',
40429               t('intro.welcome.practice'),
40430               { buttonText: t('intro.ok'), buttonCallback: words }
40431           );
40432       }
40433
40434       function words() {
40435           reveal('.intro-nav-wrap .chapter-welcome',
40436               t('intro.welcome.words'),
40437               { buttonText: t('intro.ok'), buttonCallback: mouse$$1 }
40438           );
40439       }
40440
40441
40442       function mouse$$1() {
40443           reveal('.intro-nav-wrap .chapter-welcome',
40444               t('intro.welcome.mouse'),
40445               { buttonText: t('intro.ok'), buttonCallback: leftClick }
40446           );
40447       }
40448
40449
40450       function leftClick() {
40451           var counter = 0;
40452           var times = 5;
40453
40454           var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
40455               t('intro.welcome.leftclick', { num: times }),
40456               { tooltipClass: 'intro-mouse' }
40457           );
40458
40459           tooltip.selectAll('.tooltip-inner')
40460               .insert('svg', 'span')
40461               .attr('class', 'tooltip-illustration')
40462               .append('use')
40463               .attr('xlink:href', '#iD-walkthrough-mouse');
40464
40465           tooltip
40466               .append('div')
40467               .attr('class', 'counter');
40468
40469           tooltip.call(listener);
40470
40471           listener.on('click', function(which) {
40472               if (which === 'left') {
40473                   select('.curtain-tooltip.intro-mouse .counter')
40474                       .text(String(++counter));
40475
40476                   if (counter === times) {
40477                       window.setTimeout(function() { continueTo(rightClick); }, 1000);
40478                   }
40479               }
40480           });
40481
40482           function continueTo(nextStep) {
40483               listener.on('click', null);
40484               tooltip.call(listener.off);
40485               tooltip.select('.counter').remove();
40486               nextStep();
40487           }
40488       }
40489
40490
40491       function rightClick() {
40492           var counter = 0;
40493           var times = 5;
40494
40495           var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
40496               t('intro.welcome.rightclick', { num: times }),
40497               { tooltipClass: 'intro-mouse' }
40498           );
40499
40500           tooltip.selectAll('.tooltip-inner')
40501               .insert('svg', 'span')
40502               .attr('class', 'tooltip-illustration')
40503               .append('use')
40504               .attr('xlink:href', '#iD-walkthrough-mouse');
40505
40506           tooltip
40507               .append('div')
40508               .attr('class', 'counter');
40509
40510           tooltip.call(listener);
40511
40512           listener.on('click', function(which) {
40513               if (which === 'right') {
40514                   select('.curtain-tooltip.intro-mouse .counter')
40515                       .text(String(++counter));
40516
40517                   if (counter === times) {
40518                       window.setTimeout(function() { continueTo(chapters); }, 1000);
40519                   }
40520               }
40521           });
40522
40523           function continueTo(nextStep) {
40524               listener.on('click', null);
40525               tooltip.call(listener.off);
40526               tooltip.select('.counter').remove();
40527               nextStep();
40528           }
40529       }
40530
40531
40532       function chapters() {
40533           dispatch$$1.call('done');
40534           reveal('.intro-nav-wrap .chapter-navigation',
40535               t('intro.welcome.chapters', { next: t('intro.navigation.title') })
40536           );
40537       }
40538
40539
40540       chapter.enter = function() {
40541           welcome();
40542       };
40543
40544
40545       chapter.exit = function() {
40546           listener.off();
40547           select('.curtain-tooltip.intro-mouse')
40548               .selectAll('.counter')
40549               .remove();
40550       };
40551
40552
40553       chapter.restart = function() {
40554           chapter.exit();
40555           chapter.enter();
40556       };
40557
40558
40559       return utilRebind(chapter, dispatch$$1, 'on');
40560   }
40561
40562
40563
40564   function clickListener() {
40565       var dispatch$$1 = dispatch('click');
40566       var minTime = 120;
40567       var tooltip = select(null);
40568       var down = {};
40569
40570       // `down` keeps track of which buttons/keys are down.
40571       // Setting a property in `down` happens immediately.
40572       // Unsetting a property in `down` is delayed because
40573       //   on Windows a contextmenu event happens after keyup/mouseup
40574
40575       function keydown() {
40576           if (event.keyCode === 93)  {   // context menu
40577               event.preventDefault();
40578               event.stopPropagation();
40579               down.menu = event.timeStamp;
40580               tooltip.classed('rightclick', true);
40581           }
40582       }
40583
40584
40585       function keyup() {
40586           if (event.keyCode === 93)  {   // context menu
40587               event.preventDefault();
40588               event.stopPropagation();
40589               var endTime = event.timeStamp;
40590               var startTime = down.menu || endTime;
40591               var delay = (endTime - startTime < minTime) ? minTime : 0;
40592
40593               window.setTimeout(function() {
40594                   tooltip.classed('rightclick', false);
40595                   down.menu = undefined;  // delayed, for Windows
40596               }, delay);
40597
40598               dispatch$$1.call('click', this, 'right');
40599           }
40600       }
40601
40602
40603       function mousedown() {
40604           var button = event.button;
40605           if (button === 0 && !event.ctrlKey) {
40606               tooltip.classed('leftclick', true);
40607           } else if (button === 2) {
40608               tooltip.classed('rightclick', true);
40609           }
40610           down[button] = event.timeStamp;
40611       }
40612
40613
40614       function mouseup() {
40615           var button = event.button;
40616           var endTime = event.timeStamp;
40617           var startTime = down[button] || endTime;
40618           var delay = (endTime - startTime < minTime) ? minTime : 0;
40619
40620           if (button === 0 && !event.ctrlKey) {
40621               window.setTimeout(function() {
40622                   tooltip.classed('leftclick', false);
40623                   down[button] = undefined;  // delayed, for Windows
40624               }, delay);
40625
40626               dispatch$$1.call('click', this, 'left');
40627
40628           } else if (button === 2) {
40629               window.setTimeout(function() {
40630                   tooltip.classed('rightclick', false);
40631                   down[button] = undefined;  // delayed, for Windows
40632               }, delay);
40633
40634               dispatch$$1.call('click', this, 'right');
40635
40636           } else {
40637               window.setTimeout(function() {
40638                   down[button] = undefined;  // delayed, for Windows
40639               }, delay);
40640           }
40641       }
40642
40643
40644       function contextmenu() {
40645           event.preventDefault();
40646           event.stopPropagation();
40647           if (!down[2] && !down.menu) {
40648               tooltip.classed('rightclick', true);
40649               window.setTimeout(function() {
40650                   tooltip.classed('rightclick', false);
40651               }, minTime);
40652               dispatch$$1.call('click', this, 'right');
40653           }
40654       }
40655
40656
40657       var behavior = function(selection$$1) {
40658           tooltip = selection$$1;
40659           down = {};
40660
40661           select(window)
40662               .on('keydown.intro', keydown)
40663               .on('keyup.intro', keyup)
40664               .on('mousedown.intro', mousedown)
40665               .on('mouseup.intro', mouseup)
40666               .on('contextmenu.intro', contextmenu);
40667       };
40668
40669
40670       behavior.off = function() {
40671           select(window)
40672               .on('keydown.intro', null)
40673               .on('keyup.intro', null)
40674               .on('mousedown.intro', null)
40675               .on('mouseup.intro', null)
40676               .on('contextmenu.intro', null);
40677
40678           tooltip
40679               .classed('leftclick', false)
40680               .classed('rightclick', false);
40681       };
40682
40683       return utilRebind(behavior, dispatch$$1, 'on');
40684   }
40685
40686   function uiIntroNavigation(context, reveal) {
40687       var dispatch$$1 = dispatch('done');
40688       var timeouts = [];
40689       var hallId = 'n2061';
40690       var townHall = [-85.63591, 41.94285];
40691       var springStreetId = 'w397';
40692       var springStreetEndId = 'n1834';
40693       var springStreet = [-85.63582, 41.94255];
40694       var onewayField = context.presets().field('oneway');
40695       var maxspeedField = context.presets().field('maxspeed');
40696
40697
40698       var chapter = {
40699           title: 'intro.navigation.title'
40700       };
40701
40702
40703       function timeout(f, t$$1) {
40704           timeouts.push(window.setTimeout(f, t$$1));
40705       }
40706
40707
40708       function eventCancel() {
40709           event.stopPropagation();
40710           event.preventDefault();
40711       }
40712
40713
40714       function isTownHallSelected() {
40715           var ids = context.selectedIDs();
40716           return ids.length === 1 && ids[0] === hallId;
40717       }
40718
40719
40720       function dragMap() {
40721           context.enter(modeBrowse(context));
40722           context.history().reset('initial');
40723
40724           var msec = transitionTime(townHall, context.map().center());
40725           if (msec) { reveal(null, null, { duration: 0 }); }
40726           context.map().centerZoomEase(townHall, 19, msec);
40727
40728           timeout(function() {
40729               var centerStart = context.map().center();
40730
40731               reveal('#surface', t('intro.navigation.drag'));
40732               context.map().on('drawn.intro', function() {
40733                   reveal('#surface', t('intro.navigation.drag'), { duration: 0 });
40734               });
40735
40736               context.map().on('move.intro', function() {
40737                   var centerNow = context.map().center();
40738                   if (centerStart[0] !== centerNow[0] || centerStart[1] !== centerNow[1]) {
40739                       context.map().on('move.intro', null);
40740                       timeout(function() { continueTo(zoomMap); }, 3000);
40741                   }
40742               });
40743
40744           }, msec + 100);
40745
40746           function continueTo(nextStep) {
40747               context.map().on('move.intro drawn.intro', null);
40748               nextStep();
40749           }
40750       }
40751
40752
40753       function zoomMap() {
40754           var zoomStart = context.map().zoom();
40755
40756           reveal('#surface',
40757               t('intro.navigation.zoom', {
40758                   plus: icon('#iD-icon-plus', 'pre-text'),
40759                   minus: icon('#iD-icon-minus', 'pre-text')
40760               })
40761           );
40762
40763           context.map().on('drawn.intro', function() {
40764               reveal('#surface',
40765                   t('intro.navigation.zoom', {
40766                       plus: icon('#iD-icon-plus', 'pre-text'),
40767                       minus: icon('#iD-icon-minus', 'pre-text')
40768                   }), { duration: 0 }
40769               );
40770           });
40771
40772           context.map().on('move.intro', function() {
40773               if (context.map().zoom() !== zoomStart) {
40774                   context.map().on('move.intro', null);
40775                   timeout(function() { continueTo(features); }, 3000);
40776               }
40777           });
40778
40779           function continueTo(nextStep) {
40780               context.map().on('move.intro drawn.intro', null);
40781               nextStep();
40782           }
40783       }
40784
40785
40786       function features() {
40787           var onClick = function() { continueTo(pointsLinesAreas); };
40788
40789           reveal('#surface', t('intro.navigation.features'),
40790               { buttonText: t('intro.ok'), buttonCallback: onClick }
40791           );
40792
40793           context.map().on('drawn.intro', function() {
40794               reveal('#surface', t('intro.navigation.features'),
40795                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
40796               );
40797           });
40798
40799           function continueTo(nextStep) {
40800               context.map().on('drawn.intro', null);
40801               nextStep();
40802           }
40803       }
40804
40805       function pointsLinesAreas() {
40806           var onClick = function() { continueTo(nodesWays); };
40807
40808           reveal('#surface', t('intro.navigation.points_lines_areas'),
40809               { buttonText: t('intro.ok'), buttonCallback: onClick }
40810           );
40811
40812           context.map().on('drawn.intro', function() {
40813               reveal('#surface', t('intro.navigation.points_lines_areas'),
40814                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
40815               );
40816           });
40817
40818           function continueTo(nextStep) {
40819               context.map().on('drawn.intro', null);
40820               nextStep();
40821           }
40822       }
40823
40824       function nodesWays() {
40825           var onClick = function() { continueTo(clickTownHall); };
40826
40827           reveal('#surface', t('intro.navigation.nodes_ways'),
40828               { buttonText: t('intro.ok'), buttonCallback: onClick }
40829           );
40830
40831           context.map().on('drawn.intro', function() {
40832               reveal('#surface', t('intro.navigation.nodes_ways'),
40833                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
40834               );
40835           });
40836
40837           function continueTo(nextStep) {
40838               context.map().on('drawn.intro', null);
40839               nextStep();
40840           }
40841       }
40842
40843       function clickTownHall() {
40844           context.enter(modeBrowse(context));
40845           context.history().reset('initial');
40846
40847           var entity = context.hasEntity(hallId);
40848           if (!entity) return;
40849           reveal(null, null, { duration: 0 });
40850           context.map().centerZoomEase(entity.loc, 19, 500);
40851
40852           timeout(function() {
40853               var entity = context.hasEntity(hallId);
40854               if (!entity) return;
40855               var box = pointBox(entity.loc, context);
40856               reveal(box, t('intro.navigation.click_townhall'));
40857
40858               context.map().on('move.intro drawn.intro', function() {
40859                   var entity = context.hasEntity(hallId);
40860                   if (!entity) return;
40861                   var box = pointBox(entity.loc, context);
40862                   reveal(box, t('intro.navigation.click_townhall'), { duration: 0 });
40863               });
40864
40865               context.on('enter.intro', function() {
40866                   if (isTownHallSelected()) continueTo(selectedTownHall);
40867               });
40868
40869           }, 550);  // after centerZoomEase
40870
40871           context.history().on('change.intro', function() {
40872               if (!context.hasEntity(hallId)) {
40873                   continueTo(clickTownHall);
40874               }
40875           });
40876
40877           function continueTo(nextStep) {
40878               context.on('enter.intro', null);
40879               context.map().on('move.intro drawn.intro', null);
40880               context.history().on('change.intro', null);
40881               nextStep();
40882           }
40883       }
40884
40885
40886       function selectedTownHall() {
40887           if (!isTownHallSelected()) return clickTownHall();
40888
40889           var entity = context.hasEntity(hallId);
40890           if (!entity) return clickTownHall();
40891
40892           var box = pointBox(entity.loc, context);
40893           var onClick = function() { continueTo(editorTownHall); };
40894
40895           reveal(box, t('intro.navigation.selected_townhall'),
40896               { buttonText: t('intro.ok'), buttonCallback: onClick }
40897           );
40898
40899           context.map().on('move.intro drawn.intro', function() {
40900               var entity = context.hasEntity(hallId);
40901               if (!entity) return;
40902               var box = pointBox(entity.loc, context);
40903               reveal(box, t('intro.navigation.selected_townhall'),
40904                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
40905               );
40906           });
40907
40908           context.history().on('change.intro', function() {
40909               if (!context.hasEntity(hallId)) {
40910                   continueTo(clickTownHall);
40911               }
40912           });
40913
40914           function continueTo(nextStep) {
40915               context.map().on('move.intro drawn.intro', null);
40916               context.history().on('change.intro', null);
40917               nextStep();
40918           }
40919       }
40920
40921
40922       function editorTownHall() {
40923           if (!isTownHallSelected()) return clickTownHall();
40924
40925           // disallow scrolling
40926           select('.inspector-wrap').on('wheel.intro', eventCancel);
40927
40928           var onClick = function() { continueTo(presetTownHall); };
40929
40930           reveal('.entity-editor-pane',
40931               t('intro.navigation.editor_townhall'),
40932               { buttonText: t('intro.ok'), buttonCallback: onClick }
40933           );
40934
40935           context.on('exit.intro', function() {
40936               continueTo(clickTownHall);
40937           });
40938
40939           context.history().on('change.intro', function() {
40940               if (!context.hasEntity(hallId)) {
40941                   continueTo(clickTownHall);
40942               }
40943           });
40944
40945           function continueTo(nextStep) {
40946               context.on('exit.intro', null);
40947               context.history().on('change.intro', null);
40948               select('.inspector-wrap').on('wheel.intro', null);
40949               nextStep();
40950           }
40951       }
40952
40953
40954       function presetTownHall() {
40955           if (!isTownHallSelected()) return clickTownHall();
40956
40957           // reset pane, in case user happened to change it..
40958           select('.inspector-wrap .panewrap').style('right', '0%');
40959           // disallow scrolling
40960           select('.inspector-wrap').on('wheel.intro', eventCancel);
40961
40962           // preset match, in case the user happened to change it.
40963           var entity = context.entity(context.selectedIDs()[0]);
40964           var preset = context.presets().match(entity, context.graph());
40965
40966           var onClick = function() { continueTo(fieldsTownHall); };
40967
40968           context.on('exit.intro', function() {
40969               continueTo(clickTownHall);
40970           });
40971
40972           context.history().on('change.intro', function() {
40973               if (!context.hasEntity(hallId)) {
40974                   continueTo(clickTownHall);
40975               }
40976           });
40977
40978           reveal('.inspector-body .preset-list-item.inspector-inner',
40979               t('intro.navigation.preset_townhall', { preset: preset.name() }),
40980               { buttonText: t('intro.ok'), buttonCallback: onClick }
40981           );
40982
40983           function continueTo(nextStep) {
40984               context.on('exit.intro', null);
40985               context.history().on('change.intro', null);
40986               select('.inspector-wrap').on('wheel.intro', null);
40987               nextStep();
40988           }
40989       }
40990
40991
40992       function fieldsTownHall() {
40993           if (!isTownHallSelected()) return clickTownHall();
40994
40995           // reset pane, in case user happened to change it..
40996           select('.inspector-wrap .panewrap').style('right', '0%');
40997           // disallow scrolling
40998           select('.inspector-wrap').on('wheel.intro', eventCancel);
40999
41000           var onClick = function() { continueTo(closeTownHall); };
41001
41002           reveal('.inspector-body .preset-editor',
41003               t('intro.navigation.fields_townhall'),
41004               { buttonText: t('intro.ok'), buttonCallback: onClick }
41005           );
41006
41007           context.on('exit.intro', function() {
41008               continueTo(clickTownHall);
41009           });
41010
41011           context.history().on('change.intro', function() {
41012               if (!context.hasEntity(hallId)) {
41013                   continueTo(clickTownHall);
41014               }
41015           });
41016
41017           function continueTo(nextStep) {
41018               context.on('exit.intro', null);
41019               context.history().on('change.intro', null);
41020               select('.inspector-wrap').on('wheel.intro', null);
41021               nextStep();
41022           }
41023       }
41024
41025
41026       function closeTownHall() {
41027           if (!isTownHallSelected()) return clickTownHall();
41028
41029           var selector$$1 = '.entity-editor-pane button.preset-close svg use';
41030           var href = select(selector$$1).attr('href') || '#iD-icon-close';
41031
41032           reveal('.entity-editor-pane',
41033               t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') })
41034           );
41035
41036           context.on('exit.intro', function() {
41037               continueTo(searchStreet);
41038           });
41039
41040           context.history().on('change.intro', function() {
41041               // update the close icon in the tooltip if the user edits something.
41042               var selector$$1 = '.entity-editor-pane button.preset-close svg use';
41043               var href = select(selector$$1).attr('href') || '#iD-icon-close';
41044
41045               reveal('.entity-editor-pane',
41046                   t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') }),
41047                   { duration: 0 }
41048               );
41049           });
41050
41051           function continueTo(nextStep) {
41052               context.on('exit.intro', null);
41053               context.history().on('change.intro', null);
41054               nextStep();
41055           }
41056       }
41057
41058
41059       function searchStreet() {
41060           context.enter(modeBrowse(context));
41061           context.history().reset('initial');  // ensure spring street exists
41062
41063           var msec = transitionTime(springStreet, context.map().center());
41064           if (msec) { reveal(null, null, { duration: 0 }); }
41065           context.map().centerZoomEase(springStreet, 19, msec);  // ..and user can see it
41066
41067           timeout(function() {
41068               reveal('.search-header input',
41069                   t('intro.navigation.search_street', { name: t('intro.graph.name.spring-street') })
41070               );
41071
41072               select('.search-header input')
41073                   .on('keyup.intro', checkSearchResult);
41074           }, msec + 100);
41075       }
41076
41077
41078       function checkSearchResult() {
41079           var first = select('.feature-list-item:nth-child(0n+2)');  // skip "No Results" item
41080           var firstName = first.select('.entity-name');
41081           var name = t('intro.graph.name.spring-street');
41082
41083           if (!firstName.empty() && firstName.text() === name) {
41084               reveal(first.node(),
41085                   t('intro.navigation.choose_street', { name: name }),
41086                   { duration: 300 }
41087               );
41088
41089               context.on('exit.intro', function() {
41090                   continueTo(selectedStreet);
41091               });
41092
41093               select('.search-header input')
41094                   .on('keydown.intro', eventCancel, true)
41095                   .on('keyup.intro', null);
41096           }
41097
41098           function continueTo(nextStep) {
41099               context.on('exit.intro', null);
41100               select('.search-header input')
41101                   .on('keydown.intro', null)
41102                   .on('keyup.intro', null);
41103               nextStep();
41104           }
41105       }
41106
41107
41108       function selectedStreet() {
41109           if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
41110               return searchStreet();
41111           }
41112
41113           var onClick = function() { continueTo(editorStreet); };
41114           var entity = context.entity(springStreetEndId);
41115           var box = pointBox(entity.loc, context);
41116           box.height = 500;
41117
41118           reveal(box,
41119               t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
41120               { duration: 600, buttonText: t('intro.ok'), buttonCallback: onClick }
41121           );
41122
41123           timeout(function() {
41124               context.map().on('move.intro drawn.intro', function() {
41125                   var entity = context.hasEntity(springStreetEndId);
41126                   if (!entity) return;
41127                   var box = pointBox(entity.loc, context);
41128                   box.height = 500;
41129                   reveal(box,
41130                       t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
41131                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
41132                   );
41133               });
41134           }, 600);  // after reveal.
41135
41136           context.on('enter.intro', function(mode) {
41137               if (!context.hasEntity(springStreetId)) {
41138                   return continueTo(searchStreet);
41139               }
41140               var ids = context.selectedIDs();
41141               if (mode.id !== 'select' || !ids.length || ids[0] !== springStreetId) {
41142                   // keep Spring Street selected..
41143                   context.enter(modeSelect(context, [springStreetId]));
41144               }
41145           });
41146
41147           context.history().on('change.intro', function() {
41148               if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
41149                   timeout(function() {
41150                       continueTo(searchStreet);
41151                   }, 300);  // after any transition (e.g. if user deleted intersection)
41152               }
41153           });
41154
41155           function continueTo(nextStep) {
41156               context.map().on('move.intro drawn.intro', null);
41157               context.on('enter.intro', null);
41158               context.history().on('change.intro', null);
41159               nextStep();
41160           }
41161       }
41162
41163
41164       function editorStreet() {
41165           var selector$$1 = '.entity-editor-pane button.preset-close svg use';
41166           var href = select(selector$$1).attr('href') || '#iD-icon-close';
41167
41168           reveal('.entity-editor-pane',
41169               t('intro.navigation.editor_street', {
41170                   button: icon(href, 'pre-text'),
41171                   field1: onewayField.label(),
41172                   field2: maxspeedField.label()
41173               })
41174           );
41175
41176           context.on('exit.intro', function() {
41177               continueTo(play);
41178           });
41179
41180           context.history().on('change.intro', function() {
41181               // update the close icon in the tooltip if the user edits something.
41182               var selector$$1 = '.entity-editor-pane button.preset-close svg use';
41183               var href = select(selector$$1).attr('href') || '#iD-icon-close';
41184
41185               reveal('.entity-editor-pane',
41186                   t('intro.navigation.editor_street', {
41187                       button: icon(href, 'pre-text'),
41188                       field1: onewayField.label().toLowerCase(),
41189                       field2: maxspeedField.label().toLowerCase()
41190                   }), { duration: 0 }
41191               );
41192           });
41193
41194           function continueTo(nextStep) {
41195               context.on('exit.intro', null);
41196               context.history().on('change.intro', null);
41197               nextStep();
41198           }
41199       }
41200
41201
41202       function play() {
41203           dispatch$$1.call('done');
41204           reveal('#id-container',
41205               t('intro.navigation.play', { next: t('intro.points.title') }), {
41206                   tooltipBox: '.intro-nav-wrap .chapter-point',
41207                   buttonText: t('intro.ok'),
41208                   buttonCallback: function() { reveal('#id-container'); }
41209               }
41210           );
41211       }
41212
41213
41214       chapter.enter = function() {
41215           dragMap();
41216       };
41217
41218
41219       chapter.exit = function() {
41220           timeouts.forEach(window.clearTimeout);
41221           context.on('enter.intro exit.intro', null);
41222           context.map().on('move.intro drawn.intro', null);
41223           context.history().on('change.intro', null);
41224           select('.inspector-wrap').on('wheel.intro', null);
41225           select('.search-header input').on('keydown.intro keyup.intro', null);
41226       };
41227
41228
41229       chapter.restart = function() {
41230           chapter.exit();
41231           chapter.enter();
41232       };
41233
41234
41235       return utilRebind(chapter, dispatch$$1, 'on');
41236   }
41237
41238   function uiIntroPoint(context, reveal) {
41239       var dispatch$$1 = dispatch('done');
41240       var timeouts = [];
41241       var intersection = [-85.63279, 41.94394];
41242       var building = [-85.632422, 41.944045];
41243       var cafePreset = context.presets().item('amenity/cafe');
41244       var _pointID = null;
41245
41246
41247       var chapter = {
41248           title: 'intro.points.title'
41249       };
41250
41251
41252       function timeout(f, t$$1) {
41253           timeouts.push(window.setTimeout(f, t$$1));
41254       }
41255
41256
41257       function revealEditMenu(loc, text, options) {
41258           var rect = context.surfaceRect();
41259           var point$$1 = context.curtainProjection(loc);
41260           var pad = 40;
41261           var width = 250 + (2 * pad);
41262           var height = 250;
41263           var startX = rect.left + point$$1[0];
41264           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
41265           var box = {
41266               left: left,
41267               top: point$$1[1] + rect.top - 60,
41268               width: width,
41269               height: height
41270           };
41271           reveal(box, text, options);
41272       }
41273
41274
41275       function eventCancel() {
41276           event.stopPropagation();
41277           event.preventDefault();
41278       }
41279
41280
41281       function addPoint() {
41282           context.enter(modeBrowse(context));
41283           context.history().reset('initial');
41284
41285           var msec = transitionTime(intersection, context.map().center());
41286           if (msec) { reveal(null, null, { duration: 0 }); }
41287           context.map().centerZoomEase(intersection, 19, msec);
41288
41289           timeout(function() {
41290               var tooltip = reveal('button.add-point',
41291                   t('intro.points.add_point', { button: icon('#iD-icon-point', 'pre-text') }));
41292
41293               _pointID = null;
41294
41295               tooltip.selectAll('.tooltip-inner')
41296                   .insert('svg', 'span')
41297                   .attr('class', 'tooltip-illustration')
41298                   .append('use')
41299                   .attr('xlink:href', '#iD-graphic-points');
41300
41301               context.on('enter.intro', function(mode) {
41302                   if (mode.id !== 'add-point') return;
41303                   continueTo(placePoint);
41304               });
41305           }, msec + 100);
41306
41307           function continueTo(nextStep) {
41308               context.on('enter.intro', null);
41309               nextStep();
41310           }
41311       }
41312
41313
41314       function placePoint() {
41315           if (context.mode().id !== 'add-point') {
41316               return chapter.restart();
41317           }
41318
41319           var pointBox$$1 = pad$1(building, 150, context);
41320           reveal(pointBox$$1, t('intro.points.place_point'));
41321
41322           context.map().on('move.intro drawn.intro', function() {
41323               pointBox$$1 = pad$1(building, 150, context);
41324               reveal(pointBox$$1, t('intro.points.place_point'), { duration: 0 });
41325           });
41326
41327           context.on('enter.intro', function(mode) {
41328               if (mode.id !== 'select') return chapter.restart();
41329               _pointID = context.mode().selectedIDs()[0];
41330               continueTo(searchPreset);
41331           });
41332
41333           function continueTo(nextStep) {
41334               context.map().on('move.intro drawn.intro', null);
41335               context.on('enter.intro', null);
41336               nextStep();
41337           }
41338       }
41339
41340
41341       function searchPreset() {
41342           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
41343               return addPoint();
41344           }
41345
41346           // disallow scrolling
41347           select('.inspector-wrap').on('wheel.intro', eventCancel);
41348
41349           select('.preset-search-input')
41350               .on('keydown.intro', null)
41351               .on('keyup.intro', checkPresetSearch);
41352
41353           reveal('.preset-search-input',
41354               t('intro.points.search_cafe', { preset: cafePreset.name() })
41355           );
41356
41357           context.on('enter.intro', function(mode) {
41358               if (!_pointID || !context.hasEntity(_pointID)) {
41359                   return continueTo(addPoint);
41360               }
41361
41362               var ids = context.selectedIDs();
41363               if (mode.id !== 'select' || !ids.length || ids[0] !== _pointID) {
41364                   // keep the user's point selected..
41365                   context.enter(modeSelect(context, [_pointID]));
41366
41367                   // disallow scrolling
41368                   select('.inspector-wrap').on('wheel.intro', eventCancel);
41369
41370                   select('.preset-search-input')
41371                       .on('keydown.intro', null)
41372                       .on('keyup.intro', checkPresetSearch);
41373
41374                   reveal('.preset-search-input',
41375                       t('intro.points.search_cafe', { preset: cafePreset.name() })
41376                   );
41377
41378                   context.history().on('change.intro', null);
41379               }
41380           });
41381
41382
41383           function checkPresetSearch() {
41384               var first = select('.preset-list-item:first-child');
41385
41386               if (first.classed('preset-amenity-cafe')) {
41387                   select('.preset-search-input')
41388                       .on('keydown.intro', eventCancel, true)
41389                       .on('keyup.intro', null);
41390
41391                   reveal(first.select('.preset-list-button').node(),
41392                       t('intro.points.choose_cafe', { preset: cafePreset.name() }),
41393                       { duration: 300 }
41394                   );
41395
41396                   context.history().on('change.intro', function() {
41397                       continueTo(aboutFeatureEditor);
41398                   });
41399               }
41400           }
41401
41402           function continueTo(nextStep) {
41403               context.on('enter.intro', null);
41404               context.history().on('change.intro', null);
41405               select('.inspector-wrap').on('wheel.intro', null);
41406               select('.preset-search-input').on('keydown.intro keyup.intro', null);
41407               nextStep();
41408           }
41409       }
41410
41411
41412       function aboutFeatureEditor() {
41413           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
41414               return addPoint();
41415           }
41416
41417           timeout(function() {
41418               reveal('.entity-editor-pane', t('intro.points.feature_editor'), {
41419                   tooltipClass: 'intro-points-describe',
41420                   buttonText: t('intro.ok'),
41421                   buttonCallback: function() { continueTo(addName); }
41422               });
41423           }, 400);
41424
41425           context.on('exit.intro', function() {
41426               // if user leaves select mode here, just continue with the tutorial.
41427               continueTo(reselectPoint);
41428           });
41429
41430           function continueTo(nextStep) {
41431               context.on('exit.intro', null);
41432               nextStep();
41433           }
41434       }
41435
41436
41437       function addName() {
41438           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
41439               return addPoint();
41440           }
41441
41442           // reset pane, in case user happened to change it..
41443           select('.inspector-wrap .panewrap').style('right', '0%');
41444
41445           timeout(function() {
41446               // It's possible for the user to add a name in a previous step..
41447               // If so, don't tell them to add the name in this step.
41448               // Give them an OK button instead.
41449               var entity = context.entity(_pointID);
41450               if (entity.tags.name) {
41451                   var tooltip = reveal('.entity-editor-pane', t('intro.points.add_name'), {
41452                       tooltipClass: 'intro-points-describe',
41453                       buttonText: t('intro.ok'),
41454                       buttonCallback: function() { continueTo(addCloseEditor); }
41455                   });
41456                   tooltip.select('.instruction').style('display', 'none');
41457
41458               } else {
41459                   reveal('.entity-editor-pane', t('intro.points.add_name'),
41460                       { tooltipClass: 'intro-points-describe' }
41461                   );
41462               }
41463           }, 400);
41464
41465           context.history().on('change.intro', function() {
41466               continueTo(addCloseEditor);
41467           });
41468
41469           context.on('exit.intro', function() {
41470               // if user leaves select mode here, just continue with the tutorial.
41471               continueTo(reselectPoint);
41472           });
41473
41474           function continueTo(nextStep) {
41475               context.on('exit.intro', null);
41476               context.history().on('change.intro', null);
41477               nextStep();
41478           }
41479       }
41480
41481
41482       function addCloseEditor() {
41483           // reset pane, in case user happened to change it..
41484           select('.inspector-wrap .panewrap').style('right', '0%');
41485
41486           var selector$$1 = '.entity-editor-pane button.preset-close svg use';
41487           var href = select(selector$$1).attr('href') || '#iD-icon-close';
41488
41489           context.on('exit.intro', function() {
41490               continueTo(reselectPoint);
41491           });
41492
41493           reveal('.entity-editor-pane',
41494               t('intro.points.add_close', { button: icon(href, 'pre-text') })
41495           );
41496
41497           function continueTo(nextStep) {
41498               context.on('exit.intro', null);
41499               nextStep();
41500           }
41501       }
41502
41503
41504       function reselectPoint() {
41505           if (!_pointID) return chapter.restart();
41506           var entity = context.hasEntity(_pointID);
41507           if (!entity) return chapter.restart();
41508
41509           // make sure it's still a cafe, in case user somehow changed it..
41510           var oldPreset = context.presets().match(entity, context.graph());
41511           context.replace(actionChangePreset(_pointID, oldPreset, cafePreset));
41512
41513           context.enter(modeBrowse(context));
41514
41515           var msec = transitionTime(entity.loc, context.map().center());
41516           if (msec) { reveal(null, null, { duration: 0 }); }
41517           context.map().centerEase(entity.loc, msec);
41518
41519           timeout(function() {
41520               var box = pointBox(entity.loc, context);
41521               reveal(box, t('intro.points.reselect'), { duration: 600 });
41522
41523               timeout(function() {
41524                   context.map().on('move.intro drawn.intro', function() {
41525                       var entity = context.hasEntity(_pointID);
41526                       if (!entity) return chapter.restart();
41527                       var box = pointBox(entity.loc, context);
41528                       reveal(box, t('intro.points.reselect'), { duration: 0 });
41529                   });
41530               }, 600); // after reveal..
41531
41532               context.on('enter.intro', function(mode) {
41533                   if (mode.id !== 'select') return;
41534                   continueTo(updatePoint);
41535               });
41536
41537           }, msec + 100);
41538
41539           function continueTo(nextStep) {
41540               context.map().on('move.intro drawn.intro', null);
41541               context.on('enter.intro', null);
41542               nextStep();
41543           }
41544       }
41545
41546
41547       function updatePoint() {
41548           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
41549               return continueTo(reselectPoint);
41550           }
41551
41552           // reset pane, in case user happened to untag the point..
41553           select('.inspector-wrap .panewrap').style('right', '0%');
41554
41555           context.on('exit.intro', function() {
41556               continueTo(reselectPoint);
41557           });
41558
41559           context.history().on('change.intro', function() {
41560               continueTo(updateCloseEditor);
41561           });
41562
41563           timeout(function() {
41564               reveal('.entity-editor-pane', t('intro.points.update'),
41565                   { tooltipClass: 'intro-points-describe' }
41566               );
41567           }, 400);
41568
41569           function continueTo(nextStep) {
41570               context.on('exit.intro', null);
41571               context.history().on('change.intro', null);
41572               nextStep();
41573           }
41574       }
41575
41576
41577       function updateCloseEditor() {
41578           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
41579               return continueTo(reselectPoint);
41580           }
41581
41582           // reset pane, in case user happened to change it..
41583           select('.inspector-wrap .panewrap').style('right', '0%');
41584
41585           context.on('exit.intro', function() {
41586               continueTo(rightClickPoint);
41587           });
41588
41589           timeout(function() {
41590               reveal('.entity-editor-pane',
41591                   t('intro.points.update_close', { button: icon('#iD-icon-apply', 'pre-text') })
41592               );
41593           }, 500);
41594
41595           function continueTo(nextStep) {
41596               context.on('exit.intro', null);
41597               nextStep();
41598           }
41599       }
41600
41601
41602       function rightClickPoint() {
41603           if (!_pointID) return chapter.restart();
41604           var entity = context.hasEntity(_pointID);
41605           if (!entity) return chapter.restart();
41606
41607           context.enter(modeBrowse(context));
41608
41609           var box = pointBox(entity.loc, context);
41610           reveal(box, t('intro.points.rightclick'), { duration: 600 });
41611
41612           timeout(function() {
41613               context.map().on('move.intro drawn.intro', function() {
41614                   var entity = context.hasEntity(_pointID);
41615                   if (!entity) return chapter.restart();
41616                   var box = pointBox(entity.loc, context);
41617                   reveal(box, t('intro.points.rightclick'), { duration: 0 });
41618               });
41619           }, 600); // after reveal
41620
41621           context.on('enter.intro', function(mode) {
41622               if (mode.id !== 'select') return;
41623               var ids = context.selectedIDs();
41624               if (ids.length !== 1 || ids[0] !== _pointID) return;
41625
41626               timeout(function() {
41627                   var node = selectMenuItem('delete').node();
41628                   if (!node) return;
41629                   continueTo(enterDelete);
41630               }, 300);  // after menu visible
41631           });
41632
41633           function continueTo(nextStep) {
41634               context.on('enter.intro', null);
41635               context.map().on('move.intro drawn.intro', null);
41636               nextStep();
41637           }
41638       }
41639
41640
41641       function enterDelete() {
41642           if (!_pointID) return chapter.restart();
41643           var entity = context.hasEntity(_pointID);
41644           if (!entity) return chapter.restart();
41645
41646           var node = selectMenuItem('delete').node();
41647           if (!node) { return continueTo(rightClickPoint); }
41648
41649           revealEditMenu(entity.loc,
41650               t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') })
41651           );
41652
41653           timeout(function() {
41654               context.map().on('move.intro drawn.intro', function() {
41655                   revealEditMenu(entity.loc,
41656                       t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') }),
41657                       { duration: 0}
41658                   );
41659               });
41660           }, 300); // after menu visible
41661
41662           context.on('exit.intro', function() {
41663               if (!_pointID) return chapter.restart();
41664               var entity = context.hasEntity(_pointID);
41665               if (entity) return continueTo(rightClickPoint);  // point still exists
41666           });
41667
41668           context.history().on('change.intro', function(changed) {
41669               if (changed.deleted().length) {
41670                   continueTo(undo);
41671               }
41672           });
41673
41674           function continueTo(nextStep) {
41675               context.map().on('move.intro drawn.intro', null);
41676               context.history().on('change.intro', null);
41677               context.on('exit.intro', null);
41678               nextStep();
41679           }
41680       }
41681
41682
41683       function undo() {
41684           context.history().on('change.intro', function() {
41685               continueTo(play);
41686           });
41687
41688           var iconName = '#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo');
41689           reveal('#bar button.undo-button',
41690               t('intro.points.undo', { button: icon(iconName, 'pre-text') })
41691           );
41692
41693           function continueTo(nextStep) {
41694               context.history().on('change.intro', null);
41695               nextStep();
41696           }
41697       }
41698
41699
41700       function play() {
41701           dispatch$$1.call('done');
41702           reveal('#id-container',
41703               t('intro.points.play', { next: t('intro.areas.title') }), {
41704                   tooltipBox: '.intro-nav-wrap .chapter-area',
41705                   buttonText: t('intro.ok'),
41706                   buttonCallback: function() { reveal('#id-container'); }
41707               }
41708           );
41709       }
41710
41711
41712       chapter.enter = function() {
41713           addPoint();
41714       };
41715
41716
41717       chapter.exit = function() {
41718           timeouts.forEach(window.clearTimeout);
41719           context.on('enter.intro exit.intro', null);
41720           context.map().on('move.intro drawn.intro', null);
41721           context.history().on('change.intro', null);
41722           select('.inspector-wrap').on('wheel.intro', eventCancel);
41723           select('.preset-search-input').on('keydown.intro keyup.intro', null);
41724       };
41725
41726
41727       chapter.restart = function() {
41728           chapter.exit();
41729           chapter.enter();
41730       };
41731
41732
41733       return utilRebind(chapter, dispatch$$1, 'on');
41734   }
41735
41736   function uiIntroArea(context, reveal) {
41737       var dispatch$$1 = dispatch('done');
41738       var playground = [-85.63552, 41.94159];
41739       var playgroundPreset = context.presets().item('leisure/playground');
41740       var descriptionField = context.presets().field('description');
41741       var timeouts = [];
41742       var _areaID;
41743
41744
41745       var chapter = {
41746           title: 'intro.areas.title'
41747       };
41748
41749
41750       function timeout(f, t$$1) {
41751           timeouts.push(window.setTimeout(f, t$$1));
41752       }
41753
41754
41755       function eventCancel() {
41756           event.stopPropagation();
41757           event.preventDefault();
41758       }
41759
41760
41761       function revealPlayground(center, text, options) {
41762           var padding = 180 * Math.pow(2, context.map().zoom() - 19.5);
41763           var box = pad$1(center, padding, context);
41764           reveal(box, text, options);
41765       }
41766
41767
41768       function addArea() {
41769           context.enter(modeBrowse(context));
41770           context.history().reset('initial');
41771           _areaID = null;
41772
41773           var msec = transitionTime(playground, context.map().center());
41774           if (msec) { reveal(null, null, { duration: 0 }); }
41775           context.map().centerZoomEase(playground, 19, msec);
41776
41777           timeout(function() {
41778               var tooltip = reveal('button.add-area',
41779                   t('intro.areas.add_playground', { button: icon('#iD-icon-area', 'pre-text') }));
41780
41781               tooltip.selectAll('.tooltip-inner')
41782                   .insert('svg', 'span')
41783                   .attr('class', 'tooltip-illustration')
41784                   .append('use')
41785                   .attr('xlink:href', '#iD-graphic-areas');
41786
41787               context.on('enter.intro', function(mode) {
41788                   if (mode.id !== 'add-area') return;
41789                   continueTo(startPlayground);
41790               });
41791           }, msec + 100);
41792
41793           function continueTo(nextStep) {
41794               context.on('enter.intro', null);
41795               nextStep();
41796           }
41797       }
41798
41799
41800       function startPlayground() {
41801           if (context.mode().id !== 'add-area') {
41802               return chapter.restart();
41803           }
41804
41805           _areaID = null;
41806           context.map().zoomEase(19.5, 500);
41807
41808           timeout(function() {
41809               revealPlayground(playground,
41810                   t('intro.areas.start_playground'), { duration: 250 }
41811               );
41812
41813               timeout(function() {
41814                   context.map().on('move.intro drawn.intro', function() {
41815                       revealPlayground(playground,
41816                           t('intro.areas.start_playground'), { duration: 0 }
41817                       );
41818                   });
41819                   context.on('enter.intro', function(mode) {
41820                       if (mode.id !== 'draw-area') return chapter.restart();
41821                       continueTo(continuePlayground);
41822                   });
41823               }, 250);  // after reveal
41824
41825           }, 550);  // after easing
41826
41827           function continueTo(nextStep) {
41828               context.map().on('move.intro drawn.intro', null);
41829               context.on('enter.intro', null);
41830               nextStep();
41831           }
41832       }
41833
41834
41835       function continuePlayground() {
41836           if (context.mode().id !== 'draw-area') {
41837               return chapter.restart();
41838           }
41839
41840           _areaID = null;
41841           revealPlayground(playground,
41842               t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
41843               { duration: 250 }
41844           );
41845
41846           timeout(function() {
41847               context.map().on('move.intro drawn.intro', function() {
41848                   revealPlayground(playground,
41849                       t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
41850                       { duration: 0 }
41851                   );
41852               });
41853           }, 250);  // after reveal
41854
41855           context.on('enter.intro', function(mode) {
41856               if (mode.id === 'draw-area') {
41857                   var entity = context.hasEntity(context.selectedIDs()[0]);
41858                   if (entity && entity.nodes.length >= 6) {
41859                       return continueTo(finishPlayground);
41860                   } else {
41861                       return;
41862                   }
41863               } else if (mode.id === 'select') {
41864                   _areaID = context.selectedIDs()[0];
41865                   return continueTo(searchPresets);
41866               } else {
41867                   return chapter.restart();
41868               }
41869           });
41870
41871           function continueTo(nextStep) {
41872               context.map().on('move.intro drawn.intro', null);
41873               context.on('enter.intro', null);
41874               nextStep();
41875           }
41876       }
41877
41878
41879       function finishPlayground() {
41880           if (context.mode().id !== 'draw-area') {
41881               return chapter.restart();
41882           }
41883
41884           _areaID = null;
41885           revealPlayground(playground,
41886               t('intro.areas.finish_playground'), { duration: 250 }
41887           );
41888
41889           timeout(function() {
41890               context.map().on('move.intro drawn.intro', function() {
41891                   revealPlayground(playground,
41892                       t('intro.areas.finish_playground'), { duration: 0 }
41893                   );
41894               });
41895           }, 250);  // after reveal
41896
41897           context.on('enter.intro', function(mode) {
41898               if (mode.id === 'draw-area') {
41899                   return;
41900               } else if (mode.id === 'select') {
41901                   _areaID = context.selectedIDs()[0];
41902                   return continueTo(searchPresets);
41903               } else {
41904                   return chapter.restart();
41905               }
41906           });
41907
41908           function continueTo(nextStep) {
41909               context.map().on('move.intro drawn.intro', null);
41910               context.on('enter.intro', null);
41911               nextStep();
41912           }
41913       }
41914
41915
41916       function searchPresets() {
41917           if (!_areaID || !context.hasEntity(_areaID)) {
41918               return addArea();
41919           }
41920           var ids = context.selectedIDs();
41921           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
41922               context.enter(modeSelect(context, [_areaID]));
41923           }
41924
41925           // disallow scrolling
41926           select('.inspector-wrap').on('wheel.intro', eventCancel);
41927
41928           timeout(function() {
41929               // reset pane, in case user somehow happened to change it..
41930               select('.inspector-wrap .panewrap').style('right', '-100%');
41931
41932               select('.preset-search-input')
41933                   .on('keydown.intro', null)
41934                   .on('keyup.intro', checkPresetSearch);
41935
41936               reveal('.preset-search-input',
41937                   t('intro.areas.search_playground', { preset: playgroundPreset.name() })
41938               );
41939           }, 400);  // after preset list pane visible..
41940
41941           context.on('enter.intro', function(mode) {
41942               if (!_areaID || !context.hasEntity(_areaID)) {
41943                   return continueTo(addArea);
41944               }
41945
41946               var ids = context.selectedIDs();
41947               if (mode.id !== 'select' || !ids.length || ids[0] !== _areaID) {
41948                   // keep the user's area selected..
41949                   context.enter(modeSelect(context, [_areaID]));
41950
41951                   // reset pane, in case user somehow happened to change it..
41952                   select('.inspector-wrap .panewrap').style('right', '-100%');
41953                   // disallow scrolling
41954                   select('.inspector-wrap').on('wheel.intro', eventCancel);
41955
41956                   select('.preset-search-input')
41957                       .on('keydown.intro', null)
41958                       .on('keyup.intro', checkPresetSearch);
41959
41960                   reveal('.preset-search-input',
41961                       t('intro.areas.search_playground', { preset: playgroundPreset.name() })
41962                   );
41963
41964                   context.history().on('change.intro', null);
41965               }
41966           });
41967
41968           function checkPresetSearch() {
41969               var first = select('.preset-list-item:first-child');
41970
41971               if (first.classed('preset-leisure-playground')) {
41972                   reveal(first.select('.preset-list-button').node(),
41973                       t('intro.areas.choose_playground', { preset: playgroundPreset.name() }),
41974                       { duration: 300 }
41975                   );
41976
41977                   select('.preset-search-input')
41978                       .on('keydown.intro', eventCancel, true)
41979                       .on('keyup.intro', null);
41980
41981                   context.history().on('change.intro', function() {
41982                       continueTo(clickAddField);
41983                   });
41984               }
41985           }
41986
41987           function continueTo(nextStep) {
41988               select('.inspector-wrap').on('wheel.intro', null);
41989               context.on('enter.intro', null);
41990               context.history().on('change.intro', null);
41991               select('.preset-search-input').on('keydown.intro keyup.intro', null);
41992               nextStep();
41993           }
41994       }
41995
41996
41997       function clickAddField() {
41998           if (!_areaID || !context.hasEntity(_areaID)) {
41999               return addArea();
42000           }
42001           var ids = context.selectedIDs();
42002           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
42003               return searchPresets();
42004           }
42005
42006           if (!select('.form-field-description').empty()) {
42007               return continueTo(describePlayground);
42008           }
42009
42010           // disallow scrolling
42011           select('.inspector-wrap').on('wheel.intro', eventCancel);
42012
42013           timeout(function() {
42014               // reset pane, in case user somehow happened to change it..
42015               select('.inspector-wrap .panewrap').style('right', '0%');
42016
42017               // It's possible for the user to add a description in a previous step..
42018               // If they did this already, just continue to next step.
42019               var entity = context.entity(_areaID);
42020               if (entity.tags.description) {
42021                   return continueTo(play);
42022               }
42023
42024               // scroll "Add field" into view
42025               var box = select('.more-fields').node().getBoundingClientRect();
42026               if (box.top > 300) {
42027                   var pane = select('.entity-editor-pane .inspector-body');
42028                   var start = pane.node().scrollTop;
42029                   var end = start + (box.top - 300);
42030
42031                   pane
42032                       .transition()
42033                       .duration(250)
42034                       .tween('scroll.inspector', function() {
42035                           var node = this;
42036                           var i = interpolateNumber(start, end);
42037                           return function(t$$1) {
42038                               node.scrollTop = i(t$$1);
42039                           };
42040                       });
42041               }
42042
42043               timeout(function() {
42044                   reveal('.more-fields .combobox-input',
42045                       t('intro.areas.add_field'),
42046                       { duration: 300 }
42047                   );
42048
42049                   select('.more-fields .combobox-input')
42050                       .on('click.intro', function() {
42051                           // Watch for the combobox to appear...
42052                           var watcher;
42053                           watcher = window.setInterval(function() {
42054                               if (!select('div.combobox').empty()) {
42055                                   window.clearInterval(watcher);
42056                                   continueTo(chooseDescriptionField);
42057                               }
42058                           }, 300);
42059                       });
42060               }, 300);  // after "Add Field" visible
42061
42062           }, 400);  // after editor pane visible
42063
42064           context.on('exit.intro', function() {
42065               return continueTo(searchPresets);
42066           });
42067
42068           function continueTo(nextStep) {
42069               select('.inspector-wrap').on('wheel.intro', null);
42070               select('.more-fields .combobox-input').on('click.intro', null);
42071               context.on('exit.intro', null);
42072               nextStep();
42073           }
42074       }
42075
42076
42077       function chooseDescriptionField() {
42078           if (!_areaID || !context.hasEntity(_areaID)) {
42079               return addArea();
42080           }
42081           var ids = context.selectedIDs();
42082           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
42083               return searchPresets();
42084           }
42085
42086           if (!select('.form-field-description').empty()) {
42087               return continueTo(describePlayground);
42088           }
42089
42090           // Make sure combobox is ready..
42091           if (select('div.combobox').empty()) {
42092               return continueTo(clickAddField);
42093           }
42094           // Watch for the combobox to go away..
42095           var watcher;
42096           watcher = window.setInterval(function() {
42097               if (select('div.combobox').empty()) {
42098                   window.clearInterval(watcher);
42099                   timeout(function() {
42100                       if (select('.form-field-description').empty()) {
42101                           continueTo(retryChooseDescription);
42102                       } else {
42103                           continueTo(describePlayground);
42104                       }
42105                   }, 300);  // after description field added.
42106               }
42107           }, 300);
42108
42109           reveal('div.combobox',
42110               t('intro.areas.choose_field', { field: descriptionField.label() }),
42111               { duration: 300 }
42112           );
42113
42114           context.on('exit.intro', function() {
42115               return continueTo(searchPresets);
42116           });
42117
42118           function continueTo(nextStep) {
42119               if (watcher) window.clearInterval(watcher);
42120               context.on('exit.intro', null);
42121               nextStep();
42122           }
42123       }
42124
42125
42126       function describePlayground() {
42127           if (!_areaID || !context.hasEntity(_areaID)) {
42128               return addArea();
42129           }
42130           var ids = context.selectedIDs();
42131           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
42132               return searchPresets();
42133           }
42134
42135           // reset pane, in case user happened to change it..
42136           select('.inspector-wrap .panewrap').style('right', '0%');
42137
42138           if (select('.form-field-description').empty()) {
42139               return continueTo(retryChooseDescription);
42140           }
42141
42142           context.on('exit.intro', function() {
42143               continueTo(play);
42144           });
42145
42146           reveal('.entity-editor-pane',
42147               t('intro.areas.describe_playground', { button: icon('#iD-icon-apply', 'pre-text') }),
42148               { duration: 300 }
42149           );
42150
42151           function continueTo(nextStep) {
42152               context.on('exit.intro', null);
42153               nextStep();
42154           }
42155       }
42156
42157
42158       function retryChooseDescription() {
42159           if (!_areaID || !context.hasEntity(_areaID)) {
42160               return addArea();
42161           }
42162           var ids = context.selectedIDs();
42163           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
42164               return searchPresets();
42165           }
42166
42167           // reset pane, in case user happened to change it..
42168           select('.inspector-wrap .panewrap').style('right', '0%');
42169
42170           reveal('.entity-editor-pane',
42171               t('intro.areas.retry_add_field', { field: descriptionField.label() }), {
42172               buttonText: t('intro.ok'),
42173               buttonCallback: function() { continueTo(clickAddField); }
42174           });
42175
42176           context.on('exit.intro', function() {
42177               return continueTo(searchPresets);
42178           });
42179
42180           function continueTo(nextStep) {
42181               context.on('exit.intro', null);
42182               nextStep();
42183           }
42184       }
42185
42186
42187       function play() {
42188           dispatch$$1.call('done');
42189           reveal('#id-container',
42190               t('intro.areas.play', { next: t('intro.lines.title') }), {
42191                   tooltipBox: '.intro-nav-wrap .chapter-line',
42192                   buttonText: t('intro.ok'),
42193                   buttonCallback: function() { reveal('#id-container'); }
42194               }
42195           );
42196       }
42197
42198
42199       chapter.enter = function() {
42200           addArea();
42201       };
42202
42203
42204       chapter.exit = function() {
42205           timeouts.forEach(window.clearTimeout);
42206           context.on('enter.intro exit.intro', null);
42207           context.map().on('move.intro drawn.intro', null);
42208           context.history().on('change.intro', null);
42209           select('.inspector-wrap').on('wheel.intro', null);
42210           select('.preset-search-input').on('keydown.intro keyup.intro', null);
42211           select('.more-fields .combobox-input').on('click.intro', null);
42212       };
42213
42214
42215       chapter.restart = function() {
42216           chapter.exit();
42217           chapter.enter();
42218       };
42219
42220
42221       return utilRebind(chapter, dispatch$$1, 'on');
42222   }
42223
42224   function uiIntroLine(context, reveal) {
42225       var dispatch$$1 = dispatch('done');
42226       var timeouts = [];
42227       var _tulipRoadID = null;
42228       var flowerRoadID = 'w646';
42229       var tulipRoadStart = [-85.6297754121684, 41.95805253325314];
42230       var tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204];
42231       var tulipRoadIntersection = [-85.62974496187628, 41.95742515554585];
42232       var roadCategory = context.presets().item('category-road');
42233       var residentialPreset = context.presets().item('highway/residential');
42234       var woodRoadID = 'w525';
42235       var woodRoadEndID = 'n2862';
42236       var woodRoadAddNode = [-85.62390110349587, 41.95397111462291];
42237       var woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487];
42238       var woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872];
42239       var washingtonStreetID = 'w522';
42240       var twelfthAvenueID = 'w1';
42241       var eleventhAvenueEndID = 'n3550';
42242       var twelfthAvenueEndID = 'n5';
42243       var _washingtonSegmentID = null;
42244       var eleventhAvenueEnd = context.entity(eleventhAvenueEndID).loc;
42245       var twelfthAvenueEnd = context.entity(twelfthAvenueEndID).loc;
42246       var deleteLinesLoc = [-85.6219395542764, 41.95228033922477];
42247       var twelfthAvenue = [-85.62219310052491, 41.952505413152956];
42248
42249
42250       var chapter = {
42251           title: 'intro.lines.title'
42252       };
42253
42254
42255       function timeout(f, t$$1) {
42256           timeouts.push(window.setTimeout(f, t$$1));
42257       }
42258
42259
42260       function eventCancel() {
42261           event.stopPropagation();
42262           event.preventDefault();
42263       }
42264
42265
42266       function revealEditMenu(loc, text, options) {
42267           var rect = context.surfaceRect();
42268           var point$$1 = context.curtainProjection(loc);
42269           var pad = 40;
42270           var width = 250 + (2 * pad);
42271           var height = 350;
42272           var startX = rect.left + point$$1[0];
42273           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
42274           var box = {
42275               left: left,
42276               top: point$$1[1] + rect.top - 60,
42277               width: width,
42278               height: height
42279           };
42280           reveal(box, text, options);
42281       }
42282
42283
42284       function addLine() {
42285           context.enter(modeBrowse(context));
42286           context.history().reset('initial');
42287
42288           var msec = transitionTime(tulipRoadStart, context.map().center());
42289           if (msec) { reveal(null, null, { duration: 0 }); }
42290           context.map().centerZoomEase(tulipRoadStart, 18.5, msec);
42291
42292           timeout(function() {
42293               var tooltip = reveal('button.add-line',
42294                   t('intro.lines.add_line', { button: icon('#iD-icon-line', 'pre-text') }));
42295
42296               tooltip.selectAll('.tooltip-inner')
42297                   .insert('svg', 'span')
42298                   .attr('class', 'tooltip-illustration')
42299                   .append('use')
42300                   .attr('xlink:href', '#iD-graphic-lines');
42301
42302               context.on('enter.intro', function(mode) {
42303                   if (mode.id !== 'add-line') return;
42304                   continueTo(startLine);
42305               });
42306           }, msec + 100);
42307
42308           function continueTo(nextStep) {
42309               context.on('enter.intro', null);
42310               nextStep();
42311           }
42312       }
42313
42314
42315       function startLine() {
42316           if (context.mode().id !== 'add-line') return chapter.restart();
42317
42318           _tulipRoadID = null;
42319
42320           var padding = 70 * Math.pow(2, context.map().zoom() - 18);
42321           var box = pad$1(tulipRoadStart, padding, context);
42322           box.height = box.height + 100;
42323           reveal(box, t('intro.lines.start_line'));
42324
42325           context.map().on('move.intro drawn.intro', function() {
42326               padding = 70 * Math.pow(2, context.map().zoom() - 18);
42327               box = pad$1(tulipRoadStart, padding, context);
42328               box.height = box.height + 100;
42329               reveal(box, t('intro.lines.start_line'), { duration: 0 });
42330           });
42331
42332           context.on('enter.intro', function(mode) {
42333               if (mode.id !== 'draw-line') return chapter.restart();
42334               continueTo(drawLine);
42335           });
42336
42337           function continueTo(nextStep) {
42338               context.map().on('move.intro drawn.intro', null);
42339               context.on('enter.intro', null);
42340               nextStep();
42341           }
42342       }
42343
42344
42345       function drawLine() {
42346           if (context.mode().id !== 'draw-line') return chapter.restart();
42347
42348           _tulipRoadID = context.mode().selectedIDs()[0];
42349           context.map().centerEase(tulipRoadMidpoint, 500);
42350
42351           timeout(function() {
42352               var padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
42353               var box = pad$1(tulipRoadMidpoint, padding, context);
42354               box.height = box.height * 2;
42355               reveal(box,
42356                   t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') })
42357               );
42358
42359               context.map().on('move.intro drawn.intro', function() {
42360                   padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
42361                   box = pad$1(tulipRoadMidpoint, padding, context);
42362                   box.height = box.height * 2;
42363                   reveal(box,
42364                       t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') }),
42365                       { duration: 0 }
42366                   );
42367               });
42368           }, 550);  // after easing..
42369
42370           context.history().on('change.intro', function() {
42371               if (isLineConnected()) {
42372                   continueTo(continueLine);
42373               }
42374           });
42375
42376           context.on('enter.intro', function(mode) {
42377               if (mode.id === 'draw-line') {
42378                   return;
42379               } else if (mode.id === 'select') {
42380                   continueTo(retryIntersect);
42381                   return;
42382               } else {
42383                   return chapter.restart();
42384               }
42385           });
42386
42387           function continueTo(nextStep) {
42388               context.map().on('move.intro drawn.intro', null);
42389               context.history().on('change.intro', null);
42390               context.on('enter.intro', null);
42391               nextStep();
42392           }
42393       }
42394
42395
42396       function isLineConnected() {
42397           var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
42398           if (!entity) return false;
42399
42400           var drawNodes = context.graph().childNodes(entity);
42401           return some(drawNodes, function(node) {
42402               return some(context.graph().parentWays(node), function(parent) {
42403                   return parent.id === flowerRoadID;
42404               });
42405           });
42406       }
42407
42408
42409       function retryIntersect() {
42410           select(window).on('mousedown.intro', eventCancel, true);
42411
42412           var box = pad$1(tulipRoadIntersection, 80, context);
42413           reveal(box,
42414               t('intro.lines.retry_intersect', { name: t('intro.graph.name.flower-street') })
42415           );
42416
42417           timeout(chapter.restart, 3000);
42418       }
42419
42420
42421       function continueLine() {
42422           if (context.mode().id !== 'draw-line') return chapter.restart();
42423           var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
42424           if (!entity) return chapter.restart();
42425
42426           context.map().centerEase(tulipRoadIntersection, 500);
42427
42428           reveal('#surface', t('intro.lines.continue_line'));
42429
42430           context.on('enter.intro', function(mode) {
42431               if (mode.id === 'draw-line')
42432                   return;
42433               else if (mode.id === 'select')
42434                   return continueTo(chooseCategoryRoad);
42435               else
42436                   return chapter.restart();
42437           });
42438
42439           function continueTo(nextStep) {
42440               context.on('enter.intro', null);
42441               nextStep();
42442           }
42443       }
42444
42445
42446       function chooseCategoryRoad() {
42447           if (context.mode().id !== 'select') return chapter.restart();
42448
42449           context.on('exit.intro', function() {
42450               return chapter.restart();
42451           });
42452
42453           var button = select('.preset-category-road .preset-list-button');
42454           if (button.empty()) return chapter.restart();
42455
42456           // disallow scrolling
42457           select('.inspector-wrap').on('wheel.intro', eventCancel);
42458
42459           timeout(function() {
42460               // reset pane, in case user somehow happened to change it..
42461               select('.inspector-wrap .panewrap').style('right', '-100%');
42462
42463               reveal(button.node(),
42464                   t('intro.lines.choose_category_road', { category: roadCategory.name() })
42465               );
42466
42467               button.on('click.intro', function() {
42468                   continueTo(choosePresetResidential);
42469               });
42470
42471           }, 400);  // after editor pane visible
42472
42473           function continueTo(nextStep) {
42474               select('.inspector-wrap').on('wheel.intro', null);
42475               select('.preset-list-button').on('click.intro', null);
42476               context.on('exit.intro', null);
42477               nextStep();
42478           }
42479       }
42480
42481
42482       function choosePresetResidential() {
42483           if (context.mode().id !== 'select') return chapter.restart();
42484
42485           context.on('exit.intro', function() {
42486               return chapter.restart();
42487           });
42488
42489           var subgrid = select('.preset-category-road .subgrid');
42490           if (subgrid.empty()) return chapter.restart();
42491
42492           subgrid.selectAll(':not(.preset-highway-residential) .preset-list-button')
42493               .on('click.intro', function() {
42494                   continueTo(retryPresetResidential);
42495               });
42496
42497           subgrid.selectAll('.preset-highway-residential .preset-list-button')
42498               .on('click.intro', function() {
42499                   continueTo(nameRoad);
42500               });
42501
42502           timeout(function() {
42503               reveal(subgrid.node(),
42504                   t('intro.lines.choose_preset_residential', { preset: residentialPreset.name() }),
42505                   { tooltipBox: '.preset-highway-residential .preset-list-button', duration: 300 }
42506               );
42507           }, 300);
42508
42509           function continueTo(nextStep) {
42510               select('.preset-list-button').on('click.intro', null);
42511               context.on('exit.intro', null);
42512               nextStep();
42513           }
42514       }
42515
42516
42517       // selected wrong road type
42518       function retryPresetResidential() {
42519           if (context.mode().id !== 'select') return chapter.restart();
42520
42521           context.on('exit.intro', function() {
42522               return chapter.restart();
42523           });
42524
42525           // disallow scrolling
42526           select('.inspector-wrap').on('wheel.intro', eventCancel);
42527
42528           timeout(function() {
42529               var button = select('.entity-editor-pane .preset-list-button');
42530
42531               reveal(button.node(),
42532                   t('intro.lines.retry_preset_residential', { preset: residentialPreset.name() })
42533               );
42534
42535               button.on('click.intro', function() {
42536                   continueTo(chooseCategoryRoad);
42537               });
42538
42539           }, 500);
42540
42541           function continueTo(nextStep) {
42542               select('.inspector-wrap').on('wheel.intro', null);
42543               select('.preset-list-button').on('click.intro', null);
42544               context.on('exit.intro', null);
42545               nextStep();
42546           }
42547       }
42548
42549
42550       function nameRoad() {
42551           context.on('exit.intro', function() {
42552               continueTo(didNameRoad);
42553           });
42554
42555           timeout(function() {
42556               reveal('.entity-editor-pane',
42557                   t('intro.lines.name_road', { button: icon('#iD-icon-apply', 'pre-text') }),
42558                   { tooltipClass: 'intro-lines-name_road' }
42559               );
42560           }, 500);
42561
42562           function continueTo(nextStep) {
42563               context.on('exit.intro', null);
42564               nextStep();
42565           }
42566       }
42567
42568
42569       function didNameRoad() {
42570           context.history().checkpoint('doneAddLine');
42571
42572           timeout(function() {
42573               reveal('#surface', t('intro.lines.did_name_road'), {
42574                   buttonText: t('intro.ok'),
42575                   buttonCallback: function() { continueTo(updateLine); }
42576               });
42577           }, 500);
42578
42579           function continueTo(nextStep) {
42580               nextStep();
42581           }
42582       }
42583
42584
42585       function updateLine() {
42586           context.history().reset('doneAddLine');
42587           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
42588               return chapter.restart();
42589           }
42590
42591           var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
42592           if (msec) { reveal(null, null, { duration: 0 }); }
42593           context.map().centerZoomEase(woodRoadDragMidpoint, 19, msec);
42594
42595           timeout(function() {
42596               var padding = 250 * Math.pow(2, context.map().zoom() - 19);
42597               var box = pad$1(woodRoadDragMidpoint, padding, context);
42598               var advance = function() { continueTo(addNode); };
42599
42600               reveal(box, t('intro.lines.update_line'),
42601                   { buttonText: t('intro.ok'), buttonCallback: advance }
42602               );
42603
42604               context.map().on('move.intro drawn.intro', function() {
42605                   var padding = 250 * Math.pow(2, context.map().zoom() - 19);
42606                   var box = pad$1(woodRoadDragMidpoint, padding, context);
42607                   reveal(box, t('intro.lines.update_line'),
42608                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
42609                   );
42610               });
42611           }, msec + 100);
42612
42613           function continueTo(nextStep) {
42614               context.map().on('move.intro drawn.intro', null);
42615               nextStep();
42616           }
42617       }
42618
42619
42620       function addNode() {
42621           context.history().reset('doneAddLine');
42622           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
42623               return chapter.restart();
42624           }
42625
42626           var padding = 40 * Math.pow(2, context.map().zoom() - 19);
42627           var box = pad$1(woodRoadAddNode, padding, context);
42628           reveal(box, t('intro.lines.add_node'));
42629
42630           context.map().on('move.intro drawn.intro', function() {
42631               var padding = 40 * Math.pow(2, context.map().zoom() - 19);
42632               var box = pad$1(woodRoadAddNode, padding, context);
42633               reveal(box, t('intro.lines.add_node'), { duration: 0 });
42634           });
42635
42636           context.history().on('change.intro', function(changed) {
42637               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
42638                   return continueTo(updateLine);
42639               }
42640               if (changed.created().length === 1) {
42641                   timeout(function() { continueTo(startDragEndpoint); }, 500);
42642               }
42643           });
42644
42645           context.on('enter.intro', function(mode) {
42646               if (mode.id !== 'select') {
42647                   continueTo(updateLine);
42648               }
42649           });
42650
42651           function continueTo(nextStep) {
42652               context.map().on('move.intro drawn.intro', null);
42653               context.history().on('change.intro', null);
42654               context.on('enter.intro', null);
42655               nextStep();
42656           }
42657       }
42658
42659
42660       function startDragEndpoint() {
42661           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
42662               return continueTo(updateLine);
42663           }
42664           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
42665           var box = pad$1(woodRoadDragEndpoint, padding, context);
42666           reveal(box, t('intro.lines.start_drag_endpoint'));
42667
42668           context.map().on('move.intro drawn.intro', function() {
42669               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
42670                   return continueTo(updateLine);
42671               }
42672               var padding = 100 * Math.pow(2, context.map().zoom() - 19);
42673               var box = pad$1(woodRoadDragEndpoint, padding, context);
42674               reveal(box, t('intro.lines.start_drag_endpoint'), { duration: 0 });
42675
42676               var entity = context.entity(woodRoadEndID);
42677               if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
42678                   continueTo(finishDragEndpoint);
42679               }
42680           });
42681
42682           function continueTo(nextStep) {
42683               context.map().on('move.intro drawn.intro', null);
42684               nextStep();
42685           }
42686       }
42687
42688
42689       function finishDragEndpoint() {
42690           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
42691               return continueTo(updateLine);
42692           }
42693
42694           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
42695           var box = pad$1(woodRoadDragEndpoint, padding, context);
42696           reveal(box, t('intro.lines.finish_drag_endpoint'));
42697
42698           context.map().on('move.intro drawn.intro', function() {
42699               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
42700                   return continueTo(updateLine);
42701               }
42702               var padding = 100 * Math.pow(2, context.map().zoom() - 19);
42703               var box = pad$1(woodRoadDragEndpoint, padding, context);
42704               reveal(box, t('intro.lines.finish_drag_endpoint'), { duration: 0 });
42705
42706               var entity = context.entity(woodRoadEndID);
42707               if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
42708                   continueTo(startDragEndpoint);
42709               }
42710           });
42711
42712           context.on('enter.intro', function() {
42713               continueTo(startDragMidpoint);
42714           });
42715
42716           function continueTo(nextStep) {
42717               context.map().on('move.intro drawn.intro', null);
42718               context.on('enter.intro', null);
42719               nextStep();
42720           }
42721       }
42722
42723
42724       function startDragMidpoint() {
42725           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
42726               return continueTo(updateLine);
42727           }
42728           if (context.selectedIDs().indexOf(woodRoadID) === -1) {
42729               context.enter(modeSelect(context, [woodRoadID]));
42730           }
42731
42732           var padding = 80 * Math.pow(2, context.map().zoom() - 19);
42733           var box = pad$1(woodRoadDragMidpoint, padding, context);
42734           reveal(box, t('intro.lines.start_drag_midpoint'));
42735
42736           context.map().on('move.intro drawn.intro', function() {
42737               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
42738                   return continueTo(updateLine);
42739               }
42740               var padding = 80 * Math.pow(2, context.map().zoom() - 19);
42741               var box = pad$1(woodRoadDragMidpoint, padding, context);
42742               reveal(box, t('intro.lines.start_drag_midpoint'), { duration: 0 });
42743           });
42744
42745           context.history().on('change.intro', function(changed) {
42746               if (changed.created().length === 1) {
42747                   continueTo(continueDragMidpoint);
42748               }
42749           });
42750
42751           context.on('enter.intro', function(mode) {
42752               if (mode.id !== 'select') {
42753                   // keep Wood Road selected so midpoint triangles are drawn..
42754                   context.enter(modeSelect(context, [woodRoadID]));
42755               }
42756           });
42757
42758           function continueTo(nextStep) {
42759               context.map().on('move.intro drawn.intro', null);
42760               context.history().on('change.intro', null);
42761               context.on('enter.intro', null);
42762               nextStep();
42763           }
42764       }
42765
42766
42767       function continueDragMidpoint() {
42768           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
42769               return continueTo(updateLine);
42770           }
42771
42772           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
42773           var box = pad$1(woodRoadDragEndpoint, padding, context);
42774           box.height += 400;
42775
42776           var advance = function() {
42777               context.history().checkpoint('doneUpdateLine');
42778               continueTo(deleteLines);
42779           };
42780
42781           reveal(box, t('intro.lines.continue_drag_midpoint'),
42782               { buttonText: t('intro.ok'), buttonCallback: advance }
42783           );
42784
42785           context.map().on('move.intro drawn.intro', function() {
42786               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
42787                   return continueTo(updateLine);
42788               }
42789               var padding = 100 * Math.pow(2, context.map().zoom() - 19);
42790               var box = pad$1(woodRoadDragEndpoint, padding, context);
42791               box.height += 400;
42792               reveal(box, t('intro.lines.continue_drag_midpoint'),
42793                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
42794               );
42795           });
42796
42797           function continueTo(nextStep) {
42798               context.map().on('move.intro drawn.intro', null);
42799               nextStep();
42800           }
42801       }
42802
42803
42804       function deleteLines() {
42805           context.history().reset('doneUpdateLine');
42806           context.enter(modeBrowse(context));
42807
42808           if (!context.hasEntity(washingtonStreetID) ||
42809               !context.hasEntity(twelfthAvenueID) ||
42810               !context.hasEntity(eleventhAvenueEndID)) {
42811               return chapter.restart();
42812           }
42813
42814           var msec = transitionTime(deleteLinesLoc, context.map().center());
42815           if (msec) { reveal(null, null, { duration: 0 }); }
42816           context.map().centerZoomEase(deleteLinesLoc, 18, msec);
42817
42818           timeout(function() {
42819               var padding = 200 * Math.pow(2, context.map().zoom() - 18);
42820               var box = pad$1(deleteLinesLoc, padding, context);
42821               box.top -= 200;
42822               box.height += 400;
42823               var advance = function() { continueTo(rightClickIntersection); };
42824
42825               reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
42826                   { buttonText: t('intro.ok'), buttonCallback: advance }
42827               );
42828
42829               context.map().on('move.intro drawn.intro', function() {
42830                   var padding = 200 * Math.pow(2, context.map().zoom() - 18);
42831                   var box = pad$1(deleteLinesLoc, padding, context);
42832                   box.top -= 200;
42833                   box.height += 400;
42834                   reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
42835                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
42836                   );
42837               });
42838
42839               context.history().on('change.intro', function() {
42840                   timeout(function() {
42841                       continueTo(deleteLines);
42842                   }, 500);  // after any transition (e.g. if user deleted intersection)
42843               });
42844
42845           }, msec + 100);
42846
42847           function continueTo(nextStep) {
42848               context.map().on('move.intro drawn.intro', null);
42849               context.history().on('change.intro', null);
42850               nextStep();
42851           }
42852       }
42853
42854
42855       function rightClickIntersection() {
42856           context.history().reset('doneUpdateLine');
42857           context.enter(modeBrowse(context));
42858
42859           context.map().centerZoomEase(eleventhAvenueEnd, 18, 500);
42860
42861           timeout(function() {
42862               var padding = 60 * Math.pow(2, context.map().zoom() - 18);
42863               var box = pad$1(eleventhAvenueEnd, padding, context);
42864               reveal(box, t('intro.lines.rightclick_intersection',
42865                   { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') })
42866               );
42867
42868               context.map().on('move.intro drawn.intro', function() {
42869                   var padding = 60 * Math.pow(2, context.map().zoom() - 18);
42870                   var box = pad$1(eleventhAvenueEnd, padding, context);
42871                   reveal(box, t('intro.lines.rightclick_intersection',
42872                       { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') }),
42873                       { duration: 0 }
42874                   );
42875               });
42876
42877               context.on('enter.intro', function(mode) {
42878                   if (mode.id !== 'select') return;
42879                   var ids = context.selectedIDs();
42880                   if (ids.length !== 1 || ids[0] !== eleventhAvenueEndID) return;
42881
42882                   timeout(function() {
42883                       var node = selectMenuItem('split').node();
42884                       if (!node) return;
42885                       continueTo(splitIntersection);
42886                   }, 300);  // after menu visible
42887               });
42888
42889               context.history().on('change.intro', function() {
42890                   timeout(function() {
42891                       continueTo(deleteLines);
42892                   }, 300);  // after any transition (e.g. if user deleted intersection)
42893               });
42894
42895           }, 600);
42896
42897           function continueTo(nextStep) {
42898               context.map().on('move.intro drawn.intro', null);
42899               context.on('enter.intro', null);
42900               context.history().on('change.intro', null);
42901               nextStep();
42902           }
42903       }
42904
42905
42906       function splitIntersection() {
42907           if (!context.hasEntity(washingtonStreetID) ||
42908               !context.hasEntity(twelfthAvenueID) ||
42909               !context.hasEntity(eleventhAvenueEndID)) {
42910               return continueTo(deleteLines);
42911           }
42912
42913           var node = selectMenuItem('split').node();
42914           if (!node) { return continueTo(rightClickIntersection); }
42915
42916           var wasChanged = false;
42917           var menuCoords = context.map().mouseCoordinates();
42918           _washingtonSegmentID = null;
42919
42920           revealEditMenu(menuCoords, t('intro.lines.split_intersection',
42921               { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') })
42922           );
42923
42924           context.map().on('move.intro drawn.intro', function() {
42925               var node = selectMenuItem('split').node();
42926               if (!wasChanged && !node) { return continueTo(rightClickIntersection); }
42927
42928               revealEditMenu(menuCoords, t('intro.lines.split_intersection',
42929                   { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') }),
42930                   { duration: 0 }
42931               );
42932           });
42933
42934           context.history().on('change.intro', function(changed) {
42935               wasChanged = true;
42936               timeout(function() {
42937                   if (context.history().undoAnnotation() === t('operations.split.annotation.line')) {
42938                       _washingtonSegmentID = changed.created()[0].id;
42939                       continueTo(didSplit);
42940                   } else {
42941                       _washingtonSegmentID = null;
42942                       continueTo(retrySplit);
42943                   }
42944               }, 300);  // after any transition (e.g. if user deleted intersection)
42945           });
42946
42947           function continueTo(nextStep) {
42948               context.map().on('move.intro drawn.intro', null);
42949               context.history().on('change.intro', null);
42950               nextStep();
42951           }
42952       }
42953
42954
42955       function retrySplit() {
42956           context.enter(modeBrowse(context));
42957           context.map().centerZoomEase(eleventhAvenueEnd, 18, 500);
42958           var advance = function() { continueTo(rightClickIntersection); };
42959
42960           var padding = 60 * Math.pow(2, context.map().zoom() - 18);
42961           var box = pad$1(eleventhAvenueEnd, padding, context);
42962           reveal(box, t('intro.lines.retry_split'),
42963               { buttonText: t('intro.ok'), buttonCallback: advance }
42964           );
42965
42966           context.map().on('move.intro drawn.intro', function() {
42967               var padding = 60 * Math.pow(2, context.map().zoom() - 18);
42968               var box = pad$1(eleventhAvenueEnd, padding, context);
42969               reveal(box, t('intro.lines.retry_split'),
42970                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
42971               );
42972           });
42973
42974           function continueTo(nextStep) {
42975               context.map().on('move.intro drawn.intro', null);
42976               nextStep();
42977           }
42978       }
42979
42980
42981       function didSplit() {
42982           if (!_washingtonSegmentID ||
42983               !context.hasEntity(_washingtonSegmentID) ||
42984               !context.hasEntity(washingtonStreetID) ||
42985               !context.hasEntity(twelfthAvenueID) ||
42986               !context.hasEntity(eleventhAvenueEndID)) {
42987               return continueTo(rightClickIntersection);
42988           }
42989
42990           var ids = context.selectedIDs();
42991           var string = 'intro.lines.did_split_' + (ids.length > 1 ? 'multi' : 'single');
42992           var street = t('intro.graph.name.washington-street');
42993
42994           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
42995           var box = pad$1(twelfthAvenue, padding, context);
42996           box.width = box.width / 2;
42997           reveal(box, t(string, { street1: street, street2: street }),
42998               { duration: 500 }
42999           );
43000
43001           timeout(function() {
43002               context.map().centerZoomEase(twelfthAvenue, 18, 500);
43003
43004               context.map().on('move.intro drawn.intro', function() {
43005                   var padding = 200 * Math.pow(2, context.map().zoom() - 18);
43006                   var box = pad$1(twelfthAvenue, padding, context);
43007                   box.width = box.width / 2;
43008                   reveal(box, t(string, { street1: street, street2: street }),
43009                       { duration: 0 }
43010                   );
43011               });
43012           }, 600);  // after initial reveal and curtain cut
43013
43014           context.on('enter.intro', function() {
43015               var ids = context.selectedIDs();
43016               if (ids.length === 1 && ids[0] === _washingtonSegmentID) {
43017                   continueTo(multiSelect);
43018               }
43019           });
43020
43021           context.history().on('change.intro', function() {
43022               if (!_washingtonSegmentID ||
43023                   !context.hasEntity(_washingtonSegmentID) ||
43024                   !context.hasEntity(washingtonStreetID) ||
43025                   !context.hasEntity(twelfthAvenueID) ||
43026                   !context.hasEntity(eleventhAvenueEndID)) {
43027                   return continueTo(rightClickIntersection);
43028               }
43029           });
43030
43031           function continueTo(nextStep) {
43032               context.map().on('move.intro drawn.intro', null);
43033               context.on('enter.intro', null);
43034               context.history().on('change.intro', null);
43035               nextStep();
43036           }
43037       }
43038
43039
43040       function multiSelect() {
43041           if (!_washingtonSegmentID ||
43042               !context.hasEntity(_washingtonSegmentID) ||
43043               !context.hasEntity(washingtonStreetID) ||
43044               !context.hasEntity(twelfthAvenueID) ||
43045               !context.hasEntity(eleventhAvenueEndID)) {
43046               return continueTo(rightClickIntersection);
43047           }
43048
43049           var ids = context.selectedIDs();
43050           var hasWashington = ids.indexOf(_washingtonSegmentID) !== -1;
43051           var hasTwelfth = ids.indexOf(twelfthAvenueID) !== -1;
43052
43053           if (hasWashington && hasTwelfth) {
43054               return continueTo(multiRightClick);
43055           } else if (!hasWashington && !hasTwelfth) {
43056               return continueTo(didSplit);
43057           }
43058
43059           context.map().centerZoomEase(twelfthAvenue, 18, 500);
43060
43061           timeout(function() {
43062               var selected, other, padding, box;
43063               if (hasWashington) {
43064                   selected = t('intro.graph.name.washington-street');
43065                   other = t('intro.graph.name.12th-avenue');
43066                   padding = 60 * Math.pow(2, context.map().zoom() - 18);
43067                   box = pad$1(twelfthAvenueEnd, padding, context);
43068                   box.width *= 3;
43069               } else {
43070                   selected = t('intro.graph.name.12th-avenue');
43071                   other = t('intro.graph.name.washington-street');
43072                   padding = 200 * Math.pow(2, context.map().zoom() - 18);
43073                   box = pad$1(twelfthAvenue, padding, context);
43074                   box.width /= 2;
43075               }
43076
43077               reveal(box,
43078                   t('intro.lines.multi_select', { selected: selected, other1: other, other2: other })
43079               );
43080
43081               context.map().on('move.intro drawn.intro', function() {
43082                   if (hasWashington) {
43083                       selected = t('intro.graph.name.washington-street');
43084                       other = t('intro.graph.name.12th-avenue');
43085                       padding = 60 * Math.pow(2, context.map().zoom() - 18);
43086                       box = pad$1(twelfthAvenueEnd, padding, context);
43087                       box.width *= 3;
43088                   } else {
43089                       selected = t('intro.graph.name.12th-avenue');
43090                       other = t('intro.graph.name.washington-street');
43091                       padding = 200 * Math.pow(2, context.map().zoom() - 18);
43092                       box = pad$1(twelfthAvenue, padding, context);
43093                       box.width /= 2;
43094                   }
43095
43096                   reveal(box,
43097                       t('intro.lines.multi_select', { selected: selected, other1: other, other2: other }),
43098                       { duration: 0 }
43099                   );
43100               });
43101
43102               context.on('enter.intro', function() {
43103                   continueTo(multiSelect);
43104               });
43105
43106               context.history().on('change.intro', function() {
43107                   if (!_washingtonSegmentID ||
43108                       !context.hasEntity(_washingtonSegmentID) ||
43109                       !context.hasEntity(washingtonStreetID) ||
43110                       !context.hasEntity(twelfthAvenueID) ||
43111                       !context.hasEntity(eleventhAvenueEndID)) {
43112                       return continueTo(rightClickIntersection);
43113                   }
43114               });
43115           }, 600);
43116
43117           function continueTo(nextStep) {
43118               context.map().on('move.intro drawn.intro', null);
43119               context.on('enter.intro', null);
43120               context.history().on('change.intro', null);
43121               nextStep();
43122           }
43123       }
43124
43125
43126       function multiRightClick() {
43127           if (!_washingtonSegmentID ||
43128               !context.hasEntity(_washingtonSegmentID) ||
43129               !context.hasEntity(washingtonStreetID) ||
43130               !context.hasEntity(twelfthAvenueID) ||
43131               !context.hasEntity(eleventhAvenueEndID)) {
43132               return continueTo(rightClickIntersection);
43133           }
43134
43135           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
43136           var box = pad$1(twelfthAvenue, padding, context);
43137           reveal(box, t('intro.lines.multi_rightclick'));
43138
43139           context.map().on('move.intro drawn.intro', function() {
43140               var padding = 200 * Math.pow(2, context.map().zoom() - 18);
43141               var box = pad$1(twelfthAvenue, padding, context);
43142               reveal(box, t('intro.lines.multi_rightclick'), { duration: 0 });
43143           });
43144
43145           select(window).on('click.intro contextmenu.intro', function() {
43146               timeout(function() {
43147                   var ids = context.selectedIDs();
43148                   if (ids.length === 2 &&
43149                       ids.indexOf(twelfthAvenueID) !== -1 &&
43150                       ids.indexOf(_washingtonSegmentID) !== -1) {
43151                           var node = selectMenuItem('delete').node();
43152                           if (!node) return;
43153                           continueTo(multiDelete);
43154                   } else if (ids.length === 1 &&
43155                       ids.indexOf(_washingtonSegmentID) !== -1) {
43156                       return continueTo(multiSelect);
43157                   } else {
43158                       return continueTo(didSplit);
43159                   }
43160               }, 300);  // after edit menu visible
43161           }, true);
43162
43163           context.history().on('change.intro', function() {
43164               if (!_washingtonSegmentID ||
43165                   !context.hasEntity(_washingtonSegmentID) ||
43166                   !context.hasEntity(washingtonStreetID) ||
43167                   !context.hasEntity(twelfthAvenueID) ||
43168                   !context.hasEntity(eleventhAvenueEndID)) {
43169                   return continueTo(rightClickIntersection);
43170               }
43171           });
43172
43173           function continueTo(nextStep) {
43174               context.map().on('move.intro drawn.intro', null);
43175               select(window).on('click.intro contextmenu.intro', null, true);
43176               context.history().on('change.intro', null);
43177               nextStep();
43178           }
43179       }
43180
43181
43182       function multiDelete() {
43183           if (!_washingtonSegmentID ||
43184               !context.hasEntity(_washingtonSegmentID) ||
43185               !context.hasEntity(washingtonStreetID) ||
43186               !context.hasEntity(twelfthAvenueID) ||
43187               !context.hasEntity(eleventhAvenueEndID)) {
43188               return continueTo(rightClickIntersection);
43189           }
43190
43191           var node = selectMenuItem('delete').node();
43192           if (!node) return continueTo(multiRightClick);
43193
43194           var menuCoords = context.map().mouseCoordinates();
43195           revealEditMenu(menuCoords,
43196               t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') })
43197           );
43198
43199           context.map().on('move.intro drawn.intro', function() {
43200               revealEditMenu(menuCoords,
43201                   t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') }),
43202                   { duration: 0 }
43203               );
43204           });
43205
43206           context.on('exit.intro', function() {
43207               if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
43208                   return continueTo(multiSelect);  // left select mode but roads still exist
43209               }
43210           });
43211
43212           context.history().on('change.intro', function() {
43213               if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
43214                   continueTo(retryDelete);         // changed something but roads still exist
43215               } else {
43216                   continueTo(play);
43217               }
43218           });
43219
43220           function continueTo(nextStep) {
43221               context.map().on('move.intro drawn.intro', null);
43222               context.on('exit.intro', null);
43223               context.history().on('change.intro', null);
43224               nextStep();
43225           }
43226       }
43227
43228
43229       function retryDelete() {
43230           context.enter(modeBrowse(context));
43231
43232           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
43233           var box = pad$1(twelfthAvenue, padding, context);
43234           reveal(box, t('intro.lines.retry_delete'), {
43235               buttonText: t('intro.ok'),
43236               buttonCallback: function() { continueTo(multiSelect); }
43237           });
43238
43239           function continueTo(nextStep) {
43240               nextStep();
43241           }
43242       }
43243
43244
43245       function play() {
43246           dispatch$$1.call('done');
43247           reveal('#id-container',
43248               t('intro.lines.play', { next: t('intro.buildings.title') }), {
43249                   tooltipBox: '.intro-nav-wrap .chapter-building',
43250                   buttonText: t('intro.ok'),
43251                   buttonCallback: function() { reveal('#id-container'); }
43252               }
43253           );
43254      }
43255
43256
43257       chapter.enter = function() {
43258           addLine();
43259       };
43260
43261
43262       chapter.exit = function() {
43263           timeouts.forEach(window.clearTimeout);
43264           select(window).on('mousedown.intro', null, true);
43265           context.on('enter.intro exit.intro', null);
43266           context.map().on('move.intro drawn.intro', null);
43267           context.history().on('change.intro', null);
43268           select('.inspector-wrap').on('wheel.intro', null);
43269           select('.preset-list-button').on('click.intro', null);
43270       };
43271
43272
43273       chapter.restart = function() {
43274           chapter.exit();
43275           chapter.enter();
43276       };
43277
43278
43279       return utilRebind(chapter, dispatch$$1, 'on');
43280   }
43281
43282   function uiIntroBuilding(context, reveal) {
43283       var dispatch$$1 = dispatch('done');
43284       var house = [-85.62815, 41.95638];
43285       var tank = [-85.62732, 41.95347];
43286       var buildingCatetory = context.presets().item('category-building');
43287       var housePreset = context.presets().item('building/house');
43288       var tankPreset = context.presets().item('man_made/storage_tank');
43289       var timeouts = [];
43290       var _houseID = null;
43291       var _tankID = null;
43292
43293
43294       var chapter = {
43295           title: 'intro.buildings.title'
43296       };
43297
43298
43299       function timeout(f, t$$1) {
43300           timeouts.push(window.setTimeout(f, t$$1));
43301       }
43302
43303
43304       function eventCancel() {
43305           event.stopPropagation();
43306           event.preventDefault();
43307       }
43308
43309
43310       function revealHouse(center, text, options) {
43311           var padding = 160 * Math.pow(2, context.map().zoom() - 20);
43312           var box = pad$1(center, padding, context);
43313           reveal(box, text, options);
43314       }
43315
43316
43317       function revealTank(center, text, options) {
43318           var padding = 190 * Math.pow(2, context.map().zoom() - 19.5);
43319           var box = pad$1(center, padding, context);
43320           reveal(box, text, options);
43321       }
43322
43323
43324       function revealEditMenu(loc, text, options) {
43325           var rect = context.surfaceRect();
43326           var point$$1 = context.curtainProjection(loc);
43327           var pad = 40;
43328           var width = 250 + (2 * pad);
43329           var height = 350;
43330           var startX = rect.left + point$$1[0];
43331           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
43332           var box = {
43333               left: left,
43334               top: point$$1[1] + rect.top - 60,
43335               width: width,
43336               height: height
43337           };
43338           reveal(box, text, options);
43339       }
43340
43341
43342       function addHouse() {
43343           context.enter(modeBrowse(context));
43344           context.history().reset('initial');
43345           _houseID = null;
43346
43347           var msec = transitionTime(house, context.map().center());
43348           if (msec) { reveal(null, null, { duration: 0 }); }
43349           context.map().centerZoomEase(house, 19, msec);
43350
43351           timeout(function() {
43352               var tooltip = reveal('button.add-area',
43353                   t('intro.buildings.add_building', { button: icon('#iD-icon-area', 'pre-text') }));
43354
43355               tooltip.selectAll('.tooltip-inner')
43356                   .insert('svg', 'span')
43357                   .attr('class', 'tooltip-illustration')
43358                   .append('use')
43359                   .attr('xlink:href', '#iD-graphic-buildings');
43360
43361               context.on('enter.intro', function(mode) {
43362                   if (mode.id !== 'add-area') return;
43363                   continueTo(startHouse);
43364               });
43365           }, msec + 100);
43366
43367           function continueTo(nextStep) {
43368               context.on('enter.intro', null);
43369               nextStep();
43370           }
43371       }
43372
43373
43374       function startHouse() {
43375           if (context.mode().id !== 'add-area') {
43376               return continueTo(addHouse);
43377           }
43378
43379           _houseID = null;
43380           context.map().zoomEase(20, 500);
43381
43382           timeout(function() {
43383               revealHouse(house, t('intro.buildings.start_building'));
43384
43385               context.map().on('move.intro drawn.intro', function() {
43386                   revealHouse(house, t('intro.buildings.start_building'), { duration: 0 });
43387               });
43388
43389               context.on('enter.intro', function(mode) {
43390                   if (mode.id !== 'draw-area') return chapter.restart();
43391                   continueTo(continueHouse);
43392               });
43393
43394           }, 550);  // after easing
43395
43396           function continueTo(nextStep) {
43397               context.map().on('move.intro drawn.intro', null);
43398               context.on('enter.intro', null);
43399               nextStep();
43400           }
43401       }
43402
43403
43404       function continueHouse() {
43405           if (context.mode().id !== 'draw-area') {
43406               return continueTo(addHouse);
43407           }
43408
43409           _houseID = null;
43410
43411           revealHouse(house, t('intro.buildings.continue_building'));
43412
43413           context.map().on('move.intro drawn.intro', function() {
43414               revealHouse(house, t('intro.buildings.continue_building'), { duration: 0 });
43415           });
43416
43417           context.on('enter.intro', function(mode) {
43418               if (mode.id === 'draw-area') {
43419                   return;
43420               } else if (mode.id === 'select') {
43421                   var graph = context.graph();
43422                   var way = context.entity(context.selectedIDs()[0]);
43423                   var nodes = graph.childNodes(way);
43424                   var points = uniq(nodes).map(function(n) { return context.projection(n.loc); });
43425
43426                   if (isMostlySquare(points)) {
43427                       _houseID = way.id;
43428                       return continueTo(chooseCategoryBuilding);
43429                   } else {
43430                       return continueTo(retryHouse);
43431                   }
43432
43433               } else {
43434                   return chapter.restart();
43435               }
43436           });
43437
43438           function continueTo(nextStep) {
43439               context.map().on('move.intro drawn.intro', null);
43440               context.on('enter.intro', null);
43441               nextStep();
43442           }
43443       }
43444
43445
43446       function retryHouse() {
43447           var onClick = function() { continueTo(addHouse); };
43448
43449           revealHouse(house, t('intro.buildings.retry_building'),
43450               { buttonText: t('intro.ok'), buttonCallback: onClick }
43451           );
43452
43453           context.map().on('move.intro drawn.intro', function() {
43454               revealHouse(house, t('intro.buildings.retry_building'),
43455                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
43456               );
43457           });
43458
43459           function continueTo(nextStep) {
43460               context.map().on('move.intro drawn.intro', null);
43461               nextStep();
43462           }
43463       }
43464
43465
43466       function chooseCategoryBuilding() {
43467           if (!_houseID || !context.hasEntity(_houseID)) {
43468               return addHouse();
43469           }
43470           var ids = context.selectedIDs();
43471           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
43472               context.enter(modeSelect(context, [_houseID]));
43473           }
43474
43475           // disallow scrolling
43476           select('.inspector-wrap').on('wheel.intro', eventCancel);
43477
43478           timeout(function() {
43479               // reset pane, in case user somehow happened to change it..
43480               select('.inspector-wrap .panewrap').style('right', '-100%');
43481
43482               var button = select('.preset-category-building .preset-list-button');
43483
43484               reveal(button.node(),
43485                   t('intro.buildings.choose_category_building', { category: buildingCatetory.name() })
43486               );
43487
43488               button.on('click.intro', function() {
43489                   button.on('click.intro', null);
43490                   continueTo(choosePresetHouse);
43491               });
43492
43493           }, 400);  // after preset list pane visible..
43494
43495
43496           context.on('enter.intro', function(mode) {
43497               if (!_houseID || !context.hasEntity(_houseID)) {
43498                   return continueTo(addHouse);
43499               }
43500               var ids = context.selectedIDs();
43501               if (mode.id !== 'select' || !ids.length || ids[0] !== _houseID) {
43502                   return continueTo(chooseCategoryBuilding);
43503               }
43504           });
43505
43506           function continueTo(nextStep) {
43507               select('.inspector-wrap').on('wheel.intro', null);
43508               select('.preset-list-button').on('click.intro', null);
43509               context.on('enter.intro', null);
43510               nextStep();
43511           }
43512       }
43513
43514
43515       function choosePresetHouse() {
43516           if (!_houseID || !context.hasEntity(_houseID)) {
43517               return addHouse();
43518           }
43519           var ids = context.selectedIDs();
43520           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
43521               context.enter(modeSelect(context, [_houseID]));
43522           }
43523
43524           // disallow scrolling
43525           select('.inspector-wrap').on('wheel.intro', eventCancel);
43526
43527           timeout(function() {
43528               // reset pane, in case user somehow happened to change it..
43529               select('.inspector-wrap .panewrap').style('right', '-100%');
43530
43531               var button = select('.preset-building-house .preset-list-button');
43532
43533               reveal(button.node(),
43534                   t('intro.buildings.choose_preset_house', { preset: housePreset.name() }),
43535                   { duration: 300 }
43536               );
43537
43538               button.on('click.intro', function() {
43539                   button.on('click.intro', null);
43540                   continueTo(closeEditorHouse);
43541               });
43542
43543           }, 400);  // after preset list pane visible..
43544
43545           context.on('enter.intro', function(mode) {
43546               if (!_houseID || !context.hasEntity(_houseID)) {
43547                   return continueTo(addHouse);
43548               }
43549               var ids = context.selectedIDs();
43550               if (mode.id !== 'select' || !ids.length || ids[0] !== _houseID) {
43551                   return continueTo(chooseCategoryBuilding);
43552               }
43553           });
43554
43555           function continueTo(nextStep) {
43556               select('.inspector-wrap').on('wheel.intro', null);
43557               select('.preset-list-button').on('click.intro', null);
43558               context.on('enter.intro', null);
43559               nextStep();
43560           }
43561       }
43562
43563
43564       function closeEditorHouse() {
43565           if (!_houseID || !context.hasEntity(_houseID)) {
43566               return addHouse();
43567           }
43568           var ids = context.selectedIDs();
43569           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
43570               context.enter(modeSelect(context, [_houseID]));
43571           }
43572
43573           context.history().checkpoint('hasHouse');
43574
43575           context.on('exit.intro', function() {
43576               continueTo(rightClickHouse);
43577           });
43578
43579           timeout(function() {
43580               reveal('.entity-editor-pane',
43581                   t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
43582               );
43583           }, 500);
43584
43585           function continueTo(nextStep) {
43586               context.on('exit.intro', null);
43587               nextStep();
43588           }
43589       }
43590
43591
43592       function rightClickHouse() {
43593           if (!_houseID) return chapter.restart();
43594
43595           context.enter(modeBrowse(context));
43596           context.history().reset('hasHouse');
43597           var zoom = context.map().zoom();
43598           if (zoom < 20) {
43599               zoom = 20;
43600           }
43601           context.map().centerZoomEase(house, zoom, 500);
43602
43603           context.on('enter.intro', function(mode) {
43604               if (mode.id !== 'select') return;
43605               var ids = context.selectedIDs();
43606               if (ids.length !== 1 || ids[0] !== _houseID) return;
43607
43608               timeout(function() {
43609                   var node = selectMenuItem('orthogonalize').node();
43610                   if (!node) return;
43611                   continueTo(clickSquare);
43612               }, 300);  // after menu visible
43613           });
43614
43615           context.map().on('move.intro drawn.intro', function() {
43616               revealHouse(house, t('intro.buildings.rightclick_building'), { duration: 0 });
43617           });
43618
43619           context.history().on('change.intro', function() {
43620               continueTo(rightClickHouse);
43621           });
43622
43623           function continueTo(nextStep) {
43624               context.on('enter.intro', null);
43625               context.map().on('move.intro drawn.intro', null);
43626               context.history().on('change.intro', null);
43627               nextStep();
43628           }
43629       }
43630
43631
43632       function clickSquare() {
43633           if (!_houseID) return chapter.restart();
43634           var entity = context.hasEntity(_houseID);
43635           if (!entity) return continueTo(rightClickHouse);
43636
43637           var node = selectMenuItem('orthogonalize').node();
43638           if (!node) { return continueTo(rightClickHouse); }
43639
43640           var wasChanged = false;
43641           var menuCoords = context.map().mouseCoordinates();
43642
43643           revealEditMenu(menuCoords,
43644               t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') })
43645           );
43646
43647           context.on('enter.intro', function(mode) {
43648               if (mode.id === 'browse') {
43649                   continueTo(rightClickHouse);
43650               } else if (mode.id === 'move' || mode.id === 'rotate') {
43651                   continueTo(retryClickSquare);
43652               }
43653           });
43654
43655           context.map().on('move.intro drawn.intro', function() {
43656               var node = selectMenuItem('orthogonalize').node();
43657               if (!wasChanged && !node) { return continueTo(rightClickHouse); }
43658
43659               revealEditMenu(menuCoords,
43660                   t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') }),
43661                   { duration: 0 }
43662               );
43663           });
43664
43665           context.history().on('change.intro', function() {
43666               wasChanged = true;
43667               context.history().on('change.intro', null);
43668
43669               // Something changed.  Wait for transition to complete and check undo annotation.
43670               timeout(function() {
43671                   if (context.history().undoAnnotation() === t('operations.orthogonalize.annotation.area')) {
43672                       continueTo(doneSquare);
43673                   } else {
43674                       continueTo(retryClickSquare);
43675                   }
43676               }, 500);  // after transitioned actions
43677           });
43678
43679           function continueTo(nextStep) {
43680               context.on('enter.intro', null);
43681               context.map().on('move.intro drawn.intro', null);
43682               context.history().on('change.intro', null);
43683               nextStep();
43684           }
43685       }
43686
43687
43688       function retryClickSquare() {
43689           context.enter(modeBrowse(context));
43690
43691           revealHouse(house, t('intro.buildings.retry_square'), {
43692               buttonText: t('intro.ok'),
43693               buttonCallback: function() { continueTo(rightClickHouse); }
43694           });
43695
43696           function continueTo(nextStep) {
43697               nextStep();
43698           }
43699       }
43700
43701
43702       function doneSquare() {
43703           context.history().checkpoint('doneSquare');
43704
43705           revealHouse(house, t('intro.buildings.done_square'), {
43706               buttonText: t('intro.ok'),
43707               buttonCallback: function() { continueTo(addTank); }
43708           });
43709
43710           function continueTo(nextStep) {
43711               nextStep();
43712           }
43713       }
43714
43715
43716       function addTank() {
43717           context.enter(modeBrowse(context));
43718           context.history().reset('doneSquare');
43719           _tankID = null;
43720
43721           var msec = transitionTime(tank, context.map().center());
43722           if (msec) { reveal(null, null, { duration: 0 }); }
43723           context.map().centerZoomEase(tank, 19.5, msec);
43724
43725           timeout(function() {
43726               reveal('button.add-area',
43727                   t('intro.buildings.add_tank', { button: icon('#iD-icon-area', 'pre-text') })
43728               );
43729
43730               context.on('enter.intro', function(mode) {
43731                   if (mode.id !== 'add-area') return;
43732                   continueTo(startTank);
43733               });
43734           }, msec + 100);
43735
43736           function continueTo(nextStep) {
43737               context.on('enter.intro', null);
43738               nextStep();
43739           }
43740       }
43741
43742
43743       function startTank() {
43744           if (context.mode().id !== 'add-area') {
43745               return continueTo(addTank);
43746           }
43747
43748           _tankID = null;
43749
43750           timeout(function() {
43751               revealTank(tank, t('intro.buildings.start_tank'));
43752
43753               context.map().on('move.intro drawn.intro', function() {
43754                   revealTank(tank, t('intro.buildings.start_tank'), { duration: 0 });
43755               });
43756
43757               context.on('enter.intro', function(mode) {
43758                   if (mode.id !== 'draw-area') return chapter.restart();
43759                   continueTo(continueTank);
43760               });
43761
43762           }, 550);  // after easing
43763
43764           function continueTo(nextStep) {
43765               context.map().on('move.intro drawn.intro', null);
43766               context.on('enter.intro', null);
43767               nextStep();
43768           }
43769       }
43770
43771
43772       function continueTank() {
43773           if (context.mode().id !== 'draw-area') {
43774               return continueTo(addTank);
43775           }
43776
43777           _tankID = null;
43778
43779           revealTank(tank, t('intro.buildings.continue_tank'));
43780
43781           context.map().on('move.intro drawn.intro', function() {
43782               revealTank(tank, t('intro.buildings.continue_tank'), { duration: 0 });
43783           });
43784
43785           context.on('enter.intro', function(mode) {
43786               if (mode.id === 'draw-area') {
43787                   return;
43788               } else if (mode.id === 'select') {
43789                   _tankID = context.selectedIDs()[0];
43790                   return continueTo(searchPresetTank);
43791               } else {
43792                   return continueTo(addTank);
43793               }
43794           });
43795
43796           function continueTo(nextStep) {
43797               context.map().on('move.intro drawn.intro', null);
43798               context.on('enter.intro', null);
43799               nextStep();
43800           }
43801       }
43802
43803
43804       function searchPresetTank() {
43805           if (!_tankID || !context.hasEntity(_tankID)) {
43806               return addTank();
43807           }
43808           var ids = context.selectedIDs();
43809           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _tankID) {
43810               context.enter(modeSelect(context, [_tankID]));
43811           }
43812
43813           // disallow scrolling
43814           select('.inspector-wrap').on('wheel.intro', eventCancel);
43815
43816           timeout(function() {
43817               // reset pane, in case user somehow happened to change it..
43818               select('.inspector-wrap .panewrap').style('right', '-100%');
43819
43820               select('.preset-search-input')
43821                   .on('keydown.intro', null)
43822                   .on('keyup.intro', checkPresetSearch);
43823
43824               reveal('.preset-search-input',
43825                   t('intro.buildings.search_tank', { preset: tankPreset.name() })
43826               );
43827           }, 400);  // after preset list pane visible..
43828
43829           context.on('enter.intro', function(mode) {
43830               if (!_tankID || !context.hasEntity(_tankID)) {
43831                   return continueTo(addTank);
43832               }
43833
43834               var ids = context.selectedIDs();
43835               if (mode.id !== 'select' || !ids.length || ids[0] !== _tankID) {
43836                   // keep the user's area selected..
43837                   context.enter(modeSelect(context, [_tankID]));
43838
43839                   // reset pane, in case user somehow happened to change it..
43840                   select('.inspector-wrap .panewrap').style('right', '-100%');
43841                   // disallow scrolling
43842                   select('.inspector-wrap').on('wheel.intro', eventCancel);
43843
43844                   select('.preset-search-input')
43845                       .on('keydown.intro', null)
43846                       .on('keyup.intro', checkPresetSearch);
43847
43848                   reveal('.preset-search-input',
43849                       t('intro.buildings.search_tank', { preset: tankPreset.name() })
43850                   );
43851
43852                   context.history().on('change.intro', null);
43853               }
43854           });
43855
43856           function checkPresetSearch() {
43857               var first = select('.preset-list-item:first-child');
43858
43859               if (first.classed('preset-man_made-storage_tank')) {
43860                   reveal(first.select('.preset-list-button').node(),
43861                       t('intro.buildings.choose_tank', { preset: tankPreset.name() }),
43862                       { duration: 300 }
43863                   );
43864
43865                   select('.preset-search-input')
43866                       .on('keydown.intro', eventCancel, true)
43867                       .on('keyup.intro', null);
43868
43869                   context.history().on('change.intro', function() {
43870                       continueTo(closeEditorTank);
43871                   });
43872               }
43873           }
43874
43875           function continueTo(nextStep) {
43876               select('.inspector-wrap').on('wheel.intro', null);
43877               context.on('enter.intro', null);
43878               context.history().on('change.intro', null);
43879               select('.preset-search-input').on('keydown.intro keyup.intro', null);
43880               nextStep();
43881           }
43882       }
43883
43884
43885       function closeEditorTank() {
43886           if (!_tankID || !context.hasEntity(_tankID)) {
43887               return addTank();
43888           }
43889           var ids = context.selectedIDs();
43890           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _tankID) {
43891               context.enter(modeSelect(context, [_tankID]));
43892           }
43893
43894           context.history().checkpoint('hasTank');
43895
43896           context.on('exit.intro', function() {
43897               continueTo(rightClickTank);
43898           });
43899
43900           timeout(function() {
43901               reveal('.entity-editor-pane',
43902                   t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
43903               );
43904           }, 500);
43905
43906           function continueTo(nextStep) {
43907               context.on('exit.intro', null);
43908               nextStep();
43909           }
43910       }
43911
43912
43913       function rightClickTank() {
43914           if (!_tankID) return continueTo(addTank);
43915
43916           context.enter(modeBrowse(context));
43917           context.history().reset('hasTank');
43918           context.map().centerEase(tank, 500);
43919
43920           timeout(function() {
43921               context.on('enter.intro', function(mode) {
43922                   if (mode.id !== 'select') return;
43923                   var ids = context.selectedIDs();
43924                   if (ids.length !== 1 || ids[0] !== _tankID) return;
43925
43926                   timeout(function() {
43927                       var node = selectMenuItem('circularize').node();
43928                       if (!node) return;
43929                       continueTo(clickCircle);
43930                   }, 300);  // after menu visible
43931               });
43932
43933               revealTank(tank, t('intro.buildings.rightclick_tank'));
43934
43935               context.map().on('move.intro drawn.intro', function() {
43936                   revealTank(tank, t('intro.buildings.rightclick_tank'), { duration: 0 });
43937               });
43938
43939               context.history().on('change.intro', function() {
43940                   continueTo(rightClickTank);
43941               });
43942
43943           }, 600);
43944
43945           function continueTo(nextStep) {
43946               context.on('enter.intro', null);
43947               context.map().on('move.intro drawn.intro', null);
43948               context.history().on('change.intro', null);
43949               nextStep();
43950           }
43951       }
43952
43953
43954       function clickCircle() {
43955           if (!_tankID) return chapter.restart();
43956           var entity = context.hasEntity(_tankID);
43957           if (!entity) return continueTo(rightClickTank);
43958
43959           var node = selectMenuItem('circularize').node();
43960           if (!node) { return continueTo(rightClickTank); }
43961
43962           var wasChanged = false;
43963           var menuCoords = context.map().mouseCoordinates();
43964
43965           revealEditMenu(menuCoords,
43966               t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') })
43967           );
43968
43969           context.on('enter.intro', function(mode) {
43970               if (mode.id === 'browse') {
43971                   continueTo(rightClickTank);
43972               } else if (mode.id === 'move' || mode.id === 'rotate') {
43973                   continueTo(retryClickCircle);
43974               }
43975           });
43976
43977           context.map().on('move.intro drawn.intro', function() {
43978               var node = selectMenuItem('circularize').node();
43979               if (!wasChanged && !node) { return continueTo(rightClickTank); }
43980
43981               revealEditMenu(menuCoords,
43982                   t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') }),
43983                   { duration: 0 }
43984               );
43985           });
43986
43987           context.history().on('change.intro', function() {
43988               wasChanged = true;
43989               context.history().on('change.intro', null);
43990
43991               // Something changed.  Wait for transition to complete and check undo annotation.
43992               timeout(function() {
43993                   if (context.history().undoAnnotation() === t('operations.circularize.annotation.area')) {
43994                       continueTo(play);
43995                   } else {
43996                       continueTo(retryClickCircle);
43997                   }
43998               }, 500);  // after transitioned actions
43999           });
44000
44001           function continueTo(nextStep) {
44002               context.on('enter.intro', null);
44003               context.map().on('move.intro drawn.intro', null);
44004               context.history().on('change.intro', null);
44005               nextStep();
44006           }
44007       }
44008
44009
44010       function retryClickCircle() {
44011           context.enter(modeBrowse(context));
44012
44013           revealTank(tank, t('intro.buildings.retry_circle'), {
44014               buttonText: t('intro.ok'),
44015               buttonCallback: function() { continueTo(rightClickTank); }
44016           });
44017
44018           function continueTo(nextStep) {
44019               nextStep();
44020           }
44021       }
44022
44023
44024       function play() {
44025           dispatch$$1.call('done');
44026           reveal('#id-container',
44027               t('intro.buildings.play', { next: t('intro.startediting.title') }), {
44028                   tooltipBox: '.intro-nav-wrap .chapter-startEditing',
44029                   buttonText: t('intro.ok'),
44030                   buttonCallback: function() { reveal('#id-container'); }
44031               }
44032           );
44033       }
44034
44035
44036       chapter.enter = function() {
44037           addHouse();
44038       };
44039
44040
44041       chapter.exit = function() {
44042           timeouts.forEach(window.clearTimeout);
44043           context.on('enter.intro exit.intro', null);
44044           context.map().on('move.intro drawn.intro', null);
44045           context.history().on('change.intro', null);
44046           select('.inspector-wrap').on('wheel.intro', null);
44047           select('.preset-search-input').on('keydown.intro keyup.intro', null);
44048           select('.more-fields .combobox-input').on('click.intro', null);
44049       };
44050
44051
44052       chapter.restart = function() {
44053           chapter.exit();
44054           chapter.enter();
44055       };
44056
44057
44058       return utilRebind(chapter, dispatch$$1, 'on');
44059   }
44060
44061   function uiModal(selection$$1, blocking) {
44062       var keybinding = utilKeybinding('modal');
44063       var previous = selection$$1.select('div.modal');
44064       var animate = previous.empty();
44065
44066       previous.transition()
44067           .duration(200)
44068           .style('opacity', 0)
44069           .remove();
44070
44071       var shaded = selection$$1
44072           .append('div')
44073           .attr('class', 'shaded')
44074           .style('opacity', 0);
44075
44076       shaded.close = function() {
44077           shaded
44078               .transition()
44079               .duration(200)
44080               .style('opacity',0)
44081               .remove();
44082
44083           modal
44084               .transition()
44085               .duration(200)
44086               .style('top','0px');
44087
44088           select(document)
44089               .call(keybinding.unbind);
44090       };
44091
44092
44093       var modal = shaded
44094           .append('div')
44095           .attr('class', 'modal fillL col6');
44096
44097       if (!blocking) {
44098           shaded.on('click.remove-modal', function() {
44099               if (event.target === this) {
44100                   shaded.close();
44101               }
44102           });
44103
44104           modal.append('button')
44105               .attr('class', 'close')
44106               .on('click', shaded.close)
44107               .call(svgIcon('#iD-icon-close'));
44108
44109           keybinding
44110               .on('⌫', shaded.close)
44111               .on('⎋', shaded.close);
44112
44113           select(document)
44114               .call(keybinding);
44115       }
44116
44117       modal
44118           .append('div')
44119           .attr('class', 'content');
44120
44121       if (animate) {
44122           shaded.transition().style('opacity', 1);
44123       } else {
44124           shaded.style('opacity', 1);
44125       }
44126
44127
44128       return shaded;
44129   }
44130
44131   function uiIntroStartEditing(context, reveal) {
44132       var dispatch$$1 = dispatch('done', 'startEditing');
44133       var modalSelection = select(null);
44134
44135
44136       var chapter = {
44137           title: 'intro.startediting.title'
44138       };
44139
44140       function showHelp() {
44141           reveal('.map-control.help-control',
44142               t('intro.startediting.help', { button: icon('#iD-icon-help', 'pre-text'), key: t('help.key') }), {
44143                   buttonText: t('intro.ok'),
44144                   buttonCallback: function() { shortcuts(); }
44145               }
44146           );
44147       }
44148
44149       function shortcuts() {
44150           reveal('.map-control.help-control',
44151               t('intro.startediting.shortcuts', { key: t('shortcuts.toggle.key') }), {
44152                   buttonText: t('intro.ok'),
44153                   buttonCallback: function() { showSave(); }
44154               }
44155           );
44156       }
44157
44158       function showSave() {
44159           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
44160           reveal('#bar button.save',
44161               t('intro.startediting.save'), {
44162                   buttonText: t('intro.ok'),
44163                   buttonCallback: function() { showStart(); }
44164               }
44165           );
44166       }
44167
44168       function showStart() {
44169           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
44170
44171           modalSelection = uiModal(context.container());
44172
44173           modalSelection.select('.modal')
44174               .attr('class', 'modal-splash modal col6');
44175
44176           modalSelection.selectAll('.close').remove();
44177
44178           var startbutton = modalSelection.select('.content')
44179               .attr('class', 'fillL')
44180               .append('button')
44181                   .attr('class', 'modal-section huge-modal-button')
44182                   .on('click', function() {
44183                       modalSelection.remove();
44184                   });
44185
44186               startbutton
44187                   .append('svg')
44188                   .attr('class', 'illustration')
44189                   .append('use')
44190                   .attr('xlink:href', '#iD-logo-walkthrough');
44191
44192               startbutton
44193                   .append('h2')
44194                   .text(t('intro.startediting.start'));
44195
44196           dispatch$$1.call('startEditing');
44197       }
44198
44199
44200       chapter.enter = function() {
44201           showHelp();
44202       };
44203
44204
44205       chapter.exit = function() {
44206           modalSelection.remove();
44207           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
44208       };
44209
44210
44211       return utilRebind(chapter, dispatch$$1, 'on');
44212   }
44213
44214   var chapterUi = {
44215       welcome: uiIntroWelcome,
44216       navigation: uiIntroNavigation,
44217       point: uiIntroPoint,
44218       area: uiIntroArea,
44219       line: uiIntroLine,
44220       building: uiIntroBuilding,
44221       startEditing: uiIntroStartEditing
44222   };
44223
44224   var chapterFlow = [
44225       'welcome',
44226       'navigation',
44227       'point',
44228       'area',
44229       'line',
44230       'building',
44231       'startEditing'
44232   ];
44233
44234
44235   function uiIntro(context) {
44236       var INTRO_IMAGERY = 'EsriWorldImageryClarity';
44237       var introGraph = {};
44238       var _currChapter;
44239
44240       // create entities for intro graph and localize names
44241       for (var id in dataIntroGraph) {
44242           introGraph[id] = osmEntity$$1(localize(dataIntroGraph[id]));
44243       }
44244
44245
44246       function intro(selection$$1) {
44247           context.enter(modeBrowse(context));
44248
44249           // Save current map state
44250           var osm = context.connection();
44251           var history = context.history().toJSON();
44252           var hash = window.location.hash;
44253           var center = context.map().center();
44254           var zoom = context.map().zoom();
44255           var background = context.background().baseLayerSource();
44256           var overlays = context.background().overlayLayerSources();
44257           var opacity = d3_selectAll('#map .layer-background').style('opacity');
44258           var caches = osm && osm.caches();
44259           var baseEntities = context.history().graph().base().entities;
44260           var countryCode = services.geocoder.countryCode;
44261
44262           // Show sidebar and disable the sidebar resizing button
44263           // (this needs to be before `context.inIntro(true)`)
44264           context.ui().sidebar.expand();
44265           d3_selectAll('button.sidebar-toggle').classed('disabled', true);
44266
44267           // Block saving
44268           context.inIntro(true);
44269
44270           // Load semi-real data used in intro
44271           if (osm) { osm.toggle(false).reset(); }
44272           context.history().reset();
44273           context.history().merge(values$1(coreGraph$$1().load(introGraph).entities));
44274           context.history().checkpoint('initial');
44275
44276           // Setup imagery
44277           var imagery = context.background().findSource(INTRO_IMAGERY);
44278           if (imagery) {
44279               context.background().baseLayerSource(imagery);
44280           } else {
44281               context.background().bing();
44282           }
44283           overlays.forEach(function(d) {
44284               context.background().toggleOverlayLayer(d);
44285           });
44286
44287           // Setup data layers (only OSM)
44288           var layers = context.layers();
44289           layers.all().forEach(function(item) {
44290               // if the layer has the function `enabled`
44291               if (typeof item.layer.enabled === 'function') {
44292                   item.layer.enabled(item.id === 'osm');
44293               }
44294           });
44295
44296           // Mock geocoder
44297           services.geocoder.countryCode = function(location, callback) {
44298               callback(null, t('intro.graph.countrycode'));
44299           };
44300
44301
44302           d3_selectAll('#map .layer-background').style('opacity', 1);
44303
44304           var curtain = uiCurtain();
44305           selection$$1.call(curtain);
44306
44307           // Store that the user started the walkthrough..
44308           context.storage('walkthrough_started', 'yes');
44309
44310           // Restore previous walkthrough progress..
44311           var storedProgress = context.storage('walkthrough_progress') || '';
44312           var progress = storedProgress.split(';').filter(Boolean);
44313
44314           var chapters = chapterFlow.map(function(chapter, i) {
44315               var s = chapterUi[chapter](context, curtain.reveal)
44316                   .on('done', function() {
44317                       context.presets().init();  // clear away "recent" presets
44318
44319                       buttons.filter(function(d) {
44320                           return d.title === s.title;
44321                       }).classed('finished', true);
44322
44323                       if (i < chapterFlow.length - 1) {
44324                           var next = chapterFlow[i + 1];
44325                           select('button.chapter-' + next)
44326                               .classed('next', true);
44327                       }
44328
44329                       // Store walkthrough progress..
44330                       progress.push(chapter);
44331                       context.storage('walkthrough_progress', uniq(progress).join(';'));
44332                   });
44333               return s;
44334           });
44335
44336           chapters[chapters.length - 1].on('startEditing', function() {
44337               // Store walkthrough progress..
44338               progress.push('startEditing');
44339               context.storage('walkthrough_progress', uniq(progress).join(';'));
44340
44341               // Store if walkthrough is completed..
44342               var incomplete = difference(chapterFlow, progress);
44343               if (!incomplete.length) {
44344                   context.storage('walkthrough_completed', 'yes');
44345               }
44346
44347               curtain.remove();
44348               navwrap.remove();
44349               d3_selectAll('#map .layer-background').style('opacity', opacity);
44350               d3_selectAll('button.sidebar-toggle').classed('disabled', false);
44351               if (osm) { osm.toggle(true).reset().caches(caches); }
44352               context.history().reset().merge(values$1(baseEntities));
44353               context.background().baseLayerSource(background);
44354               overlays.forEach(function(d) { context.background().toggleOverlayLayer(d); });
44355               if (history) { context.history().fromJSON(history, false); }
44356               context.map().centerZoom(center, zoom);
44357               window.location.replace(hash);
44358               services.geocoder.countryCode = countryCode;
44359               context.inIntro(false);
44360           });
44361
44362           var navwrap = selection$$1
44363               .append('div')
44364               .attr('class', 'intro-nav-wrap fillD');
44365
44366           navwrap
44367               .append('svg')
44368               .attr('class', 'intro-nav-wrap-logo')
44369               .append('use')
44370               .attr('xlink:href', '#iD-logo-walkthrough');
44371
44372           var buttonwrap = navwrap
44373               .append('div')
44374               .attr('class', 'joined')
44375               .selectAll('button.chapter');
44376
44377           var buttons = buttonwrap
44378               .data(chapters)
44379               .enter()
44380               .append('button')
44381               .attr('class', function(d, i) { return 'chapter chapter-' + chapterFlow[i]; })
44382               .on('click', enterChapter);
44383
44384           buttons
44385               .append('span')
44386               .text(function(d) { return t(d.title); });
44387
44388           buttons
44389               .append('span')
44390               .attr('class', 'status')
44391               .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
44392
44393           enterChapter(chapters[0]);
44394
44395
44396           function enterChapter(newChapter) {
44397               if (_currChapter) { _currChapter.exit(); }
44398               context.enter(modeBrowse(context));
44399
44400               _currChapter = newChapter;
44401               _currChapter.enter();
44402
44403               buttons
44404                   .classed('next', false)
44405                   .classed('active', function(d) {
44406                       return d.title === _currChapter.title;
44407                   });
44408           }
44409       }
44410
44411
44412       return intro;
44413   }
44414
44415   function uiConfirm(selection) {
44416       var modalSelection = uiModal(selection);
44417
44418       modalSelection.select('.modal')
44419           .classed('modal-alert', true);
44420
44421       var section = modalSelection.select('.content');
44422
44423       section.append('div')
44424           .attr('class', 'modal-section header');
44425
44426       section.append('div')
44427           .attr('class', 'modal-section message-text');
44428
44429       var buttons = section.append('div')
44430           .attr('class', 'modal-section buttons cf');
44431
44432
44433       modalSelection.okButton = function() {
44434           buttons
44435               .append('button')
44436               .attr('class', 'button ok-button action')
44437               .on('click.confirm', function() {
44438                   modalSelection.remove();
44439               })
44440               .text(t('confirm.okay'))
44441               .node()
44442               .focus();
44443
44444           return modalSelection;
44445       };
44446
44447
44448       return modalSelection;
44449   }
44450
44451   function uiSettingsCustomData(context) {
44452       var dispatch$$1 = dispatch('change');
44453
44454       function render(selection$$1) {
44455           var dataLayer = context.layers().layer('data');
44456           var _origSettings = {
44457               fileList: (dataLayer && dataLayer.fileList()) || null,
44458               url: context.storage('settings-custom-data-url')
44459           };
44460           var _currSettings = cloneDeep(_origSettings);
44461
44462           // var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
44463           var modal = uiConfirm(selection$$1).okButton();
44464
44465           modal
44466               .classed('settings-modal settings-custom-data', true);
44467
44468           modal.select('.modal-section.header')
44469               .append('h3')
44470               .text(t('settings.custom_data.header'));
44471
44472
44473           var textSection = modal.select('.modal-section.message-text');
44474
44475           textSection
44476               .append('pre')
44477               .attr('class', 'instructions-file')
44478               .text(t('settings.custom_data.file.instructions'));
44479
44480           textSection
44481               .append('input')
44482               .attr('class', 'field-file')
44483               .attr('type', 'file')
44484               .property('files', _currSettings.fileList)  // works for all except IE11
44485               .on('change', function() {
44486                   var files = event.target.files;
44487                   if (files && files.length) {
44488                       _currSettings.url = '';
44489                       textSection.select('.field-url').property('value', '');
44490                       _currSettings.fileList = files;
44491                   } else {
44492                       _currSettings.fileList = null;
44493                   }
44494               });
44495
44496           textSection
44497               .append('h4')
44498               .text(t('settings.custom_data.or'));
44499
44500           textSection
44501               .append('pre')
44502               .attr('class', 'instructions-url')
44503               .text(t('settings.custom_data.url.instructions'));
44504
44505           textSection
44506               .append('textarea')
44507               .attr('class', 'field-url')
44508               .attr('placeholder', t('settings.custom_data.url.placeholder'))
44509               .call(utilNoAuto)
44510               .property('value', _currSettings.url);
44511
44512
44513           // insert a cancel button
44514           var buttonSection = modal.select('.modal-section.buttons');
44515
44516           buttonSection
44517               .insert('button', '.ok-button')
44518               .attr('class', 'button cancel-button secondary-action')
44519               .text(t('confirm.cancel'));
44520
44521
44522           buttonSection.select('.cancel-button')
44523               .on('click.cancel', clickCancel);
44524
44525           buttonSection.select('.ok-button')
44526               .attr('disabled', isSaveDisabled)
44527               .on('click.save', clickSave);
44528
44529
44530           function isSaveDisabled() {
44531               return null;
44532           }
44533
44534
44535           // restore the original url
44536           function clickCancel() {
44537               textSection.select('.field-url').property('value', _origSettings.url);
44538               context.storage('settings-custom-data-url', _origSettings.url);
44539               this.blur();
44540               modal.close();
44541           }
44542
44543           // accept the current url
44544           function clickSave() {
44545               _currSettings.url = textSection.select('.field-url').property('value').trim();
44546
44547               // one or the other but not both
44548               if (_currSettings.url) { _currSettings.fileList = null; }
44549               if (_currSettings.fileList) { _currSettings.url = ''; }
44550
44551               context.storage('settings-custom-data-url', _currSettings.url);
44552               this.blur();
44553               modal.close();
44554               dispatch$$1.call('change', this, _currSettings);
44555           }
44556       }
44557
44558       return utilRebind(render, dispatch$$1, 'on');
44559   }
44560
44561   function uiTooltipHtml(text, key, heading) {
44562       var s = '';
44563
44564       if (heading) {
44565           s += '<div class="tooltip-heading"><span>' + heading + '</span></div>';
44566       }
44567       if (text) {
44568           s += '<div class="tooltip-text"><span>' + text + '</span></div>';
44569       }
44570       if (key) {
44571           s += '<div class="keyhint-wrap"><span>' + t('tooltip_keyhint') + '</span>' +
44572               '<span class="keyhint">' + key + '</span></div>';
44573       }
44574
44575       return s;
44576   }
44577
44578   function uiMapData(context) {
44579       var key = t('map_data.key');
44580       var features = context.features().keys();
44581       var layers = context.layers();
44582       var fills = ['wireframe', 'partial', 'full'];
44583
44584       var settingsCustomData = uiSettingsCustomData(context)
44585           .on('change', customChanged);
44586
44587       var pane = select(null);
44588
44589       var _fillSelected = context.storage('area-fill') || 'partial';
44590       var _shown = false;
44591       var _dataLayerContainer = select(null);
44592       var _fillList = select(null);
44593       var _featureList = select(null);
44594       var _QAList = select(null);
44595
44596
44597       function showsFeature(d) {
44598           return context.features().enabled(d);
44599       }
44600
44601
44602       function autoHiddenFeature(d) {
44603           if (d.type === 'kr_error') return context.errors().autoHidden(d);
44604           return context.features().autoHidden(d);
44605       }
44606
44607
44608       function clickFeature(d) {
44609           context.features().toggle(d);
44610           update();
44611       }
44612
44613
44614       function showsQA(d) {
44615           var QAKeys = [d];
44616           var QALayers = layers.all().filter(function(obj) { return QAKeys.indexOf(obj.id) !== -1; });
44617           var data = QALayers.filter(function(obj) { return obj.layer.supported(); });
44618
44619           function layerSupported(d) {
44620               return d.layer && d.layer.supported();
44621           }
44622           function layerEnabled(d) {
44623               return layerSupported(d) && d.layer.enabled();
44624           }
44625
44626           return layerEnabled(data[0]);
44627       }
44628
44629
44630       function showsFill(d) {
44631           return _fillSelected === d;
44632       }
44633
44634
44635       function setFill(d) {
44636           fills.forEach(function(opt) {
44637               context.surface().classed('fill-' + opt, Boolean(opt === d));
44638           });
44639
44640           _fillSelected = d;
44641           context.storage('area-fill', d);
44642           if (d !== 'wireframe') {
44643               context.storage('area-fill-toggle', d);
44644           }
44645           update();
44646       }
44647
44648
44649       function showsLayer(which) {
44650           var layer = layers.layer(which);
44651           if (layer) {
44652               return layer.enabled();
44653           }
44654           return false;
44655       }
44656
44657
44658       function setLayer(which, enabled) {
44659           var layer = layers.layer(which);
44660           if (layer) {
44661               layer.enabled(enabled);
44662
44663               if (!enabled && (which === 'osm' || which === 'notes')) {
44664                   context.enter(modeBrowse(context));
44665               }
44666
44667               update();
44668           }
44669       }
44670
44671
44672       function toggleLayer(which) {
44673           setLayer(which, !showsLayer(which));
44674       }
44675
44676
44677       function drawPhotoItems(selection$$1) {
44678           var photoKeys = ['streetside', 'mapillary-images', 'mapillary-signs', 'openstreetcam-images'];
44679           var photoLayers = layers.all().filter(function(obj) { return photoKeys.indexOf(obj.id) !== -1; });
44680           var data = photoLayers.filter(function(obj) { return obj.layer.supported(); });
44681
44682           function layerSupported(d) {
44683               return d.layer && d.layer.supported();
44684           }
44685           function layerEnabled(d) {
44686               return layerSupported(d) && d.layer.enabled();
44687           }
44688
44689           var ul = selection$$1
44690               .selectAll('.layer-list-photos')
44691               .data([0]);
44692
44693           ul = ul.enter()
44694               .append('ul')
44695               .attr('class', 'layer-list layer-list-photos')
44696               .merge(ul);
44697
44698           var li = ul.selectAll('.list-item-photos')
44699               .data(data);
44700
44701           li.exit()
44702               .remove();
44703
44704           var liEnter = li.enter()
44705               .append('li')
44706               .attr('class', function(d) { return 'list-item-photos list-item-' + d.id; });
44707
44708           var labelEnter = liEnter
44709               .append('label')
44710               .each(function(d) {
44711                   select(this)
44712                       .call(tooltip()
44713                           .title(t(d.id.replace('-', '_') + '.tooltip'))
44714                           .placement('top')
44715                       );
44716               });
44717
44718           labelEnter
44719               .append('input')
44720               .attr('type', 'checkbox')
44721               .on('change', function(d) { toggleLayer(d.id); });
44722
44723           labelEnter
44724               .append('span')
44725               .text(function(d) { return t(d.id.replace('-', '_') + '.title'); });
44726
44727
44728           // Update
44729           li
44730               .merge(liEnter)
44731               .classed('active', layerEnabled)
44732               .selectAll('input')
44733               .property('checked', layerEnabled);
44734       }
44735
44736
44737       function drawOsmItems(selection$$1) {
44738           var osmKeys = ['osm', 'notes'];
44739           var osmLayers = layers.all().filter(function(obj) { return osmKeys.indexOf(obj.id) !== -1; });
44740
44741           var ul = selection$$1
44742               .selectAll('.layer-list-osm')
44743               .data([0]);
44744
44745           ul = ul.enter()
44746               .append('ul')
44747               .attr('class', 'layer-list layer-list-osm')
44748               .merge(ul);
44749
44750           var li = ul.selectAll('.list-item')
44751               .data(osmLayers);
44752
44753           li.exit()
44754               .remove();
44755
44756           var liEnter = li.enter()
44757               .append('li')
44758               .attr('class', function(d) { return 'list-item list-item-' + d.id; });
44759
44760           var labelEnter = liEnter
44761               .append('label')
44762               .each(function(d) {
44763                   select(this)
44764                       .call(tooltip()
44765                           .title(t('map_data.layers.' + d.id + '.tooltip'))
44766                           .placement('bottom')
44767                       );
44768               });
44769
44770           labelEnter
44771               .append('input')
44772               .attr('type', 'checkbox')
44773               .on('change', function(d) { toggleLayer(d.id); });
44774
44775           labelEnter
44776               .append('span')
44777               .text(function(d) { return t('map_data.layers.' + d.id + '.title'); });
44778
44779
44780           // Update
44781           li
44782               .merge(liEnter)
44783               .classed('active', function (d) { return d.layer.enabled(); })
44784               .selectAll('input')
44785               .property('checked', function (d) { return d.layer.enabled(); });
44786       }
44787
44788
44789       function drawQAItems(selection$$1) {
44790           var qaKeys = ['keepRight'];
44791           var qaLayers = layers.all().filter(function(obj) { return qaKeys.indexOf(obj.id) !== -1; });
44792
44793           var ul = selection$$1
44794               .selectAll('.layer-list-qa')
44795               .data([0]);
44796
44797           ul = ul.enter()
44798               .append('ul')
44799               .attr('class', 'layer-list layer-list-qa')
44800               .merge(ul);
44801
44802           var li = ul.selectAll('.list-item')
44803               .data(qaLayers);
44804
44805           li.exit()
44806               .remove();
44807
44808           var liEnter = li.enter()
44809               .append('li')
44810               .attr('class', function(d) { return 'list-item list-item-' + d.id; });
44811
44812           var labelEnter = liEnter
44813               .append('label')
44814               .each(function(d) {
44815                   select(this)
44816                       .call(tooltip()
44817                           .title(t('map_data.layers.' + d.id + '.tooltip'))
44818                           .placement('bottom')
44819                       );
44820               });
44821
44822           labelEnter
44823               .append('input')
44824               .attr('type', 'checkbox')
44825               .on('change', function(d) { toggleLayer(d.id); });
44826
44827           labelEnter
44828               .append('span')
44829               .text(function(d) { return t('map_data.layers.' + d.id + '.title'); });
44830
44831
44832           // Update
44833           li
44834               .merge(liEnter)
44835               .classed('active', function (d) { return d.layer.enabled(); })
44836               .selectAll('input')
44837               .property('checked', function (d) { return d.layer.enabled(); });
44838       }
44839
44840
44841       // Beta feature - sample vector layers to support Detroit Mapping Challenge
44842       // https://github.com/osmus/detroit-mapping-challenge
44843       function drawVectorItems(selection$$1) {
44844           var dataLayer = layers.layer('data');
44845           var vtData = [
44846               {
44847                   name: 'Detroit Neighborhoods/Parks',
44848                   src: 'neighborhoods-parks',
44849                   tooltip: 'Neighborhood boundaries and parks as compiled by City of Detroit in concert with community groups.',
44850                   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'
44851               }, {
44852                   name: 'Detroit Composite POIs',
44853                   src: 'composite-poi',
44854                   tooltip: 'Fire Inspections, Business Licenses, and other public location data collated from the City of Detroit.',
44855                   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'
44856               }, {
44857                   name: 'Detroit All-The-Places POIs',
44858                   src: 'alltheplaces-poi',
44859                   tooltip: 'Public domain business location data created by web scrapers.',
44860                   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'
44861               }
44862           ];
44863
44864           // Only show this if the map is around Detroit..
44865           var detroit = geoExtent$$1([-83.5, 42.1], [-82.8, 42.5]);
44866           var showVectorItems = (context.map().zoom() > 9 && detroit.contains(context.map().center()));
44867
44868           var container = selection$$1.selectAll('.vectortile-container')
44869               .data(showVectorItems ? [0] : []);
44870
44871           container.exit()
44872               .remove();
44873
44874           var containerEnter = container.enter()
44875               .append('div')
44876               .attr('class', 'vectortile-container');
44877
44878           containerEnter
44879               .append('h4')
44880               .attr('class', 'vectortile-header')
44881               .text('Detroit Vector Tiles (Beta)');
44882
44883           containerEnter
44884               .append('ul')
44885               .attr('class', 'layer-list layer-list-vectortile');
44886
44887           containerEnter
44888               .append('div')
44889               .attr('class', 'vectortile-footer')
44890               .append('a')
44891               .attr('target', '_blank')
44892               .attr('tabindex', -1)
44893               .call(svgIcon('#iD-icon-out-link', 'inline'))
44894               .attr('href', 'https://github.com/osmus/detroit-mapping-challenge')
44895               .append('span')
44896               .text('About these layers');
44897
44898           container = container
44899               .merge(containerEnter);
44900
44901
44902           var ul = container.selectAll('.layer-list-vectortile');
44903
44904           var li = ul.selectAll('.list-item')
44905               .data(vtData);
44906
44907           li.exit()
44908               .remove();
44909
44910           var liEnter = li.enter()
44911               .append('li')
44912               .attr('class', function(d) { return 'list-item list-item-' + d.src; });
44913
44914           var labelEnter = liEnter
44915               .append('label')
44916               .each(function(d) {
44917                   select(this).call(
44918                       tooltip().title(d.tooltip).placement('top')
44919                   );
44920               });
44921
44922           labelEnter
44923               .append('input')
44924               .attr('type', 'radio')
44925               .attr('name', 'vectortile')
44926               .on('change', selectVTLayer);
44927
44928           labelEnter
44929               .append('span')
44930               .text(function(d) { return d.name; });
44931
44932           // Update
44933           li
44934               .merge(liEnter)
44935               .classed('active', isVTLayerSelected)
44936               .selectAll('input')
44937               .property('checked', isVTLayerSelected);
44938
44939
44940           function isVTLayerSelected(d) {
44941               return dataLayer && dataLayer.template() === d.template;
44942           }
44943
44944           function selectVTLayer(d) {
44945               context.storage('settings-custom-data-url', d.template);
44946               if (dataLayer) {
44947                   dataLayer.template(d.template, d.src);
44948                   dataLayer.enabled(true);
44949               }
44950           }
44951       }
44952
44953
44954       function drawCustomDataItems(selection$$1) {
44955           var dataLayer = layers.layer('data');
44956           var hasData = dataLayer && dataLayer.hasData();
44957           var showsData = hasData && dataLayer.enabled();
44958
44959           var ul = selection$$1
44960               .selectAll('.layer-list-data')
44961               .data(dataLayer ? [0] : []);
44962
44963           // Exit
44964           ul.exit()
44965               .remove();
44966
44967           // Enter
44968           var ulEnter = ul.enter()
44969               .append('ul')
44970               .attr('class', 'layer-list layer-list-data');
44971
44972           var liEnter = ulEnter
44973               .append('li')
44974               .attr('class', 'list-item-data');
44975
44976           liEnter
44977               .append('button')
44978               .call(tooltip()
44979                   .title(t('settings.custom_data.tooltip'))
44980                   .placement((textDirection === 'rtl') ? 'right' : 'left')
44981               )
44982               .on('click', editCustom)
44983               .call(svgIcon('#iD-icon-more'));
44984
44985           liEnter
44986               .append('button')
44987               .call(tooltip()
44988                   .title(t('map_data.layers.custom.zoom'))
44989                   .placement((textDirection === 'rtl') ? 'right' : 'left')
44990               )
44991               .on('click', function() {
44992                   event.preventDefault();
44993                   event.stopPropagation();
44994                   dataLayer.fitZoom();
44995               })
44996               .call(svgIcon('#iD-icon-search'));
44997
44998           var labelEnter = liEnter
44999               .append('label')
45000               .call(tooltip()
45001                   .title(t('map_data.layers.custom.tooltip'))
45002                   .placement('top')
45003               );
45004
45005           labelEnter
45006               .append('input')
45007               .attr('type', 'checkbox')
45008               .on('change', function() { toggleLayer('data'); });
45009
45010           labelEnter
45011               .append('span')
45012               .text(t('map_data.layers.custom.title'));
45013
45014           // Update
45015           ul = ul
45016               .merge(ulEnter);
45017
45018           ul.selectAll('.list-item-data')
45019               .classed('active', showsData)
45020               .selectAll('label')
45021               .classed('deemphasize', !hasData)
45022               .selectAll('input')
45023               .property('disabled', !hasData)
45024               .property('checked', showsData);
45025       }
45026
45027
45028       function editCustom() {
45029           event.preventDefault();
45030           context.container()
45031               .call(settingsCustomData);
45032       }
45033
45034
45035       function customChanged(d) {
45036           var dataLayer = layers.layer('data');
45037
45038           if (d && d.url) {
45039               dataLayer.url(d.url);
45040           } else if (d && d.fileList) {
45041               dataLayer.fileList(d.fileList);
45042           }
45043       }
45044
45045
45046       function drawListItems(selection$$1, data, type, name, change, active) {
45047           var items = selection$$1.selectAll('li')
45048               .data(data);
45049
45050           // Exit
45051           items.exit()
45052               .remove();
45053
45054           // Enter
45055           var enter = items.enter()
45056               .append('li')
45057               .attr('class', 'layer')
45058               .call(tooltip()
45059                   .html(true)
45060                   .title(function(d) {
45061                       var tip = t(name + '.' + d + '.tooltip');
45062                       var key = (d === 'wireframe' ? t('area_fill.wireframe.key') : null);
45063                       if ((name === 'feature' || name === 'keepRight') && autoHiddenFeature(d)) {
45064                           var msg = showsLayer('osm') ? t('map_data.autohidden') : t('map_data.osmhidden');
45065                           tip += '<div>' + msg + '</div>';
45066                       }
45067                       return uiTooltipHtml(tip, key);
45068                   })
45069                   .placement('top')
45070               );
45071
45072           var label = enter
45073               .append('label');
45074
45075           label
45076               .append('input')
45077               .attr('type', type)
45078               .attr('name', name)
45079               .on('change', change);
45080
45081           label
45082               .append('span')
45083               .text(function(d) { return t(name + '.' + d + '.description'); });
45084
45085           // Update
45086           items = items
45087               .merge(enter);
45088
45089           items
45090               .classed('active', active)
45091               .selectAll('input')
45092               .property('checked', active)
45093               .property('indeterminate', function(d) {
45094                   return ((name === 'feature' || name === 'keepRight') && autoHiddenFeature(d));
45095               });
45096       }
45097
45098
45099       function renderDataLayers(selection$$1) {
45100           var container = selection$$1.selectAll('.data-layer-container')
45101               .data([0]);
45102
45103           _dataLayerContainer = container.enter()
45104               .append('div')
45105               .attr('class', 'data-layer-container')
45106               .merge(container);
45107
45108           updateDataLayers();
45109       }
45110
45111
45112       function renderFillList(selection$$1) {
45113           var container = selection$$1.selectAll('.layer-fill-list')
45114               .data([0]);
45115
45116           _fillList = container.enter()
45117               .append('ul')
45118               .attr('class', 'layer-list layer-fill-list')
45119               .merge(container);
45120
45121           updateFillList();
45122       }
45123
45124
45125       function renderFeatureList(selection$$1) {
45126           var container = selection$$1.selectAll('.layer-feature-list')
45127               .data([0]);
45128
45129           _featureList = container.enter()
45130               .append('ul')
45131               .attr('class', 'layer-list layer-feature-list')
45132               .merge(container);
45133
45134           updateFeatureList();
45135       }
45136
45137       function updateDataLayers() {
45138           _dataLayerContainer
45139               .call(drawOsmItems)
45140               .call(drawQAItems)
45141               .call(drawPhotoItems)
45142               .call(drawCustomDataItems)
45143               .call(drawVectorItems);      // Beta - Detroit mapping challenge
45144       }
45145
45146       function updateFillList() {
45147           _fillList
45148               .call(drawListItems, fills, 'radio', 'area_fill', setFill, showsFill);
45149       }
45150
45151       function updateFeatureList() {
45152           _featureList
45153               .call(drawListItems, features, 'checkbox', 'feature', clickFeature, showsFeature);
45154       }
45155
45156       function update() {
45157
45158           if (!pane.select('.disclosure-wrap-data_layers').classed('hide')) {
45159               updateDataLayers();
45160           }
45161           if (!pane.select('.disclosure-wrap-fill_area').classed('hide')) {
45162               updateFillList();
45163           }
45164           if (!pane.select('.disclosure-wrap-map_features').classed('hide')) {
45165               updateFeatureList();
45166           }
45167
45168           _QAList
45169               .call(drawListItems, ['keep-right'], 'checkbox', 'QA', function(d) { toggleLayer(d); }, showsQA);
45170       }
45171
45172
45173       function toggleWireframe() {
45174           if (event) {
45175               event.preventDefault();
45176               event.stopPropagation();
45177           }
45178
45179           if (_fillSelected === 'wireframe') {
45180               _fillSelected = context.storage('area-fill-toggle') || 'partial';
45181           } else {
45182               _fillSelected = 'wireframe';
45183           }
45184
45185           setFill(_fillSelected);
45186           context.map().pan([0,0]);  // trigger a redraw
45187       }
45188
45189
45190       function mapData(selection$$1) {
45191
45192           function hidePane() {
45193               setVisible(false);
45194           }
45195
45196           function togglePane() {
45197               if (event) event.preventDefault();
45198               paneTooltip.hide(button);
45199               setVisible(!button.classed('active'));
45200           }
45201
45202           function setVisible(show) {
45203               if (show !== _shown) {
45204                   button.classed('active', show);
45205                   _shown = show;
45206
45207                   if (show) {
45208                       uiBackground.hidePane();
45209                       uiHelp.hidePane();
45210                       update();
45211
45212                       pane
45213                           .style('display', 'block')
45214                           .style('right', '-300px')
45215                           .transition()
45216                           .duration(200)
45217                           .style('right', '0px');
45218
45219                   } else {
45220                       pane
45221                           .style('display', 'block')
45222                           .style('right', '0px')
45223                           .transition()
45224                           .duration(200)
45225                           .style('right', '-300px')
45226                           .on('end', function() {
45227                               select(this).style('display', 'none');
45228                           });
45229                   }
45230               }
45231           }
45232
45233
45234           pane = selection$$1
45235               .append('div')
45236               .attr('class', 'fillL map-pane hide');
45237
45238           var paneTooltip = tooltip()
45239               .placement((textDirection === 'rtl') ? 'right' : 'left')
45240               .html(true)
45241               .title(uiTooltipHtml(t('map_data.description'), key));
45242
45243           var button = selection$$1
45244               .append('button')
45245               .attr('tabindex', -1)
45246               .on('click', togglePane)
45247               .call(svgIcon('#iD-icon-data', 'light'))
45248               .call(paneTooltip);
45249
45250
45251           var heading = pane
45252               .append('div')
45253               .attr('class', 'pane-heading');
45254
45255           heading
45256               .append('h2')
45257               .text(t('map_data.title'));
45258
45259           heading
45260               .append('button')
45261               .on('click', function() { uiMapData.hidePane(); })
45262               .call(svgIcon('#iD-icon-close'));
45263
45264
45265           var content = pane
45266               .append('div')
45267               .attr('class', 'pane-content');
45268
45269
45270           // data layers
45271           content
45272               .append('div')
45273               .attr('class', 'map-data-data-layers')
45274               .call(uiDisclosure(context, 'data_layers', true)
45275                   .title(t('map_data.data_layers'))
45276                   .content(renderDataLayers)
45277               );
45278
45279           // area fills
45280           content
45281               .append('div')
45282               .attr('class', 'map-data-area-fills')
45283               .call(uiDisclosure(context, 'fill_area', false)
45284                   .title(t('map_data.fill_area'))
45285                   .content(renderFillList)
45286               );
45287
45288           // feature filters
45289           content
45290               .append('div')
45291               .attr('class', 'map-data-feature-filters')
45292               .call(uiDisclosure(context, 'map_features', false)
45293                   .title(t('map_data.map_features'))
45294                   .content(renderFeatureList)
45295               );
45296
45297
45298           // add listeners
45299           context.features()
45300               .on('change.map_data-update', update);
45301
45302           update();
45303           setFill(_fillSelected);
45304
45305           context.keybinding()
45306               .on(key, togglePane)
45307               .on(t('area_fill.wireframe.key'), toggleWireframe);
45308
45309           uiMapData.hidePane = hidePane;
45310           uiMapData.togglePane = togglePane;
45311           uiMapData.setVisible = setVisible;
45312       }
45313
45314       return mapData;
45315   }
45316
45317   function uiShortcuts(context) {
45318       var detected = utilDetect();
45319       var _activeTab = 0;
45320       var _modalSelection;
45321       var _selection = select(null);
45322
45323
45324       context.keybinding()
45325           .on([t('shortcuts.toggle.key'), '?'], function () {
45326               if (d3_selectAll('.modal-shortcuts').size()) {  // already showing
45327                   if (_modalSelection) {
45328                       _modalSelection.close();
45329                       _modalSelection = null;
45330                   }
45331               } else {
45332                   _modalSelection = uiModal(_selection);
45333                   shortcutsModal(_modalSelection);
45334               }
45335           });
45336
45337
45338       function shortcutsModal(_modalSelection) {
45339           _modalSelection.select('.modal')
45340               .classed('modal-shortcuts', true);
45341
45342           var shortcutsModal = _modalSelection.select('.content');
45343
45344           shortcutsModal
45345               .append('div')
45346               .attr('class', 'modal-section')
45347               .append('h3')
45348               .text(t('shortcuts.title'));
45349
45350           shortcutsModal
45351               .call(render);
45352       }
45353
45354
45355       function render(selection$$1) {
45356           var wrapper = selection$$1
45357               .selectAll('.wrapper')
45358               .data([0]);
45359
45360           var wrapperEnter = wrapper
45361               .enter()
45362               .append('div')
45363               .attr('class', 'wrapper modal-section');
45364
45365           var tabsBar = wrapperEnter
45366               .append('div')
45367               .attr('class', 'tabs-bar');
45368
45369           var shortcutsList = wrapperEnter
45370               .append('div')
45371               .attr('class', 'shortcuts-list');
45372
45373           wrapper = wrapper.merge(wrapperEnter);
45374
45375           var tabs = tabsBar
45376               .selectAll('.tab')
45377               .data(dataShortcuts);
45378
45379           var tabsEnter = tabs
45380               .enter()
45381               .append('div')
45382               .attr('class', 'tab')
45383               .on('click', function (d, i) {
45384                   _activeTab = i;
45385                   render(selection$$1);
45386               });
45387
45388           tabsEnter
45389               .append('span')
45390               .text(function (d) { return t(d.text); });
45391
45392           tabs = tabs
45393               .merge(tabsEnter);
45394
45395           // Update
45396           wrapper.selectAll('.tab')
45397               .classed('active', function (d, i) {
45398                   return i === _activeTab;
45399               });
45400
45401
45402           var shortcuts = shortcutsList
45403               .selectAll('.shortcut-tab')
45404               .data(dataShortcuts);
45405
45406           var shortcutsEnter = shortcuts
45407               .enter()
45408               .append('div')
45409               .attr('class', function(d) { return 'shortcut-tab shortcut-tab-' + d.tab; });
45410
45411           var columnsEnter = shortcutsEnter
45412               .selectAll('.shortcut-column')
45413               .data(function (d) { return d.columns; })
45414               .enter()
45415               .append('table')
45416               .attr('class', 'shortcut-column');
45417
45418           var rowsEnter = columnsEnter
45419               .selectAll('.shortcut-row')
45420               .data(function (d) { return d.rows; })
45421               .enter()
45422               .append('tr')
45423               .attr('class', 'shortcut-row');
45424
45425
45426           var sectionRows = rowsEnter
45427               .filter(function (d) { return !d.shortcuts; });
45428
45429           sectionRows
45430               .append('td');
45431
45432           sectionRows
45433               .append('td')
45434               .attr('class', 'shortcut-section')
45435               .append('h3')
45436               .text(function (d) { return t(d.text); });
45437
45438
45439           var shortcutRows = rowsEnter
45440               .filter(function (d) { return d.shortcuts; });
45441
45442           var shortcutKeys = shortcutRows
45443               .append('td')
45444               .attr('class', 'shortcut-keys');
45445
45446           var modifierKeys = shortcutKeys
45447               .filter(function (d) { return d.modifiers; });
45448
45449           modifierKeys
45450               .selectAll('kbd.modifier')
45451               .data(function (d) {
45452                   if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
45453                       return ['⌘'];
45454                   } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
45455                       return [];
45456                   } else {
45457                       return d.modifiers;
45458                   }
45459               })
45460               .enter()
45461               .each(function () {
45462                   var selection$$1 = select(this);
45463
45464                   selection$$1
45465                       .append('kbd')
45466                       .attr('class', 'modifier')
45467                       .text(function (d) { return uiCmd.display(d); });
45468
45469                   selection$$1
45470                       .append('span')
45471                       .text('+');
45472               });
45473
45474
45475           shortcutKeys
45476               .selectAll('kbd.shortcut')
45477               .data(function (d) {
45478                   var arr = d.shortcuts;
45479                   if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
45480                       arr = ['Y'];
45481                   } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
45482                       arr = ['F11'];
45483                   }
45484
45485                   // replace translations
45486                   arr = arr.map(function(s) {
45487                       return uiCmd.display(s.indexOf('.') !== -1 ? t(s) : s);
45488                   });
45489
45490                   return uniq(arr).map(function(s) {
45491                       return {
45492                           shortcut: s,
45493                           separator: d.separator
45494                       };
45495                   });
45496               })
45497               .enter()
45498               .each(function (d, i, nodes) {
45499                   var selection$$1 = select(this);
45500                   var click = d.shortcut.toLowerCase().match(/(.*).click/);
45501
45502                   if (click && click[1]) {   // replace "left_click", "right_click" with mouse icon
45503                       selection$$1
45504                           .call(svgIcon('#iD-walkthrough-mouse', 'mouseclick', click[1]));
45505                   } else {
45506                       selection$$1
45507                           .append('kbd')
45508                           .attr('class', 'shortcut')
45509                           .text(function (d) { return d.shortcut; });
45510                   }
45511
45512                   if (i < nodes.length - 1) {
45513                       selection$$1
45514                           .append('span')
45515                           .text(d.separator || '\u00a0' + t('shortcuts.or') + '\u00a0');
45516                   }
45517               });
45518
45519
45520           shortcutKeys
45521               .filter(function(d) { return d.gesture; })
45522               .each(function () {
45523                   var selection$$1 = select(this);
45524
45525                   selection$$1
45526                       .append('span')
45527                       .text('+');
45528
45529                   selection$$1
45530                       .append('span')
45531                       .attr('class', 'gesture')
45532                       .text(function (d) { return t(d.gesture); });
45533               });
45534
45535
45536           shortcutRows
45537               .append('td')
45538               .attr('class', 'shortcut-desc')
45539               .text(function (d) { return d.text ? t(d.text) : '\u00a0'; });
45540
45541
45542           shortcuts = shortcuts
45543               .merge(shortcutsEnter);
45544
45545           // Update
45546           wrapper.selectAll('.shortcut-tab')
45547               .style('display', function (d, i) {
45548                   return i === _activeTab ? 'flex' : 'none';
45549               });
45550       }
45551
45552
45553       return function(selection$$1, show) {
45554           _selection = selection$$1;
45555           if (show) {
45556               _modalSelection = uiModal(selection$$1);
45557               shortcutsModal(_modalSelection);
45558           }
45559       };
45560   }
45561
45562   function uiHelp(context) {
45563       var key = t('help.key');
45564
45565       var docKeys = [
45566           ['help', [
45567               'welcome',
45568               'open_data_h',
45569               'open_data',
45570               'before_start_h',
45571               'before_start',
45572               'open_source_h',
45573               'open_source',
45574               'open_source_help'
45575           ]],
45576           ['overview', [
45577               'navigation_h',
45578               'navigation_drag',
45579               'navigation_zoom',
45580               'features_h',
45581               'features',
45582               'nodes_ways'
45583           ]],
45584           ['editing', [
45585               'select_h',
45586               'select_left_click',
45587               'select_right_click',
45588               'multiselect_h',
45589               'multiselect_shift_click',
45590               'multiselect_lasso',
45591               'undo_redo_h',
45592               'undo_redo',
45593               'save_h',
45594               'save',
45595               'save_validation',
45596               'upload_h',
45597               'upload',
45598               'backups_h',
45599               'backups',
45600               'keyboard_h',
45601               'keyboard'
45602           ]],
45603           ['feature_editor', [
45604               'intro',
45605               'definitions',
45606               'type_h',
45607               'type',
45608               'type_picker',
45609               'fields_h',
45610               'fields_all_fields',
45611               'fields_example',
45612               'fields_add_field',
45613               'tags_h',
45614               'tags_all_tags',
45615               'tags_resources'
45616           ]],
45617           ['points', [
45618               'intro',
45619               'add_point_h',
45620               'add_point',
45621               'add_point_finish',
45622               'move_point_h',
45623               'move_point',
45624               'delete_point_h',
45625               'delete_point',
45626               'delete_point_command'
45627           ]],
45628           ['lines', [
45629               'intro',
45630               'add_line_h',
45631               'add_line',
45632               'add_line_draw',
45633               'add_line_finish',
45634               'modify_line_h',
45635               'modify_line_dragnode',
45636               'modify_line_addnode',
45637               'connect_line_h',
45638               'connect_line',
45639               'connect_line_display',
45640               'connect_line_drag',
45641               'connect_line_tag',
45642               'disconnect_line_h',
45643               'disconnect_line_command',
45644               'move_line_h',
45645               'move_line_command',
45646               'move_line_connected',
45647               'delete_line_h',
45648               'delete_line',
45649               'delete_line_command'
45650           ]],
45651           ['areas', [
45652               'intro',
45653               'point_or_area_h',
45654               'point_or_area',
45655               'add_area_h',
45656               'add_area_command',
45657               'add_area_draw',
45658               'add_area_finish',
45659               'square_area_h',
45660               'square_area_command',
45661               'modify_area_h',
45662               'modify_area_dragnode',
45663               'modify_area_addnode',
45664               'delete_area_h',
45665               'delete_area',
45666               'delete_area_command'
45667           ]],
45668           ['relations', [
45669               'intro',
45670               'edit_relation_h',
45671               'edit_relation',
45672               'edit_relation_add',
45673               'edit_relation_delete',
45674               'maintain_relation_h',
45675               'maintain_relation',
45676               'relation_types_h',
45677               'multipolygon_h',
45678               'multipolygon',
45679               'multipolygon_create',
45680               'multipolygon_merge',
45681               'turn_restriction_h',
45682               'turn_restriction',
45683               'turn_restriction_field',
45684               'turn_restriction_editing',
45685               'route_h',
45686               'route',
45687               'route_add',
45688               'boundary_h',
45689               'boundary',
45690               'boundary_add'
45691           ]],
45692           ['notes', [
45693               'intro',
45694               'add_note_h',
45695               'add_note',
45696               'move_note',
45697               'update_note_h',
45698               'update_note',
45699               'save_note_h',
45700               'save_note'
45701           ]],
45702
45703           ['imagery', [
45704               'intro',
45705               'sources_h',
45706               'choosing',
45707               'sources',
45708               'offsets_h',
45709               'offset',
45710               'offset_change'
45711           ]],
45712           ['streetlevel', [
45713               'intro',
45714               'using_h',
45715               'using',
45716               'photos',
45717               'viewer'
45718           ]],
45719           ['gps', [
45720               'intro',
45721               'survey',
45722               'using_h',
45723               'using',
45724               'tracing',
45725               'upload'
45726           ]],
45727           ['qa', [
45728               'intro',
45729               'tools_h',
45730               'tools',
45731               'issues_h',
45732               'issues'
45733           ]]
45734       ];
45735
45736       var headings = {
45737           'help.help.open_data_h': 3,
45738           'help.help.before_start_h': 3,
45739           'help.help.open_source_h': 3,
45740           'help.overview.navigation_h': 3,
45741           'help.overview.features_h': 3,
45742           'help.editing.select_h': 3,
45743           'help.editing.multiselect_h': 3,
45744           'help.editing.undo_redo_h': 3,
45745           'help.editing.save_h': 3,
45746           'help.editing.upload_h': 3,
45747           'help.editing.backups_h': 3,
45748           'help.editing.keyboard_h': 3,
45749           'help.feature_editor.type_h': 3,
45750           'help.feature_editor.fields_h': 3,
45751           'help.feature_editor.tags_h': 3,
45752           'help.points.add_point_h': 3,
45753           'help.points.move_point_h': 3,
45754           'help.points.delete_point_h': 3,
45755           'help.lines.add_line_h': 3,
45756           'help.lines.modify_line_h': 3,
45757           'help.lines.connect_line_h': 3,
45758           'help.lines.disconnect_line_h': 3,
45759           'help.lines.move_line_h': 3,
45760           'help.lines.delete_line_h': 3,
45761           'help.areas.point_or_area_h': 3,
45762           'help.areas.add_area_h': 3,
45763           'help.areas.square_area_h': 3,
45764           'help.areas.modify_area_h': 3,
45765           'help.areas.delete_area_h': 3,
45766           'help.relations.edit_relation_h': 3,
45767           'help.relations.maintain_relation_h': 3,
45768           'help.relations.relation_types_h': 2,
45769           'help.relations.multipolygon_h': 3,
45770           'help.relations.turn_restriction_h': 3,
45771           'help.relations.route_h': 3,
45772           'help.relations.boundary_h': 3,
45773           'help.notes.add_note_h': 3,
45774           'help.notes.update_note_h': 3,
45775           'help.notes.save_note_h': 3,
45776           'help.imagery.sources_h': 3,
45777           'help.imagery.offsets_h': 3,
45778           'help.streetlevel.using_h': 3,
45779           'help.gps.using_h': 3,
45780           'help.qa.tools_h': 3,
45781           'help.qa.issues_h': 3
45782       };
45783
45784       var replacements = {
45785           point: icon('#iD-icon-point', 'pre-text'),
45786           line: icon('#iD-icon-line', 'pre-text'),
45787           area: icon('#iD-icon-area', 'pre-text'),
45788           note: icon('#iD-icon-note', 'pre-text add-note'),
45789           plus: icon('#iD-icon-plus', 'pre-text'),
45790           minus: icon('#iD-icon-minus', 'pre-text'),
45791           orthogonalize: icon('#iD-operation-orthogonalize', 'pre-text'),
45792           disconnect: icon('#iD-operation-disconnect', 'pre-text'),
45793           layers: icon('#iD-icon-layers', 'pre-text'),
45794           data: icon('#iD-icon-data', 'pre-text'),
45795           inspect: icon('#iD-icon-inspect', 'pre-text'),
45796           move: icon('#iD-operation-move', 'pre-text'),
45797           merge: icon('#iD-operation-merge', 'pre-text'),
45798           delete: icon('#iD-operation-delete', 'pre-text'),
45799           close: icon('#iD-icon-close', 'pre-text'),
45800           undo: icon(textDirection === 'rtl' ? '#iD-icon-redo' : '#iD-icon-undo', 'pre-text'),
45801           redo: icon(textDirection === 'rtl' ? '#iD-icon-undo' : '#iD-icon-redo', 'pre-text'),
45802           save: icon('#iD-icon-save', 'pre-text'),
45803           leftclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'left'),
45804           rightclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'right'),
45805           shift: uiCmd.display('⇧'),
45806           alt: uiCmd.display('⌥'),
45807           return: uiCmd.display('↵'),
45808           version: context.version
45809       };
45810
45811       // For each section, squash all the texts into a single markdown document
45812       var docs = docKeys.map(function(key) {
45813           var helpkey = 'help.' + key[0];
45814           var text = key[1].reduce(function(all, part) {
45815               var subkey = helpkey + '.' + part;
45816               var depth = headings[subkey];                              // is this subkey a heading?
45817               var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
45818               return all + hhh + t(subkey, replacements) + '\n\n';
45819           }, '');
45820
45821           return {
45822               title: t(helpkey + '.title'),
45823               html: marked(text.trim())
45824           };
45825       });
45826
45827
45828       function help(selection$$1) {
45829
45830           function hidePane() {
45831               setVisible(false);
45832           }
45833
45834
45835           function togglePane() {
45836               if (event) event.preventDefault();
45837               tooltipBehavior.hide(button);
45838               setVisible(!button.classed('active'));
45839           }
45840
45841
45842           function setVisible(show) {
45843               if (show !== shown) {
45844                   button.classed('active', show);
45845                   shown = show;
45846
45847                   if (show) {
45848                       uiBackground.hidePane();
45849                       uiMapData.hidePane();
45850
45851                       pane.style('display', 'block')
45852                           .style('right', '-500px')
45853                           .transition()
45854                           .duration(200)
45855                           .style('right', '0px');
45856
45857                   } else {
45858                       pane.style('right', '0px')
45859                           .transition()
45860                           .duration(200)
45861                           .style('right', '-500px')
45862                           .on('end', function() {
45863                               select(this).style('display', 'none');
45864                           });
45865                   }
45866               }
45867           }
45868
45869
45870           function clickHelp(d, i) {
45871               var rtl = (textDirection === 'rtl');
45872               content.property('scrollTop', 0);
45873               doctitle.html(d.title);
45874
45875               body.html(d.html);
45876               body.selectAll('a')
45877                   .attr('target', '_blank');
45878               menuItems.classed('selected', function(m) {
45879                   return m.title === d.title;
45880               });
45881
45882               nav.html('');
45883               if (rtl) {
45884                   nav.call(drawNext).call(drawPrevious);
45885               } else {
45886                   nav.call(drawPrevious).call(drawNext);
45887               }
45888
45889
45890               function drawNext(selection$$1) {
45891                   if (i < docs.length - 1) {
45892                       var nextLink = selection$$1
45893                           .append('a')
45894                           .attr('class', 'next')
45895                           .on('click', function() {
45896                               clickHelp(docs[i + 1], i + 1);
45897                           });
45898
45899                       nextLink
45900                           .append('span')
45901                           .text(docs[i + 1].title)
45902                           .call(svgIcon((rtl ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
45903                   }
45904               }
45905
45906
45907               function drawPrevious(selection$$1) {
45908                   if (i > 0) {
45909                       var prevLink = selection$$1
45910                           .append('a')
45911                           .attr('class', 'previous')
45912                           .on('click', function() {
45913                               clickHelp(docs[i - 1], i - 1);
45914                           });
45915
45916                       prevLink
45917                           .call(svgIcon((rtl ? '#iD-icon-forward' : '#iD-icon-backward'), 'inline'))
45918                           .append('span')
45919                           .text(docs[i - 1].title);
45920                   }
45921               }
45922           }
45923
45924
45925           function clickWalkthrough() {
45926               if (context.inIntro()) return;
45927               context.container().call(uiIntro(context));
45928               setVisible(false);
45929           }
45930
45931
45932           function clickShortcuts() {
45933               context.container().call(uiShortcuts(context), true);
45934           }
45935
45936
45937           var pane = selection$$1.append('div')
45938               .attr('class', 'help-wrap map-pane fillL hide');
45939
45940           var tooltipBehavior = tooltip()
45941               .placement((textDirection === 'rtl') ? 'right' : 'left')
45942               .html(true)
45943               .title(uiTooltipHtml(t('help.title'), key));
45944
45945           var button = selection$$1.append('button')
45946               .attr('tabindex', -1)
45947               .on('click', togglePane)
45948               .call(svgIcon('#iD-icon-help', 'light'))
45949               .call(tooltipBehavior);
45950
45951           var shown = false;
45952
45953
45954           var heading = pane
45955               .append('div')
45956               .attr('class', 'pane-heading');
45957
45958           var doctitle = heading
45959               .append('h2')
45960               .text(t('help.title'));
45961
45962           heading
45963               .append('button')
45964               .on('click', function() { uiHelp.hidePane(); })
45965               .call(svgIcon('#iD-icon-close'));
45966
45967
45968           var content = pane
45969               .append('div')
45970               .attr('class', 'pane-content');
45971
45972           var toc = content
45973               .append('ul')
45974               .attr('class', 'toc');
45975
45976           var menuItems = toc.selectAll('li')
45977               .data(docs)
45978               .enter()
45979               .append('li')
45980               .append('a')
45981               .html(function(d) { return d.title; })
45982               .on('click', clickHelp);
45983
45984           var shortcuts = toc
45985               .append('li')
45986               .attr('class', 'shortcuts')
45987               .call(tooltip()
45988                   .html(true)
45989                   .title(uiTooltipHtml(t('shortcuts.tooltip'), '?'))
45990                   .placement('top')
45991               )
45992               .append('a')
45993               .on('click', clickShortcuts);
45994
45995           shortcuts
45996               .append('div')
45997               .text(t('shortcuts.title'));
45998
45999           var walkthrough = toc
46000               .append('li')
46001               .attr('class', 'walkthrough')
46002               .append('a')
46003               .on('click', clickWalkthrough);
46004
46005           walkthrough
46006               .append('svg')
46007               .attr('class', 'logo logo-walkthrough')
46008               .append('use')
46009               .attr('xlink:href', '#iD-logo-walkthrough');
46010
46011           walkthrough
46012               .append('div')
46013               .text(t('splash.walkthrough'));
46014
46015
46016           var helpContent = content
46017               .append('div')
46018               .attr('class', 'left-content');
46019
46020           var body = helpContent
46021               .append('div')
46022               .attr('class', 'body');
46023
46024           var nav = helpContent
46025               .append('div')
46026               .attr('class', 'nav');
46027
46028           clickHelp(docs[0], 0);
46029
46030           context.keybinding()
46031               .on(key, togglePane);
46032
46033           uiHelp.hidePane = hidePane;
46034           uiHelp.togglePane = togglePane;
46035           uiHelp.setVisible = setVisible;
46036       }
46037
46038       return help;
46039   }
46040
46041   function localeDateString(s) {
46042       if (!s) return null;
46043       var detected = utilDetect();
46044       var options = { day: 'numeric', month: 'short', year: 'numeric' };
46045       var d = new Date(s);
46046       if (isNaN(d.getTime())) return null;
46047       return d.toLocaleDateString(detected.locale, options);
46048   }
46049
46050   function vintageRange(vintage) {
46051       var s;
46052       if (vintage.start || vintage.end) {
46053           s = (vintage.start || '?');
46054           if (vintage.start !== vintage.end) {
46055               s += ' - ' + (vintage.end || '?');
46056           }
46057       }
46058       return s;
46059   }
46060
46061
46062   function rendererBackgroundSource(data) {
46063       var source = clone(data);
46064       var offset = [0, 0];
46065       var name = source.name;
46066       var description = source.description;
46067       var best = !!source.best;
46068       var template = source.template;
46069
46070       source.tileSize = data.tileSize || 256;
46071       source.zoomExtent = data.zoomExtent || [0, 22];
46072       source.overzoom = data.overzoom !== false;
46073
46074       source.offset = function(_) {
46075           if (!arguments.length) return offset;
46076           offset = _;
46077           return source;
46078       };
46079
46080
46081       source.nudge = function(_, zoomlevel) {
46082           offset[0] += _[0] / Math.pow(2, zoomlevel);
46083           offset[1] += _[1] / Math.pow(2, zoomlevel);
46084           return source;
46085       };
46086
46087
46088       source.name = function() {
46089           var id_safe = source.id.replace(/\./g, '<TX_DOT>');
46090           return t('imagery.' + id_safe + '.name', { default: name });
46091       };
46092
46093
46094       source.description = function() {
46095           var id_safe = source.id.replace(/\./g, '<TX_DOT>');
46096           return t('imagery.' + id_safe + '.description', { default: description });
46097       };
46098
46099
46100       source.best = function() {
46101           return best;
46102       };
46103
46104
46105       source.area = function() {
46106           if (!data.polygon) return Number.MAX_VALUE;  // worldwide
46107           var area = d3_geoArea({ type: 'MultiPolygon', coordinates: [ data.polygon ] });
46108           return isNaN(area) ? 0 : area;
46109       };
46110
46111
46112       source.imageryUsed = function() {
46113           return name || source.id;
46114       };
46115
46116
46117       source.template = function(_) {
46118           if (!arguments.length) return template;
46119           if (source.id === 'custom') template = _;
46120           return source;
46121       };
46122
46123
46124       source.url = function(coord) {
46125           if (this.type === 'wms') {
46126               var tileToProjectedCoords = (function(x, y, z) {
46127                   //polyfill for IE11, PhantomJS
46128                   var sinh = Math.sinh || function(x) {
46129                       var y = Math.exp(x);
46130                       return (y - 1 / y) / 2;
46131                   };
46132
46133                   var zoomSize = Math.pow(2, z);
46134                   var lon = x / zoomSize * Math.PI * 2 - Math.PI;
46135                   var lat = Math.atan(sinh(Math.PI * (1 - 2 * y / zoomSize)));
46136
46137                   switch (this.projection) {
46138                       case 'EPSG:4326':
46139                           return {
46140                               x: lon * 180 / Math.PI,
46141                               y: lat * 180 / Math.PI
46142                           };
46143                       default: // EPSG:3857 and synonyms
46144                           var mercCoords = mercatorRaw(lon, lat);
46145                           return {
46146                               x: 20037508.34 / Math.PI * mercCoords[0],
46147                               y: 20037508.34 / Math.PI * mercCoords[1]
46148                           };
46149                   }
46150               }).bind(this);
46151
46152               var tileSize = this.tileSize;
46153               var projection$$1 = this.projection;
46154               var minXmaxY = tileToProjectedCoords(coord[0], coord[1], coord[2]);
46155               var maxXminY = tileToProjectedCoords(coord[0]+1, coord[1]+1, coord[2]);
46156               return template.replace(/\{(\w+)\}/g, function (token, key) {
46157                 switch (key) {
46158                   case 'width':
46159                   case 'height':
46160                     return tileSize;
46161                   case 'proj':
46162                     return projection$$1;
46163                   case 'wkid':
46164                     return projection$$1.replace(/^EPSG:/, '');
46165                   case 'bbox':
46166                     return minXmaxY.x + ',' + maxXminY.y + ',' + maxXminY.x + ',' + minXmaxY.y;
46167                   case 'w':
46168                     return minXmaxY.x;
46169                   case 's':
46170                     return maxXminY.y;
46171                   case 'n':
46172                     return maxXminY.x;
46173                   case 'e':
46174                     return minXmaxY.y;
46175                   default:
46176                     return token;
46177                 }
46178               });
46179           }
46180           return template
46181               .replace('{x}', coord[0])
46182               .replace('{y}', coord[1])
46183               // TMS-flipped y coordinate
46184               .replace(/\{[t-]y\}/, Math.pow(2, coord[2]) - coord[1] - 1)
46185               .replace(/\{z(oom)?\}/, coord[2])
46186               .replace(/\{switch:([^}]+)\}/, function(s, r) {
46187                   var subdomains = r.split(',');
46188                   return subdomains[(coord[0] + coord[1]) % subdomains.length];
46189               })
46190               .replace('{u}', function() {
46191                   var u = '';
46192                   for (var zoom = coord[2]; zoom > 0; zoom--) {
46193                       var b = 0;
46194                       var mask = 1 << (zoom - 1);
46195                       if ((coord[0] & mask) !== 0) b++;
46196                       if ((coord[1] & mask) !== 0) b += 2;
46197                       u += b.toString();
46198                   }
46199                   return u;
46200               });
46201       };
46202
46203
46204       source.validZoom = function(z) {
46205           return source.zoomExtent[0] <= z &&
46206               (source.overzoom || source.zoomExtent[1] > z);
46207       };
46208
46209
46210       source.isLocatorOverlay = function() {
46211           return source.id === 'mapbox_locator_overlay';
46212       };
46213
46214
46215       /* hides a source from the list, but leaves it available for use */
46216       source.isHidden = function() {
46217           return source.id === 'DigitalGlobe-Premium-vintage' ||
46218               source.id === 'DigitalGlobe-Standard-vintage';
46219       };
46220
46221
46222       source.copyrightNotices = function() {};
46223
46224
46225       source.getMetadata = function(center, tileCoord, callback) {
46226           var vintage = {
46227               start: localeDateString(source.startDate),
46228               end: localeDateString(source.endDate)
46229           };
46230           vintage.range = vintageRange(vintage);
46231
46232           var metadata = { vintage: vintage };
46233           callback(null, metadata);
46234       };
46235
46236
46237       return source;
46238   }
46239
46240
46241   rendererBackgroundSource.Bing = function(data, dispatch) {
46242       // http://msdn.microsoft.com/en-us/library/ff701716.aspx
46243       // http://msdn.microsoft.com/en-us/library/ff701701.aspx
46244
46245       data.template = 'https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z';
46246
46247       var bing = rendererBackgroundSource(data);
46248       var key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU'; // Same as P2 and JOSM
46249       var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' +
46250               key;
46251       var cache = {};
46252       var inflight = {};
46253       var providers = [];
46254
46255       d3_json(url, function(err, json$$1) {
46256           providers = json$$1.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
46257               return {
46258                   attribution: provider.attribution,
46259                   areas: provider.coverageAreas.map(function(area) {
46260                       return {
46261                           zoom: [area.zoomMin, area.zoomMax],
46262                           extent: geoExtent$$1([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
46263                       };
46264                   })
46265               };
46266           });
46267           dispatch.call('change');
46268       });
46269
46270
46271       bing.copyrightNotices = function(zoom, extent) {
46272           zoom = Math.min(zoom, 21);
46273           return providers.filter(function(provider) {
46274               return some(provider.areas, function(area) {
46275                   return extent.intersects(area.extent) &&
46276                       area.zoom[0] <= zoom &&
46277                       area.zoom[1] >= zoom;
46278               });
46279           }).map(function(provider) {
46280               return provider.attribution;
46281           }).join(', ');
46282       };
46283
46284
46285       bing.getMetadata = function(center, tileCoord, callback) {
46286           var tileId = tileCoord.slice(0, 3).join('/');
46287           var zoom = Math.min(tileCoord[2], 21);
46288           var centerPoint = center[1] + ',' + center[0];  // lat,lng
46289           var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/' + centerPoint +
46290                   '?zl=' + zoom + '&key=' + key;
46291
46292           if (inflight[tileId]) return;
46293
46294           if (!cache[tileId]) {
46295               cache[tileId] = {};
46296           }
46297           if (cache[tileId] && cache[tileId].metadata) {
46298               return callback(null, cache[tileId].metadata);
46299           }
46300
46301           inflight[tileId] = true;
46302           d3_json(url, function(error, result) {
46303               delete inflight[tileId];
46304
46305               var err;
46306               if (error) {
46307                   err = error;
46308               } else if (!result && 'Unknown Error') {
46309                   err = result.errorDetails;
46310               }
46311               if (err) {
46312                   return callback(err);
46313               } else {
46314                   var vintage = {
46315                       start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
46316                       end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
46317                   };
46318                   vintage.range = vintageRange(vintage);
46319
46320                   var metadata = { vintage: vintage };
46321                   cache[tileId].metadata = metadata;
46322                   return callback(null, metadata);
46323               }
46324           });
46325       };
46326
46327
46328       bing.terms_url = 'https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details';
46329
46330
46331       return bing;
46332   };
46333
46334
46335
46336   rendererBackgroundSource.Esri = function(data) {
46337       // in addition to using the tilemap at zoom level 20, overzoom real tiles - #4327 (deprecated technique, but it works)
46338       if (data.template.match(/blankTile/) === null) {
46339           data.template = data.template + '?blankTile=false';
46340       }
46341
46342       var esri = rendererBackgroundSource(data);
46343       var cache = {};
46344       var inflight = {};
46345       var _prevCenter;
46346
46347       // use a tilemap service to set maximum zoom for esri tiles dynamically
46348       // https://developers.arcgis.com/documentation/tiled-elevation-service/
46349       esri.fetchTilemap = function(center) {
46350           // skip if we have already fetched a tilemap within 5km
46351           if (_prevCenter && geoSphericalDistance(center, _prevCenter) < 5000) return;
46352           _prevCenter = center;
46353
46354           // tiles are available globally to zoom level 19, afterward they may or may not be present
46355           var z = 20;
46356
46357           // first generate a random url using the template
46358           var dummyUrl = esri.url([1,2,3]);
46359
46360           // calculate url z/y/x from the lat/long of the center of the map
46361           var x = (Math.floor((center[0] + 180) / 360 * Math.pow(2, z)));
46362           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)));
46363
46364           // fetch an 8x8 grid to leverage cache
46365           var tilemapUrl = dummyUrl.replace(/tile\/[0-9]+\/[0-9]+\/[0-9]+\?blankTile=false/, 'tilemap') + '/' + z + '/' + y + '/' + x + '/8/8';
46366
46367           // make the request and introspect the response from the tilemap server
46368           d3_json(tilemapUrl, function (err, tilemap) {
46369               if (err || !tilemap) return;
46370
46371               var hasTiles = true;
46372               for (var i = 0; i < tilemap.data.length; i++) {
46373                   // 0 means an individual tile in the grid doesn't exist
46374                   if (!tilemap.data[i]) {
46375                       hasTiles = false;
46376                       break;
46377                   }
46378               }
46379
46380               // if any tiles are missing at level 20 we restrict maxZoom to 19
46381               esri.zoomExtent[1] = (hasTiles ? 22 : 19);
46382           });
46383       };
46384
46385       esri.getMetadata = function(center, tileCoord, callback) {
46386           var tileId = tileCoord.slice(0, 3).join('/');
46387           var zoom = Math.min(tileCoord[2], esri.zoomExtent[1]);
46388           var centerPoint = center[0] + ',' + center[1];  // long, lat (as it should be)
46389           var unknown = t('info_panels.background.unknown');
46390           var metadataLayer;
46391           var vintage = {};
46392           var metadata = {};
46393
46394           if (inflight[tileId]) return;
46395
46396           switch (true) {
46397               case (zoom >= 20 && esri.id === 'EsriWorldImageryClarity'):
46398                   metadataLayer = 4;
46399                   break;
46400               case zoom >= 19:
46401                   metadataLayer = 3;
46402                   break;
46403               case zoom >= 17:
46404                   metadataLayer = 2;
46405                   break;
46406               case zoom >= 13:
46407                   metadataLayer = 0;
46408                   break;
46409               default:
46410                   metadataLayer = 99;
46411           }
46412
46413           var url;
46414           // build up query using the layer appropriate to the current zoom
46415           if (esri.id === 'EsriWorldImagery') {
46416               url = 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/';
46417           } else if (esri.id === 'EsriWorldImageryClarity') {
46418               url = 'https://serviceslab.arcgisonline.com/arcgis/rest/services/Clarity_World_Imagery/MapServer/';
46419           }
46420
46421           url += metadataLayer + '/query?returnGeometry=false&geometry=' + centerPoint + '&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json';
46422
46423           if (!cache[tileId]) {
46424               cache[tileId] = {};
46425           }
46426           if (cache[tileId] && cache[tileId].metadata) {
46427               return callback(null, cache[tileId].metadata);
46428           }
46429
46430           // accurate metadata is only available >= 13
46431           if (metadataLayer === 99) {
46432               vintage = {
46433                   start: null,
46434                   end: null,
46435                   range: null
46436               };
46437               metadata = {
46438                   vintage: null,
46439                   source: unknown,
46440                   description: unknown,
46441                   resolution: unknown,
46442                   accuracy: unknown
46443               };
46444
46445               callback(null, metadata);
46446
46447           } else {
46448               inflight[tileId] = true;
46449               d3_json(url, function(error, result) {
46450                   delete inflight[tileId];
46451
46452                   var err;
46453                   if (error) {
46454                       err = error;
46455                   } else if (!result) {
46456                       err = 'Unknown Error';
46457                   } else if (result.features && result.features.length < 1) {
46458                       err = 'No Results';
46459                   } else if (result.error && result.error.message) {
46460                       err = result.error.message;
46461                   }
46462
46463                   if (err) {
46464                       return callback(err);
46465                   } else {
46466                       // pass through the discrete capture date from metadata
46467                       var captureDate = localeDateString(result.features[0].attributes.SRC_DATE2);
46468                       vintage = {
46469                           start: captureDate,
46470                           end: captureDate,
46471                           range: captureDate
46472                       };
46473                       metadata = {
46474                           vintage: vintage,
46475                           source: clean(result.features[0].attributes.NICE_NAME),
46476                           description: clean(result.features[0].attributes.NICE_DESC),
46477                           resolution: clean(result.features[0].attributes.SRC_RES),
46478                           accuracy: clean(result.features[0].attributes.SRC_ACC)
46479                       };
46480
46481                       // append units - meters
46482                       if (isFinite(metadata.resolution)) {
46483                           metadata.resolution += ' m';
46484                       }
46485                       if (isFinite(metadata.accuracy)) {
46486                           metadata.accuracy += ' m';
46487                       }
46488
46489                       cache[tileId].metadata = metadata;
46490                       return callback(null, metadata);
46491                   }
46492               });
46493           }
46494
46495
46496           function clean(val) {
46497               return String(val).trim() || unknown;
46498           }
46499       };
46500
46501       return esri;
46502   };
46503
46504
46505   rendererBackgroundSource.None = function() {
46506       var source = rendererBackgroundSource({ id: 'none', template: '' });
46507
46508
46509       source.name = function() {
46510           return t('background.none');
46511       };
46512
46513
46514       source.imageryUsed = function() {
46515           return null;
46516       };
46517
46518
46519       source.area = function() {
46520           return -1;  // sources in background pane are sorted by area
46521       };
46522
46523
46524       return source;
46525   };
46526
46527
46528   rendererBackgroundSource.Custom = function(template) {
46529       var source = rendererBackgroundSource({ id: 'custom', template: template });
46530
46531
46532       source.name = function() {
46533           return t('background.custom');
46534       };
46535
46536
46537       source.imageryUsed = function() {
46538           return 'Custom (' + source.template() + ')';
46539       };
46540
46541
46542       source.area = function() {
46543           return -2;  // sources in background pane are sorted by area
46544       };
46545
46546
46547       return source;
46548   };
46549
46550   function rendererTileLayer(context) {
46551       var transformProp = utilPrefixCSSProperty('Transform');
46552       var tiler = utilTiler();
46553
46554       var _tileSize = 256;
46555       var _projection;
46556       var _cache = {};
46557       var _tileOrigin;
46558       var _zoom;
46559       var _source;
46560
46561
46562       function tileSizeAtZoom(d, z) {
46563           var EPSILON = 0.002;    // close seams
46564           return ((_tileSize * Math.pow(2, z - d[2])) / _tileSize) + EPSILON;
46565       }
46566
46567
46568       function atZoom(t$$1, distance) {
46569           var power = Math.pow(2, distance);
46570           return [
46571               Math.floor(t$$1[0] * power),
46572               Math.floor(t$$1[1] * power),
46573               t$$1[2] + distance
46574           ];
46575       }
46576
46577
46578       function lookUp(d) {
46579           for (var up = -1; up > -d[2]; up--) {
46580               var tile = atZoom(d, up);
46581               if (_cache[_source.url(tile)] !== false) {
46582                   return tile;
46583               }
46584           }
46585       }
46586
46587
46588       function uniqueBy(a, n) {
46589           var o = [];
46590           var seen = {};
46591           for (var i = 0; i < a.length; i++) {
46592               if (seen[a[i][n]] === undefined) {
46593                   o.push(a[i]);
46594                   seen[a[i][n]] = true;
46595               }
46596           }
46597           return o;
46598       }
46599
46600
46601       function addSource(d) {
46602           d.push(_source.url(d));
46603           return d;
46604       }
46605
46606
46607       // Update tiles based on current state of `projection`.
46608       function background(selection$$1) {
46609           _zoom = geoScaleToZoom(_projection.scale(), _tileSize);
46610
46611           var pixelOffset;
46612           if (_source) {
46613               pixelOffset = [
46614                   _source.offset()[0] * Math.pow(2, _zoom),
46615                   _source.offset()[1] * Math.pow(2, _zoom)
46616               ];
46617           } else {
46618               pixelOffset = [0, 0];
46619           }
46620
46621           var translate = [
46622               _projection.translate()[0] + pixelOffset[0],
46623               _projection.translate()[1] + pixelOffset[1]
46624           ];
46625
46626           tiler
46627               .scale(_projection.scale() * 2 * Math.PI)
46628               .translate(translate);
46629
46630           _tileOrigin = [
46631               _projection.scale() * Math.PI - translate[0],
46632               _projection.scale() * Math.PI - translate[1]
46633           ];
46634
46635           render(selection$$1);
46636       }
46637
46638
46639       // Derive the tiles onscreen, remove those offscreen and position them.
46640       // Important that this part not depend on `_projection` because it's
46641       // rentered when tiles load/error (see #644).
46642       function render(selection$$1) {
46643           if (!_source) return;
46644           var requests = [];
46645           var showDebug = context.getDebug('tile') && !_source.overlay;
46646
46647           if (_source.validZoom(_zoom)) {
46648               tiler.skipNullIsland(!!_source.overlay);
46649
46650               tiler().forEach(function(d) {
46651                   addSource(d);
46652                   if (d[3] === '') return;
46653                   if (typeof d[3] !== 'string') return; // Workaround for #2295
46654                   requests.push(d);
46655                   if (_cache[d[3]] === false && lookUp(d)) {
46656                       requests.push(addSource(lookUp(d)));
46657                   }
46658               });
46659
46660               requests = uniqueBy(requests, 3).filter(function(r) {
46661                   // don't re-request tiles which have failed in the past
46662                   return _cache[r[3]] !== false;
46663               });
46664           }
46665
46666           function load(d) {
46667               _cache[d[3]] = true;
46668               select(this)
46669                   .on('error', null)
46670                   .on('load', null)
46671                   .classed('tile-loaded', true);
46672               render(selection$$1);
46673           }
46674
46675           function error(d) {
46676               _cache[d[3]] = false;
46677               select(this)
46678                   .on('error', null)
46679                   .on('load', null)
46680                   .remove();
46681               render(selection$$1);
46682           }
46683
46684           function imageTransform(d) {
46685               var ts = _tileSize * Math.pow(2, _zoom - d[2]);
46686               var scale = tileSizeAtZoom(d, _zoom);
46687               return 'translate(' +
46688                   ((d[0] * ts) - _tileOrigin[0]) + 'px,' +
46689                   ((d[1] * ts) - _tileOrigin[1]) + 'px) ' +
46690                   'scale(' + scale + ',' + scale + ')';
46691           }
46692
46693           function tileCenter(d) {
46694               var ts = _tileSize * Math.pow(2, _zoom - d[2]);
46695               return [
46696                   ((d[0] * ts) - _tileOrigin[0] + (ts / 2)),
46697                   ((d[1] * ts) - _tileOrigin[1] + (ts / 2))
46698               ];
46699           }
46700
46701           function debugTransform(d) {
46702               var coord = tileCenter(d);
46703               return 'translate(' + coord[0] + 'px,' + coord[1] + 'px)';
46704           }
46705
46706
46707           // Pick a representative tile near the center of the viewport
46708           // (This is useful for sampling the imagery vintage)
46709           var dims = tiler.size();
46710           var mapCenter = [dims[0] / 2, dims[1] / 2];
46711           var minDist = Math.max(dims[0], dims[1]);
46712           var nearCenter;
46713
46714           requests.forEach(function(d) {
46715               var c = tileCenter(d);
46716               var dist = geoVecLength(c, mapCenter);
46717               if (dist < minDist) {
46718                   minDist = dist;
46719                   nearCenter = d;
46720               }
46721           });
46722
46723
46724           var image = selection$$1.selectAll('img')
46725               .data(requests, function(d) { return d[3]; });
46726
46727           image.exit()
46728               .style(transformProp, imageTransform)
46729               .classed('tile-removing', true)
46730               .classed('tile-center', false)
46731               .each(function() {
46732                   var tile = select(this);
46733                   window.setTimeout(function() {
46734                       if (tile.classed('tile-removing')) {
46735                           tile.remove();
46736                       }
46737                   }, 300);
46738               });
46739
46740           image.enter()
46741             .append('img')
46742               .attr('class', 'tile')
46743               .attr('src', function(d) { return d[3]; })
46744               .on('error', error)
46745               .on('load', load)
46746             .merge(image)
46747               .style(transformProp, imageTransform)
46748               .classed('tile-debug', showDebug)
46749               .classed('tile-removing', false)
46750               .classed('tile-center', function(d) { return d === nearCenter; });
46751
46752
46753
46754           var debug = selection$$1.selectAll('.tile-label-debug')
46755               .data(showDebug ? requests : [], function(d) { return d[3]; });
46756
46757           debug.exit()
46758               .remove();
46759
46760           if (showDebug) {
46761               var debugEnter = debug.enter()
46762                   .append('div')
46763                   .attr('class', 'tile-label-debug');
46764
46765               debugEnter
46766                   .append('div')
46767                   .attr('class', 'tile-label-debug-coord');
46768
46769               debugEnter
46770                   .append('div')
46771                   .attr('class', 'tile-label-debug-vintage');
46772
46773               debug = debug.merge(debugEnter);
46774
46775               debug
46776                   .style(transformProp, debugTransform);
46777
46778               debug
46779                   .selectAll('.tile-label-debug-coord')
46780                   .text(function(d) { return d[2] + ' / ' + d[0] + ' / ' + d[1]; });
46781
46782               debug
46783                   .selectAll('.tile-label-debug-vintage')
46784                   .each(function(d) {
46785                       var span = select(this);
46786                       var center = context.projection.invert(tileCenter(d));
46787                       _source.getMetadata(center, d, function(err, result) {
46788                           span.text((result && result.vintage && result.vintage.range) ||
46789                               t('info_panels.background.vintage') + ': ' + t('info_panels.background.unknown')
46790                           );
46791                       });
46792                   });
46793           }
46794
46795       }
46796
46797
46798       background.projection = function(_) {
46799           if (!arguments.length) return _projection;
46800           _projection = _;
46801           return background;
46802       };
46803
46804
46805       background.dimensions = function(_) {
46806           if (!arguments.length) return tiler.size();
46807           tiler.size(_);
46808           return background;
46809       };
46810
46811
46812       background.source = function(_) {
46813           if (!arguments.length) return _source;
46814           _source = _;
46815           _tileSize = _source.tileSize;
46816           _cache = {};
46817           tiler.tileSize(_source.tileSize).zoomExtent(_source.zoomExtent);
46818           return background;
46819       };
46820
46821
46822       return background;
46823   }
46824
46825   function rendererBackground(context) {
46826       var dispatch$$1 = dispatch('change');
46827       var detected = utilDetect();
46828       var baseLayer = rendererTileLayer(context).projection(context.projection);
46829       var _isValid = true;
46830       var _overlayLayers = [];
46831       var _backgroundSources = [];
46832       var _brightness = 1;
46833       var _contrast = 1;
46834       var _saturation = 1;
46835       var _sharpness = 1;
46836
46837
46838       function background(selection$$1) {
46839           // If we are displaying an Esri basemap at high zoom,
46840           // check its tilemap to see how high the zoom can go
46841           if (context.map().zoom() > 18) {
46842               var basemap = baseLayer.source();
46843               if (basemap && /^EsriWorldImagery/.test(basemap.id)) {
46844                   var center = context.map().center();
46845                   basemap.fetchTilemap(center);
46846               }
46847           }
46848
46849           // Is the imagery valid here? - #4827
46850           var sources = background.sources(context.map().extent());
46851           var wasValid = _isValid;
46852           _isValid = !!sources
46853               .filter(function(d) { return d === baseLayer.source(); }).length;
46854
46855           if (wasValid !== _isValid) {      // change in valid status
46856               background.updateImagery();
46857           }
46858
46859
46860           var baseFilter = '';
46861           if (detected.cssfilters) {
46862               if (_brightness !== 1) {
46863                   baseFilter += 'brightness(' + _brightness + ')';
46864               }
46865               if (_contrast !== 1) {
46866                   baseFilter += 'contrast(' + _contrast + ')';
46867               }
46868               if (_saturation !== 1) {
46869                   baseFilter += 'saturate(' + _saturation + ')';
46870               }
46871               if (_sharpness < 1) {  // gaussian blur
46872                   var blur = interpolateNumber(0.5, 5)(1 - _sharpness);
46873                   baseFilter += 'blur(' + blur + 'px)';
46874               }
46875           }
46876
46877           var base = selection$$1.selectAll('.layer-background')
46878               .data([0]);
46879
46880           base = base.enter()
46881               .insert('div', '.layer-data')
46882               .attr('class', 'layer layer-background')
46883               .merge(base);
46884
46885           if (detected.cssfilters) {
46886               base.style('filter', baseFilter || null);
46887           } else {
46888               base.style('opacity', _brightness);
46889           }
46890
46891
46892           var imagery = base.selectAll('.layer-imagery')
46893               .data([0]);
46894
46895           imagery.enter()
46896               .append('div')
46897               .attr('class', 'layer layer-imagery')
46898               .merge(imagery)
46899               .call(baseLayer);
46900
46901
46902           var maskFilter = '';
46903           var mixBlendMode = '';
46904           if (detected.cssfilters && _sharpness > 1) {  // apply unsharp mask
46905               mixBlendMode = 'overlay';
46906               maskFilter = 'saturate(0) blur(3px) invert(1)';
46907
46908               var contrast = _sharpness - 1;
46909               maskFilter += ' contrast(' + contrast + ')';
46910
46911               var brightness = interpolateNumber(1, 0.85)(_sharpness - 1);
46912               maskFilter += ' brightness(' + brightness + ')';
46913           }
46914
46915           var mask = base.selectAll('.layer-unsharp-mask')
46916               .data(detected.cssfilters && _sharpness > 1 ? [0] : []);
46917
46918           mask.exit()
46919               .remove();
46920
46921           mask.enter()
46922               .append('div')
46923               .attr('class', 'layer layer-mask layer-unsharp-mask')
46924               .merge(mask)
46925               .call(baseLayer)
46926               .style('filter', maskFilter || null)
46927               .style('mix-blend-mode', mixBlendMode || null);
46928
46929
46930           var overlays = selection$$1.selectAll('.layer-overlay')
46931               .data(_overlayLayers, function(d) { return d.source().name(); });
46932
46933           overlays.exit()
46934               .remove();
46935
46936           overlays.enter()
46937               .insert('div', '.layer-data')
46938               .attr('class', 'layer layer-overlay')
46939               .merge(overlays)
46940               .each(function(layer) { select(this).call(layer); });
46941       }
46942
46943
46944       background.updateImagery = function() {
46945           var b = baseLayer.source();
46946           if (context.inIntro() || !b) return;
46947
46948           var o = _overlayLayers
46949               .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
46950               .map(function (d) { return d.source().id; })
46951               .join(',');
46952
46953           var meters = geoOffsetToMeters(b.offset());
46954           var epsilon = 0.01;
46955           var x = +meters[0].toFixed(2);
46956           var y = +meters[1].toFixed(2);
46957           var q = utilStringQs(window.location.hash.substring(1));
46958
46959           var id = b.id;
46960           if (id === 'custom') {
46961               id = 'custom:' + b.template();
46962           }
46963
46964           if (id) {
46965               q.background = id;
46966           } else {
46967               delete q.background;
46968           }
46969
46970           if (o) {
46971               q.overlays = o;
46972           } else {
46973               delete q.overlays;
46974           }
46975
46976           if (Math.abs(x) > epsilon || Math.abs(y) > epsilon) {
46977               q.offset = x + ',' + y;
46978           } else {
46979               delete q.offset;
46980           }
46981
46982           if (!window.mocha) {
46983               window.location.replace('#' + utilQsString(q, true));
46984           }
46985
46986           var imageryUsed = [];
46987
46988           var current = b.imageryUsed();
46989           if (current && _isValid) {
46990               imageryUsed.push(current);
46991           }
46992
46993           _overlayLayers
46994               .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
46995               .forEach(function (d) { imageryUsed.push(d.source().imageryUsed()); });
46996
46997           var data$$1 = context.layers().layer('data');
46998           if (data$$1 && data$$1.enabled() && data$$1.hasData()) {
46999               imageryUsed.push(data$$1.getSrc());
47000           }
47001
47002           var streetside = context.layers().layer('streetside');
47003           if (streetside && streetside.enabled()) {
47004               imageryUsed.push('Bing Streetside');
47005           }
47006
47007           var mapillary_images = context.layers().layer('mapillary-images');
47008           if (mapillary_images && mapillary_images.enabled()) {
47009               imageryUsed.push('Mapillary Images');
47010           }
47011
47012           var mapillary_signs = context.layers().layer('mapillary-signs');
47013           if (mapillary_signs && mapillary_signs.enabled()) {
47014               imageryUsed.push('Mapillary Signs');
47015           }
47016
47017           var openstreetcam_images = context.layers().layer('openstreetcam-images');
47018           if (openstreetcam_images && openstreetcam_images.enabled()) {
47019               imageryUsed.push('OpenStreetCam Images');
47020           }
47021
47022           context.history().imageryUsed(imageryUsed);
47023       };
47024
47025
47026       background.sources = function(extent) {
47027           if (!data.imagery || !data.imagery.query) return [];   // called before init()?
47028
47029           var matchIDs = {};
47030           var matchImagery = data.imagery.query.bbox(extent.rectangle(), true) || [];
47031           matchImagery.forEach(function(d) { matchIDs[d.id] = true; });
47032
47033           return _backgroundSources.filter(function(source) {
47034               return matchIDs[source.id] || !source.polygon;   // no polygon = worldwide
47035           });
47036       };
47037
47038
47039       background.dimensions = function(d) {
47040           if (!d) return;
47041           baseLayer.dimensions(d);
47042
47043           _overlayLayers.forEach(function(layer) {
47044               layer.dimensions(d);
47045           });
47046       };
47047
47048
47049       background.baseLayerSource = function(d) {
47050           if (!arguments.length) return baseLayer.source();
47051
47052           // test source against OSM imagery blacklists..
47053           var osm = context.connection();
47054           if (!osm) return background;
47055
47056           var blacklists = context.connection().imageryBlacklists();
47057           var template = d.template();
47058           var fail = false;
47059           var tested = 0;
47060           var regex;
47061
47062           for (var i = 0; i < blacklists.length; i++) {
47063               try {
47064                   regex = new RegExp(blacklists[i]);
47065                   fail = regex.test(template);
47066                   tested++;
47067                   if (fail) break;
47068               } catch (e) {
47069                   /* noop */
47070               }
47071           }
47072
47073           // ensure at least one test was run.
47074           if (!tested) {
47075               regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
47076               fail = regex.test(template);
47077           }
47078
47079           baseLayer.source(!fail ? d : background.findSource('none'));
47080           dispatch$$1.call('change');
47081           background.updateImagery();
47082           return background;
47083       };
47084
47085
47086       background.findSource = function(id) {
47087           return find$1(_backgroundSources, function(d) {
47088               return d.id && d.id === id;
47089           });
47090       };
47091
47092
47093       background.bing = function() {
47094           background.baseLayerSource(background.findSource('Bing'));
47095       };
47096
47097
47098       background.showsLayer = function(d) {
47099           return d.id === baseLayer.source().id ||
47100               _overlayLayers.some(function(layer) { return d.id === layer.source().id; });
47101       };
47102
47103
47104       background.overlayLayerSources = function() {
47105           return _overlayLayers.map(function (l) { return l.source(); });
47106       };
47107
47108
47109       background.toggleOverlayLayer = function(d) {
47110           var layer;
47111           for (var i = 0; i < _overlayLayers.length; i++) {
47112               layer = _overlayLayers[i];
47113               if (layer.source() === d) {
47114                   _overlayLayers.splice(i, 1);
47115                   dispatch$$1.call('change');
47116                   background.updateImagery();
47117                   return;
47118               }
47119           }
47120
47121           layer = rendererTileLayer(context)
47122               .source(d)
47123               .projection(context.projection)
47124               .dimensions(baseLayer.dimensions()
47125           );
47126
47127           _overlayLayers.push(layer);
47128           dispatch$$1.call('change');
47129           background.updateImagery();
47130       };
47131
47132
47133       background.nudge = function(d, zoom) {
47134           baseLayer.source().nudge(d, zoom);
47135           dispatch$$1.call('change');
47136           background.updateImagery();
47137           return background;
47138       };
47139
47140
47141       background.offset = function(d) {
47142           if (!arguments.length) return baseLayer.source().offset();
47143           baseLayer.source().offset(d);
47144           dispatch$$1.call('change');
47145           background.updateImagery();
47146           return background;
47147       };
47148
47149
47150       background.brightness = function(d) {
47151           if (!arguments.length) return _brightness;
47152           _brightness = d;
47153           if (context.mode()) dispatch$$1.call('change');
47154           return background;
47155       };
47156
47157
47158       background.contrast = function(d) {
47159           if (!arguments.length) return _contrast;
47160           _contrast = d;
47161           if (context.mode()) dispatch$$1.call('change');
47162           return background;
47163       };
47164
47165
47166       background.saturation = function(d) {
47167           if (!arguments.length) return _saturation;
47168           _saturation = d;
47169           if (context.mode()) dispatch$$1.call('change');
47170           return background;
47171       };
47172
47173
47174       background.sharpness = function(d) {
47175           if (!arguments.length) return _sharpness;
47176           _sharpness = d;
47177           if (context.mode()) dispatch$$1.call('change');
47178           return background;
47179       };
47180
47181
47182       background.init = function() {
47183           function parseMap(qmap) {
47184               if (!qmap) return false;
47185               var args = qmap.split('/').map(Number);
47186               if (args.length < 3 || args.some(isNaN)) return false;
47187               return geoExtent$$1([args[2], args[1]]);
47188           }
47189
47190           var q = utilStringQs(window.location.hash.substring(1));
47191           var requested = q.background || q.layer;
47192           var extent = parseMap(q.map);
47193           var first;
47194           var best;
47195
47196
47197           data.imagery = data.imagery || [];
47198           data.imagery.features = {};
47199
47200           // build efficient index and querying for data.imagery
47201           var features = data.imagery.map(function(source) {
47202               if (!source.polygon) return null;
47203
47204               // Add an extra array nest to each element in `source.polygon`
47205               // so the rings are not treated as a bunch of holes:
47206               // what we have: [ [[outer],[hole],[hole]] ]
47207               // what we want: [ [[outer]],[[outer]],[[outer]] ]
47208               var rings = source.polygon.map(function(ring) { return [ring]; });
47209
47210               var feature = {
47211                   type: 'Feature',
47212                   properties: { id: source.id },
47213                   geometry: { type: 'MultiPolygon', coordinates: rings }
47214               };
47215
47216               data.imagery.features[source.id] = feature;
47217               return feature;
47218
47219           }).filter(Boolean);
47220
47221           data.imagery.query = whichPolygon_1({
47222               type: 'FeatureCollection',
47223               features: features
47224           });
47225
47226
47227           // Add all the available imagery sources
47228           _backgroundSources = data.imagery.map(function(source) {
47229               if (source.type === 'bing') {
47230                   return rendererBackgroundSource.Bing(source, dispatch$$1);
47231               } else if (/^EsriWorldImagery/.test(source.id)) {
47232                   return rendererBackgroundSource.Esri(source);
47233               } else {
47234                   return rendererBackgroundSource(source);
47235               }
47236           });
47237
47238           first = _backgroundSources.length && _backgroundSources[0];
47239
47240           // Add 'None'
47241           _backgroundSources.unshift(rendererBackgroundSource.None());
47242
47243           // Add 'Custom'
47244           var template = context.storage('background-custom-template') || '';
47245           var custom = rendererBackgroundSource.Custom(template);
47246           _backgroundSources.unshift(custom);
47247
47248
47249           // Decide which background layer to display
47250           if (!requested && extent) {
47251               best = find$1(this.sources(extent), function(s) { return s.best(); });
47252           }
47253           if (requested && requested.indexOf('custom:') === 0) {
47254               template = requested.replace(/^custom:/, '');
47255               background.baseLayerSource(custom.template(template));
47256               context.storage('background-custom-template', template);
47257           } else {
47258               background.baseLayerSource(
47259                   background.findSource(requested) ||
47260                   best ||
47261                   background.findSource(context.storage('background-last-used')) ||
47262                   background.findSource('Bing') ||
47263                   first ||
47264                   background.findSource('none')
47265               );
47266           }
47267
47268           var locator = find$1(_backgroundSources, function(d) {
47269               return d.overlay && d.default;
47270           });
47271
47272           if (locator) {
47273               background.toggleOverlayLayer(locator);
47274           }
47275
47276           var overlays = (q.overlays || '').split(',');
47277           overlays.forEach(function(overlay) {
47278               overlay = background.findSource(overlay);
47279               if (overlay) {
47280                   background.toggleOverlayLayer(overlay);
47281               }
47282           });
47283
47284           if (q.gpx) {
47285               var gpx = context.layers().layer('data');
47286               if (gpx) {
47287                   gpx.url(q.gpx, '.gpx');
47288               }
47289           }
47290
47291           if (q.offset) {
47292               var offset = q.offset.replace(/;/g, ',').split(',').map(function(n) {
47293                   return !isNaN(n) && n;
47294               });
47295
47296               if (offset.length === 2) {
47297                   background.offset(geoMetersToOffset(offset));
47298               }
47299           }
47300       };
47301
47302
47303       return utilRebind(background, dispatch$$1, 'on');
47304   }
47305
47306   function rendererFeatures(context) {
47307       var traffic_roads = {
47308           'motorway': true,
47309           'motorway_link': true,
47310           'trunk': true,
47311           'trunk_link': true,
47312           'primary': true,
47313           'primary_link': true,
47314           'secondary': true,
47315           'secondary_link': true,
47316           'tertiary': true,
47317           'tertiary_link': true,
47318           'residential': true,
47319           'unclassified': true,
47320           'living_street': true
47321       };
47322
47323       var service_roads = {
47324           'service': true,
47325           'road': true,
47326           'track': true
47327       };
47328
47329       var paths = {
47330           'path': true,
47331           'footway': true,
47332           'cycleway': true,
47333           'bridleway': true,
47334           'steps': true,
47335           'pedestrian': true,
47336           'corridor': true
47337       };
47338
47339       var past_futures = {
47340           'proposed': true,
47341           'construction': true,
47342           'abandoned': true,
47343           'dismantled': true,
47344           'disused': true,
47345           'razed': true,
47346           'demolished': true,
47347           'obliterated': true
47348       };
47349
47350       var dispatch$$1 = dispatch('change', 'redraw'),
47351           _cullFactor = 1,
47352           _cache = {},
47353           _features = {},
47354           _stats = {},
47355           _keys = [],
47356           _hidden = [];
47357
47358
47359       function update() {
47360           if (!window.mocha) {
47361               var q = utilStringQs(window.location.hash.substring(1));
47362               var disabled = features.disabled();
47363               if (disabled.length) {
47364                   q.disable_features = disabled.join(',');
47365               } else {
47366                   delete q.disable_features;
47367               }
47368               window.location.replace('#' + utilQsString(q, true));
47369               context.storage('disabled-features', disabled.join(','));
47370           }
47371           _hidden = features.hidden();
47372           dispatch$$1.call('change');
47373           dispatch$$1.call('redraw');
47374       }
47375
47376
47377       function defineFeature(k, filter, max) {
47378           var isEnabled = true;
47379
47380           _keys.push(k);
47381           _features[k] = {
47382               filter: filter,
47383               enabled: isEnabled,   // whether the user wants it enabled..
47384               count: 0,
47385               currentMax: (max || Infinity),
47386               defaultMax: (max || Infinity),
47387               enable: function() { this.enabled = true; this.currentMax = this.defaultMax; },
47388               disable: function() { this.enabled = false; this.currentMax = 0; },
47389               hidden: function() { return !context.editable() || this.count > this.currentMax * _cullFactor; },
47390               autoHidden: function() { return this.hidden() && this.currentMax > 0; }
47391           };
47392       }
47393
47394
47395       defineFeature('points', function isPoint(entity, resolver, geometry) {
47396           return geometry === 'point';
47397       }, 200);
47398
47399       defineFeature('traffic_roads', function isTrafficRoad(entity) {
47400           return traffic_roads[entity.tags.highway];
47401       });
47402
47403       defineFeature('service_roads', function isServiceRoad(entity) {
47404           return service_roads[entity.tags.highway];
47405       });
47406
47407       defineFeature('paths', function isPath(entity) {
47408           return paths[entity.tags.highway];
47409       });
47410
47411       defineFeature('buildings', function isBuilding(entity) {
47412           return (
47413               !!entity.tags['building:part'] ||
47414               (!!entity.tags.building && entity.tags.building !== 'no') ||
47415               entity.tags.parking === 'multi-storey' ||
47416               entity.tags.parking === 'sheds' ||
47417               entity.tags.parking === 'carports' ||
47418               entity.tags.parking === 'garage_boxes'
47419           );
47420       }, 250);
47421
47422       defineFeature('landuse', function isLanduse(entity, resolver, geometry) {
47423           return geometry === 'area' &&
47424               !_features.buildings.filter(entity) &&
47425               !_features.water.filter(entity);
47426       });
47427
47428       defineFeature('boundaries', function isBoundary(entity) {
47429           return (
47430               !!entity.tags.boundary
47431           ) && !(
47432               traffic_roads[entity.tags.highway] ||
47433               service_roads[entity.tags.highway] ||
47434               paths[entity.tags.highway]
47435           );
47436       });
47437
47438       defineFeature('water', function isWater(entity) {
47439           return (
47440               !!entity.tags.waterway ||
47441               entity.tags.natural === 'water' ||
47442               entity.tags.natural === 'coastline' ||
47443               entity.tags.natural === 'bay' ||
47444               entity.tags.landuse === 'pond' ||
47445               entity.tags.landuse === 'basin' ||
47446               entity.tags.landuse === 'reservoir' ||
47447               entity.tags.landuse === 'salt_pond'
47448           );
47449       });
47450
47451       defineFeature('rail', function isRail(entity) {
47452           return (
47453               !!entity.tags.railway ||
47454               entity.tags.landuse === 'railway'
47455           ) && !(
47456               traffic_roads[entity.tags.highway] ||
47457               service_roads[entity.tags.highway] ||
47458               paths[entity.tags.highway]
47459           );
47460       });
47461
47462       defineFeature('power', function isPower(entity) {
47463           return !!entity.tags.power;
47464       });
47465
47466       // contains a past/future tag, but not in active use as a road/path/cycleway/etc..
47467       defineFeature('past_future', function isPastFuture(entity) {
47468           if (
47469               traffic_roads[entity.tags.highway] ||
47470               service_roads[entity.tags.highway] ||
47471               paths[entity.tags.highway]
47472           ) { return false; }
47473
47474           var strings = Object.keys(entity.tags);
47475
47476           for (var i = 0; i < strings.length; i++) {
47477               var s = strings[i];
47478               if (past_futures[s] || past_futures[entity.tags[s]]) { return true; }
47479           }
47480           return false;
47481       });
47482
47483       // Lines or areas that don't match another feature filter.
47484       // IMPORTANT: The 'others' feature must be the last one defined,
47485       //   so that code in getMatches can skip this test if `hasMatch = true`
47486       defineFeature('others', function isOther(entity, resolver, geometry) {
47487           return (geometry === 'line' || geometry === 'area');
47488       });
47489
47490
47491       function features() {}
47492
47493
47494       features.features = function() {
47495           return _features;
47496       };
47497
47498
47499       features.keys = function() {
47500           return _keys;
47501       };
47502
47503
47504       features.enabled = function(k) {
47505           if (!arguments.length) {
47506               return _keys.filter(function(k) { return _features[k].enabled; });
47507           }
47508           return _features[k] && _features[k].enabled;
47509       };
47510
47511
47512       features.disabled = function(k) {
47513           if (!arguments.length) {
47514               return _keys.filter(function(k) { return !_features[k].enabled; });
47515           }
47516           return _features[k] && !_features[k].enabled;
47517       };
47518
47519
47520       features.hidden = function(k) {
47521           if (!arguments.length) {
47522               return _keys.filter(function(k) { return _features[k].hidden(); });
47523           }
47524           return _features[k] && _features[k].hidden();
47525       };
47526
47527
47528       features.autoHidden = function(k) {
47529           if (!arguments.length) {
47530               return _keys.filter(function(k) { return _features[k].autoHidden(); });
47531           }
47532           return _features[k] && _features[k].autoHidden();
47533       };
47534
47535
47536       features.enable = function(k) {
47537           if (_features[k] && !_features[k].enabled) {
47538               _features[k].enable();
47539               update();
47540           }
47541       };
47542
47543
47544       features.disable = function(k) {
47545           if (_features[k] && _features[k].enabled) {
47546               _features[k].disable();
47547               update();
47548           }
47549       };
47550
47551
47552       features.toggle = function(k) {
47553           if (_features[k]) {
47554               (function(f) { return f.enabled ? f.disable() : f.enable(); }(_features[k]));
47555               update();
47556           }
47557       };
47558
47559
47560       features.resetStats = function() {
47561           for (var i = 0; i < _keys.length; i++) {
47562               _features[_keys[i]].count = 0;
47563           }
47564           dispatch$$1.call('change');
47565       };
47566
47567
47568       features.gatherStats = function(d, resolver, dimensions) {
47569           var needsRedraw = false,
47570               type = groupBy(d, function(ent) { return ent.type; }),
47571               entities = [].concat(type.relation || [], type.way || [], type.node || []),
47572               currHidden, geometry, matches, i, j;
47573
47574           for (i = 0; i < _keys.length; i++) {
47575               _features[_keys[i]].count = 0;
47576           }
47577
47578           // adjust the threshold for point/building culling based on viewport size..
47579           // a _cullFactor of 1 corresponds to a 1000x1000px viewport..
47580           _cullFactor = dimensions[0] * dimensions[1] / 1000000;
47581
47582           for (i = 0; i < entities.length; i++) {
47583               geometry = entities[i].geometry(resolver);
47584               if (!(geometry === 'vertex' || geometry === 'relation')) {
47585                   matches = Object.keys(features.getMatches(entities[i], resolver, geometry));
47586                   for (j = 0; j < matches.length; j++) {
47587                       _features[matches[j]].count++;
47588                   }
47589               }
47590           }
47591
47592           currHidden = features.hidden();
47593           if (currHidden !== _hidden) {
47594               _hidden = currHidden;
47595               needsRedraw = true;
47596               dispatch$$1.call('change');
47597           }
47598
47599           return needsRedraw;
47600       };
47601
47602
47603       features.stats = function() {
47604           for (var i = 0; i < _keys.length; i++) {
47605               _stats[_keys[i]] = _features[_keys[i]].count;
47606           }
47607
47608           return _stats;
47609       };
47610
47611
47612       features.clear = function(d) {
47613           for (var i = 0; i < d.length; i++) {
47614               features.clearEntity(d[i]);
47615           }
47616       };
47617
47618
47619       features.clearEntity = function(entity) {
47620           delete _cache[osmEntity$$1.key(entity)];
47621       };
47622
47623
47624       features.reset = function() {
47625           _cache = {};
47626       };
47627
47628
47629       features.getMatches = function(entity, resolver, geometry) {
47630           if (geometry === 'vertex' || geometry === 'relation') return {};
47631
47632           var ent = osmEntity$$1.key(entity);
47633           if (!_cache[ent]) {
47634               _cache[ent] = {};
47635           }
47636
47637           if (!_cache[ent].matches) {
47638               var matches = {},
47639                   hasMatch = false;
47640
47641               for (var i = 0; i < _keys.length; i++) {
47642                   if (_keys[i] === 'others') {
47643                       if (hasMatch) continue;
47644
47645                       // Multipolygon members:
47646                       // If an entity...
47647                       //   1. is a way that hasn't matched other 'interesting' feature rules,
47648                       //   2. and it belongs to a single parent multipolygon relation
47649                       // ...then match whatever feature rules the parent multipolygon has matched.
47650                       // see #2548, #2887
47651                       //
47652                       // IMPORTANT:
47653                       // For this to work, getMatches must be called on relations before ways.
47654                       //
47655                       if (entity.type === 'way') {
47656                           var parents = features.getParents(entity, resolver, geometry);
47657                           if (parents.length === 1 && parents[0].isMultipolygon()) {
47658                               var pkey = osmEntity$$1.key(parents[0]);
47659                               if (_cache[pkey] && _cache[pkey].matches) {
47660                                   matches = clone(_cache[pkey].matches);
47661                                   continue;
47662                               }
47663                           }
47664                       }
47665                   }
47666
47667                   if (_features[_keys[i]].filter(entity, resolver, geometry)) {
47668                       matches[_keys[i]] = hasMatch = true;
47669                   }
47670               }
47671               _cache[ent].matches = matches;
47672           }
47673
47674           return _cache[ent].matches;
47675       };
47676
47677
47678       features.getParents = function(entity, resolver, geometry) {
47679           if (geometry === 'point') return [];
47680
47681           var ent = osmEntity$$1.key(entity);
47682           if (!_cache[ent]) {
47683               _cache[ent] = {};
47684           }
47685
47686           if (!_cache[ent].parents) {
47687               var parents = [];
47688               if (geometry === 'vertex') {
47689                   parents = resolver.parentWays(entity);
47690               } else {   // 'line', 'area', 'relation'
47691                   parents = resolver.parentRelations(entity);
47692               }
47693               _cache[ent].parents = parents;
47694           }
47695           return _cache[ent].parents;
47696       };
47697
47698
47699       features.isHiddenFeature = function(entity, resolver, geometry) {
47700           if (!_hidden.length) return false;
47701           if (!entity.version) return false;
47702
47703           var matches = features.getMatches(entity, resolver, geometry);
47704
47705           for (var i = 0; i < _hidden.length; i++) {
47706               if (matches[_hidden[i]]) return true;
47707           }
47708           return false;
47709       };
47710
47711
47712       features.isHiddenChild = function(entity, resolver, geometry) {
47713           if (!_hidden.length) return false;
47714           if (!entity.version || geometry === 'point') return false;
47715
47716           var parents = features.getParents(entity, resolver, geometry);
47717           if (!parents.length) return false;
47718
47719           for (var i = 0; i < parents.length; i++) {
47720               if (!features.isHidden(parents[i], resolver, parents[i].geometry(resolver))) {
47721                   return false;
47722               }
47723           }
47724           return true;
47725       };
47726
47727
47728       features.hasHiddenConnections = function(entity, resolver) {
47729           if (!_hidden.length) return false;
47730           var childNodes, connections;
47731
47732           if (entity.type === 'midpoint') {
47733               childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
47734               connections = [];
47735           } else {
47736               childNodes = entity.nodes ? resolver.childNodes(entity) : [];
47737               connections = features.getParents(entity, resolver, entity.geometry(resolver));
47738           }
47739
47740           // gather ways connected to child nodes..
47741           connections = reduce(childNodes, function(result, e) {
47742               return resolver.isShared(e) ? union(result, resolver.parentWays(e)) : result;
47743           }, connections);
47744
47745           return connections.length ? some(connections, function(e) {
47746               return features.isHidden(e, resolver, e.geometry(resolver));
47747           }) : false;
47748       };
47749
47750
47751       features.isHidden = function(entity, resolver, geometry) {
47752           if (!_hidden.length) return false;
47753           if (!entity.version) return false;
47754
47755           var fn = (geometry === 'vertex' ? features.isHiddenChild : features.isHiddenFeature);
47756           return fn(entity, resolver, geometry);
47757       };
47758
47759
47760       features.filter = function(d, resolver) {
47761           if (!_hidden.length) return d;
47762
47763           var result = [];
47764           for (var i = 0; i < d.length; i++) {
47765               var entity = d[i];
47766               if (!features.isHidden(entity, resolver, entity.geometry(resolver))) {
47767                   result.push(entity);
47768               }
47769           }
47770           return result;
47771       };
47772
47773
47774       features.init = function() {
47775           var storage = context.storage('disabled-features');
47776           if (storage) {
47777               var storageDisabled = storage.replace(/;/g, ',').split(',');
47778               storageDisabled.forEach(features.disable);
47779           }
47780
47781           var q = utilStringQs(window.location.hash.substring(1));
47782           if (q.disable_features) {
47783               var hashDisabled = q.disable_features.replace(/;/g, ',').split(',');
47784               hashDisabled.forEach(features.disable);
47785           }
47786       };
47787
47788       return utilRebind(features, dispatch$$1, 'on');
47789   }
47790
47791   function utilBindOnce(target, type, listener, capture) {
47792       var typeOnce = type + '.once';
47793       function one() {
47794           target.on(typeOnce, null);
47795           listener.apply(this, arguments);
47796       }
47797       target.on(typeOnce, one, capture);
47798       return this;
47799   }
47800
47801   // constants
47802   var TILESIZE = 256;
47803   var kMin = geoZoomToScale(2, TILESIZE);
47804   var kMax = geoZoomToScale(24, TILESIZE);
47805
47806   function clamp(num, min, max) {
47807       return Math.max(min, Math.min(num, max));
47808   }
47809
47810
47811   function rendererMap(context) {
47812       var dispatch$$1 = dispatch('move', 'drawn');
47813       var projection = context.projection;
47814       var curtainProjection = context.curtainProjection;
47815       var drawLayers = svgLayers(projection, context);
47816       var drawPoints = svgPoints$$1(projection, context);
47817       var drawVertices = svgVertices$$1(projection, context);
47818       var drawLines = svgLines$$1(projection, context);
47819       var drawAreas = svgAreas$$1(projection, context);
47820       var drawMidpoints = svgMidpoints$$1(projection, context);
47821       var drawLabels = svgLabels(projection, context);
47822
47823       var _selection = select(null);
47824       var supersurface = select(null);
47825       var wrapper = select(null);
47826       var surface = select(null);
47827
47828       var _dimensions = [1, 1];
47829       var _dblClickEnabled = true;
47830       var _redrawEnabled = true;
47831       var _gestureTransformStart;
47832       var _transformStart = projection.transform();
47833       var _transformLast;
47834       var _isTransformed = false;
47835       var _minzoom = 0;
47836       var _getMouseCoords;
47837       var _mouseEvent;
47838
47839       var zoom$$1 = d3_zoom()
47840           .scaleExtent([kMin, kMax])
47841           .interpolate(interpolate)
47842           .filter(zoomEventFilter)
47843           .on('zoom', zoomPan);
47844
47845       var scheduleRedraw = throttle(redraw, 750);
47846       // var isRedrawScheduled = false;
47847       // var pendingRedrawCall;
47848       // function scheduleRedraw() {
47849       //     // Only schedule the redraw if one has not already been set.
47850       //     if (isRedrawScheduled) return;
47851       //     isRedrawScheduled = true;
47852       //     var that = this;
47853       //     var args = arguments;
47854       //     pendingRedrawCall = window.requestIdleCallback(function () {
47855       //         // Reset the boolean so future redraws can be set.
47856       //         isRedrawScheduled = false;
47857       //         redraw.apply(that, args);
47858       //     }, { timeout: 1400 });
47859       // }
47860
47861       function cancelPendingRedraw() {
47862           scheduleRedraw.cancel();
47863           // isRedrawScheduled = false;
47864           // window.cancelIdleCallback(pendingRedrawCall);
47865       }
47866
47867
47868       function map(selection$$1) {
47869           _selection = selection$$1;
47870
47871           context
47872               .on('change.map', immediateRedraw);
47873
47874           var osm = context.connection();
47875           if (osm) {
47876               osm.on('change.map', immediateRedraw);
47877           }
47878
47879           context.history()
47880               .on('change.map', immediateRedraw)
47881               .on('undone.map redone.map', function(stack) {
47882                   var mode = context.mode().id;
47883                   if (mode !== 'browse' && mode !== 'select') return;
47884
47885                   var followSelected = false;
47886                   if (Array.isArray(stack.selectedIDs)) {
47887                       followSelected = (stack.selectedIDs.length === 1 && stack.selectedIDs[0][0] === 'n');
47888                       context.enter(
47889                           modeSelect(context, stack.selectedIDs).follow(followSelected)
47890                       );
47891                   }
47892                   if (!followSelected && stack.transform) {
47893                       map.transformEase(stack.transform);
47894                   }
47895               });
47896
47897           context.background()
47898               .on('change.map', immediateRedraw);
47899
47900           context.features()
47901               .on('redraw.map', immediateRedraw);
47902
47903           drawLayers
47904               .on('change.map', function() {
47905                   context.background().updateImagery();
47906                   immediateRedraw();
47907               });
47908
47909           selection$$1
47910               .on('dblclick.map', dblClick)
47911               .call(zoom$$1)
47912               .call(zoom$$1.transform, projection.transform());
47913
47914           supersurface = selection$$1.append('div')
47915               .attr('id', 'supersurface')
47916               .call(utilSetTransform, 0, 0);
47917
47918           // Need a wrapper div because Opera can't cope with an absolutely positioned
47919           // SVG element: http://bl.ocks.org/jfirebaugh/6fbfbd922552bf776c16
47920           wrapper = supersurface
47921               .append('div')
47922               .attr('class', 'layer layer-data');
47923
47924           map.surface = surface = wrapper
47925               .call(drawLayers)
47926               .selectAll('.surface')
47927               .attr('id', 'surface');
47928
47929           surface
47930               .call(drawLabels.observe)
47931               .on('gesturestart.surface', function() {
47932                   _gestureTransformStart = projection.transform();
47933               })
47934               .on('gesturechange.surface', gestureChange)
47935               .on('mousedown.zoom', function() {
47936                   if (event.button === 2) {
47937                       event.stopPropagation();
47938                   }
47939               }, true)
47940               .on('mouseup.zoom', function() {
47941                   if (resetTransform()) {
47942                       immediateRedraw();
47943                   }
47944               })
47945               .on('mousemove.map', function() {
47946                   _mouseEvent = event;
47947               })
47948               .on('mouseover.vertices', function() {
47949                   if (map.editable() && !_isTransformed) {
47950                       var hover = event.target.__data__;
47951                       surface.call(drawVertices.drawHover, context.graph(), hover, map.extent());
47952                       dispatch$$1.call('drawn', this, { full: false });
47953                   }
47954               })
47955               .on('mouseout.vertices', function() {
47956                   if (map.editable() && !_isTransformed) {
47957                       var hover = event.relatedTarget && event.relatedTarget.__data__;
47958                       surface.call(drawVertices.drawHover, context.graph(), hover, map.extent());
47959                       dispatch$$1.call('drawn', this, { full: false });
47960                   }
47961               });
47962
47963           supersurface
47964               .call(context.background());
47965
47966           context.on('enter.map',  function() {
47967               if (map.editable() && !_isTransformed) {
47968                   // redraw immediately any objects affected by a change in selectedIDs.
47969                   var graph = context.graph();
47970                   var selectedAndParents = {};
47971                   context.selectedIDs().forEach(function(id) {
47972                       var entity = graph.hasEntity(id);
47973                       if (entity) {
47974                           selectedAndParents[entity.id] = entity;
47975                           if (entity.type === 'node') {
47976                               graph.parentWays(entity).forEach(function(parent) {
47977                                   selectedAndParents[parent.id] = parent;
47978                               });
47979                           }
47980                       }
47981                   });
47982                   var data = values$1(selectedAndParents);
47983                   var filter = function(d) { return d.id in selectedAndParents; };
47984
47985                   data = context.features().filter(data, graph);
47986
47987                   surface
47988                       .call(drawVertices.drawSelected, graph, map.extent())
47989                       .call(drawLines, graph, data, filter)
47990                       .call(drawAreas, graph, data, filter)
47991                       .call(drawMidpoints, graph, data, filter, map.trimmedExtent());
47992
47993                   dispatch$$1.call('drawn', this, { full: false });
47994
47995                   // redraw everything else later
47996                   scheduleRedraw();
47997               }
47998           });
47999
48000           map.dimensions(utilGetDimensions(selection$$1));
48001       }
48002
48003
48004       function zoomEventFilter() {
48005           // Fix for #2151, (see also d3/d3-zoom#60, d3/d3-brush#18)
48006           // Intercept `mousedown` and check if there is an orphaned zoom gesture.
48007           // This can happen if a previous `mousedown` occurred without a `mouseup`.
48008           // If we detect this, dispatch `mouseup` to complete the orphaned gesture,
48009           // so that d3-zoom won't stop propagation of new `mousedown` events.
48010           if (event.type === 'mousedown') {
48011               var hasOrphan = false;
48012               var listeners = window.__on;
48013               for (var i = 0; i < listeners.length; i++) {
48014                   var listener = listeners[i];
48015                   if (listener.name === 'zoom' && listener.type === 'mouseup') {
48016                       hasOrphan = true;
48017                       break;
48018                   }
48019               }
48020               if (hasOrphan) {
48021                   var event$$1 = window.CustomEvent;
48022                   if (event$$1) {
48023                       event$$1 = new event$$1('mouseup');
48024                   } else {
48025                       event$$1 = window.document.createEvent('Event');
48026                       event$$1.initEvent('mouseup', false, false);
48027                   }
48028                   // Event needs to be dispatched with an event.view property.
48029                   event$$1.view = window;
48030                   window.dispatchEvent(event$$1);
48031               }
48032           }
48033
48034           return event.button !== 2;   // ignore right clicks
48035       }
48036
48037
48038       function pxCenter() {
48039           return [_dimensions[0] / 2, _dimensions[1] / 2];
48040       }
48041
48042
48043       function drawVector(difference, extent) {
48044           var mode = context.mode();
48045           var graph = context.graph();
48046           var features = context.features();
48047           var all = context.intersects(map.extent());
48048           var fullRedraw = false;
48049           var data;
48050           var filter;
48051
48052           if (difference) {
48053               var complete = difference.complete(map.extent());
48054               data = compact(values$1(complete));
48055               filter = function(d) { return d.id in complete; };
48056               features.clear(data);
48057
48058           } else {
48059               // force a full redraw if gatherStats detects that a feature
48060               // should be auto-hidden (e.g. points or buildings)..
48061               if (features.gatherStats(all, graph, _dimensions)) {
48062                   extent = undefined;
48063               }
48064
48065               if (extent) {
48066                   data = context.intersects(map.extent().intersection(extent));
48067                   var set$$1 = set$2(map$3(data, 'id'));
48068                   filter = function(d) { return set$$1.has(d.id); };
48069
48070               } else {
48071                   data = all;
48072                   fullRedraw = true;
48073                   filter = utilFunctor(true);
48074               }
48075           }
48076
48077           data = features.filter(data, graph);
48078
48079           if (mode && mode.id === 'select') {
48080               // update selected vertices - the user might have just double-clicked a way,
48081               // creating a new vertex, triggering a partial redraw without a mode change
48082               surface.call(drawVertices.drawSelected, graph, map.extent());
48083           }
48084
48085           surface
48086               .call(drawVertices, graph, data, filter, map.extent(), fullRedraw)
48087               .call(drawLines, graph, data, filter)
48088               .call(drawAreas, graph, data, filter)
48089               .call(drawMidpoints, graph, data, filter, map.trimmedExtent())
48090               .call(drawLabels, graph, data, filter, _dimensions, fullRedraw)
48091               .call(drawPoints, graph, data, filter);
48092
48093           dispatch$$1.call('drawn', this, {full: true});
48094       }
48095
48096
48097       function editOff() {
48098           context.features().resetStats();
48099           surface.selectAll('.layer-osm *').remove();
48100           surface.selectAll('.layer-touch:not(.markers) *').remove();
48101
48102           var allowed = {
48103               'browse': true,
48104               'save': true,
48105               'select-note': true,
48106               'select-data': true,
48107               'select-error': true
48108           };
48109
48110           var mode = context.mode();
48111           if (mode && !allowed[mode.id]) {
48112               context.enter(modeBrowse(context));
48113           }
48114
48115           dispatch$$1.call('drawn', this, {full: true});
48116       }
48117
48118
48119       function dblClick() {
48120           if (!_dblClickEnabled) {
48121               event.preventDefault();
48122               event.stopImmediatePropagation();
48123           }
48124       }
48125
48126
48127       function gestureChange() {
48128           // Remap Safari gesture events to wheel events - #5492
48129           // We want these disabled most places, but enabled for zoom/unzoom on map surface
48130           // https://developer.mozilla.org/en-US/docs/Web/API/GestureEvent
48131           var e = event;
48132           e.preventDefault();
48133
48134           var props = {
48135               deltaMode: 0,    // dummy values to ignore in zoomPan
48136               deltaY: 1,       // dummy values to ignore in zoomPan
48137               clientX: e.clientX,
48138               clientY: e.clientY,
48139               screenX: e.screenX,
48140               screenY: e.screenY,
48141               x: e.x,
48142               y: e.y
48143           };
48144
48145           var e2 = new WheelEvent('wheel', props);
48146           e2._scale = e.scale;         // preserve the original scale
48147           e2._rotation = e.rotation;   // preserve the original rotation
48148
48149           _selection.node().dispatchEvent(e2);
48150       }
48151
48152
48153       function zoomPan(manualEvent) {
48154           var event$$1 = (manualEvent || event);
48155           var source = event$$1.sourceEvent;
48156           var eventTransform = event$$1.transform;
48157           var x = eventTransform.x;
48158           var y = eventTransform.y;
48159           var k = eventTransform.k;
48160
48161           if (_transformStart.x === x &&
48162               _transformStart.y === y &&
48163               _transformStart.k === k) {
48164               return;  // no change
48165           }
48166
48167           // Special handling of 'wheel' events:
48168           // They might be triggered by the user scrolling the mouse wheel,
48169           // or 2-finger pinch/zoom gestures, the transform may need adjustment.
48170           if (source && source.type === 'wheel') {
48171               var detected = utilDetect();
48172               var dX = source.deltaX;
48173               var dY = source.deltaY;
48174               var x2 = x;
48175               var y2 = y;
48176               var k2 = k;
48177               var t0, p0, p1;
48178
48179               // Normalize mousewheel scroll speed (Firefox) - #3029
48180               // If wheel delta is provided in LINE units, recalculate it in PIXEL units
48181               // We are essentially redoing the calculations that occur here:
48182               //   https://github.com/d3/d3-zoom/blob/78563a8348aa4133b07cac92e2595c2227ca7cd7/src/zoom.js#L203
48183               // See this for more info:
48184               //   https://github.com/basilfx/normalize-wheel/blob/master/src/normalizeWheel.js
48185               if (source.deltaMode === 1 /* LINE */) {
48186                   // Convert from lines to pixels, more if the user is scrolling fast.
48187                   // (I made up the exp function to roughly match Firefox to what Chrome does)
48188                   // These numbers should be floats, because integers are treated as pan gesture below.
48189                   var lines = Math.abs(source.deltaY);
48190                   var sign = (source.deltaY > 0) ? 1 : -1;
48191                   dY = sign * clamp(
48192                       Math.exp((lines - 1) * 0.75) * 4.000244140625,
48193                       4.000244140625,    // min
48194                       350.000244140625   // max
48195                   );
48196
48197                   // On Firefox Windows and Linux we always get +/- the scroll line amount (default 3)
48198                   // There doesn't seem to be any scroll accelleration.
48199                   // This multiplier increases the speed a little bit - #5512
48200                   if (detected.os !== 'mac') {
48201                       dY *= 5;
48202                   }
48203
48204                   // recalculate x2,y2,k2
48205                   t0 = _isTransformed ? _transformLast : _transformStart;
48206                   p0 = _getMouseCoords(source);
48207                   p1 = t0.invert(p0);
48208                   k2 = t0.k * Math.pow(2, -dY / 500);
48209                   x2 = p0[0] - p1[0] * k2;
48210                   y2 = p0[1] - p1[1] * k2;
48211
48212               // 2 finger map pinch zooming (Safari) - #5492
48213               // These are fake `wheel` events we made from Safari `gesturechange` events..
48214               } else if (source._scale) {
48215                   // recalculate x2,y2,k2
48216                   t0 = _gestureTransformStart;
48217                   p0 = _getMouseCoords(source);
48218                   p1 = t0.invert(p0);
48219                   k2 = t0.k * source._scale;
48220                   x2 = p0[0] - p1[0] * k2;
48221                   y2 = p0[1] - p1[1] * k2;
48222
48223               // 2 finger map pinch zooming (all browsers except Safari) - #5492
48224               // Pinch zooming via the `wheel` event will always have:
48225               // - `ctrlKey = true`
48226               // - `deltaY` is not round integer pixels (ignore `deltaX`)
48227               } else if (source.ctrlKey && !isInteger(dY)) {
48228                   dY *= 6;   // slightly scale up whatever the browser gave us
48229
48230                   // recalculate x2,y2,k2
48231                   t0 = _isTransformed ? _transformLast : _transformStart;
48232                   p0 = _getMouseCoords(source);
48233                   p1 = t0.invert(p0);
48234                   k2 = t0.k * Math.pow(2, -dY / 500);
48235                   x2 = p0[0] - p1[0] * k2;
48236                   y2 = p0[1] - p1[1] * k2;
48237
48238               // Trackpad scroll zooming with shift or alt/option key down
48239               } else if ((source.altKey || source.shiftKey) && isInteger(dY)) {
48240                   // recalculate x2,y2,k2
48241                   t0 = _isTransformed ? _transformLast : _transformStart;
48242                   p0 = _getMouseCoords(source);
48243                   p1 = t0.invert(p0);
48244                   k2 = t0.k * Math.pow(2, -dY / 500);
48245                   x2 = p0[0] - p1[0] * k2;
48246                   y2 = p0[1] - p1[1] * k2;
48247
48248               // 2 finger map panning (Mac only, all browsers) - #5492, #5512
48249               // Panning via the `wheel` event will always have:
48250               // - `ctrlKey = false`
48251               // - `deltaX`,`deltaY` are round integer pixels
48252               } else if (detected.os === 'mac' && !source.ctrlKey && isInteger(dX) && isInteger(dY)) {
48253                   p1 = projection.translate();
48254                   x2 = p1[0] - dX;
48255                   y2 = p1[1] - dY;
48256                   k2 = projection.scale();
48257               }
48258
48259               // something changed - replace the event transform
48260               if (x2 !== x || y2 !== y || k2 !== k) {
48261                   x = x2;
48262                   y = y2;
48263                   k = k2;
48264                   eventTransform = identity$7.translate(x2, y2).scale(k2);
48265                   _selection.node().__zoom = eventTransform;
48266               }
48267
48268           }
48269
48270           if (geoScaleToZoom(k, TILESIZE) < _minzoom) {
48271               surface.interrupt();
48272               uiFlash().text(t('cannot_zoom'))();
48273               setCenterZoom(map.center(), context.minEditableZoom(), 0, true);
48274               scheduleRedraw();
48275               dispatch$$1.call('move', this, map);
48276               return;
48277           }
48278
48279           projection.transform(eventTransform);
48280
48281           var scale = k / _transformStart.k;
48282           var tX = (x / scale - _transformStart.x) * scale;
48283           var tY = (y / scale - _transformStart.y) * scale;
48284
48285           if (context.inIntro()) {
48286               curtainProjection.transform({
48287                   x: x - tX,
48288                   y: y - tY,
48289                   k: k
48290               });
48291           }
48292
48293           if (source) {
48294               _mouseEvent = event$$1;
48295           }
48296           _isTransformed = true;
48297           _transformLast = eventTransform;
48298           utilSetTransform(supersurface, tX, tY, scale);
48299           scheduleRedraw();
48300
48301           dispatch$$1.call('move', this, map);
48302
48303
48304           function isInteger(val) {
48305               return typeof val === 'number' && isFinite(val) && Math.floor(val) === val;
48306           }
48307       }
48308
48309
48310       function resetTransform() {
48311           if (!_isTransformed) return false;
48312
48313           // deprecation warning - Radial Menu to be removed in iD v3
48314           surface.selectAll('.edit-menu, .radial-menu').interrupt().remove();
48315           utilSetTransform(supersurface, 0, 0);
48316           _isTransformed = false;
48317           if (context.inIntro()) {
48318               curtainProjection.transform(projection.transform());
48319           }
48320           return true;
48321       }
48322
48323
48324       function redraw(difference, extent) {
48325           if (surface.empty() || !_redrawEnabled) return;
48326
48327           // If we are in the middle of a zoom/pan, we can't do differenced redraws.
48328           // It would result in artifacts where differenced entities are redrawn with
48329           // one transform and unchanged entities with another.
48330           if (resetTransform()) {
48331               difference = extent = undefined;
48332           }
48333
48334           var zoom$$1 = map.zoom();
48335           var z = String(~~zoom$$1);
48336
48337           if (surface.attr('data-zoom') !== z) {
48338               surface.attr('data-zoom', z);
48339           }
48340
48341           // class surface as `lowzoom` around z17-z18.5 (based on latitude)
48342           var lat = map.center()[1];
48343           var lowzoom = linear$2()
48344               .domain([-60, 0, 60])
48345               .range([17, 18.5, 17])
48346               .clamp(true);
48347
48348           surface
48349               .classed('low-zoom', zoom$$1 <= lowzoom(lat));
48350
48351
48352           if (!difference) {
48353               supersurface.call(context.background());
48354           }
48355
48356           wrapper
48357               .call(drawLayers);
48358
48359           // OSM
48360           if (map.editable()) {
48361               context.loadTiles(projection);
48362               drawVector(difference, extent);
48363           } else {
48364               editOff();
48365           }
48366
48367           _transformStart = projection.transform();
48368
48369           return map;
48370       }
48371
48372
48373
48374       var immediateRedraw = function(difference, extent) {
48375           if (!difference && !extent) cancelPendingRedraw();
48376           redraw(difference, extent);
48377       };
48378
48379
48380       map.mouse = function() {
48381           var event$$1 = _mouseEvent || event;
48382           if (event$$1) {
48383               var s;
48384               while ((s = event$$1.sourceEvent)) { event$$1 = s; }
48385               return _getMouseCoords(event$$1);
48386           }
48387           return null;
48388       };
48389
48390
48391       // returns Lng/Lat
48392       map.mouseCoordinates = function() {
48393           var coord = map.mouse() || pxCenter();
48394           return projection.invert(coord);
48395       };
48396
48397
48398       map.dblclickEnable = function(val) {
48399           if (!arguments.length) return _dblClickEnabled;
48400           _dblClickEnabled = val;
48401           return map;
48402       };
48403
48404
48405       map.redrawEnable = function(val) {
48406           if (!arguments.length) return _redrawEnabled;
48407           _redrawEnabled = val;
48408           return map;
48409       };
48410
48411
48412       map.isTransformed = function() {
48413           return _isTransformed;
48414       };
48415
48416
48417       function setTransform(t2, duration, force) {
48418           var t$$1 = projection.transform();
48419           if (!force && t2.k === t$$1.k && t2.x === t$$1.x && t2.y === t$$1.y) return false;
48420
48421           if (duration) {
48422               _selection
48423                   .transition()
48424                   .duration(duration)
48425                   .on('start', function() { map.startEase(); })
48426                   .call(zoom$$1.transform, identity$7.translate(t2.x, t2.y).scale(t2.k));
48427           } else {
48428               projection.transform(t2);
48429               _transformStart = t2;
48430               _selection.call(zoom$$1.transform, _transformStart);
48431           }
48432
48433           return true;
48434       }
48435
48436
48437       function setCenterZoom(loc2, z2, duration, force) {
48438           var c = map.center();
48439           var z = map.zoom();
48440           if (loc2[0] === c[0] && loc2[1] === c[1] && z2 === z && !force) return false;
48441
48442           var proj = geoRawMercator().transform(projection.transform());  // copy projection
48443
48444           var k2 = clamp(geoZoomToScale(z2, TILESIZE), kMin, kMax);
48445           proj.scale(k2);
48446
48447           var t$$1 = proj.translate();
48448           var point$$1 = proj(loc2);
48449
48450           var center = pxCenter();
48451           t$$1[0] += center[0] - point$$1[0];
48452           t$$1[1] += center[1] - point$$1[1];
48453
48454           return setTransform(identity$7.translate(t$$1[0], t$$1[1]).scale(k2), duration, force);
48455       }
48456
48457
48458       map.pan = function(delta, duration) {
48459           var t$$1 = projection.translate();
48460           var k = projection.scale();
48461
48462           t$$1[0] += delta[0];
48463           t$$1[1] += delta[1];
48464
48465           if (duration) {
48466               _selection
48467                   .transition()
48468                   .duration(duration)
48469                   .on('start', function() { map.startEase(); })
48470                   .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
48471           } else {
48472               projection.translate(t$$1);
48473               _transformStart = projection.transform();
48474               _selection.call(zoom$$1.transform, _transformStart);
48475               dispatch$$1.call('move', this, map);
48476               immediateRedraw();
48477           }
48478
48479           return map;
48480       };
48481
48482
48483       map.dimensions = function(val) {
48484           if (!arguments.length) return _dimensions;
48485
48486           _dimensions = val;
48487           drawLayers.dimensions(_dimensions);
48488           context.background().dimensions(_dimensions);
48489           projection.clipExtent([[0, 0], _dimensions]);
48490           _getMouseCoords = utilFastMouse(supersurface.node());
48491
48492           scheduleRedraw();
48493           return map;
48494       };
48495
48496
48497       function zoomIn(delta) {
48498           setCenterZoom(map.center(), ~~map.zoom() + delta, 250, true);
48499       }
48500
48501       function zoomOut(delta) {
48502           setCenterZoom(map.center(), ~~map.zoom() - delta, 250, true);
48503       }
48504
48505       map.zoomIn = function() { zoomIn(1); };
48506       map.zoomInFurther = function() { zoomIn(4); };
48507
48508       map.zoomOut = function() { zoomOut(1); };
48509       map.zoomOutFurther = function() { zoomOut(4); };
48510
48511
48512       map.center = function(loc2) {
48513           if (!arguments.length) {
48514               return projection.invert(pxCenter());
48515           }
48516
48517           if (setCenterZoom(loc2, map.zoom())) {
48518               dispatch$$1.call('move', this, map);
48519           }
48520
48521           scheduleRedraw();
48522           return map;
48523       };
48524
48525
48526       map.zoom = function(z2) {
48527           if (!arguments.length) {
48528               return Math.max(geoScaleToZoom(projection.scale(), TILESIZE), 0);
48529           }
48530
48531           if (z2 < _minzoom) {
48532               surface.interrupt();
48533               uiFlash().text(t('cannot_zoom'))();
48534               z2 = context.minEditableZoom();
48535           }
48536
48537           if (setCenterZoom(map.center(), z2)) {
48538               dispatch$$1.call('move', this, map);
48539           }
48540
48541           scheduleRedraw();
48542           return map;
48543       };
48544
48545
48546       map.centerZoom = function(loc2, z2) {
48547           if (setCenterZoom(loc2, z2)) {
48548               dispatch$$1.call('move', this, map);
48549           }
48550
48551           scheduleRedraw();
48552           return map;
48553       };
48554
48555
48556       map.zoomTo = function(entity) {
48557           var extent = entity.extent(context.graph());
48558           if (!isFinite(extent.area())) return map;
48559
48560           var z2 = clamp(map.trimmedExtentZoom(extent), context.minEditableZoom(), 20);
48561           return map.centerZoom(extent.center(), z2);
48562       };
48563
48564
48565       map.centerEase = function(loc2, duration) {
48566           duration = duration || 250;
48567           setCenterZoom(loc2, map.zoom(), duration);
48568           return map;
48569       };
48570
48571
48572       map.zoomEase = function(z2, duration) {
48573           duration = duration || 250;
48574           setCenterZoom(map.center(), z2, duration, false);
48575           return map;
48576       };
48577
48578
48579       map.centerZoomEase = function(loc2, z2, duration) {
48580           duration = duration || 250;
48581           setCenterZoom(loc2, z2, duration, false);
48582           return map;
48583       };
48584
48585
48586       map.transformEase = function(t2, duration) {
48587           duration = duration || 250;
48588           setTransform(t2, duration, false);
48589           return map;
48590       };
48591
48592
48593       map.zoomToEase = function(entity, duration) {
48594           var extent = entity.extent(context.graph());
48595           if (!isFinite(extent.area())) return map;
48596
48597           var z2 = clamp(map.trimmedExtentZoom(extent), context.minEditableZoom(), 20);
48598           return map.centerZoomEase(extent.center(), z2, duration);
48599       };
48600
48601
48602       map.startEase = function() {
48603           utilBindOnce(surface, 'mousedown.ease', function() {
48604               map.cancelEase();
48605           });
48606           return map;
48607       };
48608
48609
48610       map.cancelEase = function() {
48611           _selection.interrupt();
48612           return map;
48613       };
48614
48615
48616       map.extent = function(val) {
48617           if (!arguments.length) {
48618               return new geoExtent$$1(
48619                   projection.invert([0, _dimensions[1]]),
48620                   projection.invert([_dimensions[0], 0])
48621               );
48622           } else {
48623               var extent = geoExtent$$1(val);
48624               map.centerZoom(extent.center(), map.extentZoom(extent));
48625           }
48626       };
48627
48628
48629       map.trimmedExtent = function(val) {
48630           if (!arguments.length) {
48631               var headerY = 60;
48632               var footerY = 30;
48633               var pad = 10;
48634               return new geoExtent$$1(
48635                   projection.invert([pad, _dimensions[1] - footerY - pad]),
48636                   projection.invert([_dimensions[0] - pad, headerY + pad])
48637               );
48638           } else {
48639               var extent = geoExtent$$1(val);
48640               map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
48641           }
48642       };
48643
48644
48645       function calcExtentZoom(extent, dim) {
48646           var tl = projection([extent[0][0], extent[1][1]]);
48647           var br = projection([extent[1][0], extent[0][1]]);
48648
48649           // Calculate maximum zoom that fits extent
48650           var hFactor = (br[0] - tl[0]) / dim[0];
48651           var vFactor = (br[1] - tl[1]) / dim[1];
48652           var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
48653           var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
48654           var newZoom = map.zoom() - Math.max(hZoomDiff, vZoomDiff);
48655
48656           return newZoom;
48657       }
48658
48659
48660       map.extentZoom = function(val) {
48661           return calcExtentZoom(geoExtent$$1(val), _dimensions);
48662       };
48663
48664
48665       map.trimmedExtentZoom = function(val) {
48666           var trimY = 120;
48667           var trimX = 40;
48668           var trimmed = [_dimensions[0] - trimX, _dimensions[1] - trimY];
48669           return calcExtentZoom(geoExtent$$1(val), trimmed);
48670       };
48671
48672
48673       map.editable = function() {
48674           var osmLayer = surface.selectAll('.data-layer.osm');
48675           if (!osmLayer.empty() && osmLayer.classed('disabled')) return false;
48676
48677           return map.zoom() >= context.minEditableZoom();
48678       };
48679
48680
48681       map.notesEditable = function() {
48682           var noteLayer = surface.selectAll('.data-layer.notes');
48683           if (!noteLayer.empty() && noteLayer.classed('disabled')) return false;
48684
48685           return map.zoom() >= context.minEditableZoom();
48686       };
48687
48688
48689       map.minzoom = function(val) {
48690           if (!arguments.length) return _minzoom;
48691           _minzoom = val;
48692           return map;
48693       };
48694
48695
48696       map.layers = drawLayers;
48697
48698
48699       return utilRebind(map, dispatch$$1, 'on');
48700   }
48701
48702   function uiMapInMap(context) {
48703
48704       function map_in_map(selection$$1) {
48705           var backgroundLayer = rendererTileLayer(context);
48706           var overlayLayers = {};
48707           var projection$$1 = geoRawMercator();
48708           var dataLayer = svgData$$1(projection$$1, context).showLabels(false);
48709           var debugLayer = svgDebug$$1(projection$$1, context);
48710           var zoom$$1 = d3_zoom()
48711               .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(24)])
48712               .on('start', zoomStarted)
48713               .on('zoom', zoomed)
48714               .on('end', zoomEnded);
48715           var isTransformed = false;
48716           var isHidden = true;
48717           var skipEvents = false;
48718           var gesture = null;
48719           var zDiff = 6;    // by default, minimap renders at (main zoom - 6)
48720           var wrap = select(null);
48721           var tiles = select(null);
48722           var viewport = select(null);
48723           var tStart;    // transform at start of gesture
48724           var tCurr;     // transform at most recent event
48725           var timeoutId;
48726
48727
48728           function zoomStarted() {
48729               if (skipEvents) return;
48730               tStart = tCurr = projection$$1.transform();
48731               gesture = null;
48732           }
48733
48734
48735           function zoomed() {
48736               if (skipEvents) return;
48737
48738               var x = event.transform.x;
48739               var y = event.transform.y;
48740               var k = event.transform.k;
48741               var isZooming = (k !== tStart.k);
48742               var isPanning = (x !== tStart.x || y !== tStart.y);
48743
48744               if (!isZooming && !isPanning) {
48745                   return;  // no change
48746               }
48747
48748               // lock in either zooming or panning, don't allow both in minimap.
48749               if (!gesture) {
48750                   gesture = isZooming ? 'zoom' : 'pan';
48751               }
48752
48753               var tMini = projection$$1.transform();
48754               var tX, tY, scale;
48755
48756               if (gesture === 'zoom') {
48757                   var dMini = utilGetDimensions(wrap);
48758                   var cMini = geoVecScale(dMini, 0.5);
48759                   scale = k / tMini.k;
48760                   tX = (cMini[0] / scale - cMini[0]) * scale;
48761                   tY = (cMini[1] / scale - cMini[1]) * scale;
48762               } else {
48763                   k = tMini.k;
48764                   scale = 1;
48765                   tX = x - tMini.x;
48766                   tY = y - tMini.y;
48767               }
48768
48769               utilSetTransform(tiles, tX, tY, scale);
48770               utilSetTransform(viewport, 0, 0, scale);
48771               isTransformed = true;
48772               tCurr = identity$7.translate(x, y).scale(k);
48773
48774               var zMain = geoScaleToZoom(context.projection.scale());
48775               var zMini = geoScaleToZoom(k);
48776
48777               zDiff = zMain - zMini;
48778
48779               queueRedraw();
48780           }
48781
48782
48783           function zoomEnded() {
48784               if (skipEvents) return;
48785               if (gesture !== 'pan') return;
48786
48787               updateProjection();
48788               gesture = null;
48789               var dMini = utilGetDimensions(wrap);
48790               var cMini = geoVecScale(dMini, 0.5);
48791               context.map().center(projection$$1.invert(cMini));   // recenter main map..
48792           }
48793
48794
48795           function updateProjection() {
48796               var loc = context.map().center();
48797               var dMini = utilGetDimensions(wrap);
48798               var cMini = geoVecScale(dMini, 0.5);
48799               var tMain = context.projection.transform();
48800               var zMain = geoScaleToZoom(tMain.k);
48801               var zMini = Math.max(zMain - zDiff, 0.5);
48802               var kMini = geoZoomToScale(zMini);
48803
48804               projection$$1
48805                   .translate([tMain.x, tMain.y])
48806                   .scale(kMini);
48807
48808               var point$$1 = projection$$1(loc);
48809               var mouse$$1 = (gesture === 'pan') ? geoVecSubtract([tCurr.x, tCurr.y], [tStart.x, tStart.y]) : [0, 0];
48810               var xMini = cMini[0] - point$$1[0] + tMain.x + mouse$$1[0];
48811               var yMini = cMini[1] - point$$1[1] + tMain.y + mouse$$1[1];
48812
48813               projection$$1
48814                   .translate([xMini, yMini])
48815                   .clipExtent([[0, 0], dMini]);
48816
48817               tCurr = projection$$1.transform();
48818
48819               if (isTransformed) {
48820                   utilSetTransform(tiles, 0, 0);
48821                   utilSetTransform(viewport, 0, 0);
48822                   isTransformed = false;
48823               }
48824
48825               zoom$$1
48826                   .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(zMain - 3)]);
48827
48828               skipEvents = true;
48829               wrap.call(zoom$$1.transform, tCurr);
48830               skipEvents = false;
48831           }
48832
48833
48834           function redraw() {
48835               clearTimeout(timeoutId);
48836               if (isHidden) return;
48837
48838               updateProjection();
48839
48840               var dMini = utilGetDimensions(wrap);
48841               var zMini = geoScaleToZoom(projection$$1.scale());
48842
48843               // setup tile container
48844               tiles = wrap
48845                   .selectAll('.map-in-map-tiles')
48846                   .data([0]);
48847
48848               tiles = tiles.enter()
48849                   .append('div')
48850                   .attr('class', 'map-in-map-tiles')
48851                   .merge(tiles);
48852
48853               // redraw background
48854               backgroundLayer
48855                   .source(context.background().baseLayerSource())
48856                   .projection(projection$$1)
48857                   .dimensions(dMini);
48858
48859               var background = tiles
48860                   .selectAll('.map-in-map-background')
48861                   .data([0]);
48862
48863               background.enter()
48864                   .append('div')
48865                   .attr('class', 'map-in-map-background')
48866                   .merge(background)
48867                   .call(backgroundLayer);
48868
48869
48870               // redraw overlay
48871               var overlaySources = context.background().overlayLayerSources();
48872               var activeOverlayLayers = [];
48873               for (var i = 0; i < overlaySources.length; i++) {
48874                   if (overlaySources[i].validZoom(zMini)) {
48875                       if (!overlayLayers[i]) overlayLayers[i] = rendererTileLayer(context);
48876                       activeOverlayLayers.push(overlayLayers[i]
48877                           .source(overlaySources[i])
48878                           .projection(projection$$1)
48879                           .dimensions(dMini));
48880                   }
48881               }
48882
48883               var overlay = tiles
48884                   .selectAll('.map-in-map-overlay')
48885                   .data([0]);
48886
48887               overlay = overlay.enter()
48888                   .append('div')
48889                   .attr('class', 'map-in-map-overlay')
48890                   .merge(overlay);
48891
48892
48893               var overlays = overlay
48894                   .selectAll('div')
48895                   .data(activeOverlayLayers, function(d) { return d.source().name(); });
48896
48897               overlays.exit()
48898                   .remove();
48899
48900               overlays = overlays.enter()
48901                   .append('div')
48902                   .merge(overlays)
48903                   .each(function(layer) { select(this).call(layer); });
48904
48905
48906               var dataLayers = tiles
48907                   .selectAll('.map-in-map-data')
48908                   .data([0]);
48909
48910               dataLayers.exit()
48911                   .remove();
48912
48913               dataLayers = dataLayers.enter()
48914                   .append('svg')
48915                   .attr('class', 'map-in-map-data')
48916                   .merge(dataLayers)
48917                   .call(dataLayer)
48918                   .call(debugLayer);
48919
48920
48921               // redraw viewport bounding box
48922               if (gesture !== 'pan') {
48923                   var getPath = d3_geoPath(projection$$1);
48924                   var bbox = { type: 'Polygon', coordinates: [context.map().extent().polygon()] };
48925
48926                   viewport = wrap.selectAll('.map-in-map-viewport')
48927                       .data([0]);
48928
48929                   viewport = viewport.enter()
48930                       .append('svg')
48931                       .attr('class', 'map-in-map-viewport')
48932                       .merge(viewport);
48933
48934
48935                   var path = viewport.selectAll('.map-in-map-bbox')
48936                       .data([bbox]);
48937
48938                   path.enter()
48939                       .append('path')
48940                       .attr('class', 'map-in-map-bbox')
48941                       .merge(path)
48942                       .attr('d', getPath)
48943                       .classed('thick', function(d) { return getPath.area(d) < 30; });
48944               }
48945           }
48946
48947
48948           function queueRedraw() {
48949               clearTimeout(timeoutId);
48950               timeoutId = setTimeout(function() { redraw(); }, 750);
48951           }
48952
48953
48954           function toggle() {
48955               if (event) event.preventDefault();
48956
48957               isHidden = !isHidden;
48958
48959               select('.minimap-toggle-item')
48960                   .classed('active', !isHidden)
48961                   .select('input')
48962                   .property('checked', !isHidden);
48963
48964               if (isHidden) {
48965                   wrap
48966                       .style('display', 'block')
48967                       .style('opacity', '1')
48968                       .transition()
48969                       .duration(200)
48970                       .style('opacity', '0')
48971                       .on('end', function() {
48972                           selection$$1.selectAll('.map-in-map')
48973                               .style('display', 'none');
48974                       });
48975               } else {
48976                   wrap
48977                       .style('display', 'block')
48978                       .style('opacity', '0')
48979                       .transition()
48980                       .duration(200)
48981                       .style('opacity', '1')
48982                       .on('end', function() {
48983                           redraw();
48984                       });
48985               }
48986           }
48987
48988
48989           uiMapInMap.toggle = toggle;
48990
48991           wrap = selection$$1.selectAll('.map-in-map')
48992               .data([0]);
48993
48994           wrap = wrap.enter()
48995               .append('div')
48996               .attr('class', 'map-in-map')
48997               .style('display', (isHidden ? 'none' : 'block'))
48998               .call(zoom$$1)
48999               .on('dblclick.zoom', null)
49000               .merge(wrap);
49001
49002           context.map()
49003               .on('drawn.map-in-map', function(drawn) {
49004                   if (drawn.full === true) {
49005                       redraw();
49006                   }
49007               });
49008
49009           redraw();
49010
49011           context.keybinding()
49012               .on(t('background.minimap.key'), toggle);
49013       }
49014
49015       return map_in_map;
49016   }
49017
49018   function uiSettingsCustomBackground(context) {
49019       var dispatch$$1 = dispatch('change');
49020
49021       function render(selection) {
49022           var _origSettings = {
49023               template: context.storage('background-custom-template')
49024           };
49025           var _currSettings = cloneDeep(_origSettings);
49026           var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
49027           var modal = uiConfirm(selection).okButton();
49028
49029           modal
49030               .classed('settings-modal settings-custom-background', true);
49031
49032           modal.select('.modal-section.header')
49033               .append('h3')
49034               .text(t('settings.custom_background.header'));
49035
49036
49037           var textSection = modal.select('.modal-section.message-text');
49038
49039           textSection
49040               .append('pre')
49041               .attr('class', 'instructions-template')
49042               .text(t('settings.custom_background.instructions', { example: example }));
49043
49044           textSection
49045               .append('textarea')
49046               .attr('class', 'field-template')
49047               .attr('placeholder', t('settings.custom_background.template.placeholder'))
49048               .call(utilNoAuto)
49049               .property('value', _currSettings.template);
49050
49051
49052           // insert a cancel button
49053           var buttonSection = modal.select('.modal-section.buttons');
49054
49055           buttonSection
49056               .insert('button', '.ok-button')
49057               .attr('class', 'button cancel-button secondary-action')
49058               .text(t('confirm.cancel'));
49059
49060
49061           buttonSection.select('.cancel-button')
49062               .on('click.cancel', clickCancel);
49063
49064           buttonSection.select('.ok-button')
49065               .attr('disabled', isSaveDisabled)
49066               .on('click.save', clickSave);
49067
49068
49069           function isSaveDisabled() {
49070               return null;
49071           }
49072
49073
49074           // restore the original template
49075           function clickCancel() {
49076               textSection.select('.field-template').property('value', _origSettings.template);
49077               context.storage('background-custom-template', _origSettings.template);
49078               this.blur();
49079               modal.close();
49080           }
49081
49082           // accept the current template
49083           function clickSave() {
49084               _currSettings.template = textSection.select('.field-template').property('value');
49085               context.storage('background-custom-template', _currSettings.template);
49086               this.blur();
49087               modal.close();
49088               dispatch$$1.call('change', this, _currSettings);
49089           }
49090       }
49091
49092       return utilRebind(render, dispatch$$1, 'on');
49093   }
49094
49095   function uiBackground(context) {
49096       var key = t('background.key');
49097
49098       var pane = select(null);
49099
49100       var _customSource = context.background().findSource('custom');
49101       var _previousBackground = context.background().findSource(context.storage('background-last-used-toggle'));
49102       var _shown = false;
49103
49104       var _backgroundList = select(null);
49105       var _overlayList = select(null);
49106       var _displayOptionsContainer = select(null);
49107       var _offsetContainer = select(null);
49108
49109       var backgroundDisplayOptions = uiBackgroundDisplayOptions(context);
49110       var backgroundOffset = uiBackgroundOffset(context);
49111
49112       var settingsCustomBackground = uiSettingsCustomBackground(context)
49113           .on('change', customChanged);
49114
49115
49116       function setTooltips(selection$$1) {
49117           selection$$1.each(function(d, i, nodes) {
49118               var item = select(this).select('label');
49119               var span = item.select('span');
49120               var placement = (i < nodes.length / 2) ? 'bottom' : 'top';
49121               var description = d.description();
49122               var isOverflowing = (span.property('clientWidth') !== span.property('scrollWidth'));
49123
49124               item.call(tooltip().destroyAny);
49125
49126               if (d === _previousBackground) {
49127                   item.call(tooltip()
49128                       .placement(placement)
49129                       .html(true)
49130                       .title(function() {
49131                           var tip = '<div>' + t('background.switch') + '</div>';
49132                           return uiTooltipHtml(tip, uiCmd('⌘' + key));
49133                       })
49134                   );
49135               } else if (description || isOverflowing) {
49136                   item.call(tooltip()
49137                       .placement(placement)
49138                       .title(description || d.name())
49139                   );
49140               }
49141           });
49142       }
49143
49144
49145       function updateLayerSelections(selection$$1) {
49146           function active(d) {
49147               return context.background().showsLayer(d);
49148           }
49149
49150           selection$$1.selectAll('.layer')
49151               .classed('active', active)
49152               .classed('switch', function(d) { return d === _previousBackground; })
49153               .call(setTooltips)
49154               .selectAll('input')
49155               .property('checked', active);
49156       }
49157
49158
49159       function chooseBackground(d) {
49160           if (d.id === 'custom' && !d.template()) {
49161               return editCustom();
49162           }
49163
49164           event.preventDefault();
49165           _previousBackground = context.background().baseLayerSource();
49166           context.storage('background-last-used-toggle', _previousBackground.id);
49167           context.storage('background-last-used', d.id);
49168           context.background().baseLayerSource(d);
49169           _backgroundList.call(updateLayerSelections);
49170           document.activeElement.blur();
49171       }
49172
49173
49174       function customChanged(d) {
49175           if (d && d.template) {
49176               _customSource.template(d.template);
49177               chooseBackground(_customSource);
49178           } else {
49179               _customSource.template('');
49180               chooseBackground(context.background().findSource('none'));
49181           }
49182       }
49183
49184
49185       function editCustom() {
49186           event.preventDefault();
49187           context.container()
49188               .call(settingsCustomBackground);
49189       }
49190
49191
49192       function chooseOverlay(d) {
49193           event.preventDefault();
49194           context.background().toggleOverlayLayer(d);
49195           _overlayList.call(updateLayerSelections);
49196           document.activeElement.blur();
49197       }
49198
49199
49200       function drawListItems(layerList, type, change, filter) {
49201           var sources = context.background()
49202               .sources(context.map().extent())
49203               .filter(filter);
49204
49205           var layerLinks = layerList.selectAll('li.layer')
49206               .data(sources, function(d) { return d.name(); });
49207
49208           layerLinks.exit()
49209               .remove();
49210
49211           var enter = layerLinks.enter()
49212               .append('li')
49213               .attr('class', 'layer')
49214               .classed('layer-custom', function(d) { return d.id === 'custom'; })
49215               .classed('best', function(d) { return d.best(); });
49216
49217           enter.filter(function(d) { return d.id === 'custom'; })
49218               .append('button')
49219               .attr('class', 'layer-browse')
49220               .call(tooltip()
49221                   .title(t('settings.custom_background.tooltip'))
49222                   .placement((textDirection === 'rtl') ? 'right' : 'left')
49223               )
49224               .on('click', editCustom)
49225               .call(svgIcon('#iD-icon-more'));
49226
49227           enter.filter(function(d) { return d.best(); })
49228               .append('div')
49229               .attr('class', 'best')
49230               .call(tooltip()
49231                   .title(t('background.best_imagery'))
49232                   .placement((textDirection === 'rtl') ? 'right' : 'left')
49233               )
49234               .append('span')
49235               .html('&#9733;');
49236
49237           var label = enter
49238               .append('label');
49239
49240           label
49241               .append('input')
49242               .attr('type', type)
49243               .attr('name', 'layers')
49244               .on('change', change);
49245
49246           label
49247               .append('span')
49248               .text(function(d) { return d.name(); });
49249
49250
49251           layerList.selectAll('li.layer')
49252               .sort(sortSources)
49253               .style('display', layerList.selectAll('li.layer').data().length > 0 ? 'block' : 'none');
49254
49255           layerList
49256               .call(updateLayerSelections);
49257
49258
49259           function sortSources(a, b) {
49260               return a.best() && !b.best() ? -1
49261                   : b.best() && !a.best() ? 1
49262                   : d3_descending(a.area(), b.area()) || ascending(a.name(), b.name()) || 0;
49263           }
49264       }
49265
49266
49267       function renderBackgroundList(selection$$1) {
49268
49269           // the background list
49270           var container = selection$$1.selectAll('.layer-background-list')
49271               .data([0]);
49272
49273           _backgroundList = container.enter()
49274               .append('ul')
49275               .attr('class', 'layer-list layer-background-list')
49276               .attr('dir', 'auto')
49277               .merge(container);
49278
49279
49280           // add minimap toggle below list
49281           var minimapEnter = selection$$1.selectAll('.minimap-toggle-list')
49282               .data([0])
49283               .enter()
49284               .append('ul')
49285               .attr('class', 'layer-list minimap-toggle-list')
49286               .append('li')
49287               .attr('class', 'layer minimap-toggle-item');
49288
49289           var minimapLabelEnter = minimapEnter
49290               .append('label')
49291               .call(tooltip()
49292                   .html(true)
49293                   .title(uiTooltipHtml(t('background.minimap.tooltip'), t('background.minimap.key')))
49294                   .placement('top')
49295               );
49296
49297           minimapLabelEnter
49298               .append('input')
49299               .attr('type', 'checkbox')
49300               .on('change', function() {
49301                   event.preventDefault();
49302                   uiMapInMap.toggle();
49303               });
49304
49305           minimapLabelEnter
49306               .append('span')
49307               .text(t('background.minimap.description'));
49308
49309
49310           // "Info / Report a Problem" link
49311           selection$$1.selectAll('.imagery-faq')
49312               .data([0])
49313               .enter()
49314               .append('div')
49315               .attr('class', 'imagery-faq')
49316               .append('a')
49317               .attr('target', '_blank')
49318               .attr('tabindex', -1)
49319               .call(svgIcon('#iD-icon-out-link', 'inline'))
49320               .attr('href', 'https://github.com/openstreetmap/iD/blob/master/FAQ.md#how-can-i-report-an-issue-with-background-imagery')
49321               .append('span')
49322               .text(t('background.imagery_source_faq'));
49323
49324           updateBackgroundList();
49325       }
49326
49327
49328       function renderOverlayList(selection$$1) {
49329           var container = selection$$1.selectAll('.layer-overlay-list')
49330               .data([0]);
49331
49332           _overlayList = container.enter()
49333               .append('ul')
49334               .attr('class', 'layer-list layer-overlay-list')
49335               .attr('dir', 'auto')
49336               .merge(container);
49337
49338           updateOverlayList();
49339       }
49340
49341       function updateBackgroundList() {
49342           _backgroundList
49343               .call(drawListItems, 'radio', chooseBackground, function(d) { return !d.isHidden() && !d.overlay; });
49344       }
49345
49346       function updateOverlayList() {
49347           _overlayList
49348               .call(drawListItems, 'checkbox', chooseOverlay, function(d) { return !d.isHidden() && d.overlay; });
49349       }
49350
49351
49352       function update() {
49353
49354           if (!pane.select('.disclosure-wrap-background_list').classed('hide')) {
49355               updateBackgroundList();
49356           }
49357
49358           if (!pane.select('.disclosure-wrap-overlay_list').classed('hide')) {
49359               updateOverlayList();
49360           }
49361
49362           _displayOptionsContainer
49363               .call(backgroundDisplayOptions);
49364
49365           _offsetContainer
49366               .call(backgroundOffset);
49367       }
49368
49369
49370       function quickSwitch() {
49371           if (event) {
49372               event.stopImmediatePropagation();
49373               event.preventDefault();
49374           }
49375           if (_previousBackground) {
49376               chooseBackground(_previousBackground);
49377           }
49378       }
49379
49380
49381       function background(selection$$1) {
49382
49383           function hidePane() {
49384               setVisible(false);
49385           }
49386
49387           function togglePane() {
49388               if (event) event.preventDefault();
49389               paneTooltip.hide(button);
49390               setVisible(!button.classed('active'));
49391           }
49392
49393           function setVisible(show) {
49394               if (show !== _shown) {
49395                   button.classed('active', show);
49396                   _shown = show;
49397
49398                   if (show) {
49399                       uiMapData.hidePane();
49400                       uiHelp.hidePane();
49401                       update();
49402
49403                       pane
49404                           .style('display', 'block')
49405                           .style('right', '-300px')
49406                           .transition()
49407                           .duration(200)
49408                           .style('right', '0px');
49409
49410                   } else {
49411                       pane
49412                           .style('display', 'block')
49413                           .style('right', '0px')
49414                           .transition()
49415                           .duration(200)
49416                           .style('right', '-300px')
49417                           .on('end', function() {
49418                               select(this).style('display', 'none');
49419                           });
49420                   }
49421               }
49422           }
49423
49424
49425           pane = selection$$1
49426               .append('div')
49427               .attr('class', 'fillL map-pane hide');
49428
49429           var paneTooltip = tooltip()
49430               .placement((textDirection === 'rtl') ? 'right' : 'left')
49431               .html(true)
49432               .title(uiTooltipHtml(t('background.description'), key));
49433
49434           var button = selection$$1
49435               .append('button')
49436               .attr('tabindex', -1)
49437               .on('click', togglePane)
49438               .call(svgIcon('#iD-icon-layers', 'light'))
49439               .call(paneTooltip);
49440
49441
49442           var heading = pane
49443               .append('div')
49444               .attr('class', 'pane-heading');
49445
49446           heading
49447               .append('h2')
49448               .text(t('background.title'));
49449
49450           heading
49451               .append('button')
49452               .on('click', function() { uiBackground.hidePane(); })
49453               .call(svgIcon('#iD-icon-close'));
49454
49455
49456           var content = pane
49457               .append('div')
49458               .attr('class', 'pane-content');
49459
49460           // background list
49461           content
49462               .append('div')
49463               .attr('class', 'background-background-list-container')
49464               .call(uiDisclosure(context, 'background_list', true)
49465                   .title(t('background.backgrounds'))
49466                   .content(renderBackgroundList)
49467               );
49468
49469           // overlay list
49470           content
49471               .append('div')
49472               .attr('class', 'background-overlay-list-container')
49473               .call(uiDisclosure(context, 'overlay_list', true)
49474                   .title(t('background.overlays'))
49475                   .content(renderOverlayList)
49476               );
49477
49478           // display options
49479           _displayOptionsContainer = content
49480               .append('div')
49481               .attr('class', 'background-display-options');
49482
49483           // offset controls
49484           _offsetContainer = content
49485               .append('div')
49486               .attr('class', 'background-offset');
49487
49488
49489           // add listeners
49490           context.map()
49491               .on('move.background-update', debounce(utilCallWhenIdle(update), 1000));
49492
49493           context.background()
49494               .on('change.background-update', update);
49495
49496
49497           update();
49498
49499           context.keybinding()
49500               .on(key, togglePane)
49501               .on(uiCmd('⌘' + key), quickSwitch);
49502
49503           uiBackground.hidePane = hidePane;
49504           uiBackground.togglePane = togglePane;
49505           uiBackground.setVisible = setVisible;
49506       }
49507
49508       return background;
49509   }
49510
49511   function uiContributors(context) {
49512       var osm = context.connection(),
49513           debouncedUpdate = debounce(function() { update(); }, 1000),
49514           limit = 4,
49515           hidden = false,
49516           wrap = select(null);
49517
49518
49519       function update() {
49520           if (!osm) return;
49521
49522           var users = {},
49523               entities = context.intersects(context.map().extent());
49524
49525           entities.forEach(function(entity) {
49526               if (entity && entity.user) users[entity.user] = true;
49527           });
49528
49529           var u = Object.keys(users),
49530               subset = u.slice(0, u.length > limit ? limit - 1 : limit);
49531
49532           wrap.html('')
49533               .call(svgIcon('#iD-icon-nearby', 'pre-text light'));
49534
49535           var userList = select(document.createElement('span'));
49536
49537           userList.selectAll()
49538               .data(subset)
49539               .enter()
49540               .append('a')
49541               .attr('class', 'user-link')
49542               .attr('href', function(d) { return osm.userURL(d); })
49543               .attr('target', '_blank')
49544               .attr('tabindex', -1)
49545               .text(String);
49546
49547           if (u.length > limit) {
49548               var count = select(document.createElement('span'));
49549
49550               count.append('a')
49551                   .attr('target', '_blank')
49552                   .attr('tabindex', -1)
49553                   .attr('href', function() {
49554                       return osm.changesetsURL(context.map().center(), context.map().zoom());
49555                   })
49556                   .text(u.length - limit + 1);
49557
49558               wrap.append('span')
49559                   .html(t('contributors.truncated_list', { users: userList.html(), count: count.html() }));
49560
49561           } else {
49562               wrap.append('span')
49563                   .html(t('contributors.list', { users: userList.html() }));
49564           }
49565
49566           if (!u.length) {
49567               hidden = true;
49568               wrap
49569                   .transition()
49570                   .style('opacity', 0);
49571
49572           } else if (hidden) {
49573               wrap
49574                   .transition()
49575                   .style('opacity', 1);
49576           }
49577       }
49578
49579
49580       return function(selection$$1) {
49581           if (!osm) return;
49582           wrap = selection$$1;
49583           update();
49584
49585           osm.on('loaded.contributors', debouncedUpdate);
49586           context.map().on('move.contributors', debouncedUpdate);
49587       };
49588   }
49589
49590   function uiFeatureInfo(context) {
49591       function update(selection$$1) {
49592           var features = context.features(),
49593               stats = features.stats(),
49594               count = 0,
49595               hiddenList = compact(map$3(features.hidden(), function(k) {
49596                   if (stats[k]) {
49597                       count += stats[k];
49598                       return String(stats[k]) + ' ' + t('feature.' + k + '.description');
49599                   }
49600               }));
49601
49602           selection$$1.html('');
49603
49604           if (hiddenList.length) {
49605               var tooltipBehavior = tooltip()
49606                   .placement('top')
49607                   .html(true)
49608                   .title(function() {
49609                       return uiTooltipHtml(hiddenList.join('<br/>'));
49610                   });
49611
49612               var warning = selection$$1.append('a')
49613                   .attr('href', '#')
49614                   .attr('tabindex', -1)
49615                   .html(t('feature_info.hidden_warning', { count: count }))
49616                   .call(tooltipBehavior)
49617                   .on('click', function() {
49618                       tooltipBehavior.hide(warning);
49619                       // open map data panel?
49620                       event.preventDefault();
49621                   });
49622           }
49623
49624           selection$$1
49625               .classed('hide', !hiddenList.length);
49626       }
49627
49628
49629       return function(selection$$1) {
49630           update(selection$$1);
49631
49632           context.features().on('change.feature_info', function() {
49633               update(selection$$1);
49634           });
49635       };
49636   }
49637
49638   function uiFullScreen(context) {
49639       var element = context.container().node();
49640       // var button = d3_select(null);
49641
49642
49643       function getFullScreenFn() {
49644           if (element.requestFullscreen) {
49645               return element.requestFullscreen;
49646           } else if (element.msRequestFullscreen) {
49647               return element.msRequestFullscreen;
49648           } else if (element.mozRequestFullScreen) {
49649               return element.mozRequestFullScreen;
49650           } else if (element.webkitRequestFullscreen) {
49651               return element.webkitRequestFullscreen;
49652           }
49653       }
49654
49655
49656       function getExitFullScreenFn() {
49657           if (document.exitFullscreen) {
49658               return document.exitFullscreen;
49659           } else if (document.msExitFullscreen) {
49660               return document.msExitFullscreen;
49661           } else if (document.mozCancelFullScreen) {
49662               return document.mozCancelFullScreen;
49663           } else if (document.webkitExitFullscreen) {
49664               return document.webkitExitFullscreen;
49665           }
49666       }
49667
49668
49669       function isFullScreen() {
49670           return document.fullscreenElement ||
49671               document.mozFullScreenElement ||
49672               document.webkitFullscreenElement ||
49673               document.msFullscreenElement;
49674       }
49675
49676
49677       function isSupported() {
49678           return !!getFullScreenFn();
49679       }
49680
49681
49682       function fullScreen() {
49683           event.preventDefault();
49684           if (!isFullScreen()) {
49685               // button.classed('active', true);
49686               getFullScreenFn().apply(element);
49687           } else {
49688               // button.classed('active', false);
49689               getExitFullScreenFn().apply(document);
49690           }
49691       }
49692
49693
49694       return function() { // selection) {
49695           if (!isSupported()) return;
49696
49697           // button = selection.append('button')
49698           //     .attr('title', t('full_screen'))
49699           //     .attr('tabindex', -1)
49700           //     .on('click', fullScreen)
49701           //     .call(tooltip);
49702
49703           // button.append('span')
49704           //     .attr('class', 'icon full-screen');
49705
49706           var detected = utilDetect();
49707           var keys = (detected.os === 'mac' ? [uiCmd('⌃⌘F'), 'f11'] : ['f11']);
49708           context.keybinding().on(keys, fullScreen);
49709       };
49710   }
49711
49712   function uiLoading(context) {
49713       var _modalSelection = select(null);
49714       var _message = '';
49715       var _blocking = false;
49716
49717
49718       var loading = function(selection$$1) {
49719           _modalSelection = uiModal(selection$$1, _blocking);
49720
49721           var loadertext = _modalSelection.select('.content')
49722               .classed('loading-modal', true)
49723               .append('div')
49724               .attr('class', 'modal-section fillL');
49725
49726           loadertext
49727               .append('img')
49728               .attr('class', 'loader')
49729               .attr('src', context.imagePath('loader-white.gif'));
49730
49731           loadertext
49732               .append('h3')
49733               .text(_message);
49734
49735           _modalSelection.select('button.close')
49736               .attr('class', 'hide');
49737
49738           return loading;
49739       };
49740
49741
49742       loading.message = function(_) {
49743           if (!arguments.length) return _message;
49744           _message = _;
49745           return loading;
49746       };
49747
49748
49749       loading.blocking = function(_) {
49750           if (!arguments.length) return _blocking;
49751           _blocking = _;
49752           return loading;
49753       };
49754
49755
49756       loading.close = function() {
49757           _modalSelection.remove();
49758       };
49759
49760
49761       return loading;
49762   }
49763
49764   function uiGeolocate(context) {
49765       var geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ };
49766       var locating = uiLoading(context).message(t('geolocate.locating')).blocking(true);
49767       var layer = context.layers().layer('geolocate');
49768       var _position;
49769       var _extent;
49770       var _timeoutID;
49771
49772
49773       function click() {
49774           if (context.inIntro()) return;
49775           context.enter(modeBrowse(context));
49776           if (!layer.enabled()) {
49777               if (!_position) {
49778                   context.container().call(locating);
49779                   navigator.geolocation.getCurrentPosition(success, error, geoOptions);
49780               } else {
49781                   zoomTo();
49782               }
49783           } else {
49784               layer.enabled(null, false);
49785           }
49786           // This timeout ensures that we still call finish() even if
49787           // the user declines to share their location in Firefox
49788           _timeoutID = setTimeout(finish, 10000 /* 10sec */ );
49789       }
49790
49791       function zoomTo() {
49792           var map = context.map();
49793           layer.enabled(_position, true);
49794           map.centerZoomEase(_extent.center(), Math.min(20, map.extentZoom(_extent)));
49795       }
49796
49797
49798       function success(geolocation) {
49799           _position = geolocation;
49800           var coords = _position.coords;
49801           _extent = geoExtent$$1([coords.longitude, coords.latitude]).padByMeters(coords.accuracy);
49802           zoomTo();
49803           finish();
49804       }
49805
49806
49807       function error() {
49808           finish();
49809       }
49810
49811
49812       function finish() {
49813           locating.close();  // unblock ui
49814           if (_timeoutID) { clearTimeout(_timeoutID); }
49815           _timeoutID = undefined;
49816       }
49817
49818
49819       return function(selection) {
49820           if (!navigator.geolocation) return;
49821
49822           selection
49823               .append('button')
49824               .attr('tabindex', -1)
49825               .attr('title', t('geolocate.title'))
49826               .on('click', click)
49827               .call(svgIcon('#iD-icon-geolocate', 'light'))
49828               .call(tooltip()
49829                   .placement((textDirection === 'rtl') ? 'right' : 'left'));
49830       };
49831   }
49832
49833   function uiPanelBackground(context) {
49834       var background = context.background();
49835       var currSourceName = null;
49836       var metadata = {};
49837       var metadataKeys = [
49838           'zoom', 'vintage', 'source', 'description', 'resolution', 'accuracy'
49839       ];
49840
49841       var debouncedRedraw = debounce(redraw, 250);
49842
49843       function redraw(selection$$1) {
49844           var source = background.baseLayerSource();
49845           var isDG = (source.id.match(/^DigitalGlobe/i) !== null);
49846
49847           if (currSourceName !== source.name()) {
49848               currSourceName = source.name();
49849               metadata = {};
49850           }
49851
49852           selection$$1.html('');
49853
49854           var list = selection$$1
49855               .append('ul')
49856               .attr('class', 'background-info');
49857
49858           list
49859               .append('li')
49860               .text(currSourceName);
49861
49862           metadataKeys.forEach(function(k) {
49863               // DigitalGlobe vintage is available in raster layers for now.
49864               if (isDG && k === 'vintage') return;
49865
49866               list
49867                   .append('li')
49868                   .attr('class', 'background-info-list-' + k)
49869                   .classed('hide', !metadata[k])
49870                   .text(t('info_panels.background.' + k) + ':')
49871                   .append('span')
49872                   .attr('class', 'background-info-span-' + k)
49873                   .text(metadata[k]);
49874           });
49875
49876           debouncedGetMetadata(selection$$1);
49877
49878           var toggleTiles = context.getDebug('tile') ? 'hide_tiles' : 'show_tiles';
49879
49880           selection$$1
49881               .append('a')
49882               .text(t('info_panels.background.' + toggleTiles))
49883               .attr('href', '#')
49884               .attr('class', 'button button-toggle-tiles')
49885               .on('click', function() {
49886                   event.preventDefault();
49887                   context.setDebug('tile', !context.getDebug('tile'));
49888                   selection$$1.call(redraw);
49889               });
49890
49891           if (isDG) {
49892               var key = source.id + '-vintage';
49893               var sourceVintage = context.background().findSource(key);
49894               var showsVintage = context.background().showsLayer(sourceVintage);
49895               var toggleVintage = showsVintage ? 'hide_vintage' : 'show_vintage';
49896               selection$$1
49897                   .append('a')
49898                   .text(t('info_panels.background.' + toggleVintage))
49899                   .attr('href', '#')
49900                   .attr('class', 'button button-toggle-vintage')
49901                   .on('click', function() {
49902                       event.preventDefault();
49903                       context.background().toggleOverlayLayer(sourceVintage);
49904                       selection$$1.call(redraw);
49905                   });
49906           }
49907
49908           // disable if necessary
49909           ['DigitalGlobe-Premium', 'DigitalGlobe-Standard'].forEach(function(layerId) {
49910               if (source.id !== layerId) {
49911                   var key = layerId + '-vintage';
49912                   var sourceVintage = context.background().findSource(key);
49913                   if (context.background().showsLayer(sourceVintage)) {
49914                       context.background().toggleOverlayLayer(sourceVintage);
49915                   }
49916               }
49917           });
49918       }
49919
49920
49921       var debouncedGetMetadata = debounce(getMetadata, 250);
49922
49923       function getMetadata(selection$$1) {
49924           var tile = select('.layer-background img.tile-center');   // tile near viewport center
49925           if (tile.empty()) return;
49926
49927           var sourceName = currSourceName,
49928               d = tile.datum(),
49929               zoom = (d && d.length >= 3 && d[2]) || Math.floor(context.map().zoom()),
49930               center = context.map().center();
49931
49932           // update zoom
49933           metadata.zoom = String(zoom);
49934           selection$$1.selectAll('.background-info-list-zoom')
49935               .classed('hide', false)
49936               .selectAll('.background-info-span-zoom')
49937               .text(metadata.zoom);
49938
49939           if (!d || !d.length >= 3) return;
49940
49941           background.baseLayerSource().getMetadata(center, d, function(err, result) {
49942               if (err || currSourceName !== sourceName) return;
49943
49944               // update vintage
49945               var vintage = result.vintage;
49946               metadata.vintage = (vintage && vintage.range) || t('info_panels.background.unknown');
49947               selection$$1.selectAll('.background-info-list-vintage')
49948                   .classed('hide', false)
49949                   .selectAll('.background-info-span-vintage')
49950                   .text(metadata.vintage);
49951
49952               // update other metdata
49953               without(metadataKeys, 'zoom', 'vintage')
49954                   .forEach(function(k) {
49955                       var val = result[k];
49956                       metadata[k] = val;
49957                       selection$$1.selectAll('.background-info-list-' + k)
49958                           .classed('hide', !val)
49959                           .selectAll('.background-info-span-' + k)
49960                           .text(val);
49961                   });
49962           });
49963       }
49964
49965
49966       var panel = function(selection$$1) {
49967           selection$$1.call(redraw);
49968
49969           context.map()
49970               .on('drawn.info-background', function() {
49971                   selection$$1.call(debouncedRedraw);
49972               })
49973               .on('move.info-background', function() {
49974                   selection$$1.call(debouncedGetMetadata);
49975               });
49976
49977       };
49978
49979       panel.off = function() {
49980           context.map()
49981               .on('drawn.info-background', null)
49982               .on('move.info-background', null);
49983       };
49984
49985       panel.id = 'background';
49986       panel.title = t('info_panels.background.title');
49987       panel.key = t('info_panels.background.key');
49988
49989
49990       return panel;
49991   }
49992
49993   function uiPanelHistory(context) {
49994       var osm;
49995
49996       function displayTimestamp(timestamp) {
49997           if (!timestamp) return t('info_panels.history.unknown');
49998           var detected = utilDetect();
49999           var options = {
50000               day: 'numeric', month: 'short', year: 'numeric',
50001               hour: 'numeric', minute: 'numeric', second: 'numeric'
50002           };
50003           var d = new Date(timestamp);
50004           if (isNaN(d.getTime())) return t('info_panels.history.unknown');
50005           return d.toLocaleString(detected.locale, options);
50006       }
50007
50008
50009       function displayUser(selection, userName) {
50010           if (!userName) {
50011               selection
50012                   .append('span')
50013                   .text(t('info_panels.history.unknown'));
50014               return;
50015           }
50016
50017           selection
50018               .append('span')
50019               .attr('class', 'user-name')
50020               .text(userName);
50021
50022           var links = selection
50023               .append('div')
50024               .attr('class', 'links');
50025
50026           if (osm) {
50027               links
50028                   .append('a')
50029                   .attr('class', 'user-osm-link')
50030                   .attr('href', osm.userURL(userName))
50031                   .attr('target', '_blank')
50032                   .attr('tabindex', -1)
50033                   .text('OSM');
50034           }
50035
50036           links
50037               .append('a')
50038               .attr('class', 'user-hdyc-link')
50039               .attr('href', 'https://hdyc.neis-one.org/?' + userName)
50040               .attr('target', '_blank')
50041               .attr('tabindex', -1)
50042               .text('HDYC');
50043       }
50044
50045
50046       function displayChangeset(selection, changeset) {
50047           if (!changeset) {
50048               selection
50049                   .append('span')
50050                   .text(t('info_panels.history.unknown'));
50051               return;
50052           }
50053
50054           selection
50055               .append('span')
50056               .attr('class', 'changeset-id')
50057               .text(changeset);
50058
50059           var links = selection
50060               .append('div')
50061               .attr('class', 'links');
50062
50063           if (osm) {
50064               links
50065                   .append('a')
50066                   .attr('class', 'changeset-osm-link')
50067                   .attr('href', osm.changesetURL(changeset))
50068                   .attr('target', '_blank')
50069                   .attr('tabindex', -1)
50070                   .text('OSM');
50071           }
50072
50073           links
50074               .append('a')
50075               .attr('class', 'changeset-osmcha-link')
50076               .attr('href', 'https://osmcha.mapbox.com/changesets/' + changeset)
50077               .attr('target', '_blank')
50078               .attr('tabindex', -1)
50079               .text('OSMCha');
50080       }
50081
50082
50083       function redraw(selection) {
50084           var selectedNoteID = context.selectedNoteID();
50085           osm = context.connection();
50086
50087           var selected, note, entity;
50088           if (selectedNoteID && osm) {       // selected 1 note
50089               selected = [ t('note.note') + ' ' + selectedNoteID ];
50090               note = osm.getNote(selectedNoteID);
50091           } else {                           // selected 1..n entities
50092               selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); });
50093               if (selected.length) {
50094                   entity = context.entity(selected[0]);
50095               }
50096           }
50097
50098           var singular = selected.length === 1 ? selected[0] : null;
50099
50100           selection.html('');
50101
50102           selection
50103               .append('h4')
50104               .attr('class', 'history-heading')
50105               .text(singular || t('info_panels.history.selected', { n: selected.length }));
50106
50107           if (!singular) return;
50108
50109           if (entity) {
50110               selection.call(redrawEntity, entity);
50111           } else if (note) {
50112               selection.call(redrawNote, note);
50113           }
50114       }
50115
50116
50117       function redrawNote(selection, note) {
50118           if (!note || note.isNew()) {
50119               selection
50120                   .append('div')
50121                   .text(t('info_panels.history.note_no_history'));
50122               return;
50123           }
50124
50125           var list = selection
50126               .append('ul');
50127
50128           list
50129               .append('li')
50130               .text(t('info_panels.history.note_comments') + ':')
50131               .append('span')
50132               .text(note.comments.length);
50133
50134           if (note.comments.length) {
50135               list
50136                   .append('li')
50137                   .text(t('info_panels.history.note_created_date') + ':')
50138                   .append('span')
50139                   .text(displayTimestamp(note.comments[0].date));
50140
50141               list
50142                   .append('li')
50143                   .text(t('info_panels.history.note_created_user') + ':')
50144                   .call(displayUser, note.comments[0].user);
50145           }
50146
50147           if (osm) {
50148               selection
50149                   .append('a')
50150                   .attr('class', 'view-history-on-osm')
50151                   .attr('target', '_blank')
50152                   .attr('tabindex', -1)
50153                   .attr('href', osm.noteURL(note))
50154                   .call(svgIcon('#iD-icon-out-link', 'inline'))
50155                   .append('span')
50156                   .text(t('info_panels.history.note_link_text'));
50157           }
50158       }
50159
50160
50161       function redrawEntity(selection, entity) {
50162           if (!entity || entity.isNew()) {
50163               selection
50164                   .append('div')
50165                   .text(t('info_panels.history.no_history'));
50166               return;
50167           }
50168
50169           var list = selection
50170               .append('ul');
50171
50172           list
50173               .append('li')
50174               .text(t('info_panels.history.version') + ':')
50175               .append('span')
50176               .text(entity.version);
50177
50178           list
50179               .append('li')
50180               .text(t('info_panels.history.last_edit') + ':')
50181               .append('span')
50182               .text(displayTimestamp(entity.timestamp));
50183
50184           list
50185               .append('li')
50186               .text(t('info_panels.history.edited_by') + ':')
50187               .call(displayUser, entity.user);
50188
50189           list
50190               .append('li')
50191               .text(t('info_panels.history.changeset') + ':')
50192               .call(displayChangeset, entity.changeset);
50193
50194           if (osm) {
50195               selection
50196                   .append('a')
50197                   .attr('class', 'view-history-on-osm')
50198                   .attr('target', '_blank')
50199                   .attr('tabindex', -1)
50200                   .attr('href', osm.historyURL(entity))
50201                   .call(svgIcon('#iD-icon-out-link', 'inline'))
50202                   .append('span')
50203                   .text(t('info_panels.history.link_text'));
50204           }
50205       }
50206
50207
50208       var panel = function(selection) {
50209           selection.call(redraw);
50210
50211           context.map()
50212               .on('drawn.info-history', function() {
50213                   selection.call(redraw);
50214               });
50215
50216           context
50217               .on('enter.info-history', function() {
50218                   selection.call(redraw);
50219               });
50220       };
50221
50222       panel.off = function() {
50223           context.map().on('drawn.info-history', null);
50224           context.on('enter.info-history', null);
50225       };
50226
50227       panel.id = 'history';
50228       panel.title = t('info_panels.history.title');
50229       panel.key = t('info_panels.history.key');
50230
50231
50232       return panel;
50233   }
50234
50235   var OSM_PRECISION = 7;
50236   var locale$2 = utilDetect().locale;
50237
50238   /**
50239    * Returns a localized representation of the given length measurement.
50240    *
50241    * @param {Number} m area in meters
50242    * @param {Boolean} isImperial true for U.S. customary units; false for metric
50243    */
50244   function displayLength(m, isImperial) {
50245       var d = m * (isImperial ? 3.28084 : 1);
50246       var unit;
50247
50248       if (isImperial) {
50249           if (d >= 5280) {
50250               d /= 5280;
50251               unit = 'miles';
50252           } else {
50253               unit = 'feet';
50254           }
50255       } else {
50256           if (d >= 1000) {
50257               d /= 1000;
50258               unit = 'kilometers';
50259           } else {
50260               unit = 'meters';
50261           }
50262       }
50263
50264       return t('units.' + unit, {
50265           quantity: d.toLocaleString(locale$2, {
50266               maximumSignificantDigits: 4
50267           })
50268       });
50269   }
50270
50271   /**
50272    * Returns a localized representation of the given area measurement.
50273    *
50274    * @param {Number} m2 area in square meters
50275    * @param {Boolean} isImperial true for U.S. customary units; false for metric
50276    */
50277   function displayArea(m2, isImperial) {
50278       var d = m2 * (isImperial ? 10.7639111056 : 1);
50279       var d1, d2, area;
50280       var unit1 = '';
50281       var unit2 = '';
50282
50283       if (isImperial) {
50284           if (d >= 6969600) { // > 0.25mi² show mi²
50285               d1 = d / 27878400;
50286               unit1 = 'square_miles';
50287           } else {
50288               d1 = d;
50289               unit1 = 'square_feet';
50290           }
50291
50292           if (d > 4356 && d < 43560000) { // 0.1 - 1000 acres
50293               d2 = d / 43560;
50294               unit2 = 'acres';
50295           }
50296
50297       } else {
50298           if (d >= 250000) { // > 0.25km² show km²
50299               d1 = d / 1000000;
50300               unit1 = 'square_kilometers';
50301           } else {
50302               d1 = d;
50303               unit1 = 'square_meters';
50304           }
50305
50306           if (d > 1000 && d < 10000000) { // 0.1 - 1000 hectares
50307               d2 = d / 10000;
50308               unit2 = 'hectares';
50309           }
50310       }
50311
50312       area = t('units.' + unit1, {
50313           quantity: d1.toLocaleString(locale$2, {
50314               maximumSignificantDigits: 4
50315           })
50316       });
50317
50318       if (d2) {
50319           return t('units.area_pair', {
50320               area1: area,
50321               area2: t('units.' + unit2, {
50322                   quantity: d2.toLocaleString(locale$2, {
50323                       maximumSignificantDigits: 2
50324                   })
50325               })
50326           });
50327       } else {
50328           return area;
50329       }
50330   }
50331
50332   function wrap(x, min, max) {
50333       var d = max - min;
50334       return ((x - min) % d + d) % d + min;
50335   }
50336
50337   function clamp$1(x, min, max) {
50338       return Math.max(min, Math.min(x, max));
50339   }
50340
50341   function displayCoordinate(deg, pos, neg) {
50342       var min = (Math.abs(deg) - Math.floor(Math.abs(deg))) * 60;
50343       var sec = (min - Math.floor(min)) * 60;
50344       var displayDegrees = t('units.arcdegrees', {
50345           quantity: Math.floor(Math.abs(deg)).toLocaleString(locale$2)
50346       });
50347       var displayCoordinate;
50348
50349       if (Math.floor(sec) > 0) {
50350           displayCoordinate = displayDegrees +
50351               t('units.arcminutes', {
50352                   quantity: Math.floor(min).toLocaleString(locale$2)
50353               }) +
50354               t('units.arcseconds', {
50355                   quantity: Math.round(sec).toLocaleString(locale$2)
50356               });
50357       } else if (Math.floor(min) > 0) {
50358           displayCoordinate = displayDegrees +
50359               t('units.arcminutes', {
50360                   quantity: Math.round(min).toLocaleString(locale$2)
50361               });
50362       } else {
50363           displayCoordinate = t('units.arcdegrees', {
50364               quantity: Math.round(Math.abs(deg)).toLocaleString(locale$2)
50365           });
50366       }
50367
50368       if (deg === 0) {
50369           return displayCoordinate;
50370       } else {
50371           return t('units.coordinate', {
50372               coordinate: displayCoordinate,
50373               direction: t('units.' + (deg > 0 ? pos : neg))
50374           });
50375       }
50376   }
50377
50378   /**
50379    * Returns given coordinate pair in degree-minute-second format.
50380    *
50381    * @param {Array<Number>} coord longitude and latitude
50382    */
50383   function dmsCoordinatePair(coord) {
50384       return t('units.coordinate_pair', {
50385           latitude: displayCoordinate(clamp$1(coord[1], -90, 90), 'north', 'south'),
50386           longitude: displayCoordinate(wrap(coord[0], -180, 180), 'east', 'west')
50387       });
50388   }
50389
50390   /**
50391    * Returns the given coordinate pair in decimal format.
50392    * note: unlocalized to avoid comma ambiguity - see #4765
50393    *
50394    * @param {Array<Number>} coord longitude and latitude
50395    */
50396   function decimalCoordinatePair(coord) {
50397       return t('units.coordinate_pair', {
50398           latitude: clamp$1(coord[1], -90, 90).toFixed(OSM_PRECISION),
50399           longitude: wrap(coord[0], -180, 180).toFixed(OSM_PRECISION)
50400       });
50401   }
50402
50403   function uiPanelLocation(context) {
50404       var currLocation = '';
50405
50406
50407       function redraw(selection) {
50408           selection.html('');
50409
50410           var list = selection
50411               .append('ul');
50412
50413           // Mouse coordinates
50414           var coord = context.map().mouseCoordinates();
50415           if (coord.some(isNaN)) {
50416               coord = context.map().center();
50417           }
50418
50419           list
50420               .append('li')
50421               .text(dmsCoordinatePair(coord))
50422               .append('li')
50423               .text(decimalCoordinatePair(coord));
50424
50425           // Location Info
50426           selection
50427               .append('div')
50428               .attr('class', 'location-info')
50429               .text(currLocation || ' ');
50430
50431           debouncedGetLocation(selection, coord);
50432       }
50433
50434
50435       var debouncedGetLocation = debounce(getLocation, 250);
50436       function getLocation(selection, coord) {
50437           if (!services.geocoder) {
50438               currLocation = t('info_panels.location.unknown_location');
50439               selection.selectAll('.location-info')
50440                   .text(currLocation);
50441           } else {
50442               services.geocoder.reverse(coord, function(err, result) {
50443                   currLocation = result ? result.display_name : t('info_panels.location.unknown_location');
50444                   selection.selectAll('.location-info')
50445                       .text(currLocation);
50446               });
50447           }
50448       }
50449
50450
50451       var panel = function(selection) {
50452           selection.call(redraw);
50453
50454           context.surface()
50455               .on('mousemove.info-location', function() {
50456                   selection.call(redraw);
50457               });
50458       };
50459
50460       panel.off = function() {
50461           context.surface()
50462               .on('mousemove.info-location', null);
50463       };
50464
50465       panel.id = 'location';
50466       panel.title = t('info_panels.location.title');
50467       panel.key = t('info_panels.location.key');
50468
50469
50470       return panel;
50471   }
50472
50473   function uiPanelMeasurement(context) {
50474       var locale = utilDetect().locale,
50475           isImperial = (locale.toLowerCase() === 'en-us');
50476
50477
50478       function radiansToMeters(r) {
50479           // using WGS84 authalic radius (6371007.1809 m)
50480           return r * 6371007.1809;
50481       }
50482
50483       function steradiansToSqmeters(r) {
50484           // http://gis.stackexchange.com/a/124857/40446
50485           return r / (4 * Math.PI) * 510065621724000;
50486       }
50487
50488
50489       function toLineString(feature) {
50490           if (feature.type === 'LineString') return feature;
50491
50492           var result = { type: 'LineString', coordinates: [] };
50493           if (feature.type === 'Polygon') {
50494               result.coordinates = feature.coordinates[0];
50495           } else if (feature.type === 'MultiPolygon') {
50496               result.coordinates = feature.coordinates[0][0];
50497           }
50498
50499           return result;
50500       }
50501
50502
50503       function nodeCount(feature) {
50504         if (feature.type === 'LineString') return feature.coordinates.length;
50505         if (feature.type === 'Polygon') return feature.coordinates[0].length - 1;
50506       }
50507
50508
50509       function redraw(selection$$1) {
50510           var resolver = context.graph();
50511           var selectedNoteID = context.selectedNoteID();
50512           var osm = services.osm;
50513
50514           var selected, center, entity, note, geometry;
50515
50516           if (selectedNoteID && osm) {       // selected 1 note
50517               selected = [ t('note.note') + ' ' + selectedNoteID ];
50518               note = osm.getNote(selectedNoteID);
50519               center = note.loc;
50520               geometry = 'note';
50521
50522           } else {                           // selected 1..n entities
50523               var extent = geoExtent$$1();
50524               selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); });
50525               if (selected.length) {
50526                   for (var i = 0; i < selected.length; i++) {
50527                       entity = context.entity(selected[i]);
50528                       extent._extend(entity.extent(resolver));
50529                   }
50530                   center = extent.center();
50531                   geometry = entity.geometry(resolver);
50532               }
50533           }
50534
50535           var singular = selected.length === 1 ? selected[0] : null;
50536
50537           selection$$1.html('');
50538
50539           selection$$1
50540               .append('h4')
50541               .attr('class', 'measurement-heading')
50542               .text(singular || t('info_panels.measurement.selected', { n: selected.length.toLocaleString(locale) }));
50543
50544           if (!selected.length) return;
50545
50546
50547           var list = selection$$1
50548               .append('ul');
50549           var coordItem;
50550
50551           // multiple selected features, just display extent center..
50552           if (!singular) {
50553               coordItem = list
50554                   .append('li')
50555                   .text(t('info_panels.measurement.center') + ':');
50556               coordItem.append('span')
50557                   .text(dmsCoordinatePair(center));
50558               coordItem.append('span')
50559                   .text(decimalCoordinatePair(center));
50560               return;
50561           }
50562
50563           // single selected feature, display details..
50564           if (geometry === 'line' || geometry === 'area') {
50565               var closed = (entity.type === 'relation') || (entity.isClosed() && !entity.isDegenerate());
50566               var feature = entity.asGeoJSON(resolver);
50567               var length = radiansToMeters(length$1(toLineString(feature)));
50568               var lengthLabel = t('info_panels.measurement.' + (closed ? 'perimeter' : 'length'));
50569               var centroid = d3_geoCentroid(feature);
50570
50571               list
50572                   .append('li')
50573                   .text(t('info_panels.measurement.geometry') + ':')
50574                   .append('span')
50575                   .text(
50576                       closed ? t('info_panels.measurement.closed_' + geometry) : t('geometry.' + geometry)
50577                   );
50578
50579               if (entity.type !== 'relation') {
50580                   list
50581                       .append('li')
50582                       .text(t('info_panels.measurement.node_count') + ':')
50583                       .append('span')
50584                       .text(nodeCount(feature).toLocaleString(locale));
50585               }
50586
50587               if (closed) {
50588                   var area = steradiansToSqmeters(entity.area(resolver));
50589                   list
50590                       .append('li')
50591                       .text(t('info_panels.measurement.area') + ':')
50592                       .append('span')
50593                       .text(displayArea(area, isImperial));
50594               }
50595
50596
50597               list
50598                   .append('li')
50599                   .text(lengthLabel + ':')
50600                   .append('span')
50601                   .text(displayLength(length, isImperial));
50602
50603               coordItem = list
50604                   .append('li')
50605                   .text(t('info_panels.measurement.centroid') + ':');
50606               coordItem.append('span')
50607                   .text(dmsCoordinatePair(centroid));
50608               coordItem.append('span')
50609                   .text(decimalCoordinatePair(centroid));
50610
50611               var toggle  = isImperial ? 'imperial' : 'metric';
50612
50613               selection$$1
50614                   .append('a')
50615                   .text(t('info_panels.measurement.' + toggle))
50616                   .attr('href', '#')
50617                   .attr('class', 'button button-toggle-units')
50618                   .on('click', function() {
50619                       event.preventDefault();
50620                       isImperial = !isImperial;
50621                       selection$$1.call(redraw);
50622                   });
50623
50624           } else {
50625               var centerLabel = t('info_panels.measurement.' +
50626                   (note || entity.type === 'node' ? 'location' : 'center'));
50627
50628               list
50629                   .append('li')
50630                   .text(t('info_panels.measurement.geometry') + ':')
50631                   .append('span')
50632                   .text(t('geometry.' + geometry));
50633
50634               coordItem = list
50635                   .append('li')
50636                   .text(centerLabel + ':');
50637               coordItem.append('span')
50638                   .text(dmsCoordinatePair(center));
50639               coordItem.append('span')
50640                   .text(decimalCoordinatePair(center));
50641           }
50642       }
50643
50644
50645       var panel = function(selection$$1) {
50646           selection$$1.call(redraw);
50647
50648           context.map()
50649               .on('drawn.info-measurement', function() {
50650                   selection$$1.call(redraw);
50651               });
50652
50653           context
50654               .on('enter.info-measurement', function() {
50655                   selection$$1.call(redraw);
50656               });
50657       };
50658
50659       panel.off = function() {
50660           context.map().on('drawn.info-measurement', null);
50661           context.on('enter.info-measurement', null);
50662       };
50663
50664       panel.id = 'measurement';
50665       panel.title = t('info_panels.measurement.title');
50666       panel.key = t('info_panels.measurement.key');
50667
50668
50669       return panel;
50670   }
50671
50672   var uiInfoPanels = {
50673       background: uiPanelBackground,
50674       history: uiPanelHistory,
50675       location: uiPanelLocation,
50676       measurement: uiPanelMeasurement,
50677   };
50678
50679   function uiInfo(context) {
50680       var ids = Object.keys(uiInfoPanels);
50681       var wasActive = ['measurement'];
50682       var panels = {};
50683       var active = {};
50684
50685       // create panels
50686       ids.forEach(function(k) {
50687           if (!panels[k]) {
50688               panels[k] = uiInfoPanels[k](context);
50689               active[k] = false;
50690           }
50691       });
50692
50693
50694       function info(selection$$1) {
50695
50696           function redraw() {
50697               var activeids = ids.filter(function(k) { return active[k]; }).sort();
50698
50699               var containers = infoPanels.selectAll('.panel-container')
50700                   .data(activeids, function(k) { return k; });
50701
50702               containers.exit()
50703                   .style('opacity', 1)
50704                   .transition()
50705                   .duration(200)
50706                   .style('opacity', 0)
50707                   .on('end', function(d) {
50708                       select(this)
50709                           .call(panels[d].off)
50710                           .remove();
50711                   });
50712
50713               var enter = containers.enter()
50714                   .append('div')
50715                   .attr('class', function(d) { return 'fillD2 panel-container panel-container-' + d; });
50716
50717               enter
50718                   .style('opacity', 0)
50719                   .transition()
50720                   .duration(200)
50721                   .style('opacity', 1);
50722
50723               var title = enter
50724                   .append('div')
50725                   .attr('class', 'panel-title fillD2');
50726
50727               title
50728                   .append('h3')
50729                   .text(function(d) { return panels[d].title; });
50730
50731               title
50732                   .append('button')
50733                   .attr('class', 'close')
50734                   .on('click', function (d) { toggle(d); })
50735                   .call(svgIcon('#iD-icon-close'));
50736
50737               enter
50738                   .append('div')
50739                   .attr('class', function(d) { return 'panel-content panel-content-' + d; });
50740
50741
50742               // redraw the panels
50743               infoPanels.selectAll('.panel-content')
50744                   .each(function(d) {
50745                       select(this).call(panels[d]);
50746                   });
50747           }
50748
50749
50750           function toggle(which) {
50751               if (event) {
50752                   event.stopImmediatePropagation();
50753                   event.preventDefault();
50754               }
50755
50756               var activeids = ids.filter(function(k) { return active[k]; });
50757
50758               if (which) {  // toggle one
50759                   active[which] = !active[which];
50760                   if (activeids.length === 1 && activeids[0] === which) {  // none active anymore
50761                       wasActive = [which];
50762                   }
50763               } else {      // toggle all
50764                   if (activeids.length) {
50765                       wasActive = activeids;
50766                       activeids.forEach(function(k) { active[k] = false; });
50767                   } else {
50768                       wasActive.forEach(function(k) { active[k] = true; });
50769                   }
50770               }
50771
50772               redraw();
50773           }
50774
50775
50776           var infoPanels = selection$$1.selectAll('.info-panels')
50777               .data([0]);
50778
50779           infoPanels = infoPanels.enter()
50780               .append('div')
50781               .attr('class', 'info-panels')
50782               .merge(infoPanels);
50783
50784           redraw();
50785
50786           context.keybinding()
50787               .on(uiCmd('⌘' + t('info_panels.key')), toggle);
50788
50789           ids.forEach(function(k) {
50790               var key = t('info_panels.' + k + '.key', { default: null });
50791               if (!key) return;
50792               context.keybinding()
50793                   .on(uiCmd('⌘⇧' + key), function() { toggle(k); });
50794           });
50795       }
50796
50797       return info;
50798   }
50799
50800   function uiModes(context) {
50801       var modes = [
50802           modeAddPoint$$1(context),
50803           modeAddLine$$1(context),
50804           modeAddArea$$1(context),
50805           modeAddNote$$1(context)
50806       ];
50807
50808
50809       function enabled(d) {
50810           if (d.id === 'add-note') {
50811               return notesEnabled() && notesEditable();
50812           } else {
50813               return osmEditable();
50814           }
50815       }
50816
50817       function osmEditable() {
50818           var mode = context.mode();
50819           return context.editable() && mode && mode.id !== 'save';
50820       }
50821
50822       function notesEnabled() {
50823           var noteLayer = context.layers().layer('notes');
50824           return noteLayer && noteLayer.enabled();
50825       }
50826
50827       function notesEditable() {
50828           var mode = context.mode();
50829           return context.map().notesEditable() && mode && mode.id !== 'save';
50830       }
50831
50832
50833       return function(selection$$1) {
50834           context
50835               .on('enter.editor', function(entered) {
50836                   selection$$1.selectAll('button.add-button')
50837                       .classed('active', function(mode) { return entered.button === mode.button; });
50838                   context.container()
50839                       .classed('mode-' + entered.id, true);
50840               });
50841
50842           context
50843               .on('exit.editor', function(exited) {
50844                   context.container()
50845                       .classed('mode-' + exited.id, false);
50846               });
50847
50848           modes.forEach(function(mode) {
50849               context.keybinding().on(mode.key, function() {
50850                   if (!enabled(mode)) return;
50851
50852                   if (mode.id === context.mode().id) {
50853                       context.enter(modeBrowse(context));
50854                   } else {
50855                       context.enter(mode);
50856                   }
50857               });
50858           });
50859
50860
50861           var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
50862
50863           context.map()
50864               .on('move.modes', debouncedUpdate)
50865               .on('drawn.modes', debouncedUpdate);
50866
50867           context
50868               .on('enter.modes', update);
50869
50870           update();
50871
50872
50873           function update() {
50874               var showNotes = notesEnabled();
50875               var data = showNotes ? modes : modes.slice(0, 3);
50876
50877               var buttons = selection$$1.selectAll('button.add-button')
50878                   .data(data, function(d) { return d.id; });
50879
50880               // exit
50881               buttons.exit()
50882                   .remove();
50883
50884               // enter
50885               var buttonsEnter = buttons.enter()
50886                   .append('button')
50887                   .attr('tabindex', -1)
50888                   .attr('class', function(d) { return d.id + ' add-button'; })
50889                   .on('click.mode-buttons', function(d) {
50890                       if (!enabled(d)) return;
50891
50892                       // When drawing, ignore accidental clicks on mode buttons - #4042
50893                       var currMode = context.mode().id;
50894                       if (/^draw/.test(currMode)) return;
50895
50896                       if (d.id === currMode) {
50897                           context.enter(modeBrowse(context));
50898                       } else {
50899                           context.enter(d);
50900                       }
50901                   })
50902                   .call(tooltip()
50903                       .placement('bottom')
50904                       .html(true)
50905                       .title(function(d) { return uiTooltipHtml(d.description, d.key); })
50906                   );
50907
50908               buttonsEnter
50909                   .each(function(d) {
50910                       select(this)
50911                           .call(svgIcon('#iD-icon-' + d.button));
50912                   });
50913
50914               buttonsEnter
50915                   .append('span')
50916                   .attr('class', 'label')
50917                   .text(function(mode) { return mode.title; });
50918
50919               // if we are adding/removing the buttons, check if toolbar has overflowed
50920               if (buttons.enter().size() || buttons.exit().size()) {
50921                   context.ui().checkOverflow('#bar', true);
50922               }
50923
50924               // update
50925               buttons = buttons
50926                   .merge(buttonsEnter)
50927                   .classed('disabled', function(d) { return !enabled(d); });
50928           }
50929       };
50930   }
50931
50932   function uiNotice(context) {
50933
50934       return function(selection$$1) {
50935           var div = selection$$1
50936               .append('div')
50937               .attr('class', 'notice');
50938
50939           var button = div
50940               .append('button')
50941               .attr('class', 'zoom-to notice fillD')
50942               .on('click', function() {
50943                   context.map().zoomEase(context.minEditableZoom());
50944               })
50945               .on('wheel', function() {   // let wheel events pass through #4482
50946                   var e2 = new WheelEvent(event.type, event);
50947                   context.surface().node().dispatchEvent(e2);
50948               });
50949
50950           button
50951               .call(svgIcon('#iD-icon-plus', 'pre-text'))
50952               .append('span')
50953               .attr('class', 'label')
50954               .text(t('zoom_in_edit'));
50955
50956
50957           function disableTooHigh() {
50958               var canEdit = context.map().zoom() >= context.minEditableZoom();
50959               div.style('display', canEdit ? 'none' : 'block');
50960           }
50961
50962           context.map()
50963               .on('move.notice', debounce(disableTooHigh, 500));
50964
50965           disableTooHigh();
50966       };
50967   }
50968
50969   function uiPhotoviewer(context) {
50970
50971       var dispatch$$1 = dispatch('resize');
50972
50973       function photoviewer(selection$$1) {
50974           selection$$1
50975               .append('button')
50976               .attr('class', 'thumb-hide')
50977               .on('click', function () {
50978                   if (services.streetside) { services.streetside.hideViewer(); }
50979                   if (services.mapillary) { services.mapillary.hideViewer(); }
50980                   if (services.openstreetcam) { services.openstreetcam.hideViewer(); }
50981               })
50982               .append('div')
50983               .call(svgIcon('#iD-icon-close'));
50984
50985           selection$$1
50986               .append('button')
50987               .attr('class', 'resize-handle-xy')
50988               .on(
50989                   'mousedown',
50990                   buildResizeListener(selection$$1, 'resize', dispatch$$1, { resizeOnX: true, resizeOnY: true })
50991               );
50992
50993           selection$$1
50994               .append('button')
50995               .attr('class', 'resize-handle-x')
50996               .on(
50997                   'mousedown',
50998                   buildResizeListener(selection$$1, 'resize', dispatch$$1, { resizeOnX: true })
50999               );
51000
51001           selection$$1
51002               .append('button')
51003               .attr('class', 'resize-handle-y')
51004               .on(
51005                   'mousedown',
51006                   buildResizeListener(selection$$1, 'resize', dispatch$$1, { resizeOnY: true })
51007               );
51008
51009
51010           function buildResizeListener(target, eventName, dispatch$$1, options) {
51011               var resizeOnX = !!options.resizeOnX;
51012               var resizeOnY = !!options.resizeOnY;
51013               var minHeight = options.minHeight || 240;
51014               var minWidth = options.minWidth || 320;
51015               var startX;
51016               var startY;
51017               var startWidth;
51018               var startHeight;
51019
51020               function startResize() {
51021                   var mapSize = context.map().dimensions();
51022
51023                   if (resizeOnX) {
51024                       var maxWidth = mapSize[0];
51025                       var newWidth = clamp((startWidth + event.clientX - startX), minWidth, maxWidth);
51026                       target.style('width', newWidth + 'px');
51027                   }
51028
51029                   if (resizeOnY) {
51030                       var maxHeight = mapSize[1] - 90;  // preserve space at top/bottom of map
51031                       var newHeight = clamp((startHeight + startY - event.clientY), minHeight, maxHeight);
51032                       target.style('height', newHeight + 'px');
51033                   }
51034
51035                   dispatch$$1.call(eventName, target, utilGetDimensions(target, true));
51036               }
51037
51038               function clamp(num, min, max) {
51039                   return Math.max(min, Math.min(num, max));
51040               }
51041
51042               function stopResize() {
51043                   select(window)
51044                       .on('.' + eventName, null);
51045               }
51046
51047               return function initResize() {
51048                   startX = event.clientX;
51049                   startY = event.clientY;
51050                   startWidth = target.node().getBoundingClientRect().width;
51051                   startHeight = target.node().getBoundingClientRect().height;
51052
51053                   select(window)
51054                       .on('mousemove.' + eventName, startResize, false)
51055                       .on('mouseup.' + eventName, stopResize, false);
51056               };
51057           }
51058       }
51059
51060       photoviewer.onMapResize = function() {
51061           var photoviewer = select('#photoviewer');
51062           var content = select('#content');
51063           var mapDimensions = utilGetDimensions(content, true);
51064           // shrink photo viewer if it is too big
51065           // (-90 preserves space at top and bottom of map used by menus)
51066           var photoDimensions = utilGetDimensions(photoviewer, true);
51067           if (photoDimensions[0] > mapDimensions[0] || photoDimensions[1] > (mapDimensions[1] - 90)) {
51068               var setPhotoDimensions = [
51069                   Math.min(photoDimensions[0], mapDimensions[0]),
51070                   Math.min(photoDimensions[1], mapDimensions[1] - 90),
51071               ];
51072
51073               photoviewer
51074                   .style('width', setPhotoDimensions[0] + 'px')
51075                   .style('height', setPhotoDimensions[1] + 'px');
51076
51077               dispatch$$1.call('resize', photoviewer, setPhotoDimensions);
51078           }
51079       };
51080
51081       return utilRebind(photoviewer, dispatch$$1, 'on');
51082   }
51083
51084   function uiRestore(context) {
51085
51086       return function(selection) {
51087           if (!context.history().lock() || !context.history().restorableChanges())
51088               return;
51089
51090           var modalSelection = uiModal(selection, true);
51091
51092           modalSelection.select('.modal')
51093               .attr('class', 'modal fillL col6');
51094
51095           var introModal = modalSelection.select('.content');
51096
51097           introModal
51098               .attr('class','cf');
51099
51100           introModal
51101               .append('div')
51102               .attr('class', 'modal-section')
51103               .append('h3')
51104               .text(t('restore.heading'));
51105
51106           introModal
51107               .append('div')
51108               .attr('class','modal-section')
51109               .append('p')
51110               .text(t('restore.description'));
51111
51112           var buttonWrap = introModal
51113               .append('div')
51114               .attr('class', 'modal-actions cf');
51115
51116           var restore = buttonWrap
51117               .append('button')
51118               .attr('class', 'restore col6')
51119               .on('click', function() {
51120                   context.history().restore();
51121                   modalSelection.remove();
51122               });
51123
51124           restore
51125               .append('svg')
51126               .attr('class', 'logo logo-restore')
51127               .append('use')
51128               .attr('xlink:href', '#iD-logo-restore');
51129
51130           restore
51131               .append('div')
51132               .text(t('restore.restore'));
51133
51134           var reset = buttonWrap
51135               .append('button')
51136               .attr('class', 'reset col6')
51137               .on('click', function() {
51138                   context.history().clearSaved();
51139                   modalSelection.remove();
51140               });
51141
51142           reset
51143               .append('svg')
51144               .attr('class', 'logo logo-reset')
51145               .append('use')
51146               .attr('xlink:href', '#iD-logo-reset');
51147
51148           reset
51149               .append('div')
51150               .text(t('restore.reset'));
51151
51152           restore.node().focus();
51153       };
51154   }
51155
51156   function uiSave(context) {
51157       var history = context.history();
51158       var key = uiCmd('⌘S');
51159       var _numChanges = 0;
51160
51161
51162       return function(selection$$1) {
51163
51164
51165           function isSaving() {
51166               var mode = context.mode();
51167               return mode && mode.id === 'save';
51168           }
51169
51170
51171           function isDisabled() {
51172               return _numChanges === 0 || isSaving();
51173           }
51174
51175
51176           function save() {
51177               event.preventDefault();
51178               if (!context.inIntro() && !isSaving() && history.hasChanges()) {
51179                   context.enter(modeSave$$1(context));
51180               }
51181           }
51182
51183
51184           function bgColor() {
51185               var step;
51186               if (_numChanges === 0) {
51187                   return null;
51188               } else if (_numChanges <= 50) {
51189                   step = _numChanges / 50;
51190                   return interpolateRgb('#fff', '#ff8')(step);  // white -> yellow
51191               } else {
51192                   step = Math.min((_numChanges - 50) / 50, 1.0);
51193                   return interpolateRgb('#ff8', '#f88')(step);  // yellow -> red
51194               }
51195           }
51196
51197
51198           function updateCount() {
51199               var val = history.difference().summary().length;
51200               if (val === _numChanges) return;
51201               _numChanges = val;
51202
51203               tooltipBehavior
51204                   .title(uiTooltipHtml(
51205                       t(_numChanges > 0 ? 'save.help' : 'save.no_changes'), key)
51206                   );
51207
51208               button
51209                   .classed('disabled', isDisabled())
51210                   .style('background', bgColor(_numChanges));
51211
51212               button.select('span.count')
51213                   .text(_numChanges);
51214           }
51215
51216
51217           var tooltipBehavior = tooltip()
51218               .placement('bottom')
51219               .html(true)
51220               .title(uiTooltipHtml(t('save.no_changes'), key));
51221
51222           var button = selection$$1
51223               .append('button')
51224               .attr('class', 'save disabled')
51225               .attr('tabindex', -1)
51226               .on('click', save)
51227               .call(tooltipBehavior);
51228
51229           button
51230               .call(svgIcon('#iD-icon-save'));
51231
51232           button
51233               .append('span')
51234               .attr('class', 'label')
51235               .text(t('save.title'));
51236
51237           button
51238               .append('span')
51239               .attr('class', 'count')
51240               .text('0');
51241
51242           updateCount();
51243
51244
51245           context.keybinding()
51246               .on(key, save, true);
51247
51248           context.history()
51249               .on('change.save', updateCount);
51250
51251           context
51252               .on('enter.save', function() {
51253                   button
51254                       .classed('disabled', isDisabled());
51255
51256                   if (isSaving()) {
51257                       button.call(tooltipBehavior.hide);
51258                   }
51259               });
51260       };
51261   }
51262
51263   function uiScale(context) {
51264       var projection = context.projection,
51265           isImperial = (utilDetect().locale.toLowerCase() === 'en-us'),
51266           maxLength = 180,
51267           tickHeight = 8;
51268
51269
51270       function scaleDefs(loc1, loc2) {
51271           var lat = (loc2[1] + loc1[1]) / 2,
51272               conversion = (isImperial ? 3.28084 : 1),
51273               dist = geoLonToMeters(loc2[0] - loc1[0], lat) * conversion,
51274               scale = { dist: 0, px: 0, text: '' },
51275               buckets, i, val, dLon;
51276
51277           if (isImperial) {
51278               buckets = [5280000, 528000, 52800, 5280, 500, 50, 5, 1];
51279           } else {
51280               buckets = [5000000, 500000, 50000, 5000, 500, 50, 5, 1];
51281           }
51282
51283           // determine a user-friendly endpoint for the scale
51284           for (i = 0; i < buckets.length; i++) {
51285               val = buckets[i];
51286               if (dist >= val) {
51287                   scale.dist = Math.floor(dist / val) * val;
51288                   break;
51289               } else {
51290                   scale.dist = +dist.toFixed(2);
51291               }
51292           }
51293
51294           dLon = geoMetersToLon(scale.dist / conversion, lat);
51295           scale.px = Math.round(projection([loc1[0] + dLon, loc1[1]])[0]);
51296
51297           scale.text = displayLength(scale.dist / conversion, isImperial);
51298
51299           return scale;
51300       }
51301
51302
51303       function update(selection) {
51304           // choose loc1, loc2 along bottom of viewport (near where the scale will be drawn)
51305           var dims = context.map().dimensions(),
51306               loc1 = projection.invert([0, dims[1]]),
51307               loc2 = projection.invert([maxLength, dims[1]]),
51308               scale = scaleDefs(loc1, loc2);
51309
51310           selection.select('#scale-path')
51311               .attr('d', 'M0.5,0.5v' + tickHeight + 'h' + scale.px + 'v-' + tickHeight);
51312
51313           selection.select('#scale-textgroup')
51314               .attr('transform', 'translate(' + (scale.px + 8) + ',' + tickHeight + ')');
51315
51316           selection.select('#scale-text')
51317               .text(scale.text);
51318       }
51319
51320
51321       return function(selection) {
51322           function switchUnits() {
51323               isImperial = !isImperial;
51324               selection.call(update);
51325           }
51326
51327           var scalegroup = selection.append('svg')
51328               .attr('id', 'scale')
51329               .on('click', switchUnits)
51330               .append('g')
51331               .attr('transform', 'translate(10,11)');
51332
51333           scalegroup
51334               .append('path')
51335               .attr('id', 'scale-path');
51336
51337           scalegroup
51338               .append('g')
51339               .attr('id', 'scale-textgroup')
51340               .append('text')
51341               .attr('id', 'scale-text');
51342
51343           selection.call(update);
51344
51345           context.map().on('move.scale', function() {
51346               update(selection);
51347           });
51348       };
51349   }
51350
51351   function uiSidebar$$1(context) {
51352       var inspector = uiInspector(context);
51353       var dataEditor = uiDataEditor$$1(context);
51354       var noteEditor = uiNoteEditor$$1(context);
51355       var keepRightEditor = uiKeepRightEditor$$1(context);
51356       var _current;
51357       var _wasData = false;
51358       var _wasNote = false;
51359       var _wasKRError = false;
51360
51361
51362       function sidebar(selection$$1) {
51363           var container = select('#id-container');
51364           var minWidth = 280;
51365           var sidebarWidth;
51366           var containerWidth;
51367           var dragOffset;
51368
51369           var resizer = selection$$1
51370               .append('div')
51371               .attr('id', 'sidebar-resizer');
51372
51373           // Set the initial width constraints
51374           selection$$1
51375               .style('min-width', minWidth + 'px')
51376               .style('max-width', '400px')
51377               .style('width', '33.3333%');
51378
51379           resizer.call(d3_drag()
51380               .container(container.node())
51381               .on('start', function() {
51382                   // offset from edge of sidebar-resizer
51383                   dragOffset = event.sourceEvent.offsetX - 1;
51384
51385                   sidebarWidth = selection$$1.node().getBoundingClientRect().width;
51386                   containerWidth = container.node().getBoundingClientRect().width;
51387                   var widthPct = (sidebarWidth / containerWidth) * 100;
51388                   selection$$1
51389                       .style('width', widthPct + '%')    // lock in current width
51390                       .style('max-width', '85%');        // but allow larger widths
51391
51392                   resizer.classed('dragging', true);
51393               })
51394               .on('drag', function() {
51395                   var isRTL = (textDirection === 'rtl');
51396                   var xMarginProperty = isRTL ? 'margin-right' : 'margin-left';
51397
51398                   var x = event.x - dragOffset;
51399                   sidebarWidth = isRTL ? containerWidth - x : x;
51400
51401                   var isCollapsed = selection$$1.classed('collapsed');
51402                   var shouldCollapse = sidebarWidth < minWidth;
51403
51404                   selection$$1.classed('collapsed', shouldCollapse);
51405
51406                   if (shouldCollapse) {
51407                       if (!isCollapsed) {
51408                           selection$$1
51409                               .style(xMarginProperty, '-400px')
51410                               .style('width', '400px');
51411
51412                           context.ui().onResize([sidebarWidth - event.dx, 0]);
51413                       }
51414
51415                   } else {
51416                       var widthPct = (sidebarWidth / containerWidth) * 100;
51417                       selection$$1
51418                           .style(xMarginProperty, null)
51419                           .style('width', widthPct + '%');
51420
51421                       if (isCollapsed) {
51422                           context.ui().onResize([-sidebarWidth, 0]);
51423                       } else {
51424                           context.ui().onResize([-event.dx, 0]);
51425                       }
51426                   }
51427               })
51428               .on('end', function() {
51429                   resizer.classed('dragging', false);
51430               })
51431           );
51432
51433           var featureListWrap = selection$$1
51434               .append('div')
51435               .attr('class', 'feature-list-pane')
51436               .call(uiFeatureList(context));
51437
51438           var inspectorWrap = selection$$1
51439               .append('div')
51440               .attr('class', 'inspector-hidden inspector-wrap fr');
51441
51442
51443           function hover(datum) {
51444               if (datum && datum.__featurehash__) {   // hovering on data
51445                   _wasData = true;
51446                   sidebar
51447                       .show(dataEditor.datum(datum));
51448
51449                   selection$$1.selectAll('.sidebar-component')
51450                       .classed('inspector-hover', true);
51451
51452               } else if (datum instanceof osmNote) {
51453                   if (context.mode().id === 'drag-note') return;
51454                   _wasNote = true;
51455
51456                   var osm = services.osm;
51457                   if (osm) {
51458                       datum = osm.getNote(datum.id);   // marker may contain stale data - get latest
51459                   }
51460
51461                   sidebar
51462                       .show(noteEditor.note(datum));
51463
51464                   selection$$1.selectAll('.sidebar-component')
51465                       .classed('inspector-hover', true);
51466
51467               } else if (datum instanceof krError) {
51468                   _wasKRError = true;
51469
51470                   var keepRight = services.keepRight;
51471                   if (keepRight) {
51472                       datum = keepRight.getError(datum.id);   // marker may contain stale data - get latest
51473                   }
51474
51475                   d3_selectAll('.kr_error')
51476                       .classed('hover', function(d) { return d.id === datum.id; });
51477
51478                   sidebar
51479                       .show(keepRightEditor.error(datum));
51480
51481                   selection$$1.selectAll('.sidebar-component')
51482                       .classed('inspector-hover', true);
51483
51484               } else if (!_current && (datum instanceof osmEntity$$1)) {
51485                   featureListWrap
51486                       .classed('inspector-hidden', true);
51487
51488                   inspectorWrap
51489                       .classed('inspector-hidden', false)
51490                       .classed('inspector-hover', true);
51491
51492                   if (inspector.entityID() !== datum.id || inspector.state() !== 'hover') {
51493                       inspector
51494                           .state('hover')
51495                           .entityID(datum.id);
51496
51497                       inspectorWrap
51498                           .call(inspector);
51499                   }
51500
51501               } else if (!_current) {
51502                   featureListWrap
51503                       .classed('inspector-hidden', false);
51504                   inspectorWrap
51505                       .classed('inspector-hidden', true);
51506                   inspector
51507                       .state('hide');
51508
51509               } else if (_wasData || _wasNote || _wasKRError) {
51510                   _wasNote = false;
51511                   _wasData = false;
51512                   _wasKRError = false;
51513                   d3_selectAll('.note').classed('hover', false);
51514                   d3_selectAll('.kr_error').classed('hover', false);
51515                   sidebar.hide();
51516               }
51517           }
51518
51519
51520           sidebar.hover = throttle(hover, 200);
51521
51522
51523           sidebar.intersects = function(extent) {
51524               var rect = selection$$1.node().getBoundingClientRect();
51525               return extent.intersects([
51526                   context.projection.invert([0, rect.height]),
51527                   context.projection.invert([rect.width, 0])
51528               ]);
51529           };
51530
51531
51532           sidebar.select = function(id, newFeature) {
51533               sidebar.hide();
51534
51535               if (id) {
51536                   // uncollapse the sidebar
51537                   if (selection$$1.classed('collapsed')) {
51538                       var entity = context.entity(id);
51539                       var extent = entity.extent(context.graph());
51540                       sidebar.expand(sidebar.intersects(extent));
51541                   }
51542
51543                   featureListWrap
51544                       .classed('inspector-hidden', true);
51545
51546                   inspectorWrap
51547                       .classed('inspector-hidden', false)
51548                       .classed('inspector-hover', false);
51549
51550                   if (inspector.entityID() !== id || inspector.state() !== 'select') {
51551                       inspector
51552                           .state('select')
51553                           .entityID(id)
51554                           .newFeature(newFeature);
51555
51556                       inspectorWrap
51557                           .call(inspector, newFeature);
51558                   }
51559
51560               } else {
51561                   inspector
51562                       .state('hide');
51563               }
51564           };
51565
51566
51567           sidebar.show = function(component, element) {
51568               featureListWrap
51569                   .classed('inspector-hidden', true);
51570               inspectorWrap
51571                   .classed('inspector-hidden', true);
51572
51573               if (_current) _current.remove();
51574               _current = selection$$1
51575                   .append('div')
51576                   .attr('class', 'sidebar-component')
51577                   .call(component, element);
51578           };
51579
51580
51581           sidebar.hide = function() {
51582               featureListWrap
51583                   .classed('inspector-hidden', false);
51584               inspectorWrap
51585                   .classed('inspector-hidden', true);
51586
51587               if (_current) _current.remove();
51588               _current = null;
51589           };
51590
51591
51592           sidebar.expand = function(moveMap) {
51593               if (selection$$1.classed('collapsed')) {
51594                   sidebar.toggle(moveMap);
51595               }
51596           };
51597
51598
51599           sidebar.collapse = function(moveMap) {
51600               if (!selection$$1.classed('collapsed')) {
51601                   sidebar.toggle(moveMap);
51602               }
51603           };
51604
51605
51606           sidebar.toggle = function(moveMap) {
51607               var e = event;
51608               if (e && e.sourceEvent) {
51609                   e.sourceEvent.preventDefault();
51610               } else if (e) {
51611                   e.preventDefault();
51612               }
51613
51614               // Don't allow sidebar to toggle when the user is in the walkthrough.
51615               if (context.inIntro()) return;
51616
51617               var isCollapsed = selection$$1.classed('collapsed');
51618               var isCollapsing = !isCollapsed;
51619               var xMarginProperty = textDirection === 'rtl' ? 'margin-right' : 'margin-left';
51620
51621               sidebarWidth = selection$$1.node().getBoundingClientRect().width;
51622
51623               // switch from % to px
51624               selection$$1.style('width', sidebarWidth + 'px');
51625
51626               var startMargin, endMargin, lastMargin;
51627               if (isCollapsing) {
51628                   startMargin = lastMargin = 0;
51629                   endMargin = -sidebarWidth;
51630               } else {
51631                   startMargin = lastMargin = -sidebarWidth;
51632                   endMargin = 0;
51633               }
51634
51635               selection$$1.transition()
51636                   .style(xMarginProperty, endMargin + 'px')
51637                   .tween('panner', function() {
51638                       var i = interpolateNumber(startMargin, endMargin);
51639                       return function(t$$1) {
51640                           var dx = lastMargin - Math.round(i(t$$1));
51641                           lastMargin = lastMargin - dx;
51642                           context.ui().onResize(moveMap ? undefined : [dx, 0]);
51643                       };
51644                   })
51645                   .on('end', function() {
51646                       selection$$1.classed('collapsed', isCollapsing);
51647
51648                       // switch back from px to %
51649                       if (!isCollapsing) {
51650                           var containerWidth = container.node().getBoundingClientRect().width;
51651                           var widthPct = (sidebarWidth / containerWidth) * 100;
51652                           selection$$1
51653                               .style(xMarginProperty, null)
51654                               .style('width', widthPct + '%');
51655                       }
51656                   });
51657           };
51658
51659           // toggle the sidebar collapse when double-clicking the resizer
51660           resizer.on('dblclick', sidebar.toggle);
51661       }
51662
51663
51664       sidebar.hover = function() {};
51665       sidebar.hover.cancel = function() {};
51666       sidebar.intersects = function() {};
51667       sidebar.select = function() {};
51668       sidebar.show = function() {};
51669       sidebar.hide = function() {};
51670       sidebar.expand = function() {};
51671       sidebar.collapse = function() {};
51672       sidebar.toggle = function() {};
51673
51674       return sidebar;
51675   }
51676
51677   function uiSpinner(context) {
51678       var osm = context.connection();
51679
51680
51681       return function(selection) {
51682           var img = selection
51683               .append('img')
51684               .attr('src', context.imagePath('loader-black.gif'))
51685               .style('opacity', 0);
51686
51687           if (osm) {
51688               osm
51689                   .on('loading.spinner', function() {
51690                       img.transition()
51691                           .style('opacity', 1);
51692                   })
51693                   .on('loaded.spinner', function() {
51694                       img.transition()
51695                           .style('opacity', 0);
51696                   });
51697           }
51698       };
51699   }
51700
51701   function uiSplash(context) {
51702
51703       return function(selection) {
51704           if (context.storage('sawSplash'))
51705                return;
51706
51707           context.storage('sawSplash', true);
51708
51709           var modalSelection = uiModal(selection);
51710
51711           modalSelection.select('.modal')
51712               .attr('class', 'modal-splash modal col6');
51713
51714           var introModal = modalSelection.select('.content')
51715               .append('div')
51716               .attr('class', 'fillL');
51717
51718           introModal
51719               .append('div')
51720               .attr('class','modal-section cf')
51721               .append('h3').text(t('splash.welcome'));
51722
51723           introModal
51724               .append('div')
51725               .attr('class','modal-section')
51726               .append('p')
51727               .html(t('splash.text', {
51728                   version: context.version,
51729                   website: '<a href="http://ideditor.com/">ideditor.com</a>',
51730                   github: '<a href="https://github.com/openstreetmap/iD">github.com</a>'
51731               }));
51732
51733           var buttonWrap = introModal
51734               .append('div')
51735               .attr('class', 'modal-actions cf');
51736
51737           var walkthrough = buttonWrap
51738               .append('button')
51739               .attr('class', 'walkthrough col6')
51740               .on('click', function() {
51741                   context.container().call(uiIntro(context));
51742                   modalSelection.close();
51743               });
51744
51745           walkthrough
51746               .append('svg')
51747               .attr('class', 'logo logo-walkthrough')
51748               .append('use')
51749               .attr('xlink:href', '#iD-logo-walkthrough');
51750
51751           walkthrough
51752               .append('div')
51753               .text(t('splash.walkthrough'));
51754
51755           var startEditing = buttonWrap
51756               .append('button')
51757               .attr('class', 'start-editing col6')
51758               .on('click', modalSelection.close);
51759
51760           startEditing
51761               .append('svg')
51762               .attr('class', 'logo logo-features')
51763               .append('use')
51764               .attr('xlink:href', '#iD-logo-features');
51765
51766           startEditing
51767               .append('div')
51768               .text(t('splash.start'));
51769
51770
51771           modalSelection.select('button.close')
51772               .attr('class','hide');
51773
51774       };
51775   }
51776
51777   function uiStatus(context) {
51778       var osm = context.connection();
51779
51780
51781       return function(selection$$1) {
51782           if (!osm) return;
51783
51784           function update() {
51785               osm.status(function(err, apiStatus) {
51786                   selection$$1.html('');
51787
51788                   if (err) {
51789                       if (apiStatus === 'connectionSwitched') {
51790                           // if the connection was just switched, we can't rely on
51791                           // the status (we're getting the status of the previous api)
51792                           return;
51793
51794                       } else if (apiStatus === 'rateLimited') {
51795                           selection$$1
51796                               .text(t('status.rateLimit'))
51797                               .append('a')
51798                               .attr('class', 'api-status-login')
51799                               .attr('target', '_blank')
51800                               .call(svgIcon('#iD-icon-out-link', 'inline'))
51801                               .append('span')
51802                               .text(t('login'))
51803                               .on('click.login', function() {
51804                                   event.preventDefault();
51805                                   osm.authenticate();
51806                               });
51807                       } else {
51808                           // eslint-disable-next-line no-warning-comments
51809                           // TODO: nice messages for different error types
51810                           selection$$1.text(t('status.error'));
51811                       }
51812
51813                   } else if (apiStatus === 'readonly') {
51814                       selection$$1.text(t('status.readonly'));
51815                   } else if (apiStatus === 'offline') {
51816                       selection$$1.text(t('status.offline'));
51817                   }
51818
51819                   selection$$1.attr('class', 'api-status ' + (err ? 'error' : apiStatus));
51820               });
51821           }
51822
51823           osm.on('change', function() { update(selection$$1); });
51824
51825           window.setInterval(update, 90000);
51826           update(selection$$1);
51827       };
51828   }
51829
51830   function uiUndoRedo(context) {
51831       var commands = [{
51832           id: 'undo',
51833           cmd: uiCmd('⌘Z'),
51834           action: function() { if (editable()) context.undo(); },
51835           annotation: function() { return context.history().undoAnnotation(); }
51836       }, {
51837           id: 'redo',
51838           cmd: uiCmd('⌘⇧Z'),
51839           action: function() { if (editable()) context.redo(); },
51840           annotation: function() { return context.history().redoAnnotation(); }
51841       }];
51842
51843
51844       function editable() {
51845           var mode = context.mode();
51846           return context.editable() && mode && mode.id !== 'save';
51847       }
51848
51849
51850       return function(selection$$1) {
51851           var tooltipBehavior = tooltip()
51852               .placement('bottom')
51853               .html(true)
51854               .title(function (d) {
51855                   return uiTooltipHtml(d.annotation() ?
51856                       t(d.id + '.tooltip', {action: d.annotation()}) :
51857                       t(d.id + '.nothing'), d.cmd);
51858               });
51859
51860           var buttons = selection$$1.selectAll('button')
51861               .data(commands)
51862               .enter()
51863               .append('button')
51864               .attr('class', function(d) { return 'disabled ' + d.id + '-button'; })
51865               .on('click', function(d) { return d.action(); })
51866               .call(tooltipBehavior);
51867
51868           buttons.each(function(d) {
51869               var iconName = d.id;
51870               if (textDirection === 'rtl') {
51871                   if (iconName === 'undo') {
51872                       iconName = 'redo';
51873                   } else if (iconName === 'redo') {
51874                       iconName = 'undo';
51875                   }
51876               }
51877               select(this)
51878                   .call(svgIcon('#iD-icon-' + iconName));
51879           });
51880
51881           context.keybinding()
51882               .on(commands[0].cmd, function() { event.preventDefault(); commands[0].action(); })
51883               .on(commands[1].cmd, function() { event.preventDefault(); commands[1].action(); });
51884
51885
51886           var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
51887
51888           context.map()
51889               .on('move.undo_redo', debouncedUpdate)
51890               .on('drawn.undo_redo', debouncedUpdate);
51891
51892           context.history()
51893               .on('change.undo_redo', update);
51894
51895           context
51896               .on('enter.undo_redo', update);
51897
51898
51899           function update() {
51900               buttons
51901                   .property('disabled', !editable())
51902                   .classed('disabled', function(d) { return !d.annotation(); })
51903                   .each(function() {
51904                       var selection$$1 = select(this);
51905                       if (selection$$1.property('tooltipVisible')) {
51906                           selection$$1.call(tooltipBehavior.show);
51907                       }
51908                   });
51909           }
51910       };
51911   }
51912
51913   // these are module variables so they are preserved through a ui.restart()
51914   var sawVersion = null;
51915   var isNewVersion = false;
51916   var isNewUser = false;
51917
51918
51919   function uiVersion(context) {
51920
51921       var currVersion = context.version;
51922       var matchedVersion = currVersion.match(/\d+\.\d+\.\d+.*/);
51923
51924       if (sawVersion === null && matchedVersion !== null) {
51925           isNewVersion = (context.storage('sawVersion') !== currVersion);
51926           isNewUser = !context.storage('sawSplash');
51927           context.storage('sawVersion', currVersion);
51928           sawVersion = currVersion;
51929       }
51930
51931       return function(selection) {
51932           selection
51933               .append('a')
51934               .attr('target', '_blank')
51935               .attr('tabindex', -1)
51936               .attr('href', 'https://github.com/openstreetmap/iD')
51937               .text(currVersion);
51938
51939           // only show new version indicator to users that have used iD before
51940           if (isNewVersion && !isNewUser) {
51941               selection
51942                   .append('div')
51943                   .attr('class', 'badge')
51944                   .append('a')
51945                   .attr('target', '_blank')
51946                   .attr('tabindex', -1)
51947                   .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CHANGELOG.md#whats-new')
51948                   .call(svgIcon('#maki-gift-11'))
51949                   .call(tooltip()
51950                       .title(t('version.whats_new', { version: currVersion }))
51951                       .placement('top')
51952                   );
51953           }
51954       };
51955   }
51956
51957   function uiZoom(context) {
51958       var zooms = [{
51959           id: 'zoom-in',
51960           icon: 'plus',
51961           title: t('zoom.in'),
51962           action: context.zoomIn,
51963           key: '+'
51964       }, {
51965           id: 'zoom-out',
51966           icon: 'minus',
51967           title: t('zoom.out'),
51968           action: context.zoomOut,
51969           key: '-'
51970       }];
51971
51972
51973       function zoomIn() {
51974           event.preventDefault();
51975           context.zoomIn();
51976       }
51977
51978
51979       function zoomOut() {
51980           event.preventDefault();
51981           context.zoomOut();
51982       }
51983
51984
51985       function zoomInFurther() {
51986           event.preventDefault();
51987           context.zoomInFurther();
51988       }
51989
51990
51991       function zoomOutFurther() {
51992           event.preventDefault();
51993           context.zoomOutFurther();
51994       }
51995
51996
51997       return function(selection$$1) {
51998           var button = selection$$1.selectAll('button')
51999               .data(zooms)
52000               .enter()
52001               .append('button')
52002               .attr('tabindex', -1)
52003               .attr('class', function(d) { return d.id; })
52004               .on('click.editor', function(d) { d.action(); })
52005               .call(tooltip()
52006                   .placement((textDirection === 'rtl') ? 'right' : 'left')
52007                   .html(true)
52008                   .title(function(d) {
52009                       return uiTooltipHtml(d.title, d.key);
52010                   })
52011               );
52012
52013           button.each(function(d) {
52014               select(this)
52015                   .call(svgIcon('#iD-icon-' + d.icon, 'light'));
52016           });
52017
52018           ['plus', 'ffplus', '=', 'ffequals'].forEach(function(key) {
52019               context.keybinding().on([key], zoomIn);
52020               context.keybinding().on([uiCmd('⌘' + key)], zoomInFurther);
52021           });
52022
52023           ['_', '-', 'ffminus', 'dash'].forEach(function(key) {
52024               context.keybinding().on([key], zoomOut);
52025               context.keybinding().on([uiCmd('⌘' + key)], zoomOutFurther);
52026           });
52027       };
52028   }
52029
52030   function uiInit(context) {
52031       var _initCounter = 0;
52032       var _initCallback;
52033       var _needWidth = {};
52034
52035
52036       function render(container) {
52037           container
52038               .attr('dir', textDirection);
52039
52040           var map = context.map();
52041
52042           container
52043               .append('svg')
52044               .attr('id', 'defs')
52045               .call(svgDefs(context));
52046
52047           container
52048               .append('div')
52049               .attr('id', 'sidebar')
52050               .call(ui.sidebar);
52051
52052           var content = container
52053               .append('div')
52054               .attr('id', 'content')
52055               .attr('class', 'active');
52056
52057           // Top toolbar
52058           var bar = content
52059               .append('div')
52060               .attr('id', 'bar')
52061               .attr('class', 'fillD');
52062
52063           content
52064               .append('div')
52065               .attr('id', 'map')
52066               .attr('dir', 'ltr')
52067               .call(map);
52068
52069           // Leading area button group (Sidebar toggle)
52070           var leadingArea = bar
52071               .append('div')
52072               .attr('class', 'tool-group leading-area');
52073
52074           var sidebarButton = leadingArea
52075               .append('div')
52076               .append('button')
52077               .attr('class', 'sidebar-toggle')
52078               .attr('tabindex', -1)
52079               .on('click', ui.sidebar.toggle)
52080               .call(tooltip()
52081                   .placement('bottom')
52082                   .html(true)
52083                   .title(uiTooltipHtml(t('sidebar.tooltip'), t('sidebar.key')))
52084               );
52085
52086           var iconSuffix = textDirection === 'rtl' ? 'right' : 'left';
52087           sidebarButton
52088               .call(svgIcon('#iD-icon-sidebar-' + iconSuffix));
52089
52090           leadingArea
52091               .append('div')
52092               .attr('class', 'full-screen bar-group')
52093               .call(uiFullScreen(context));
52094
52095
52096           // Center area button group (Point/Line/Area/Note mode buttons)
52097           bar
52098               .append('div')
52099               .attr('class', 'tool-group center-area')
52100               .append('div')
52101               .attr('class', 'modes joined')
52102               .call(uiModes(context), bar);
52103
52104
52105           // Trailing area button group (Undo/Redo save buttons)
52106           var trailingArea = bar
52107               .append('div')
52108               .attr('class', 'tool-group trailing-area');
52109
52110           trailingArea
52111               .append('div')
52112               .attr('class', 'joined')
52113               .call(uiUndoRedo(context));
52114
52115           trailingArea
52116               .append('div')
52117               .attr('class', 'save-wrap')
52118               .call(uiSave(context));
52119
52120
52121           // For now, just put spinner at the end of the #bar
52122           bar
52123               .append('div')
52124               .attr('class', 'spinner')
52125               .call(uiSpinner(context));
52126
52127
52128           // Map controls (appended to #bar, but absolutely positioned)
52129           var controls = bar
52130               .append('div')
52131               .attr('class', 'map-controls');
52132
52133           controls
52134               .append('div')
52135               .attr('class', 'map-control zoombuttons')
52136               .call(uiZoom(context));
52137
52138           controls
52139               .append('div')
52140               .attr('class', 'map-control geolocate-control')
52141               .call(uiGeolocate(context));
52142
52143           controls
52144               .append('div')
52145               .attr('class', 'map-control background-control')
52146               .call(uiBackground(context));
52147
52148           controls
52149               .append('div')
52150               .attr('class', 'map-control map-data-control')
52151               .call(uiMapData(context));
52152
52153           controls
52154               .append('div')
52155               .attr('class', 'map-control help-control')
52156               .call(uiHelp(context));
52157
52158
52159           // Add attribution and footer
52160           var about = content
52161               .append('div')
52162               .attr('id', 'about');
52163
52164           about
52165               .append('div')
52166               .attr('id', 'attrib')
52167               .attr('dir', 'ltr')
52168               .call(uiAttribution(context));
52169
52170           about
52171               .append('div')
52172               .attr('class', 'api-status')
52173               .call(uiStatus(context));
52174
52175
52176           var footer = about
52177               .append('div')
52178               .attr('id', 'footer')
52179               .attr('class', 'fillD');
52180
52181           footer
52182               .append('div')
52183               .attr('id', 'flash-wrap')
52184               .attr('class', 'footer-hide');
52185
52186           var footerWrap = footer
52187               .append('div')
52188               .attr('id', 'footer-wrap')
52189               .attr('class', 'footer-show');
52190
52191           footerWrap
52192               .append('div')
52193               .attr('id', 'scale-block')
52194               .call(uiScale(context));
52195
52196           var aboutList = footerWrap
52197               .append('div')
52198               .attr('id', 'info-block')
52199               .append('ul')
52200               .attr('id', 'about-list');
52201
52202           if (!context.embed()) {
52203               aboutList
52204                   .call(uiAccount(context));
52205           }
52206
52207           aboutList
52208               .append('li')
52209               .attr('class', 'version')
52210               .call(uiVersion(context));
52211
52212           var issueLinks = aboutList
52213               .append('li');
52214
52215           issueLinks
52216               .append('a')
52217               .attr('target', '_blank')
52218               .attr('tabindex', -1)
52219               .attr('href', 'https://github.com/openstreetmap/iD/issues')
52220               .call(svgIcon('#iD-icon-bug', 'light'))
52221               .call(tooltip().title(t('report_a_bug')).placement('top'));
52222
52223           issueLinks
52224               .append('a')
52225               .attr('target', '_blank')
52226               .attr('tabindex', -1)
52227               .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating')
52228               .call(svgIcon('#iD-icon-translate', 'light'))
52229               .call(tooltip().title(t('help_translate')).placement('top'));
52230
52231           aboutList
52232               .append('li')
52233               .attr('class', 'feature-warning')
52234               .attr('tabindex', -1)
52235               .call(uiFeatureInfo(context));
52236
52237           aboutList
52238               .append('li')
52239               .attr('class', 'user-list')
52240               .attr('tabindex', -1)
52241               .call(uiContributors(context));
52242
52243
52244           // Setup map dimensions and move map to initial center/zoom.
52245           // This should happen after #content and toolbars exist.
52246           ui.onResize();
52247
52248           var hash = behaviorHash(context);
52249           hash();
52250           if (!hash.hadHash) {
52251               map.centerZoom([0, 0], 2);
52252           }
52253
52254
52255           // Add absolutely-positioned elements that sit on top of the map
52256           // This should happen after the map is ready (center/zoom)
52257           content
52258               .call(uiMapInMap(context))
52259               .call(uiInfo(context))
52260               .call(uiNotice(context));
52261
52262           content
52263               .append('div')
52264               .attr('id', 'photoviewer')
52265               .classed('al', true)       // 'al'=left,  'ar'=right
52266               .classed('hide', true)
52267               .call(ui.photoviewer);
52268
52269
52270           // Bind events
52271           window.onbeforeunload = function() {
52272               return context.save();
52273           };
52274           window.onunload = function() {
52275               context.history().unlock();
52276           };
52277
52278           select(window)
52279               .on('gesturestart.editor', eventCancel)
52280               .on('gesturechange.editor', eventCancel)
52281               .on('gestureend.editor', eventCancel)
52282               .on('resize.editor', ui.onResize);
52283
52284
52285           var panPixels = 80;
52286           context.keybinding()
52287               .on('⌫', function() { event.preventDefault(); })
52288               .on([t('sidebar.key'), '`', '²'], ui.sidebar.toggle)   // #5663 - common QWERTY, AZERTY
52289               .on('←', pan([panPixels, 0]))
52290               .on('↑', pan([0, panPixels]))
52291               .on('→', pan([-panPixels, 0]))
52292               .on('↓', pan([0, -panPixels]))
52293               .on(['⇧←', uiCmd('⌘←')], pan([map.dimensions()[0], 0]))
52294               .on(['⇧↑', uiCmd('⌘↑')], pan([0, map.dimensions()[1]]))
52295               .on(['⇧→', uiCmd('⌘→')], pan([-map.dimensions()[0], 0]))
52296               .on(['⇧↓', uiCmd('⌘↓')], pan([0, -map.dimensions()[1]]));
52297
52298           context.enter(modeBrowse(context));
52299
52300           if (!_initCounter++) {
52301               if (!hash.startWalkthrough) {
52302                   context.container()
52303                       .call(uiSplash(context))
52304                       .call(uiRestore(context));
52305               }
52306
52307               context.container()
52308                   .call(uiShortcuts(context));
52309           }
52310
52311           var osm = context.connection();
52312           var auth = uiLoading(context).message(t('loading_auth')).blocking(true);
52313
52314           if (osm && auth) {
52315               osm
52316                   .on('authLoading.ui', function() {
52317                       context.container()
52318                           .call(auth);
52319                   })
52320                   .on('authDone.ui', function() {
52321                       auth.close();
52322                   });
52323           }
52324
52325           _initCounter++;
52326
52327           if (hash.startWalkthrough) {
52328               hash.startWalkthrough = false;
52329               context.container().call(uiIntro(context));
52330           }
52331
52332
52333           function pan(d) {
52334               return function() {
52335                   if (select('.combobox').size()) return;
52336                   event.preventDefault();
52337                   context.pan(d, 100);
52338               };
52339           }
52340
52341           function eventCancel() {
52342               event.preventDefault();
52343           }
52344       }
52345
52346
52347       function ui(node, callback) {
52348           _initCallback = callback;
52349           var container = select(node);
52350           context.container(container);
52351           context.loadLocale(function(err) {
52352               if (!err) {
52353                   render(container);
52354               }
52355               if (callback) {
52356                   callback(err);
52357               }
52358           });
52359       }
52360
52361
52362       ui.restart = function(arg) {
52363           context.keybinding().clear();
52364           context.locale(arg);
52365           context.loadLocale(function(err) {
52366               if (!err) {
52367                   context.container().selectAll('*').remove();
52368                   render(context.container());
52369                   if (_initCallback) _initCallback();
52370               }
52371           });
52372       };
52373
52374
52375       ui.sidebar = uiSidebar$$1(context);
52376
52377       ui.photoviewer = uiPhotoviewer(context);
52378
52379       ui.onResize = function(withPan) {
52380           var map = context.map();
52381
52382           // Recalc dimensions of map and sidebar.. (`true` = force recalc)
52383           // This will call `getBoundingClientRect` and trigger reflow,
52384           //  but the values will be cached for later use.
52385           var mapDimensions = utilGetDimensions(select('#content'), true);
52386           utilGetDimensions(select('#sidebar'), true);
52387
52388           if (withPan !== undefined) {
52389               map.redrawEnable(false);
52390               map.pan(withPan);
52391               map.redrawEnable(true);
52392           }
52393           map.dimensions(mapDimensions);
52394
52395           ui.photoviewer.onMapResize();
52396
52397           // check if header or footer have overflowed
52398           ui.checkOverflow('#bar');
52399           ui.checkOverflow('#footer');
52400
52401           // Use outdated code so it works on Explorer
52402           var resizeWindowEvent = document.createEvent('Event');
52403
52404           resizeWindowEvent.initEvent('resizeWindow', true, true);
52405
52406           document.dispatchEvent(resizeWindowEvent);
52407       };
52408
52409
52410       // Call checkOverflow when resizing or whenever the contents change.
52411       ui.checkOverflow = function(selector$$1, reset) {
52412           if (reset) {
52413               delete _needWidth[selector$$1];
52414           }
52415
52416           var element = select(selector$$1);
52417           var scrollWidth = element.property('scrollWidth');
52418           var clientWidth = element.property('clientWidth');
52419           var needed = _needWidth[selector$$1] || scrollWidth;
52420
52421           if (scrollWidth > clientWidth) {    // overflow happening
52422               element.classed('narrow', true);
52423               if (!_needWidth[selector$$1]) {
52424                   _needWidth[selector$$1] = scrollWidth;
52425               }
52426
52427           } else if (scrollWidth >= needed) {
52428               element.classed('narrow', false);
52429           }
52430       };
52431
52432
52433       return ui;
52434   }
52435
52436   /**
52437    * This method is like `_.uniq` except that it accepts `iteratee` which is
52438    * invoked for each element in `array` to generate the criterion by which
52439    * uniqueness is computed. The order of result values is determined by the
52440    * order they occur in the array. The iteratee is invoked with one argument:
52441    * (value).
52442    *
52443    * @static
52444    * @memberOf _
52445    * @since 4.0.0
52446    * @category Array
52447    * @param {Array} array The array to inspect.
52448    * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
52449    * @returns {Array} Returns the new duplicate free array.
52450    * @example
52451    *
52452    * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
52453    * // => [2.1, 1.2]
52454    *
52455    * // The `_.property` iteratee shorthand.
52456    * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
52457    * // => [{ 'x': 1 }, { 'x': 2 }]
52458    */
52459   function uniqBy(array, iteratee) {
52460     return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];
52461   }
52462
52463   function uiChangesetEditor$$1(context) {
52464       var dispatch$$1 = dispatch('change');
52465       var formFields = uiFormFields$$1(context);
52466       var commentCombo = uiCombobox(context, 'comment').caseSensitive(true);
52467       var _fieldsArr;
52468       var _tags;
52469       var _changesetID;
52470
52471
52472       function changesetEditor(selection) {
52473           render(selection);
52474       }
52475
52476
52477       function render(selection) {
52478           var initial = false;
52479
52480           if (!_fieldsArr) {
52481               initial = true;
52482               var presets = context.presets();
52483
52484               _fieldsArr = [
52485                   uiField(context, presets.field('comment'), null, { show: true, revert: false }),
52486                   uiField(context, presets.field('source'), null, { show: false, revert: false }),
52487                   uiField(context, presets.field('hashtags'), null, { show: false, revert: false }),
52488               ];
52489
52490               _fieldsArr.forEach(function(field) {
52491                   field
52492                       .on('change', function(t$$1, onInput) {
52493                           dispatch$$1.call('change', field, t$$1, onInput);
52494                       });
52495               });
52496           }
52497
52498           _fieldsArr.forEach(function(field) {
52499               field
52500                   .tags(_tags);
52501           });
52502
52503
52504           selection
52505               .call(formFields.fieldsArr(_fieldsArr));
52506
52507
52508           if (initial) {
52509               var commentField = selection.select('#preset-input-comment');
52510               var commentNode = commentField.node();
52511
52512               if (commentNode) {
52513                   commentNode.focus();
52514                   commentNode.select();
52515               }
52516
52517               // trigger a 'blur' event so that comment field can be cleaned
52518               // and checked for hashtags, even if retrieved from localstorage
52519               utilTriggerEvent(commentField, 'blur');
52520
52521               var osm = context.connection();
52522               if (osm) {
52523                   osm.userChangesets(function (err, changesets) {
52524                       if (err) return;
52525
52526                       var comments = changesets.map(function(changeset) {
52527                           return {
52528                               title: changeset.tags.comment,
52529                               value: changeset.tags.comment
52530                           };
52531                       });
52532
52533                       commentField
52534                           .call(commentCombo
52535                               .data(uniqBy(comments, 'title'))
52536                           );
52537                   });
52538               }
52539           }
52540
52541           // Add warning if comment mentions Google
52542           var hasGoogle = _tags.comment.match(/google/i);
52543           var commentWarning = selection.select('.form-field-comment').selectAll('.comment-warning')
52544               .data(hasGoogle ? [0] : []);
52545
52546           commentWarning.exit()
52547               .transition()
52548               .duration(200)
52549               .style('opacity', 0)
52550               .remove();
52551
52552           var commentEnter = commentWarning.enter()
52553               .insert('div', '.tag-reference-body')
52554               .attr('class', 'field-warning comment-warning')
52555               .style('opacity', 0);
52556
52557           commentEnter
52558               .append('a')
52559               .attr('target', '_blank')
52560               .attr('tabindex', -1)
52561               .call(svgIcon('#iD-icon-alert', 'inline'))
52562               .attr('href', t('commit.google_warning_link'))
52563               .append('span')
52564               .text(t('commit.google_warning'));
52565
52566           commentEnter
52567               .transition()
52568               .duration(200)
52569               .style('opacity', 1);
52570       }
52571
52572
52573       changesetEditor.tags = function(_) {
52574           if (!arguments.length) return _tags;
52575           _tags = _;
52576           // Don't reset _fieldsArr here.
52577           return changesetEditor;
52578       };
52579
52580
52581       changesetEditor.changesetID = function(_) {
52582           if (!arguments.length) return _changesetID;
52583           if (_changesetID === _) return changesetEditor;
52584           _changesetID = _;
52585           _fieldsArr = null;
52586           return changesetEditor;
52587       };
52588
52589
52590       return utilRebind(changesetEditor, dispatch$$1, 'on');
52591   }
52592
52593   // This code assumes that the combobox values will not have duplicate entries.
52594   // It is keyed on the `value` of the entry.
52595   // Data should be an array of objects like:
52596   //   [{
52597   //       title:  'hover text',
52598   //       value:  'display text'
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 _values = [];
52609       var _selected = null;
52610       var _canAutocomplete = true;
52611       var _caseSensitive = false;
52612       var _cancelFetch = false;
52613       var _minItems = 2;
52614       var _tDown = 0;
52615
52616       var _fetcher = function(val, cb) {
52617           cb(_values.filter(function(d) {
52618               return d.value
52619                   .toString()
52620                   .toLowerCase()
52621                   .indexOf(val.toLowerCase()) !== -1;
52622           }));
52623       };
52624
52625       var combobox = function(input, attachTo) {
52626           if (!input || input.empty()) return;
52627
52628           input
52629               .classed('combobox-input', true)
52630               .on('focus.combobox', focus)
52631               .on('blur.combobox', blur)
52632               .on('keydown.combobox', keydown)
52633               .on('keyup.combobox', keyup)
52634               .on('input.combobox', change)
52635               .on('mousedown.combobox', mousedown)
52636               .each(addCaret);
52637
52638
52639           function addCaret() {
52640               var parent = this.parentNode;
52641               var sibling = this.nextSibling;
52642
52643               select(parent).selectAll('.combobox-caret')
52644                   .filter(function(d) { return d === input.node(); })
52645                   .data([input.node()])
52646                   .enter()
52647                   .insert('div', function() { return sibling; })
52648                   .attr('class', 'combobox-caret');
52649           }
52650
52651
52652           function mousedown() {
52653               if (event.button !== 0) return;    // left click only
52654
52655               var start = input.property('selectionStart');
52656               var end = input.property('selectionEnd');
52657               if (start !== end) return;  // exit if user is deselecting
52658
52659               _tDown = +new Date();
52660               input.on('mouseup.combobox', mouseup);
52661           }
52662
52663
52664           function mouseup() {
52665               input.on('mouseup.combobox', null);
52666
52667               if (event.button !== 0) return;    // left click only
52668
52669               var start = input.property('selectionStart');
52670               var end = input.property('selectionEnd');
52671               if (start !== end) return;  // exit if user is selecting
52672
52673               var combo = container.selectAll('.combobox');
52674               if (combo.empty()) {   // not showing - try to show it.
52675                   var tOrig = _tDown;
52676                   window.setTimeout(function() {
52677                       if (tOrig !== _tDown) return;   // exit if user double clicked
52678                       input.node().focus();
52679                       fetch('', function() {
52680                           show();
52681                           render();
52682                       });
52683                   }, 75);
52684
52685               } else {
52686                   hide();
52687               }
52688           }
52689
52690
52691           function focus() {
52692               fetch('');   // prefetch values (may warm taginfo cache)
52693           }
52694
52695
52696           function blur() {
52697               _comboHideTimerID = window.setTimeout(hide, 75);
52698           }
52699
52700
52701           function show() {
52702               hide();   // remove any existing
52703
52704               container
52705                   .insert('div', ':first-child')
52706                   .datum(input.node())
52707                   .attr('class', 'combobox' + (klass ? ' combobox-' + klass : ''))
52708                   .style('position', 'absolute')
52709                   .style('display', 'block')
52710                   .style('left', '0px')
52711                   .on('mousedown.combobox', function () {
52712                       // prevent moving focus out of the input field
52713                       event.preventDefault();
52714                   });
52715
52716               select('body')
52717                   .on('scroll.combobox', render, true);
52718           }
52719
52720
52721           function hide() {
52722               if (_comboHideTimerID) {
52723                   window.clearTimeout(_comboHideTimerID);
52724                   _comboHideTimerID = undefined;
52725               }
52726
52727               container.selectAll('.combobox')
52728                   .remove();
52729
52730               select('body')
52731                   .on('scroll.combobox', null);
52732           }
52733
52734
52735           function keydown() {
52736               var shown = !container.selectAll('.combobox').empty();
52737               var tagName = input.node() ? input.node().tagName.toLowerCase() : '';
52738
52739               switch (event.keyCode) {
52740                   case 8:   // ⌫ Backspace
52741                   case 46:  // ⌦ Delete
52742                       event.stopPropagation();
52743                       _selected = null;
52744                       render();
52745                       input.on('input.combobox', function() {
52746                           var start = input.property('selectionStart');
52747                           input.node().setSelectionRange(start, start);
52748                           input.on('input.combobox', change);
52749                       });
52750                       break;
52751
52752                   case 9:   // ⇥ Tab
52753                       event.stopPropagation();
52754                       accept();
52755                       break;
52756
52757                   case 13:  // ↩ Return
52758                       event.preventDefault();
52759                       event.stopPropagation();
52760                       break;
52761
52762                   case 38:  // ↑ Up arrow
52763                       if (tagName === 'textarea' && !shown) return;
52764                       event.preventDefault();
52765                       if (tagName === 'input' && !shown) {
52766                           show();
52767                       }
52768                       nav(-1);
52769                       break;
52770
52771                   case 40:  // ↓ Down arrow
52772                       if (tagName === 'textarea' && !shown) return;
52773                       event.preventDefault();
52774                       if (tagName === 'input' && !shown) {
52775                           show();
52776                       }
52777                       nav(+1);
52778                       break;
52779               }
52780           }
52781
52782
52783           function keyup() {
52784               switch (event.keyCode) {
52785                   case 27:  // ⎋ Escape
52786                       cancel();
52787                       break;
52788
52789                   case 13:  // ↩ Return
52790                       accept();
52791                       break;
52792               }
52793           }
52794
52795
52796           // return the datum for the currently chosen value
52797           function datum(val) {
52798               for (var i = 0; i < _suggestions.length; i++) {
52799                   var suggestion = _suggestions[i];
52800                   if (suggestion.value === val) {
52801                       return suggestion;
52802                   }
52803               }
52804               return null;
52805           }
52806
52807
52808           // Called whenever the input value is changed (e.g. on typing)
52809           function change() {
52810               fetch(value(), function() {
52811                   _selected = null;
52812                   var val = input.property('value');
52813
52814                   if (_suggestions.length) {
52815                       if (input.property('selectionEnd') === val.length) {
52816                           _selected = tryAutocomplete();
52817                       }
52818
52819                       if (!_selected) {
52820                           _selected = datum(val);
52821                       }
52822                   }
52823
52824                   if (val.length) {
52825                       var combo = container.selectAll('.combobox');
52826                       if (combo.empty()) {
52827                           show();
52828                       }
52829                   } else {
52830                       hide();
52831                   }
52832
52833                   render();
52834               });
52835           }
52836
52837
52838           // Called when the user presses up/down arrows to navigate the list
52839           function nav(dir) {
52840               if (_suggestions.length) {
52841                   // try to determine previously selected index..
52842                   var index = -1;
52843                   for (var i = 0; i < _suggestions.length; i++) {
52844                       if (_selected && _suggestions[i].value === _selected.value) {
52845                           index = i;
52846                           break;
52847                       }
52848                   }
52849
52850                   // pick new _selected
52851                   index = Math.max(Math.min(index + dir, _suggestions.length - 1), 0);
52852                   _selected = _suggestions[index];
52853                   input.property('value', _selected.value);
52854               }
52855
52856               render();
52857               ensureVisible();
52858           }
52859
52860
52861           function ensureVisible() {
52862               var combo = container.selectAll('.combobox');
52863               if (combo.empty()) return;
52864
52865               var containerRect = container.node().getBoundingClientRect();
52866               var comboRect = combo.node().getBoundingClientRect();
52867
52868               if (comboRect.bottom > containerRect.bottom) {
52869                   var node = attachTo ? attachTo.node() : input.node();
52870                   node.scrollIntoView({ behavior: 'instant', block: 'center' });
52871                   render();
52872               }
52873
52874               // https://stackoverflow.com/questions/11039885/scrollintoview-causing-the-whole-page-to-move
52875               var selected = combo.selectAll('.combobox-option.selected').node();
52876               if (selected) {
52877                   selected.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
52878               }
52879           }
52880
52881
52882           function value() {
52883               var value = input.property('value');
52884               var start = input.property('selectionStart');
52885               var end = input.property('selectionEnd');
52886
52887               if (start && end) {
52888                   value = value.substring(0, start);
52889               }
52890
52891               return value;
52892           }
52893
52894
52895           function fetch(v, cb) {
52896               _cancelFetch = false;
52897
52898               _fetcher.call(input, v, function(results) {
52899                   if (_cancelFetch) return;
52900                   _suggestions = results;
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 _suggestions[bestIndex];
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                   .text(function(d) { return d.value; })
52963                   .merge(options)
52964                   .attr('title', function(d) { return d.title; })
52965                   .classed('selected', function(d) { return d === _selected; })
52966                   .on('click.combobox', 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 = datum(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 _values;
53035           _values = 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.combobox', null)
53059           .on('blur.combobox', null)
53060           .on('keydown.combobox', null)
53061           .on('keyup.combobox', null)
53062           .on('input.combobox', null)
53063           .on('mousedown.combobox', null)
53064           .on('mouseup.combobox', null);
53065
53066
53067       select('body')
53068           .on('scroll.combobox', 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
56553           items = div.selectAll('li')
56554               .data(field.keys);
56555
56556           var enter = items.enter()
56557               .append('li')
56558               .attr('class', function(d) { return 'preset-cycleway-' + stripcolon(d); });
56559
56560           enter
56561               .append('span')
56562               .attr('class', 'label preset-label-cycleway')
56563               .attr('for', function(d) { return 'preset-input-cycleway-' + stripcolon(d); })
56564               .text(function(d) { return field.t('types.' + d); });
56565
56566           enter
56567               .append('div')
56568               .attr('class', 'preset-input-cycleway-wrap')
56569               .append('input')
56570               .attr('type', 'text')
56571               .attr('class', function(d) { return 'preset-input-cycleway preset-input-' + stripcolon(d); })
56572               .call(utilNoAuto)
56573               .each(function(d) {
56574                   select(this)
56575                       .call(uiCombobox(context, 'cycleway-' + stripcolon(d))
56576                           .data(cycleway.options(d))
56577                       );
56578               });
56579
56580
56581           // Update
56582           wrap.selectAll('.preset-input-cycleway')
56583               .on('change', change)
56584               .on('blur', change);
56585       }
56586
56587
56588       function change() {
56589           var left = utilGetSetValue(select('.preset-input-cyclewayleft'));
56590           var right = utilGetSetValue(select('.preset-input-cyclewayright'));
56591           var tag = {};
56592
56593           if (left === 'none' || left === '') { left = undefined; }
56594           if (right === 'none' || right === '') { right = undefined; }
56595
56596           // Always set both left and right as changing one can affect the other
56597           tag = {
56598               cycleway: undefined,
56599               'cycleway:left': left,
56600               'cycleway:right': right
56601           };
56602
56603           // If the left and right tags match, use the cycleway tag to tag both
56604           // sides the same way
56605           if (left === right) {
56606               tag = {
56607                   cycleway: left,
56608                   'cycleway:left': undefined,
56609                   'cycleway:right': undefined
56610               };
56611           }
56612
56613           dispatch$$1.call('change', this, tag);
56614       }
56615
56616
56617       cycleway.options = function() {
56618           return Object.keys(field.strings.options).map(function(option) {
56619               return {
56620                   title: field.t('options.' + option + '.description'),
56621                   value: option
56622               };
56623           });
56624       };
56625
56626
56627       cycleway.tags = function(tags) {
56628           utilGetSetValue(items.selectAll('.preset-input-cycleway'), function(d) {
56629                   // If cycleway is set, always return that
56630                   if (tags.cycleway) {
56631                       return tags.cycleway;
56632                   }
56633                   return tags[d] || '';
56634               })
56635               .attr('placeholder', field.placeholder());
56636       };
56637
56638
56639       cycleway.focus = function() {
56640           var node = wrap.selectAll('input').node();
56641           if (node) node.focus();
56642       };
56643
56644
56645       return utilRebind(cycleway, dispatch$$1, 'on');
56646   }
56647
56648   function uiFieldLanes(field, context) {
56649       var dispatch$$1 = dispatch('change');
56650       var LANE_WIDTH = 40;
56651       var LANE_HEIGHT = 200;
56652       var _entityID;
56653
56654       function lanes(selection$$1) {
56655           var lanesData = context.entity(_entityID).lanes();
56656
56657           if (!select('.inspector-wrap.inspector-hidden').empty() || !selection$$1.node().parentNode) {
56658               selection$$1.call(lanes.off);
56659               return;
56660           }
56661
56662           var wrap = selection$$1.selectAll('.form-field-input-wrap')
56663               .data([0]);
56664
56665           wrap = wrap.enter()
56666               .append('div')
56667               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
56668               .merge(wrap);
56669
56670           var surface =  wrap.selectAll('.surface')
56671               .data([0]);
56672
56673           var d = utilGetDimensions(wrap);
56674           var freeSpace = d[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5;
56675
56676           surface = surface.enter()
56677               .append('svg')
56678               .attr('width', d[0])
56679               .attr('height', 300)
56680               .attr('class', 'surface')
56681               .merge(surface);
56682
56683
56684           var lanesSelection = surface.selectAll('.lanes')
56685               .data([0]);
56686
56687           lanesSelection = lanesSelection.enter()
56688               .append('g')
56689               .attr('class', 'lanes')
56690               .merge(lanesSelection);
56691
56692           lanesSelection
56693               .attr('transform', function () {
56694                   return 'translate(' + (freeSpace / 2) + ', 0)';
56695               });
56696
56697
56698           var lane = lanesSelection.selectAll('.lane')
56699              .data(lanesData.lanes);
56700
56701           lane.exit()
56702               .remove();
56703
56704           var enter = lane.enter()
56705               .append('g')
56706               .attr('class', 'lane');
56707
56708           enter
56709               .append('g')
56710               .append('rect')
56711               .attr('y', 50)
56712               .attr('width', LANE_WIDTH)
56713               .attr('height', LANE_HEIGHT);
56714
56715           enter
56716               .append('g')
56717               .attr('class', 'forward')
56718               .append('text')
56719               .attr('y', 40)
56720               .attr('x', 14)
56721               .text('▲');
56722
56723           enter
56724               .append('g')
56725               .attr('class', 'bothways')
56726               .append('text')
56727               .attr('y', 40)
56728               .attr('x', 14)
56729               .text('▲▼');
56730
56731           enter
56732               .append('g')
56733               .attr('class', 'backward')
56734               .append('text')
56735               .attr('y', 40)
56736               .attr('x', 14)
56737               .text('▼');
56738
56739
56740           lane = lane
56741               .merge(enter);
56742
56743           lane
56744               .attr('transform', function(d) {
56745                   return 'translate(' + (LANE_WIDTH * d.index * 1.5) + ', 0)';
56746               });
56747
56748           lane.select('.forward')
56749               .style('visibility', function(d) {
56750                   return d.direction === 'forward' ? 'visible' : 'hidden';
56751               });
56752
56753           lane.select('.bothways')
56754               .style('visibility', function(d) {
56755                   return d.direction === 'bothways' ? 'visible' : 'hidden';
56756               });
56757
56758           lane.select('.backward')
56759               .style('visibility', function(d) {
56760                   return d.direction === 'backward' ? 'visible' : 'hidden';
56761               });
56762       }
56763
56764
56765       lanes.entity = function(val) {
56766           if (!_entityID || _entityID !== val.id) {
56767               _entityID = val.id;
56768           }
56769       };
56770
56771       lanes.tags = function() {};
56772       lanes.focus = function() {};
56773       lanes.off = function() {};
56774
56775       return utilRebind(lanes, dispatch$$1, 'on');
56776   }
56777
56778   function uiFieldLocalized(field, context) {
56779       var dispatch$$1 = dispatch('change', 'input');
56780       var wikipedia = services.wikipedia;
56781       var input = select(null);
56782       var localizedInputs = select(null);
56783
56784       var allSuggestions = context.presets().collection.filter(function(p) {
56785           return p.suggestion === true;
56786       });
56787
56788       // reuse these combos
56789       var langCombo = uiCombobox(context, 'localized-lang')
56790           .fetcher(fetchLanguages)
56791           .minItems(0);
56792
56793       var brandCombo = uiCombobox(context, 'localized-brand')
56794           .canAutocomplete(false)
56795           .minItems(1);
56796
56797       var _selection = select(null);
56798       var _multilingual = [];
56799       var _isLocked = false;
56800       var _brandTip = tooltip()
56801           .title(t('inspector.lock.suggestion', { label: field.label }))
56802           .placement('bottom');
56803       var _buttonTip = tooltip()
56804           .title(t('translate.translate'))
56805           .placement('left');
56806       var _wikiTitles;
56807       var _entity;
56808
56809
56810       function calcLocked() {
56811           if (!_entity) {    // the original entity
56812               _isLocked = false;
56813               return;
56814           }
56815
56816           var latest = context.hasEntity(_entity.id);
56817           if (!latest) {    // get current entity, possibly edited
56818               _isLocked = false;
56819               return;
56820           }
56821
56822           var hasOriginalName = (latest.tags.name && latest.tags.name === _entity.tags.name);
56823           var hasWikidata = latest.tags.wikidata;
56824           var preset = context.presets().match(latest, context.graph());
56825           var isSuggestion = preset && preset.suggestion;
56826           var showsBrand = preset && preset.fields
56827               .filter(function(d) { return d.id === 'brand'; }).length;
56828
56829           _isLocked = !!(field.id === 'name' && hasOriginalName &&
56830               (hasWikidata || (isSuggestion && !showsBrand)));
56831       }
56832
56833
56834       function calcMultilingual(tags) {
56835           _multilingual = [];
56836           for (var k in tags) {
56837               var m = k.match(/^(.*):([a-zA-Z_-]+)$/);
56838               if (m && m[1] === field.key && m[2]) {
56839                   _multilingual.push({ lang: m[2], value: tags[k] });
56840               }
56841           }
56842           _multilingual.reverse();
56843       }
56844
56845
56846       function localized(selection$$1) {
56847           _selection = selection$$1;
56848           calcLocked();
56849           var entity = _entity && context.hasEntity(_entity.id);  // get latest
56850           var preset = entity && context.presets().match(entity, context.graph());
56851
56852           var wrap = selection$$1.selectAll('.form-field-input-wrap')
56853               .data([0]);
56854
56855           // enter/update
56856           wrap = wrap.enter()
56857               .append('div')
56858               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
56859               .merge(wrap)
56860               .call(_isLocked ? _brandTip : _brandTip.destroy);
56861
56862
56863           input = wrap.selectAll('.localized-main')
56864               .data([0]);
56865
56866           // enter/update
56867           input = input.enter()
56868               .append('input')
56869               .attr('type', 'text')
56870               .attr('id', 'preset-input-' + field.safeid)
56871               .attr('class', 'localized-main')
56872               .attr('placeholder', field.placeholder())
56873               .call(utilNoAuto)
56874               .merge(input);
56875
56876           if (preset && field.id === 'name') {
56877               var pTag = preset.id.split('/', 2);
56878               var pKey = pTag[0];
56879               var pValue = pTag[1];
56880
56881               if (preset.suggestion) {
56882                   // A "suggestion" preset (brand name)
56883                   // Put suggestion keys in `field.keys` so delete button can remove them all.
56884                   field.keys = Object.keys(preset.removeTags)
56885                       .filter(function(k) { return k !== pKey; });
56886
56887               } else {
56888                   // Not a suggestion preset - Add a suggestions dropdown if it makes sense to.
56889                   // This code attempts to determine if the matched preset is the
56890                   // kind of preset that even can benefit from name suggestions..
56891                   // - true = shops, cafes, hotels, etc. (also generic and fallback presets)
56892                   // - false = churches, parks, hospitals, etc. (things not in the index)
56893                   var isFallback = preset.isFallback();
56894                   var goodSuggestions = allSuggestions.filter(function(s) {
56895                       if (isFallback) return true;
56896                       var sTag = s.id.split('/', 2);
56897                       var sKey = sTag[0];
56898                       var sValue = sTag[1];
56899                       return pKey === sKey && (!pValue || pValue === sValue);
56900                   });
56901
56902                   // Show the suggestions.. If the user picks one, change the tags..
56903                   if (allSuggestions.length && goodSuggestions.length) {
56904                       input
56905                           .call(brandCombo
56906                               .fetcher(fetchBrandNames(preset, allSuggestions))
56907                               .on('accept', acceptBrand)
56908                               .on('cancel', cancelBrand)
56909                           );
56910                   }
56911               }
56912           }
56913
56914           input
56915               .classed('disabled', !!_isLocked)
56916               .attr('readonly', _isLocked || null)
56917               .on('input', change(true))
56918               .on('blur', change())
56919               .on('change', change());
56920
56921
56922           var translateButton = wrap.selectAll('.localized-add')
56923               .data([0]);
56924
56925           translateButton = translateButton.enter()
56926               .append('button')
56927               .attr('class', 'localized-add form-field-button')
56928               .attr('tabindex', -1)
56929               .call(svgIcon('#iD-icon-plus'))
56930               .merge(translateButton);
56931
56932           translateButton
56933               .classed('disabled', !!_isLocked)
56934               .call(_isLocked ? _buttonTip.destroy : _buttonTip)
56935               .on('click', addNew);
56936
56937
56938           if (entity && !_multilingual.length) {
56939               calcMultilingual(entity.tags);
56940           }
56941
56942           localizedInputs = selection$$1.selectAll('.localized-multilingual')
56943               .data([0]);
56944
56945           localizedInputs = localizedInputs.enter()
56946               .append('div')
56947               .attr('class', 'localized-multilingual')
56948               .merge(localizedInputs);
56949
56950           localizedInputs
56951               .call(renderMultilingual);
56952
56953           localizedInputs.selectAll('button, input')
56954               .classed('disabled', !!_isLocked)
56955               .attr('readonly', _isLocked || null);
56956
56957
56958
56959           function acceptBrand(d) {
56960               if (!d) {
56961                   cancelBrand();
56962                   return;
56963               }
56964
56965               var entity = context.entity(_entity.id);  // get latest
56966               var tags = entity.tags;
56967               var geometry = entity.geometry(context.graph());
56968               var removed = preset.unsetTags(tags, geometry);
56969               for (var k in tags) {
56970                   tags[k] = removed[k];  // set removed tags to `undefined`
56971               }
56972               tags = d.suggestion.setTags(tags, geometry);
56973               utilGetSetValue(input, tags.name);
56974               dispatch$$1.call('change', this, tags);
56975           }
56976
56977
56978           function cancelBrand() {
56979               // user hit escape, remove whatever is after the last ' – '
56980               // NOTE: split/join on en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
56981               var name = utilGetSetValue(input);
56982               var parts = name.split(' – ');
56983               parts.pop();
56984               name = parts.join(' – ');
56985               utilGetSetValue(input, name);
56986               dispatch$$1.call('change', this, { name: name });
56987           }
56988
56989
56990           function fetchBrandNames(preset, suggestions) {
56991               var pTag = preset.id.split('/', 2);
56992               var pKey = pTag[0];
56993               var pValue = pTag[1];
56994
56995               return function(value, callback) {
56996                   var results = [];
56997                   if (value && value.length > 2) {
56998                       for (var i = 0; i < suggestions.length; i++) {
56999                           var s = suggestions[i];
57000                           var sTag = s.id.split('/', 2);
57001                           var sKey = sTag[0];
57002                           var sValue = sTag[1];
57003                           var name = s.name();
57004                           var dist = utilEditDistance(value, name.substring(0, value.length));
57005                           var matchesPreset = (pKey === sKey && (!pValue || pValue === sValue));
57006
57007                           if (dist < 1 || (matchesPreset && dist < 3)) {
57008                               var obj = {
57009                                   title: name,
57010                                   value: name,
57011                                   suggestion: s,
57012                                   dist: dist + (matchesPreset ? 0 : 1)  // penalize if not matched preset
57013                               };
57014                               results.push(obj);
57015                           }
57016                       }
57017                       results.sort(function(a, b) { return a.dist - b.dist; });
57018                   }
57019                   results = results.slice(0, 10);
57020                   callback(results);
57021               };
57022           }
57023
57024
57025           function addNew() {
57026               event.preventDefault();
57027               if (_isLocked) return;
57028
57029               var defaultLang = utilDetect().locale.toLowerCase().split('-')[0];
57030               var langExists = find$1(_multilingual, function(datum) { return datum.lang === defaultLang;});
57031               var isLangEn = defaultLang.indexOf('en') > -1;
57032               if (isLangEn || langExists) {
57033                   defaultLang = '';
57034               }
57035               _multilingual.push({ lang: defaultLang, value: '' });
57036
57037               localizedInputs
57038                   .call(renderMultilingual);
57039           }
57040
57041
57042           function change(onInput) {
57043               return function() {
57044                   if (_isLocked) {
57045                       event.preventDefault();
57046                       return;
57047                   }
57048                   var t$$1 = {};
57049                   t$$1[field.key] = utilGetSetValue(select(this)) || undefined;
57050                   dispatch$$1.call('change', this, t$$1, onInput);
57051               };
57052           }
57053       }
57054
57055
57056       function key(lang) {
57057           return field.key + ':' + lang;
57058       }
57059
57060
57061       function changeLang(d) {
57062           var lang = utilGetSetValue(select(this));
57063           var t$$1 = {};
57064           var language = find$1(wikipedia$2, function(d) {
57065               return d[0].toLowerCase() === lang.toLowerCase() ||
57066                   d[1].toLowerCase() === lang.toLowerCase();
57067           });
57068
57069           if (language) lang = language[2];
57070
57071           if (d.lang && d.lang !== lang) {
57072               t$$1[key(d.lang)] = undefined;
57073           }
57074
57075           var value = utilGetSetValue(select(this.parentNode)
57076               .selectAll('.localized-value'));
57077
57078           if (lang && value) {
57079               t$$1[key(lang)] = value;
57080           } else if (lang && _wikiTitles && _wikiTitles[d.lang]) {
57081               t$$1[key(lang)] = _wikiTitles[d.lang];
57082           }
57083
57084           d.lang = lang;
57085           dispatch$$1.call('change', this, t$$1);
57086       }
57087
57088
57089       function changeValue(d) {
57090           if (!d.lang) return;
57091           var t$$1 = {};
57092           t$$1[key(d.lang)] = utilGetSetValue(select(this)) || undefined;
57093           dispatch$$1.call('change', this, t$$1);
57094       }
57095
57096
57097       function fetchLanguages(value, cb) {
57098           var v = value.toLowerCase();
57099
57100           cb(wikipedia$2.filter(function(d) {
57101               return d[0].toLowerCase().indexOf(v) >= 0 ||
57102               d[1].toLowerCase().indexOf(v) >= 0 ||
57103               d[2].toLowerCase().indexOf(v) >= 0;
57104           }).map(function(d) {
57105               return { value: d[1] };
57106           }));
57107       }
57108
57109
57110       function renderMultilingual(selection$$1) {
57111           var wraps = selection$$1.selectAll('div.entry')
57112               .data(_multilingual, function(d) { return d.lang; });
57113
57114           wraps.exit()
57115               .transition()
57116               .duration(200)
57117               .style('max-height', '0px')
57118               .style('opacity', '0')
57119               .style('top', '-10px')
57120               .remove();
57121
57122           var innerWrap = wraps.enter()
57123               .insert('div', ':first-child');
57124
57125           innerWrap
57126               .attr('class', 'entry')
57127               .each(function() {
57128                   var wrap = select(this);
57129
57130                   var label = wrap
57131                       .append('label')
57132                       .attr('class', 'form-field-label');
57133
57134                   label
57135                       .append('span')
57136                       .attr('class', 'label-text')
57137                       .text(t('translate.localized_translation_label'));
57138
57139                   label
57140                       .append('button')
57141                       .attr('class', 'remove-icon-multilingual')
57142                       .on('click', function(d){
57143                           if (_isLocked) return;
57144                           event.preventDefault();
57145                           var t$$1 = {};
57146                           t$$1[key(d.lang)] = undefined;
57147                           dispatch$$1.call('change', this, t$$1);
57148                           select(this.parentNode.parentNode.parentNode)
57149                               .style('top', '0')
57150                               .style('max-height', '240px')
57151                               .transition()
57152                               .style('opacity', '0')
57153                               .style('max-height', '0px')
57154                               .remove();
57155                       })
57156                       .call(svgIcon('#iD-operation-delete'));
57157
57158                   wrap
57159                       .append('input')
57160                       .attr('class', 'localized-lang')
57161                       .attr('type', 'text')
57162                       .attr('placeholder', t('translate.localized_translation_language'))
57163                       .on('blur', changeLang)
57164                       .on('change', changeLang)
57165                       .call(langCombo);
57166
57167                   wrap
57168                       .append('input')
57169                       .attr('type', 'text')
57170                       .attr('placeholder', t('translate.localized_translation_name'))
57171                       .attr('class', 'localized-value')
57172                       .on('blur', changeValue)
57173                       .on('change', changeValue);
57174               });
57175
57176           innerWrap
57177               .style('margin-top', '0px')
57178               .style('max-height', '0px')
57179               .style('opacity', '0')
57180               .transition()
57181               .duration(200)
57182               .style('margin-top', '10px')
57183               .style('max-height', '240px')
57184               .style('opacity', '1')
57185               .on('end', function() {
57186                   select(this)
57187                       .style('max-height', '')
57188                       .style('overflow', 'visible');
57189               });
57190
57191
57192           var entry = selection$$1.selectAll('.entry');
57193
57194           utilGetSetValue(entry.select('.localized-lang'), function(d) {
57195               var lang = find$1(wikipedia$2, function(lang) { return lang[2] === d.lang; });
57196               return lang ? lang[1] : d.lang;
57197           });
57198
57199           utilGetSetValue(entry.select('.localized-value'),
57200               function(d) { return d.value; });
57201       }
57202
57203
57204       localized.tags = function(tags) {
57205           // Fetch translations from wikipedia
57206           if (tags.wikipedia && !_wikiTitles) {
57207               _wikiTitles = {};
57208               var wm = tags.wikipedia.match(/([^:]+):(.+)/);
57209               if (wm && wm[0] && wm[1]) {
57210                   wikipedia.translations(wm[1], wm[2], function(d) { _wikiTitles = d; });
57211               }
57212           }
57213
57214           utilGetSetValue(input, tags[field.key] || '');
57215
57216           calcMultilingual(tags);
57217
57218           _selection
57219               .call(localized);
57220       };
57221
57222
57223       localized.focus = function() {
57224           input.node().focus();
57225       };
57226
57227
57228       localized.entity = function(val) {
57229           if (!arguments.length) return _entity;
57230           _entity = val;
57231           _multilingual = [];
57232           return localized;
57233       };
57234
57235       return utilRebind(localized, dispatch$$1, 'on');
57236   }
57237
57238   function uiFieldMaxspeed(field, context) {
57239       var dispatch$$1 = dispatch('change');
57240       var unitInput = select(null);
57241       var input = select(null);
57242       var _entity;
57243       var _isImperial;
57244
57245       var speedCombo = uiCombobox(context, 'maxspeed');
57246       var unitCombo = uiCombobox(context, 'maxspeed-unit')
57247               .data(['km/h', 'mph'].map(comboValues));
57248
57249       var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120];
57250       var imperialValues = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80];
57251
57252
57253       function maxspeed(selection$$1) {
57254
57255           var wrap = selection$$1.selectAll('.form-field-input-wrap')
57256               .data([0]);
57257
57258           wrap = wrap.enter()
57259               .append('div')
57260               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
57261               .merge(wrap);
57262
57263
57264           input = wrap.selectAll('#preset-input-' + field.safeid)
57265               .data([0]);
57266
57267           input = input.enter()
57268               .append('input')
57269               .attr('type', 'text')
57270               .attr('id', 'preset-input-' + field.safeid)
57271               .attr('placeholder', field.placeholder())
57272               .call(utilNoAuto)
57273               .call(speedCombo)
57274               .merge(input);
57275
57276           input
57277               .on('change', change)
57278               .on('blur', change);
57279
57280           var loc;
57281           if (_entity.type === 'node') {
57282               loc = _entity.loc;
57283           } else {
57284               var childNodes = context.graph().childNodes(context.entity(_entity.id));
57285               loc = childNodes[~~(childNodes.length/2)].loc;
57286           }
57287
57288           _isImperial = some(dataImperial.features, function(f) {
57289               return some(f.geometry.coordinates, function(d) {
57290                   return geoPointInPolygon(loc, d);
57291               });
57292           });
57293
57294           unitInput = wrap.selectAll('input.maxspeed-unit')
57295               .data([0]);
57296
57297           unitInput = unitInput.enter()
57298               .append('input')
57299               .attr('type', 'text')
57300               .attr('class', 'maxspeed-unit')
57301               .call(unitCombo)
57302               .merge(unitInput);
57303
57304           unitInput
57305               .on('blur', changeUnits)
57306               .on('change', changeUnits);
57307
57308
57309           function changeUnits() {
57310               _isImperial = utilGetSetValue(unitInput) === 'mph';
57311               utilGetSetValue(unitInput, _isImperial ? 'mph' : 'km/h');
57312               setSuggestions();
57313               change();
57314           }
57315       }
57316
57317
57318       function setSuggestions() {
57319           speedCombo.data((_isImperial ? imperialValues : metricValues).map(comboValues));
57320           utilGetSetValue(unitInput, _isImperial ? 'mph' : 'km/h');
57321       }
57322
57323
57324       function comboValues(d) {
57325           return {
57326               value: d.toString(),
57327               title: d.toString()
57328           };
57329       }
57330
57331
57332       function change() {
57333           var tag = {};
57334           var value = utilGetSetValue(input);
57335
57336           if (!value) {
57337               tag[field.key] = undefined;
57338           } else if (isNaN(value) || !_isImperial) {
57339               tag[field.key] = value;
57340           } else {
57341               tag[field.key] = value + ' mph';
57342           }
57343
57344           dispatch$$1.call('change', this, tag);
57345       }
57346
57347
57348       maxspeed.tags = function(tags) {
57349           var value = tags[field.key];
57350
57351           if (value && value.indexOf('mph') >= 0) {
57352               value = parseInt(value, 10);
57353               _isImperial = true;
57354           } else if (value) {
57355               _isImperial = false;
57356           }
57357
57358           setSuggestions();
57359           utilGetSetValue(input, value || '');
57360       };
57361
57362
57363       maxspeed.focus = function() {
57364           input.node().focus();
57365       };
57366
57367
57368       maxspeed.entity = function(val) {
57369           _entity = val;
57370       };
57371
57372
57373       return utilRebind(maxspeed, dispatch$$1, 'on');
57374   }
57375
57376   /**
57377    * This function is like `baseIndexOf` except that it accepts a comparator.
57378    *
57379    * @private
57380    * @param {Array} array The array to inspect.
57381    * @param {*} value The value to search for.
57382    * @param {number} fromIndex The index to search from.
57383    * @param {Function} comparator The comparator invoked per element.
57384    * @returns {number} Returns the index of the matched value, else `-1`.
57385    */
57386   function baseIndexOfWith(array, value, fromIndex, comparator) {
57387     var index = fromIndex - 1,
57388         length = array.length;
57389
57390     while (++index < length) {
57391       if (comparator(array[index], value)) {
57392         return index;
57393       }
57394     }
57395     return -1;
57396   }
57397
57398   /** Used for built-in method references. */
57399   var arrayProto$2 = Array.prototype;
57400
57401   /** Built-in value references. */
57402   var splice$2 = arrayProto$2.splice;
57403
57404   /**
57405    * The base implementation of `_.pullAllBy` without support for iteratee
57406    * shorthands.
57407    *
57408    * @private
57409    * @param {Array} array The array to modify.
57410    * @param {Array} values The values to remove.
57411    * @param {Function} [iteratee] The iteratee invoked per element.
57412    * @param {Function} [comparator] The comparator invoked per element.
57413    * @returns {Array} Returns `array`.
57414    */
57415   function basePullAll(array, values, iteratee, comparator) {
57416     var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
57417         index = -1,
57418         length = values.length,
57419         seen = array;
57420
57421     if (array === values) {
57422       values = copyArray(values);
57423     }
57424     if (iteratee) {
57425       seen = arrayMap(array, baseUnary(iteratee));
57426     }
57427     while (++index < length) {
57428       var fromIndex = 0,
57429           value = values[index],
57430           computed = iteratee ? iteratee(value) : value;
57431
57432       while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
57433         if (seen !== array) {
57434           splice$2.call(seen, fromIndex, 1);
57435         }
57436         splice$2.call(array, fromIndex, 1);
57437       }
57438     }
57439     return array;
57440   }
57441
57442   /**
57443    * This method is like `_.pull` except that it accepts an array of values to remove.
57444    *
57445    * **Note:** Unlike `_.difference`, this method mutates `array`.
57446    *
57447    * @static
57448    * @memberOf _
57449    * @since 4.0.0
57450    * @category Array
57451    * @param {Array} array The array to modify.
57452    * @param {Array} values The values to remove.
57453    * @returns {Array} Returns `array`.
57454    * @example
57455    *
57456    * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
57457    *
57458    * _.pullAll(array, ['a', 'c']);
57459    * console.log(array);
57460    * // => ['b', 'b']
57461    */
57462   function pullAll(array, values) {
57463     return (array && array.length && values && values.length)
57464       ? basePullAll(array, values)
57465       : array;
57466   }
57467
57468   /**
57469    * Removes all given values from `array` using
57470    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
57471    * for equality comparisons.
57472    *
57473    * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
57474    * to remove elements from an array by predicate.
57475    *
57476    * @static
57477    * @memberOf _
57478    * @since 2.0.0
57479    * @category Array
57480    * @param {Array} array The array to modify.
57481    * @param {...*} [values] The values to remove.
57482    * @returns {Array} Returns `array`.
57483    * @example
57484    *
57485    * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
57486    *
57487    * _.pull(array, 'a', 'c');
57488    * console.log(array);
57489    * // => ['b', 'b']
57490    */
57491   var pull = baseRest(pullAll);
57492
57493   function uiFieldRadio(field, context) {
57494       var dispatch$$1 = dispatch('change');
57495       var placeholder = select(null);
57496       var wrap = select(null);
57497       var labels = select(null);
57498       var radios = select(null);
57499       var radioData = clone(field.options || field.keys);
57500       var typeField;
57501       var layerField;
57502       var _oldType = {};
57503       var _entity;
57504
57505
57506       function selectedKey() {
57507           var node = wrap.selectAll('.form-field-input-radio label.active input');
57508           return !node.empty() && node.datum();
57509       }
57510
57511
57512       function radio(selection$$1) {
57513           selection$$1.classed('preset-radio', true);
57514
57515           wrap = selection$$1.selectAll('.form-field-input-wrap')
57516               .data([0]);
57517
57518           var enter = wrap.enter()
57519               .append('div')
57520               .attr('class', 'form-field-input-wrap form-field-input-radio');
57521
57522           enter
57523               .append('span')
57524               .attr('class', 'placeholder');
57525
57526           wrap = wrap
57527               .merge(enter);
57528
57529
57530           placeholder = wrap.selectAll('.placeholder');
57531
57532           labels = wrap.selectAll('label')
57533               .data(radioData);
57534
57535           enter = labels.enter()
57536               .append('label');
57537
57538           enter
57539               .append('input')
57540               .attr('type', 'radio')
57541               .attr('name', field.id)
57542               .attr('value', function(d) { return field.t('options.' + d, { 'default': d }); })
57543               .attr('checked', false);
57544
57545           enter
57546               .append('span')
57547               .text(function(d) { return field.t('options.' + d, { 'default': d }); });
57548
57549           labels = labels
57550               .merge(enter);
57551
57552           radios = labels.selectAll('input')
57553               .on('change', changeRadio);
57554
57555       }
57556
57557
57558       function structureExtras(selection$$1, tags) {
57559           var selected = selectedKey();
57560           var type = context.presets().field(selected);
57561           var layer = context.presets().field('layer');
57562           var showLayer = (selected === 'bridge' || selected === 'tunnel');
57563
57564
57565           var extrasWrap = selection$$1.selectAll('.structure-extras-wrap')
57566               .data(selected ? [0] : []);
57567
57568           extrasWrap.exit()
57569               .remove();
57570
57571           extrasWrap = extrasWrap.enter()
57572               .append('div')
57573               .attr('class', 'structure-extras-wrap')
57574               .merge(extrasWrap);
57575
57576           var list = extrasWrap.selectAll('ul')
57577               .data([0]);
57578
57579           list = list.enter()
57580               .append('ul')
57581               .attr('class', 'labeled-inputs')
57582               .merge(list);
57583
57584
57585           // Type
57586           if (type) {
57587               if (!typeField || typeField.id !== selected) {
57588                   typeField = uiField(context, type, _entity, { wrap: false })
57589                       .on('change', changeType);
57590               }
57591               typeField.tags(tags);
57592           } else {
57593               typeField = null;
57594           }
57595
57596           var typeItem = list.selectAll('.structure-type-item')
57597               .data(typeField ? [typeField] : [], function(d) { return d.id; });
57598
57599           // Exit
57600           typeItem.exit()
57601               .remove();
57602
57603           // Enter
57604           var typeEnter = typeItem.enter()
57605               .insert('li', ':first-child')
57606               .attr('class', 'structure-type-item');
57607
57608           typeEnter
57609               .append('span')
57610               .attr('class', 'label structure-label-type')
57611               .attr('for', 'preset-input-' + selected)
57612               .text(t('inspector.radio.structure.type'));
57613
57614           typeEnter
57615               .append('div')
57616               .attr('class', 'structure-input-type-wrap');
57617
57618           // Update
57619           typeItem = typeItem
57620               .merge(typeEnter);
57621
57622           if (typeField) {
57623               typeItem.selectAll('.structure-input-type-wrap')
57624                   .call(typeField.render);
57625           }
57626
57627
57628           // Layer
57629           if (layer && showLayer) {
57630               if (!layerField) {
57631                   layerField = uiField(context, layer, _entity, { wrap: false })
57632                       .on('change', changeLayer);
57633               }
57634               layerField.tags(tags);
57635               field.keys = union(field.keys, ['layer']);
57636           } else {
57637               layerField = null;
57638               pull(field.keys, 'layer');
57639           }
57640
57641           var layerItem = list.selectAll('.structure-layer-item')
57642               .data(layerField ? [layerField] : []);
57643
57644           // Exit
57645           layerItem.exit()
57646               .remove();
57647
57648           // Enter
57649           var layerEnter = layerItem.enter()
57650               .append('li')
57651               .attr('class', 'structure-layer-item');
57652
57653           layerEnter
57654               .append('span')
57655               .attr('class', 'label structure-label-layer')
57656               .attr('for', 'preset-input-layer')
57657               .text(t('inspector.radio.structure.layer'));
57658
57659           layerEnter
57660               .append('div')
57661               .attr('class', 'structure-input-layer-wrap');
57662
57663           // Update
57664           layerItem = layerItem
57665               .merge(layerEnter);
57666
57667           if (layerField) {
57668               layerItem.selectAll('.structure-input-layer-wrap')
57669                   .call(layerField.render);
57670           }
57671       }
57672
57673
57674       function changeType(t$$1, onInput) {
57675           var key = selectedKey();
57676           if (!key) return;
57677
57678           var val = t$$1[key];
57679           if (val !== 'no') {
57680               _oldType[key] = val;
57681           }
57682
57683           if (field.type === 'structureRadio') {
57684               // remove layer if it should not be set
57685               if (val === 'no' ||
57686                   (key !== 'bridge' && key !== 'tunnel') ||
57687                   (key === 'tunnel' && val === 'building_passage')) {
57688                   t$$1.layer = undefined;
57689               }
57690               // add layer if it should be set
57691               if (t$$1.layer === undefined) {
57692                   if (key === 'bridge' && val !== 'no') {
57693                       t$$1.layer = '1';
57694                   }
57695                   if (key === 'tunnel' && val !== 'no' && val !== 'building_passage') {
57696                       t$$1.layer = '-1';
57697                   }
57698               }
57699            }
57700
57701           dispatch$$1.call('change', this, t$$1, onInput);
57702       }
57703
57704
57705       function changeLayer(t$$1, onInput) {
57706           if (t$$1.layer === '0') {
57707               t$$1.layer = undefined;
57708           }
57709           dispatch$$1.call('change', this, t$$1, onInput);
57710       }
57711
57712
57713       function changeRadio() {
57714           var t$$1 = {};
57715           var activeKey;
57716
57717           if (field.key) {
57718               t$$1[field.key] = undefined;
57719           }
57720
57721           radios.each(function(d) {
57722               var active = select(this).property('checked');
57723               if (active) activeKey = d;
57724
57725               if (field.key) {
57726                   if (active) t$$1[field.key] = d;
57727               } else {
57728                   var val = _oldType[activeKey] || 'yes';
57729                   t$$1[d] = active ? val : undefined;
57730               }
57731           });
57732
57733           if (field.type === 'structureRadio') {
57734               if (activeKey === 'bridge') {
57735                   t$$1.layer = '1';
57736               } else if (activeKey === 'tunnel' && t$$1.tunnel !== 'building_passage') {
57737                   t$$1.layer = '-1';
57738               } else {
57739                   t$$1.layer = undefined;
57740               }
57741           }
57742
57743           dispatch$$1.call('change', this, t$$1);
57744       }
57745
57746
57747       radio.tags = function(tags) {
57748           function checked(d) {
57749               if (field.key) {
57750                   return tags[field.key] === d;
57751               } else {
57752                   return !!(tags[d] && tags[d].toLowerCase() !== 'no');
57753               }
57754           }
57755
57756           labels.classed('active', checked);
57757           radios.property('checked', checked);
57758
57759           var selection$$1 = radios.filter(function() { return this.checked; });
57760
57761           if (selection$$1.empty()) {
57762               placeholder.text(t('inspector.none'));
57763           } else {
57764               placeholder.text(selection$$1.attr('value'));
57765               _oldType[selection$$1.datum()] = tags[selection$$1.datum()];
57766           }
57767
57768           if (field.type === 'structureRadio') {
57769               // For waterways without a tunnel tag, set 'culvert' as
57770               // the _oldType to default to if the user picks 'tunnel'
57771               if (!!tags.waterway && !_oldType.tunnel) {
57772                   _oldType.tunnel = 'culvert';
57773               }
57774
57775               wrap.call(structureExtras, tags);
57776           }
57777       };
57778
57779
57780       radio.focus = function() {
57781           radios.node().focus();
57782       };
57783
57784
57785       radio.entity = function(val) {
57786           if (!arguments.length) return _entity;
57787           _entity = val;
57788           _oldType = {};
57789           return radio;
57790       };
57791
57792
57793       return utilRebind(radio, dispatch$$1, 'on');
57794   }
57795
57796   function uiFieldRestrictions(field, context) {
57797       var dispatch$$1 = dispatch('change');
57798       var breathe = behaviorBreathe(context);
57799       var storedViaWay = context.storage('turn-restriction-via-way');
57800       var storedDistance = context.storage('turn-restriction-distance');
57801
57802       var _maxViaWay = storedViaWay !== null ? (+storedViaWay) : 1;
57803       var _maxDistance = storedDistance ? (+storedDistance) : 30;
57804       var _initialized = false;
57805       var _parent = select(null);       // the entire field
57806       var _container = select(null);    // just the map
57807       var _oldTurns;
57808       var _graph;
57809       var _vertexID;
57810       var _intersection;
57811       var _fromWayID;
57812
57813       var _lastXPos;
57814
57815
57816       function restrictions(selection$$1) {
57817           _parent = selection$$1;
57818
57819           // try to reuse the intersection, but always rebuild it if the graph has changed
57820           if (_vertexID && (context.graph() !== _graph || !_intersection)) {
57821               _graph = context.graph();
57822               _intersection = osmIntersection(_graph, _vertexID, _maxDistance);
57823           }
57824
57825           // It's possible for there to be no actual intersection here.
57826           // for example, a vertex of two `highway=path`
57827           // In this case, hide the field.
57828           var isOK = (
57829               _intersection &&
57830               _intersection.vertices.length &&           // has vertices
57831               _intersection.vertices                     // has the vertex that the user selected
57832                   .filter(function(vertex) { return vertex.id === _vertexID; }).length &&
57833               _intersection.ways.length > 2 &&           // has more than 2 ways
57834               _intersection.ways                         // has more than 1 TO way
57835                   .filter(function(way) { return way.__to; }).length > 1
57836           );
57837
57838           // Also hide in the case where
57839           select(selection$$1.node().parentNode).classed('hide', !isOK);
57840
57841           // if form field is hidden or has detached from dom, clean up.
57842           if (!isOK ||
57843               !select('.inspector-wrap.inspector-hidden').empty() ||
57844               !selection$$1.node().parentNode ||
57845               !selection$$1.node().parentNode.parentNode) {
57846               selection$$1.call(restrictions.off);
57847               return;
57848           }
57849
57850
57851           var wrap = selection$$1.selectAll('.form-field-input-wrap')
57852               .data([0]);
57853
57854           wrap = wrap.enter()
57855               .append('div')
57856               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
57857               .merge(wrap);
57858
57859           var container = wrap.selectAll('.restriction-container')
57860               .data([0]);
57861
57862           // enter
57863           var containerEnter = container.enter()
57864               .append('div')
57865               .attr('class', 'restriction-container');
57866
57867           containerEnter
57868               .append('div')
57869               .attr('class', 'restriction-help');
57870
57871           // update
57872           _container = containerEnter
57873               .merge(container)
57874               .call(renderViewer);
57875
57876           var controls = wrap.selectAll('.restriction-controls')
57877               .data([0]);
57878
57879           // enter/update
57880           controls.enter()
57881               .append('div')
57882               .attr('class', 'restriction-controls-container')
57883               .append('div')
57884               .attr('class', 'restriction-controls')
57885               .merge(controls)
57886               .call(renderControls);
57887       }
57888
57889
57890       function renderControls(selection$$1) {
57891           var distControl = selection$$1.selectAll('.restriction-distance')
57892               .data([0]);
57893
57894           distControl.exit()
57895               .remove();
57896
57897           var distControlEnter = distControl.enter()
57898               .append('div')
57899               .attr('class', 'restriction-control restriction-distance');
57900
57901           distControlEnter
57902               .append('span')
57903               .attr('class', 'restriction-control-label restriction-distance-label')
57904               .text(t('restriction.controls.distance') + ':');
57905
57906           distControlEnter
57907               .append('input')
57908               .attr('class', 'restriction-distance-input')
57909               .attr('type', 'range')
57910               .attr('min', '20')
57911               .attr('max', '50')
57912               .attr('step', '5');
57913
57914           distControlEnter
57915               .append('span')
57916               .attr('class', 'restriction-distance-text');
57917
57918           // update
57919           selection$$1.selectAll('.restriction-distance-input')
57920               .property('value', _maxDistance)
57921               .on('input', function() {
57922                   var val = select(this).property('value');
57923                   _maxDistance = +val;
57924                   _intersection = null;
57925                   _container.selectAll('.layer-osm .layer-turns *').remove();
57926                   context.storage('turn-restriction-distance', _maxDistance);
57927                   _parent.call(restrictions);
57928               });
57929
57930           selection$$1.selectAll('.restriction-distance-text')
57931               .text(displayMaxDistance(_maxDistance));
57932
57933
57934           var viaControl = selection$$1.selectAll('.restriction-via-way')
57935               .data([0]);
57936
57937           viaControl.exit()
57938               .remove();
57939
57940           var viaControlEnter = viaControl.enter()
57941               .append('div')
57942               .attr('class', 'restriction-control restriction-via-way');
57943
57944           viaControlEnter
57945               .append('span')
57946               .attr('class', 'restriction-control-label restriction-via-way-label')
57947               .text(t('restriction.controls.via') + ':');
57948
57949           viaControlEnter
57950               .append('input')
57951               .attr('class', 'restriction-via-way-input')
57952               .attr('type', 'range')
57953               .attr('min', '0')
57954               .attr('max', '2')
57955               .attr('step', '1');
57956
57957           viaControlEnter
57958               .append('span')
57959               .attr('class', 'restriction-via-way-text');
57960
57961           // update
57962           selection$$1.selectAll('.restriction-via-way-input')
57963               .property('value', _maxViaWay)
57964               .on('input', function() {
57965                   var val = select(this).property('value');
57966                   _maxViaWay = +val;
57967                   _container.selectAll('.layer-osm .layer-turns *').remove();
57968                   context.storage('turn-restriction-via-way', _maxViaWay);
57969                   _parent.call(restrictions);
57970               });
57971
57972           selection$$1.selectAll('.restriction-via-way-text')
57973               .text(displayMaxVia(_maxViaWay));
57974       }
57975
57976
57977       function renderViewer(selection$$1) {
57978           if (!_intersection) return;
57979
57980           var vgraph = _intersection.graph;
57981           var filter = utilFunctor(true);
57982           var projection = geoRawMercator();
57983
57984           // Reflow warning: `utilGetDimensions` calls `getBoundingClientRect`
57985           // Instead of asking the restriction-container for its dimensions,
57986           //  we can ask the #sidebar, which can have its dimensions cached.
57987           // width: calc as sidebar - padding
57988           // height: hardcoded (from `80_app.css`)
57989           // var d = utilGetDimensions(selection);
57990           var sdims = utilGetDimensions(select('#sidebar'));
57991           var d = [ sdims[0] - 50, 370 ];
57992           var c = geoVecScale(d, 0.5);
57993           var z = 22;
57994
57995           projection.scale(geoZoomToScale(z));
57996
57997           // Calculate extent of all key vertices
57998           var extent = geoExtent$$1();
57999           for (var i = 0; i < _intersection.vertices.length; i++) {
58000               extent._extend(_intersection.vertices[i].extent());
58001           }
58002
58003           // If this is a large intersection, adjust zoom to fit extent
58004           if (_intersection.vertices.length > 1) {
58005               var padding = 180;   // in z22 pixels
58006               var tl = projection([extent[0][0], extent[1][1]]);
58007               var br = projection([extent[1][0], extent[0][1]]);
58008               var hFactor = (br[0] - tl[0]) / (d[0] - padding);
58009               var vFactor = (br[1] - tl[1]) / (d[1] - padding);
58010               var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
58011               var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
58012               z = z - Math.max(hZoomDiff, vZoomDiff);
58013               projection.scale(geoZoomToScale(z));
58014           }
58015
58016           var padTop = 35;   // reserve top space for hint text
58017           var extentCenter = projection(extent.center());
58018           extentCenter[1] = extentCenter[1] - padTop;
58019
58020           projection
58021               .translate(geoVecSubtract(c, extentCenter))
58022               .clipExtent([[0, 0], d]);
58023
58024           var drawLayers = svgLayers(projection, context).only(['osm','touch']).dimensions(d);
58025           var drawVertices = svgVertices$$1(projection, context);
58026           var drawLines = svgLines$$1(projection, context);
58027           var drawTurns = svgTurns(projection, context);
58028
58029           var firstTime = selection$$1.selectAll('.surface').empty();
58030
58031           selection$$1
58032               .call(drawLayers);
58033
58034           var surface = selection$$1.selectAll('.surface')
58035               .classed('tr', true);
58036
58037           if (firstTime) {
58038               _initialized = true;
58039
58040               surface
58041                   .call(breathe);
58042           }
58043
58044           // This can happen if we've lowered the detail while a FROM way
58045           // is selected, and that way is no longer part of the intersection.
58046           if (_fromWayID && !vgraph.hasEntity(_fromWayID)) {
58047               _fromWayID = null;
58048               _oldTurns = null;
58049           }
58050
58051           surface
58052               .call(utilSetDimensions, d)
58053               .call(drawVertices, vgraph, _intersection.vertices, filter, extent, z)
58054               .call(drawLines, vgraph, _intersection.ways, filter)
58055               .call(drawTurns, vgraph, _intersection.turns(_fromWayID, _maxViaWay));
58056
58057           surface
58058               .on('click.restrictions', click)
58059               .on('mouseover.restrictions', mouseover);
58060
58061           surface
58062               .selectAll('.selected')
58063               .classed('selected', false);
58064
58065           surface
58066               .selectAll('.related')
58067               .classed('related', false);
58068
58069           if (_fromWayID) {
58070               var way = vgraph.entity(_fromWayID);
58071               surface
58072                   .selectAll('.' + _fromWayID)
58073                   .classed('selected', true)
58074                   .classed('related', true);
58075           }
58076
58077           document.addEventListener('resizeWindow', function () {
58078               utilSetDimensions(_container, null);
58079               redraw(1);
58080           }, false);
58081
58082           updateHints(null);
58083
58084
58085           function click() {
58086               surface
58087                   .call(breathe.off)
58088                   .call(breathe);
58089
58090               var datum = event.target.__data__;
58091               var entity = datum && datum.properties && datum.properties.entity;
58092               if (entity) {
58093                   datum = entity;
58094               }
58095
58096               if (datum instanceof osmWay && (datum.__from || datum.__via)) {
58097                   _fromWayID = datum.id;
58098                   _oldTurns = null;
58099                   redraw();
58100
58101               } else if (datum instanceof osmTurn) {
58102                   var actions, extraActions, turns, i;
58103                   var restrictionType = osmInferRestriction(vgraph, datum, projection);
58104
58105                   if (datum.restrictionID && !datum.direct) {
58106                       return;
58107
58108                   } else if (datum.restrictionID && !datum.only) {    // NO -> ONLY
58109                       var seen = {};
58110                       var datumOnly = cloneDeep(datum);
58111                       datumOnly.only = true;
58112                       restrictionType = restrictionType.replace(/^no/, 'only');
58113
58114                       // Adding an ONLY restriction should destroy all other direct restrictions from the FROM towards the VIA.
58115                       // We will remember them in _oldTurns, and restore them if the user clicks again.
58116                       turns = _intersection.turns(_fromWayID, 2);
58117                       extraActions = [];
58118                       _oldTurns = [];
58119                       for (i = 0; i < turns.length; i++) {
58120                           var turn = turns[i];
58121                           if (seen[turn.restrictionID]) continue;  // avoid deleting the turn twice (#4968, #4928)
58122
58123                           if (turn.direct && turn.path[1] === datum.path[1]) {
58124                               seen[turns[i].restrictionID] = true;
58125                               turn.restrictionType = osmInferRestriction(vgraph, turn, projection);
58126                               _oldTurns.push(turn);
58127                               extraActions.push(actionUnrestrictTurn(turn));
58128                           }
58129                       }
58130
58131                       actions = _intersection.actions.concat(extraActions, [
58132                           actionRestrictTurn(datumOnly, restrictionType),
58133                           t('operations.restriction.annotation.create')
58134                       ]);
58135
58136                   } else if (datum.restrictionID) {   // ONLY -> Allowed
58137                       // Restore whatever restrictions we might have destroyed by cycling thru the ONLY state.
58138                       // This relies on the assumption that the intersection was already split up when we
58139                       // performed the previous action (NO -> ONLY), so the IDs in _oldTurns shouldn't have changed.
58140                       turns = _oldTurns || [];
58141                       extraActions = [];
58142                       for (i = 0; i < turns.length; i++) {
58143                           if (turns[i].key !== datum.key) {
58144                               extraActions.push(actionRestrictTurn(turns[i], turns[i].restrictionType));
58145                           }
58146                       }
58147                       _oldTurns = null;
58148
58149                       actions = _intersection.actions.concat(extraActions, [
58150                           actionUnrestrictTurn(datum),
58151                           t('operations.restriction.annotation.delete')
58152                       ]);
58153
58154                   } else {    // Allowed -> NO
58155                       actions = _intersection.actions.concat([
58156                           actionRestrictTurn(datum, restrictionType),
58157                           t('operations.restriction.annotation.create')
58158                       ]);
58159                   }
58160
58161                   context.perform.apply(context, actions);
58162
58163                   // At this point the datum will be changed, but will have same key..
58164                   // Refresh it and update the help..
58165                   var s = surface.selectAll('.' + datum.key);
58166                   datum = s.empty() ? null : s.datum();
58167                   updateHints(datum);
58168
58169               } else {
58170                   _fromWayID = null;
58171                   _oldTurns = null;
58172                   redraw();
58173               }
58174           }
58175
58176
58177           function mouseover() {
58178               var datum = event.target.__data__;
58179               updateHints(datum);
58180           }
58181
58182           _lastXPos = _lastXPos || sdims[0];
58183
58184           function redraw(minChange) {
58185               var xPos = -1;
58186
58187               if (minChange) {
58188                   xPos = utilGetDimensions(select('#sidebar'))[0];
58189               }
58190
58191               if (!minChange || (minChange && Math.abs(xPos - _lastXPos) >= minChange)) {
58192                   if (context.hasEntity(_vertexID)) {
58193                       _lastXPos = xPos;
58194                       _container.call(renderViewer);
58195                   }
58196               }
58197           }
58198
58199
58200           function highlightPathsFrom(wayID) {
58201               surface.selectAll('.related')
58202                   .classed('related', false)
58203                   .classed('allow', false)
58204                   .classed('restrict', false)
58205                   .classed('only', false);
58206
58207               surface.selectAll('.' + wayID)
58208                   .classed('related', true);
58209
58210               if (wayID) {
58211                   var turns = _intersection.turns(wayID, _maxViaWay);
58212                   for (var i = 0; i < turns.length; i++) {
58213                       var turn = turns[i];
58214                       var ids = [turn.to.way];
58215                       var klass = (turn.no ? 'restrict' : (turn.only ? 'only' : 'allow'));
58216
58217                       if (turn.only || turns.length === 1) {
58218                           if (turn.via.ways) {
58219                               ids = ids.concat(turn.via.ways);
58220                           }
58221                       } else if (turn.to.way === wayID) {
58222                           continue;
58223                       }
58224
58225                       surface.selectAll(utilEntitySelector(ids))
58226                           .classed('related', true)
58227                           .classed('allow', (klass === 'allow'))
58228                           .classed('restrict', (klass === 'restrict'))
58229                           .classed('only', (klass === 'only'));
58230                   }
58231               }
58232           }
58233
58234
58235           function updateHints(datum) {
58236               var help = _container.selectAll('.restriction-help').html('');
58237
58238               var placeholders = {};
58239               ['from', 'via', 'to'].forEach(function(k) {
58240                   placeholders[k] = '<span class="qualifier">' + t('restriction.help.' + k) + '</span>';
58241               });
58242
58243               var entity = datum && datum.properties && datum.properties.entity;
58244               if (entity) {
58245                   datum = entity;
58246               }
58247
58248               if (_fromWayID) {
58249                   way = vgraph.entity(_fromWayID);
58250                   surface
58251                       .selectAll('.' + _fromWayID)
58252                       .classed('selected', true)
58253                       .classed('related', true);
58254               }
58255
58256               // Hovering a way
58257               if (datum instanceof osmWay && datum.__from) {
58258                   way = datum;
58259
58260                   highlightPathsFrom(_fromWayID ? null : way.id);
58261                   surface.selectAll('.' + way.id)
58262                       .classed('related', true);
58263
58264                   var clickSelect = (!_fromWayID || _fromWayID !== way.id);
58265                   help
58266                       .append('div')      // "Click to select FROM {fromName}." / "FROM {fromName}"
58267                       .html(t('restriction.help.' + (clickSelect ? 'select_from_name' : 'from_name'), {
58268                           from: placeholders.from,
58269                           fromName: displayName(way.id, vgraph)
58270                       }));
58271
58272
58273               // Hovering a turn arrow
58274               } else if (datum instanceof osmTurn) {
58275                   var restrictionType = osmInferRestriction(vgraph, datum, projection);
58276                   var turnType = restrictionType.replace(/^(only|no)\_/, '');
58277                   var indirect = (datum.direct === false ? t('restriction.help.indirect') : '');
58278                   var klass, turnText, nextText;
58279
58280                   if (datum.no) {
58281                       klass = 'restrict';
58282                       turnText = t('restriction.help.turn.no_' + turnType, { indirect: indirect });
58283                       nextText = t('restriction.help.turn.only_' + turnType, { indirect: '' });
58284                   } else if (datum.only) {
58285                       klass = 'only';
58286                       turnText = t('restriction.help.turn.only_' + turnType, { indirect: indirect });
58287                       nextText = t('restriction.help.turn.allowed_' + turnType, { indirect: '' });
58288                   } else {
58289                       klass = 'allow';
58290                       turnText = t('restriction.help.turn.allowed_' + turnType, { indirect: indirect });
58291                       nextText = t('restriction.help.turn.no_' + turnType, { indirect: '' });
58292                   }
58293
58294                   help
58295                       .append('div')      // "NO Right Turn (indirect)"
58296                       .attr('class', 'qualifier ' + klass)
58297                       .text(turnText);
58298
58299                   help
58300                       .append('div')      // "FROM {fromName} TO {toName}"
58301                       .html(t('restriction.help.from_name_to_name', {
58302                           from: placeholders.from,
58303                           fromName: displayName(datum.from.way, vgraph),
58304                           to: placeholders.to,
58305                           toName: displayName(datum.to.way, vgraph)
58306                       }));
58307
58308                   if (datum.via.ways && datum.via.ways.length) {
58309                       var names = [];
58310                       for (var i = 0; i < datum.via.ways.length; i++) {
58311                           var prev = names[names.length - 1];
58312                           var curr = displayName(datum.via.ways[i], vgraph);
58313                           if (!prev || curr !== prev)   // collapse identical names
58314                               names.push(curr);
58315                       }
58316
58317                       help
58318                           .append('div')      // "VIA {viaNames}"
58319                           .html(t('restriction.help.via_names', {
58320                               via: placeholders.via,
58321                               viaNames: names.join(', ')
58322                           }));
58323                   }
58324
58325                   if (!indirect) {
58326                       help
58327                           .append('div')      // Click for "No Right Turn"
58328                           .text(t('restriction.help.toggle', { turn: nextText.trim() }));
58329                   }
58330
58331                   highlightPathsFrom(null);
58332                   var alongIDs = datum.path.slice();
58333                   surface.selectAll(utilEntitySelector(alongIDs))
58334                       .classed('related', true)
58335                       .classed('allow', (klass === 'allow'))
58336                       .classed('restrict', (klass === 'restrict'))
58337                       .classed('only', (klass === 'only'));
58338
58339
58340               // Hovering empty surface
58341               } else {
58342                   highlightPathsFrom(null);
58343                   if (_fromWayID) {
58344                       help
58345                           .append('div')      // "FROM {fromName}"
58346                           .html(t('restriction.help.from_name', {
58347                               from: placeholders.from,
58348                               fromName: displayName(_fromWayID, vgraph)
58349                           }));
58350
58351                   } else {
58352                       help
58353                           .append('div')      // "Click to select a FROM segment."
58354                           .html(t('restriction.help.select_from', {
58355                               from: placeholders.from
58356                           }));
58357                   }
58358               }
58359           }
58360       }
58361
58362
58363       function displayMaxDistance(maxDist) {
58364           var isImperial = (utilDetect().locale.toLowerCase() === 'en-us');
58365           var opts;
58366
58367           if (isImperial) {
58368               var distToFeet = {   // imprecise conversion for prettier display
58369                   20: 70, 25: 85, 30: 100, 35: 115, 40: 130, 45: 145, 50: 160
58370               }[maxDist];
58371               opts = { distance: t('units.feet', { quantity: distToFeet }) };
58372           } else {
58373               opts = { distance: t('units.meters', { quantity: maxDist }) };
58374           }
58375
58376           return t('restriction.controls.distance_up_to', opts);
58377       }
58378
58379
58380       function displayMaxVia(maxVia) {
58381           return maxVia === 0 ? t('restriction.controls.via_node_only')
58382               : maxVia === 1 ? t('restriction.controls.via_up_to_one')
58383               : t('restriction.controls.via_up_to_two');
58384       }
58385
58386
58387       function displayName(entityID, graph) {
58388           var entity = graph.entity(entityID);
58389           var name = utilDisplayName(entity) || '';
58390           var matched = context.presets().match(entity, graph);
58391           var type = (matched && matched.name()) || utilDisplayType(entity.id);
58392           return name || type;
58393       }
58394
58395
58396       restrictions.entity = function(_) {
58397           _intersection = null;
58398           _fromWayID = null;
58399           _oldTurns = null;
58400           _vertexID = _.id;
58401       };
58402
58403
58404       restrictions.tags = function() {};
58405       restrictions.focus = function() {};
58406
58407
58408       restrictions.off = function(selection$$1) {
58409           if (!_initialized) return;
58410
58411           selection$$1.selectAll('.surface')
58412               .call(breathe.off)
58413               .on('click.restrictions', null)
58414               .on('mouseover.restrictions', null);
58415
58416           select(window)
58417               .on('resize.restrictions', null);
58418       };
58419
58420
58421       return utilRebind(restrictions, dispatch$$1, 'on');
58422   }
58423
58424   function uiFieldTextarea(field) {
58425       var dispatch$$1 = dispatch('change');
58426       var input = select(null);
58427
58428
58429       function textarea(selection$$1) {
58430           var wrap = selection$$1.selectAll('.form-field-input-wrap')
58431               .data([0]);
58432
58433           wrap = wrap.enter()
58434               .append('div')
58435               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
58436               .merge(wrap);
58437
58438           input = wrap.selectAll('textarea')
58439               .data([0]);
58440
58441           input = input.enter()
58442               .append('textarea')
58443               .attr('id', 'preset-input-' + field.safeid)
58444               .attr('placeholder', field.placeholder() || t('inspector.unknown'))
58445               .attr('maxlength', 255)
58446               .call(utilNoAuto)
58447               .on('input', change(true))
58448               .on('blur', change())
58449               .on('change', change())
58450               .merge(input);
58451       }
58452
58453
58454       function change(onInput) {
58455           return function() {
58456               var t$$1 = {};
58457               t$$1[field.key] = utilGetSetValue(input) || undefined;
58458               dispatch$$1.call('change', this, t$$1, onInput);
58459           };
58460       }
58461
58462
58463       textarea.tags = function(tags) {
58464           utilGetSetValue(input, tags[field.key] || '');
58465       };
58466
58467
58468       textarea.focus = function() {
58469           input.node().focus();
58470       };
58471
58472
58473       return utilRebind(textarea, dispatch$$1, 'on');
58474   }
58475
58476   function uiFieldWikidata(field) {
58477       var wikidata = services.wikidata;
58478       var dispatch$$1 = dispatch('change');
58479       var link = select(null);
58480       var title = select(null);
58481       var _wikiURL = '';
58482
58483
58484       function wiki(selection$$1) {
58485
58486           var wrap = selection$$1.selectAll('.form-field-input-wrap')
58487               .data([0]);
58488
58489           wrap = wrap.enter()
58490               .append('div')
58491               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
58492               .merge(wrap);
58493
58494
58495           var list = wrap.selectAll('ul')
58496               .data([0]);
58497
58498           list = list.enter()
58499               .append('ul')
58500               .attr('class', 'labeled-inputs')
58501               .merge(list);
58502
58503           var wikidataProperties = ['identifier', 'label', 'description'];
58504
58505           var items = list.selectAll('li')
58506               .data(wikidataProperties);
58507
58508           // Enter
58509           var enter = items.enter()
58510               .append('li')
58511               .attr('class', function(d) { return 'preset-wikidata-' + d; });
58512
58513           enter
58514               .append('span')
58515               .attr('class', 'label')
58516               .attr('for', function(d) { return 'preset-input-wikidata-' + d; })
58517               .text(function(d) { return t('wikidata.' + d); });
58518
58519           var inputWrap = enter
58520               .append('div')
58521               .attr('class', 'input-wrap');
58522
58523           inputWrap
58524               .append('input')
58525               .attr('type', 'text')
58526               .attr('class', 'preset-input-wikidata')
58527               .attr('id', function(d) { return 'preset-input-wikidata-' + d; });
58528
58529
58530           title = wrap.select('.preset-wikidata-identifier input')
58531               .call(utilNoAuto)
58532               .merge(title);
58533
58534           title
58535               .on('blur', blur)
58536               .on('change', change);
58537
58538           var idItem = wrap.select('.preset-wikidata-identifier');
58539
58540           idItem.select('button')
58541               .remove();
58542
58543           link = idItem
58544               .append('button')
58545               .attr('class', 'form-field-button wiki-link')
58546               .attr('title', t('icons.open_wikidata'))
58547               .attr('tabindex', -1)
58548               .call(svgIcon('#iD-icon-out-link'))
58549               .merge(link);
58550
58551           link
58552               .on('click', function() {
58553                   event.preventDefault();
58554                   if (_wikiURL) window.open(_wikiURL, '_blank');
58555               });
58556
58557           var readOnlyItems = wrap.selectAll('li:not(.preset-wikidata-identifier)');
58558
58559           readOnlyItems.select('input')
58560               .classed('disabled', 'true')
58561               .attr('readonly', 'true');
58562
58563           readOnlyItems.select('button')
58564               .remove();
58565
58566           readOnlyItems.append('button')
58567               .attr('class', 'form-field-button wiki-link')
58568               .attr('title', t('icons.copy'))
58569               .attr('tabindex', -1)
58570               .call(svgIcon('#iD-operation-copy'))
58571               .on('click', function() {
58572                   event.preventDefault();
58573                   select(this.parentNode)
58574                       .select('input')
58575                       .node()
58576                       .select();
58577                   document.execCommand('copy');
58578               });
58579       }
58580
58581
58582       function blur() {
58583           change();
58584       }
58585
58586
58587       function change() {
58588           var syncTags = {
58589               wikidata: utilGetSetValue(title)
58590           };
58591           dispatch$$1.call('change', this, syncTags);
58592       }
58593
58594
58595       wiki.tags = function(tags) {
58596           var value = tags[field.key] || '';
58597           var matches = value.match(/^Q[0-9]*$/);
58598
58599           utilGetSetValue(title, value);
58600
58601           // value in correct format
58602           if (matches) {
58603               _wikiURL = 'https://wikidata.org/wiki/' + value;
58604               wikidata.entityByQID(value, function(qid, entity) {
58605                   var label = '';
58606                   var description = '';
58607
58608                   if (entity.labels && Object.keys(entity.labels).length > 0) {
58609                       label = entity.labels[Object.keys(entity.labels)[0]].value;
58610                   }
58611                   if (entity.descriptions && Object.keys(entity.descriptions).length > 0) {
58612                       description = entity.descriptions[Object.keys(entity.descriptions)[0]].value;
58613                   }
58614
58615                   select('.preset-wikidata-label')
58616                       .style('display', function(){
58617                           return label.length > 0 ? 'flex' : 'none';
58618                       })
58619                       .select('input')
58620                       .attr('value', label);
58621
58622                   select('.preset-wikidata-description')
58623                       .style('display', function(){
58624                           return description.length > 0 ? 'flex' : 'none';
58625                       })
58626                       .select('input')
58627                       .attr('value', description);
58628               });
58629
58630           // unrecognized value format
58631           } else {
58632               select('.preset-wikidata-label').style('display', 'none');
58633               select('.preset-wikidata-description').style('display', 'none');
58634               if (value && value !== '') {
58635                   _wikiURL = 'https://wikidata.org/wiki/Special:Search?search=' + value;
58636               } else {
58637                   _wikiURL = '';
58638               }
58639           }
58640       };
58641
58642
58643       wiki.focus = function() {
58644           title.node().focus();
58645       };
58646
58647
58648       return utilRebind(wiki, dispatch$$1, 'on');
58649   }
58650
58651   function uiFieldWikipedia(field, context) {
58652       var dispatch$$1 = dispatch('change');
58653       var wikipedia = services.wikipedia;
58654       var wikidata = services.wikidata;
58655       var lang = select(null);
58656       var title = select(null);
58657       var _wikiURL = '';
58658       var _entity;
58659
58660       var langCombo = uiCombobox(context, 'wikipedia-lang')
58661           .fetcher(function(value, cb) {
58662               var v = value.toLowerCase();
58663
58664               cb(wikipedia$2.filter(function(d) {
58665                   return d[0].toLowerCase().indexOf(v) >= 0 ||
58666                       d[1].toLowerCase().indexOf(v) >= 0 ||
58667                       d[2].toLowerCase().indexOf(v) >= 0;
58668               }).map(function(d) {
58669                   return { value: d[1] };
58670               }));
58671           });
58672
58673       var titleCombo = uiCombobox(context, 'wikipedia-title')
58674           .fetcher(function(value, cb) {
58675               if (!value && _entity) {
58676                   value = context.entity(_entity.id).tags.name || '';
58677               }
58678
58679               var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
58680               searchfn(language()[2], value, function(query, data$$1) {
58681                   cb(data$$1.map(function(d) {
58682                       return { value: d };
58683                   }));
58684               });
58685           });
58686
58687
58688       function wiki(selection$$1) {
58689           var wrap = selection$$1.selectAll('.form-field-input-wrap')
58690               .data([0]);
58691
58692           wrap = wrap.enter()
58693               .append('div')
58694               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
58695               .merge(wrap);
58696
58697
58698           var langRow = wrap.selectAll('.wiki-lang-container')
58699               .data([0]);
58700
58701           langRow = langRow.enter()
58702               .append('div')
58703               .attr('class', 'wiki-lang-container')
58704               .merge(langRow);
58705
58706
58707           lang = langRow.selectAll('input.wiki-lang')
58708               .data([0]);
58709
58710           lang = lang.enter()
58711               .append('input')
58712               .attr('type', 'text')
58713               .attr('class', 'wiki-lang')
58714               .attr('placeholder', t('translate.localized_translation_language'))
58715               .call(utilNoAuto)
58716               .call(langCombo)
58717               .merge(lang);
58718
58719           utilGetSetValue(lang, language()[1]);
58720
58721           lang
58722               .on('blur', changeLang)
58723               .on('change', changeLang);
58724
58725
58726           var titleRow = wrap.selectAll('.wiki-title-container')
58727               .data([0]);
58728
58729           titleRow = titleRow.enter()
58730               .append('div')
58731               .attr('class', 'wiki-title-container')
58732               .merge(titleRow);
58733
58734           title = titleRow.selectAll('input.wiki-title')
58735               .data([0]);
58736
58737           title = title.enter()
58738               .append('input')
58739               .attr('type', 'text')
58740               .attr('class', 'wiki-title')
58741               .attr('id', 'preset-input-' + field.safeid)
58742               .call(utilNoAuto)
58743               .call(titleCombo)
58744               .merge(title);
58745
58746           title
58747               .on('blur', blur)
58748               .on('change', change);
58749
58750
58751           var link = titleRow.selectAll('.wiki-link')
58752               .data([0]);
58753
58754           link = link.enter()
58755               .append('button')
58756               .attr('class', 'form-field-button wiki-link')
58757               .attr('tabindex', -1)
58758               .call(svgIcon('#iD-icon-out-link'))
58759               .merge(link);
58760
58761           link
58762               .on('click', function() {
58763                   event.preventDefault();
58764                   if (_wikiURL) window.open(_wikiURL, '_blank');
58765               });
58766       }
58767
58768
58769       function language() {
58770           var value = utilGetSetValue(lang).toLowerCase();
58771           var locale = utilDetect().locale.toLowerCase();
58772           var localeLanguage;
58773           return find$1(wikipedia$2, function(d) {
58774               if (d[2] === locale) localeLanguage = d;
58775               return d[0].toLowerCase() === value ||
58776                   d[1].toLowerCase() === value ||
58777                   d[2] === value;
58778           }) || localeLanguage || ['English', 'English', 'en'];
58779       }
58780
58781
58782       function changeLang() {
58783           utilGetSetValue(lang, language()[1]);
58784           change(true);
58785       }
58786
58787
58788       function blur() {
58789           change(true);
58790       }
58791
58792
58793       function change(skipWikidata) {
58794           var value = utilGetSetValue(title);
58795           var m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/);
58796           var l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; });
58797           var syncTags = {};
58798
58799           if (l) {
58800               // Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization
58801               value = decodeURIComponent(m[2]).replace(/_/g, ' ');
58802               if (m[3]) {
58803                   var anchor;
58804                   try {
58805                       // Best-effort `anchordecode:` implementation
58806                       anchor = decodeURIComponent(m[3].replace(/\.([0-9A-F]{2})/g, '%$1'));
58807                   } catch (e) {
58808                       anchor = decodeURIComponent(m[3]);
58809                   }
58810                   value += '#' + anchor.replace(/_/g, ' ');
58811               }
58812               value = value.slice(0, 1).toUpperCase() + value.slice(1);
58813               utilGetSetValue(lang, l[1]);
58814               utilGetSetValue(title, value);
58815           }
58816
58817           if (value) {
58818               syncTags.wikipedia = language()[2] + ':' + value;
58819           } else {
58820               syncTags.wikipedia = undefined;
58821               syncTags.wikidata = undefined;
58822           }
58823
58824           dispatch$$1.call('change', this, syncTags);
58825
58826
58827           if (skipWikidata || !value || !language()[2]) return;
58828
58829           // attempt asynchronous update of wikidata tag..
58830           var initGraph = context.graph();
58831           var initEntityID = _entity.id;
58832
58833           wikidata.itemsByTitle(language()[2], value, function(title, data$$1) {
58834               // If graph has changed, we can't apply this update.
58835               if (context.graph() !== initGraph) return;
58836
58837               if (!data$$1 || !Object.keys(data$$1).length) return;
58838
58839               var qids = Object.keys(data$$1);
58840               var value = qids && find$1(qids, function(id) { return id.match(/^Q\d+$/); });
58841               var currTags = clone(context.entity(initEntityID).tags);
58842
58843               currTags.wikidata = value;
58844
58845               // Coalesce the update of wikidata tag into the previous tag change
58846               context.overwrite(
58847                   actionChangeTags(initEntityID, currTags),
58848                   context.history().undoAnnotation()
58849               );
58850
58851               // do not dispatch.call('change') here, because entity_editor
58852               // changeTags() is not intended to be called asynchronously
58853           });
58854       }
58855
58856
58857       wiki.tags = function(tags) {
58858           var value = tags[field.key] || '';
58859           var m = value.match(/([^:]+):([^#]+)(?:#(.+))?/);
58860           var l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; });
58861           var anchor = m && m[3];
58862
58863           // value in correct format
58864           if (l) {
58865               utilGetSetValue(lang, l[1]);
58866               utilGetSetValue(title, m[2] + (anchor ? ('#' + anchor) : ''));
58867               if (anchor) {
58868                   try {
58869                       // Best-effort `anchorencode:` implementation
58870                       anchor = encodeURIComponent(anchor.replace(/ /g, '_')).replace(/%/g, '.');
58871                   } catch (e) {
58872                       anchor = anchor.replace(/ /g, '_');
58873                   }
58874               }
58875               _wikiURL = 'https://' + m[1] + '.wikipedia.org/wiki/' +
58876                   m[2].replace(/ /g, '_') + (anchor ? ('#' + anchor) : '');
58877
58878           // unrecognized value format
58879           } else {
58880               utilGetSetValue(title, value);
58881               if (value && value !== '') {
58882                   utilGetSetValue(lang, '');
58883                   _wikiURL = 'https://en.wikipedia.org/wiki/Special:Search?search=' + value;
58884               } else {
58885                   _wikiURL = '';
58886               }
58887           }
58888       };
58889
58890
58891       wiki.entity = function(val) {
58892           if (!arguments.length) return _entity;
58893           _entity = val;
58894           return wiki;
58895       };
58896
58897
58898       wiki.focus = function() {
58899           title.node().focus();
58900       };
58901
58902
58903       return utilRebind(wiki, dispatch$$1, 'on');
58904   }
58905
58906   var uiFields = {
58907       access: uiFieldAccess,
58908       address: uiFieldAddress,
58909       check: uiFieldCheck,
58910       combo: uiFieldCombo,
58911       cycleway: uiFieldCycleway,
58912       defaultCheck: uiFieldCheck,
58913       email: uiFieldText,
58914       lanes: uiFieldLanes,
58915       localized: uiFieldLocalized,
58916       maxspeed: uiFieldMaxspeed,
58917       multiCombo: uiFieldCombo,
58918       networkCombo: uiFieldCombo,
58919       number: uiFieldText,
58920       onewayCheck: uiFieldCheck,
58921       radio: uiFieldRadio,
58922       restrictions: uiFieldRestrictions,
58923       semiCombo: uiFieldCombo,
58924       structureRadio: uiFieldRadio,
58925       tel: uiFieldText,
58926       text: uiFieldText,
58927       textarea: uiFieldTextarea,
58928       typeCombo: uiFieldCombo,
58929       url: uiFieldText,
58930       wikidata: uiFieldWikidata,
58931       wikipedia: uiFieldWikipedia
58932   };
58933
58934   function uiTagReference(tag) {
58935       var wikibase = services.osmWikibase;
58936       var tagReference = {};
58937
58938       var _button = select(null);
58939       var _body = select(null);
58940       var _loaded;
58941       var _showing;
58942
58943       /**
58944        * @returns {{itemTitle: String, description: String, image: String|null}|null}
58945        **/
58946       function findLocal(data) {
58947           var entity = data.tag || data.key;
58948           if (!entity) return null;
58949
58950           var result = {
58951               title: entity.title,
58952               description: entity.description,
58953           };
58954
58955           if (entity.claims) {
58956               var langCode = utilDetect().locale.toLowerCase();
58957               var url;
58958               var image = wikibase.claimToValue(entity, 'P4', langCode);
58959               if (image) {
58960                   url = 'https://commons.wikimedia.org/w/index.php';
58961               } else {
58962                   image = wikibase.claimToValue(entity, 'P28', langCode);
58963                   if (image) {
58964                       url = 'https://wiki.openstreetmap.org/w/index.php';
58965                   }
58966               }
58967               if (image) {
58968                   result.image = {
58969                       url: url,
58970                       title: 'Special:Redirect/file/' + image
58971                   };
58972               }
58973           }
58974
58975           // Helper method to get wiki info if a given language exists
58976           function getWikiInfo(wiki, langCode, msg) {
58977               if (wiki && wiki[langCode]) {
58978                   return {title: wiki[langCode], text: t(msg)};
58979               }
58980           }
58981
58982           // Try to get a wiki page from tag data item first, followed by the corresponding key data item.
58983           // If neither tag nor key data item contain a wiki page in the needed language nor English,
58984           // get the first found wiki page from either the tag or the key item.
58985           var tagWiki = wikibase.monolingualClaimToValueObj(data.tag, 'P31');
58986           var keyWiki = wikibase.monolingualClaimToValueObj(data.key, 'P31');
58987
58988           // If exact language code does not exist, try to find the first part before the '-'
58989           // BUG: in some cases, a more elaborate fallback logic might be needed
58990           var langPrefix = langCode.split('-', 2)[0];
58991
58992           result.wiki =
58993             getWikiInfo(tagWiki, langCode, 'inspector.wiki_reference') ||
58994             getWikiInfo(tagWiki, langPrefix, 'inspector.wiki_reference') ||
58995             getWikiInfo(tagWiki, 'en', 'inspector.wiki_en_reference') ||
58996             getWikiInfo(keyWiki, langCode, 'inspector.wiki_reference') ||
58997             getWikiInfo(keyWiki, langPrefix, 'inspector.wiki_reference') ||
58998             getWikiInfo(keyWiki, 'en', 'inspector.wiki_en_reference');
58999
59000           return result;
59001       }
59002
59003
59004       function load(param) {
59005           if (!wikibase) return;
59006
59007           _button
59008               .classed('tag-reference-loading', true);
59009
59010           wikibase.getEntity(param, function show(err, data) {
59011               var docs;
59012               if (!err && data) {
59013                   docs = findLocal(data);
59014               }
59015
59016               _body.html('');
59017
59018               if (!docs || !docs.title) {
59019                   _body
59020                       .append('p')
59021                       .attr('class', 'tag-reference-description')
59022                       .text(t('inspector.no_documentation_key'));
59023                   done();
59024                   return;
59025               }
59026
59027               if (docs.image) {
59028                   var imageUrl = docs.image.url + '?' + utilQsString({
59029                       title: docs.image.title,
59030                       width: 100,
59031                       height: 100,
59032                   });
59033
59034                   _body
59035                       .append('img')
59036                       .attr('class', 'tag-reference-wiki-image')
59037                       .attr('src', imageUrl)
59038                       .on('load', function() { done(); })
59039                       .on('error', function() { select(this).remove(); done(); });
59040               } else {
59041                   done();
59042               }
59043
59044               _body
59045                   .append('p')
59046                   .attr('class', 'tag-reference-description')
59047                   .text(docs.description || t('inspector.no_documentation_key'));
59048
59049               _body
59050                   .append('a')
59051                   .attr('class', 'tag-reference-link')
59052                   .attr('target', '_blank')
59053                   .attr('tabindex', -1)
59054                   .attr('href', 'https://wiki.openstreetmap.org/wiki/' + docs.title)
59055                   .call(svgIcon('#iD-icon-out-link', 'inline'))
59056                   .append('span')
59057                   .text(t('inspector.edit_reference'));
59058
59059               if (docs.wiki) {
59060                   _body
59061                     .append('a')
59062                     .attr('class', 'tag-reference-link')
59063                     .attr('target', '_blank')
59064                     .attr('tabindex', -1)
59065                     .attr('href', 'https://wiki.openstreetmap.org/wiki/' + docs.wiki.title)
59066                     .call(svgIcon('#iD-icon-out-link', 'inline'))
59067                     .append('span')
59068                     .text(docs.wiki.text);
59069               }
59070
59071               // Add link to info about "good changeset comments" - #2923
59072               if (param.key === 'comment') {
59073                   _body
59074                       .append('a')
59075                       .attr('class', 'tag-reference-comment-link')
59076                       .attr('target', '_blank')
59077                       .attr('tabindex', -1)
59078                       .call(svgIcon('#iD-icon-out-link', 'inline'))
59079                       .attr('href', t('commit.about_changeset_comments_link'))
59080                       .append('span')
59081                       .text(t('commit.about_changeset_comments'));
59082               }
59083           });
59084       }
59085
59086
59087       function done() {
59088           _loaded = true;
59089
59090           _button
59091               .classed('tag-reference-loading', false);
59092
59093           _body
59094               .classed('expanded', true)
59095               .transition()
59096               .duration(200)
59097               .style('max-height', '200px')
59098               .style('opacity', '1');
59099
59100           _showing = true;
59101       }
59102
59103
59104       function hide() {
59105           _body
59106               .transition()
59107               .duration(200)
59108               .style('max-height', '0px')
59109               .style('opacity', '0')
59110               .on('end', function () {
59111                   _body.classed('expanded', false);
59112               });
59113
59114           _showing = false;
59115       }
59116
59117
59118       tagReference.button = function(selection$$1) {
59119           _button = selection$$1.selectAll('.tag-reference-button')
59120               .data([0]);
59121
59122           _button = _button.enter()
59123               .append('button')
59124               .attr('class', 'tag-reference-button')
59125               .attr('title', t('icons.information'))
59126               .attr('tabindex', -1)
59127               .call(svgIcon('#iD-icon-inspect'))
59128               .merge(_button);
59129
59130           _button
59131               .on('click', function () {
59132                   event.stopPropagation();
59133                   event.preventDefault();
59134                   if (_showing) {
59135                       hide();
59136                   } else if (_loaded) {
59137                       done();
59138                   } else {
59139                       tag.langCode = utilDetect().locale.toLowerCase();
59140                       load(tag);
59141                   }
59142               });
59143       };
59144
59145
59146       tagReference.body = function(selection$$1) {
59147           var tagid = tag.rtype || (tag.key + '-' + tag.value);
59148           _body = selection$$1.selectAll('.tag-reference-body')
59149               .data([tagid], function(d) { return d; });
59150
59151           _body.exit()
59152               .remove();
59153
59154           _body = _body.enter()
59155               .append('div')
59156               .attr('class', 'tag-reference-body')
59157               .style('max-height', '0')
59158               .style('opacity', '0')
59159               .merge(_body);
59160
59161           if (_showing === false) {
59162               hide();
59163           }
59164       };
59165
59166
59167       tagReference.showing = function(_) {
59168           if (!arguments.length) return _showing;
59169           _showing = _;
59170           return tagReference;
59171       };
59172
59173
59174       return tagReference;
59175   }
59176
59177   function uiField(context, presetField, entity, options) {
59178       options = assignIn({
59179           show: true,
59180           wrap: true,
59181           remove: true,
59182           revert: true,
59183           info: true
59184       }, options);
59185
59186       var dispatch$$1 = dispatch('change');
59187       var field = clone(presetField);
59188       var _show = options.show;
59189       var _state = '';
59190       var _tags = {};
59191
59192       field.keys = field.keys || [field.key];
59193
59194       // only create the fields that are actually being shown
59195       if (_show && !field.impl) {
59196           createField();
59197       }
59198
59199       // Creates the field.. This is done lazily,
59200       // once we know that the field will be shown.
59201       function createField() {
59202           field.impl = uiFields[field.type](field, context)
59203               .on('change', function(t$$1, onInput) {
59204                   dispatch$$1.call('change', field, t$$1, onInput);
59205               });
59206
59207           if (entity) {
59208               field.entityID = entity.id;
59209               // if this field cares about the entity, pass it along
59210               if (field.impl.entity) {
59211                   field.impl.entity(entity);
59212               }
59213           }
59214       }
59215
59216
59217       function isModified() {
59218           if (!entity) return false;
59219           var original = context.graph().base().entities[entity.id];
59220           return some(field.keys, function(key) {
59221               return original ? _tags[key] !== original.tags[key] : _tags[key];
59222           });
59223       }
59224
59225
59226       function isPresent() {
59227           return some(field.keys, function(key) {
59228               return _tags[key] !== undefined;
59229           });
59230       }
59231
59232
59233       function revert(d) {
59234           event.stopPropagation();
59235           event.preventDefault();
59236           if (!entity) return false;
59237
59238           var original = context.graph().base().entities[entity.id];
59239           var t$$1 = {};
59240           d.keys.forEach(function(key) {
59241               t$$1[key] = original ? original.tags[key] : undefined;
59242           });
59243
59244           dispatch$$1.call('change', d, t$$1);
59245       }
59246
59247
59248       function remove(d) {
59249           event.stopPropagation();
59250           event.preventDefault();
59251
59252           var t$$1 = {};
59253           d.keys.forEach(function(key) {
59254               t$$1[key] = undefined;
59255           });
59256
59257           dispatch$$1.call('change', d, t$$1);
59258       }
59259
59260
59261       field.render = function(selection$$1) {
59262           var container = selection$$1.selectAll('.form-field')
59263               .data([field]);
59264
59265           // Enter
59266           var enter = container.enter()
59267               .append('div')
59268               .attr('class', function(d) { return 'form-field form-field-' + d.safeid; })
59269               .classed('nowrap', !options.wrap);
59270
59271           if (options.wrap) {
59272               var label = enter
59273                   .append('label')
59274                   .attr('class', 'form-field-label')
59275                   .attr('for', function(d) { return 'preset-input-' + d.safeid; });
59276
59277               label
59278                   .append('span')
59279                   .attr('class', 'label-text')
59280                   .text(function(d) { return d.label(); });
59281
59282               if (options.remove) {
59283                   label
59284                       .append('button')
59285                       .attr('class', 'remove-icon')
59286                       .attr('title', t('icons.remove'))
59287                       .attr('tabindex', -1)
59288                       .call(svgIcon('#iD-operation-delete'));
59289               }
59290
59291               if (options.revert) {
59292                   label
59293                       .append('button')
59294                       .attr('class', 'modified-icon')
59295                       .attr('title', t('icons.undo'))
59296                       .attr('tabindex', -1)
59297                       .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-redo' : '#iD-icon-undo'));
59298               }
59299           }
59300
59301
59302           // Update
59303           container = container
59304               .merge(enter);
59305
59306           container.select('.form-field-label > .remove-icon')  // propagate bound data
59307               .on('click', remove);
59308
59309           container.select('.form-field-label > .modified-icon')  // propagate bound data
59310               .on('click', revert);
59311
59312           container
59313               .classed('modified', isModified())
59314               .classed('present', isPresent())
59315               .each(function(d) {
59316                   if (!d.impl) {
59317                       createField();
59318                   }
59319
59320                   var reference, help;
59321
59322                   // instantiate field help
59323                   if (options.wrap && field.type === 'restrictions') {
59324                       help = uiFieldHelp(context, 'restrictions');
59325                   }
59326
59327                   // instantiate tag reference
59328                   if (options.wrap && options.info) {
59329                       var referenceKey = d.key;
59330                       if (d.type === 'multiCombo') {   // lookup key without the trailing ':'
59331                           referenceKey = referenceKey.replace(/:$/, '');
59332                       }
59333
59334                       reference = uiTagReference(d.reference || { key: referenceKey }, context);
59335                       if (_state === 'hover') {
59336                           reference.showing(false);
59337                       }
59338                   }
59339
59340                   select(this)
59341                       .call(d.impl);
59342
59343                   // add field help components
59344                   if (help) {
59345                       select(this)
59346                           .call(help.body)
59347                           .select('.form-field-label')
59348                           .call(help.button);
59349                   }
59350
59351                   // add tag reference components
59352                   if (reference) {
59353                       select(this)
59354                           .call(reference.body)
59355                           .select('.form-field-label')
59356                           .call(reference.button);
59357                   }
59358
59359                   d.impl.tags(_tags);
59360               });
59361       };
59362
59363
59364       field.state = function(val) {
59365           if (!arguments.length) return _state;
59366           _state = val;
59367           return field;
59368       };
59369
59370
59371       field.tags = function(val) {
59372           if (!arguments.length) return _tags;
59373           _tags = val;
59374           return field;
59375       };
59376
59377
59378       field.show = function() {
59379           _show = true;
59380           if (!field.impl) {
59381               createField();
59382           }
59383           if (field.default && field.key && _tags[field.key] !== field.default) {
59384               var t$$1 = {};
59385               t$$1[field.key] = field.default;
59386               dispatch$$1.call('change', this, t$$1);
59387           }
59388       };
59389
59390
59391       // A shown field has a visible UI, a non-shown field is in the 'Add field' dropdown
59392       field.isShown = function() {
59393           return _show || isPresent();
59394       };
59395
59396
59397       // An allowed field can appear in the UI or in the 'Add field' dropdown.
59398       // A non-allowed field is hidden from the user altogether
59399       field.isAllowed = function() {
59400           if (!entity || isPresent()) return true;   // a field with a value should always display
59401
59402           var latest = context.hasEntity(entity.id);   // check the most current copy of the entity
59403           if (!latest) return true;
59404
59405           var require = field.prerequisiteTag;
59406           if (require && require.key) {
59407               var value = latest.tags[require.key];
59408               if (!value) return false;
59409
59410               if (require.valueNot) {
59411                   return require.valueNot !== value;
59412               }
59413               if (require.value) {
59414                   return require.value === value;
59415               }
59416               return true;
59417           }
59418           return true;
59419       };
59420
59421
59422       field.focus = function() {
59423           if (field.impl) {
59424               field.impl.focus();
59425           }
59426       };
59427
59428
59429       return utilRebind(field, dispatch$$1, 'on');
59430   }
59431
59432   function uiFormFields$$1(context) {
59433       var moreCombo = uiCombobox(context, 'more-fields').minItems(1);
59434       var _fieldsArr = [];
59435       var _state = '';
59436       var _klass = '';
59437
59438
59439       function formFields(selection$$1) {
59440           var allowedFields = _fieldsArr.filter(function(field) { return field.isAllowed(); });
59441           var shown = allowedFields.filter(function(field) { return field.isShown(); });
59442           var notShown = allowedFields.filter(function(field) { return !field.isShown(); });
59443
59444           var container = selection$$1.selectAll('.form-fields-container')
59445               .data([0]);
59446
59447           container = container.enter()
59448               .append('div')
59449               .attr('class', 'form-fields-container ' + (_klass || ''))
59450               .merge(container);
59451
59452
59453           var fields = container.selectAll('.wrap-form-field')
59454               .data(shown, function(d) { return d.id + (d.entityID || ''); });
59455
59456           fields.exit()
59457               .remove();
59458
59459           // Enter
59460           var enter = fields.enter()
59461               .append('div')
59462               .attr('class', function(d) { return 'wrap-form-field wrap-form-field-' + d.safeid; });
59463
59464           // Update
59465           fields = fields
59466               .merge(enter);
59467
59468           fields
59469               .order()
59470               .each(function(d) {
59471                   select(this)
59472                       .call(d.render);
59473               });
59474
59475
59476           notShown = notShown.map(function(field) {
59477               return {
59478                   title: field.label(),
59479                   value: field.label(),
59480                   field: field
59481               };
59482           });
59483
59484
59485           var more = selection$$1.selectAll('.more-fields')
59486               .data((_state === 'hover' || notShown.length === 0) ? [] : [0]);
59487
59488           more.exit()
59489               .remove();
59490
59491           more = more.enter()
59492               .append('div')
59493               .attr('class', 'more-fields')
59494               .append('label')
59495               .text(t('inspector.add_fields'))
59496               .merge(more);
59497
59498
59499           var input = more.selectAll('.value')
59500               .data([0]);
59501
59502           input.exit()
59503               .remove();
59504
59505           input = input.enter()
59506               .append('input')
59507               .attr('class', 'value')
59508               .attr('type', 'text')
59509               .call(utilNoAuto)
59510               .merge(input);
59511
59512           input
59513               .call(utilGetSetValue, '')
59514               .attr('placeholder', function() {
59515                   var placeholder = [];
59516                   for (var field in notShown) {
59517                       placeholder.push(notShown[field].title);
59518                   }
59519                   return placeholder.slice(0,3).join(', ') + ((placeholder.length > 3) ? '…' : '');
59520               })
59521               .call(moreCombo
59522                   .data(notShown)
59523                   .on('accept', function (d) {
59524                       if (!d) return;  // user entered something that was not matched
59525                       var field = d.field;
59526                       field.show();
59527                       selection$$1.call(formFields);  // rerender
59528                       if (field.type !== 'semiCombo' && field.type !== 'multiCombo') {
59529                           field.focus();
59530                       }
59531                   })
59532               );
59533       }
59534
59535
59536       formFields.fieldsArr = function(val) {
59537           if (!arguments.length) return _fieldsArr;
59538           _fieldsArr = val || [];
59539           return formFields;
59540       };
59541
59542       formFields.state = function(val) {
59543           if (!arguments.length) return _state;
59544           _state = val;
59545           return formFields;
59546       };
59547
59548       formFields.klass = function(val) {
59549           if (!arguments.length) return _klass;
59550           _klass = val;
59551           return formFields;
59552       };
59553
59554
59555       return formFields;
59556   }
59557
59558   function uiPresetEditor(context) {
59559       var dispatch$$1 = dispatch('change');
59560       var formFields = uiFormFields$$1(context);
59561       var _state;
59562       var _fieldsArr;
59563       var _preset;
59564       var _tags;
59565       var _entityID;
59566
59567
59568       function presetEditor(selection$$1) {
59569           selection$$1.call(uiDisclosure(context, 'preset_fields', true)
59570               .title(t('inspector.all_fields'))
59571               .content(render)
59572           );
59573       }
59574
59575
59576       function render(selection$$1) {
59577           if (!_fieldsArr) {
59578               var entity = context.entity(_entityID);
59579               var geometry = context.geometry(_entityID);
59580               var presets = context.presets();
59581
59582               _fieldsArr = [];
59583
59584               _preset.fields.forEach(function(field) {
59585                   if (field.matchGeometry(geometry)) {
59586                       _fieldsArr.push(
59587                           uiField(context, field, entity)
59588                       );
59589                   }
59590               });
59591
59592               if (entity.isHighwayIntersection(context.graph()) && presets.field('restrictions')) {
59593                   _fieldsArr.push(
59594                       uiField(context, presets.field('restrictions'), entity)
59595                   );
59596               }
59597
59598               var additionalFields = union(_preset.moreFields, presets.universal());
59599               additionalFields.sort(function(field1, field2) {
59600                   return field1.label() > field2.label();
59601               });
59602
59603               additionalFields.forEach(function(field) {
59604                   if (_preset.fields.indexOf(field) === -1) {
59605                       _fieldsArr.push(
59606                           uiField(context, field, entity, { show: false })
59607                       );
59608                   }
59609               });
59610
59611               _fieldsArr.forEach(function(field) {
59612                   field
59613                       .on('change', function(t$$1, onInput) {
59614                           dispatch$$1.call('change', field, t$$1, onInput);
59615                       });
59616               });
59617           }
59618
59619           _fieldsArr.forEach(function(field) {
59620               field
59621                   .state(_state)
59622                   .tags(_tags);
59623           });
59624
59625
59626           selection$$1
59627               .call(formFields
59628                   .fieldsArr(_fieldsArr)
59629                   .state(_state)
59630                   .klass('inspector-inner fillL3')
59631               );
59632
59633
59634           selection$$1.selectAll('.wrap-form-field input')
59635               .on('keydown', function() {
59636                   // if user presses enter, and combobox is not active, accept edits..
59637                   if (event.keyCode === 13 && select('.combobox').empty()) {
59638                       context.enter(modeBrowse(context));
59639                   }
59640               });
59641       }
59642
59643
59644       presetEditor.preset = function(val) {
59645           if (!arguments.length) return _preset;
59646           if (_preset && _preset.id === val.id) return presetEditor;
59647           _preset = val;
59648           _fieldsArr = null;
59649           return presetEditor;
59650       };
59651
59652
59653       presetEditor.state = function(val) {
59654           if (!arguments.length) return _state;
59655           _state = val;
59656           return presetEditor;
59657       };
59658
59659
59660       presetEditor.tags = function(val) {
59661           if (!arguments.length) return _tags;
59662           _tags = val;
59663           // Don't reset _fieldsArr here.
59664           return presetEditor;
59665       };
59666
59667
59668       presetEditor.entityID = function(val) {
59669           if (!arguments.length) return _entityID;
59670           if (_entityID === val) return presetEditor;
59671           _entityID = val;
59672           _fieldsArr = null;
59673           return presetEditor;
59674       };
59675
59676
59677       return utilRebind(presetEditor, dispatch$$1, 'on');
59678   }
59679
59680   function uiPresetIcon() {
59681       var preset, geometry;
59682
59683
59684       function presetIcon(selection$$1) {
59685           selection$$1.each(render);
59686       }
59687
59688
59689       function getIcon(p, geom) {
59690           if (p.icon)
59691               return p.icon;
59692           else if (geom === 'line')
59693               return 'iD-other-line';
59694           else if (geom === 'vertex')
59695               return p.isFallback() ? '' : 'temaki-vertex';
59696           else
59697               return 'maki-marker-stroked';
59698       }
59699
59700
59701       function render() {
59702           var selection$$1 = select(this);
59703           var p = preset.apply(this, arguments);
59704           var geom = geometry.apply(this, arguments);
59705           var picon = getIcon(p, geom);
59706           var isMaki = /^maki-/.test(picon);
59707           var isTemaki = /^temaki-/.test(picon);
59708           var isFa = /^fa[srb]-/.test(picon);
59709           var isPOI = isMaki || isTemaki || isFa;
59710           var isFramed = (geom === 'area' || geom === 'vertex');
59711
59712           var tagClasses = '';
59713           for (var k in p.tags) {
59714               var v = p.tags[k];
59715               tagClasses += ' tag-' + k;
59716               if (v !== '*') {
59717                   tagClasses += ' tag-' + k + '-' + v;
59718               }
59719           }
59720
59721           // if the preset includes a `building_area` field, class it as a building
59722           if (p.fields && p.fields.filter(function(d) { return d.id === 'building_area'; }).length) {
59723               tagClasses += ' tag-building';
59724           }
59725
59726
59727           var fill = selection$$1.selectAll('.preset-icon-fill')
59728               .data([0]);
59729
59730           fill = fill.enter()
59731               .append('div')
59732               .merge(fill);
59733
59734           fill
59735               .attr('class', function() {
59736                   return 'preset-icon-fill preset-icon-fill-' + geom + tagClasses;
59737               });
59738
59739
59740           var areaFrame = selection$$1.selectAll('.preset-icon-frame')
59741               .data((geom === 'area') ? [0] : []);
59742
59743           areaFrame.exit()
59744               .remove();
59745
59746           areaFrame = areaFrame.enter()
59747               .append('div')
59748               .attr('class', 'preset-icon-frame')
59749               .call(svgIcon('#iD-preset-icon-frame'));
59750
59751
59752           var icon = selection$$1.selectAll('.preset-icon')
59753               .data([0]);
59754
59755           icon = icon.enter()
59756               .append('div')
59757               .attr('class', 'preset-icon')
59758               .call(svgIcon(''))
59759               .merge(icon);
59760
59761           icon
59762               .attr('class', 'preset-icon preset-icon-' +
59763                   (isPOI ? (isFramed ? '24' : '28') : (isFramed ? '44' : '60'))
59764               );
59765
59766           icon.selectAll('svg')
59767               .attr('class', function() {
59768                   return 'icon ' + picon + (isPOI ? '' : tagClasses);
59769               });
59770
59771           icon.selectAll('use')
59772               .attr('href', '#' + picon + (isMaki ? '-15' : ''));
59773       }
59774
59775
59776       presetIcon.preset = function(val) {
59777           if (!arguments.length) return preset;
59778           preset = utilFunctor(val);
59779           return presetIcon;
59780       };
59781
59782
59783       presetIcon.geometry = function(val) {
59784           if (!arguments.length) return geometry;
59785           geometry = utilFunctor(val);
59786           return presetIcon;
59787       };
59788
59789       return presetIcon;
59790   }
59791
59792   function uiQuickLinks() {
59793       var _choices = [];
59794
59795
59796       function quickLinks(selection$$1) {
59797           var container = selection$$1.selectAll('.quick-links')
59798               .data([0]);
59799
59800           container = container.enter()
59801               .append('div')
59802               .attr('class', 'quick-links')
59803               .merge(container);
59804
59805           var items = container.selectAll('.quick-link')
59806               .data(_choices, function(d) { return d.id; });
59807
59808           items.exit()
59809               .remove();
59810
59811           items.enter()
59812               .append('a')
59813               .attr('class', function(d) { return 'quick-link quick-link-' + d.id; })
59814               .attr('href', '#')
59815               .text(function(d) { return t(d.label); })
59816               .each(function(d) {
59817                   if (typeof d.tooltip !== 'function') return;
59818                   select(this)
59819                       .call(tooltip().html(true).title(d.tooltip).placement('bottom'));
59820               })
59821               .on('click', function(d) {
59822                   if (typeof d.click !== 'function') return;
59823                   event.preventDefault();
59824                   d.click(d);
59825               });
59826       }
59827
59828
59829       //  val should be an array of choices like:
59830       //    [{
59831       //       id: 'link-id',
59832       //       label: 'translation.key',
59833       //       tooltip: function(d),
59834       //       click: function(d)
59835       //    }, ..]
59836       quickLinks.choices = function(val) {
59837           if (!arguments.length) return _choices;
59838           _choices = val;
59839           return quickLinks;
59840       };
59841
59842
59843       return quickLinks;
59844   }
59845
59846   function uiRawMemberEditor$$1(context) {
59847       var taginfo = services.taginfo;
59848       var _entityID;
59849
59850       function downloadMember(d) {
59851           event.preventDefault();
59852
59853           // display the loading indicator
59854           select(this.parentNode).classed('tag-reference-loading', true);
59855           context.loadEntity(d.id);
59856       }
59857
59858       function zoomToMember(d) {
59859           event.preventDefault();
59860
59861           var entity = context.entity(d.id);
59862           context.map().zoomTo(entity);
59863
59864           // highlight the feature in case it wasn't previously on-screen
59865           utilHighlightEntity(d.id, true, context);
59866       }
59867
59868
59869       function selectMember(d) {
59870           event.preventDefault();
59871
59872           // remove the hover-highlight styling
59873           utilHighlightEntity(d.id, false, context);
59874
59875           var entity = context.entity(d.id);
59876           var mapExtent = context.map().extent();
59877           if (!entity.intersects(mapExtent, context.graph())) {
59878               // zoom to the entity if its extent is not visible now
59879               context.map().zoomToEase(entity);
59880           }
59881
59882           context.enter(modeSelect(context, [d.id]));
59883       }
59884
59885
59886       function changeRole(d) {
59887           var oldRole = d.role;
59888           var newRole = select(this).property('value');
59889
59890           if (oldRole !== newRole) {
59891               var member = { id: d.id, type: d.type, role: newRole };
59892               context.perform(
59893                   actionChangeMember(d.relation.id, member, d.index),
59894                   t('operations.change_role.annotation')
59895               );
59896           }
59897       }
59898
59899
59900       function deleteMember(d) {
59901           context.perform(
59902               actionDeleteMember(d.relation.id, d.index),
59903               t('operations.delete_member.annotation')
59904           );
59905
59906           if (!context.hasEntity(d.relation.id)) {
59907               context.enter(modeBrowse(context));
59908           }
59909
59910           utilHighlightEntity(d.id, false, context);
59911       }
59912
59913
59914       function rawMemberEditor(selection$$1) {
59915           var entity = context.entity(_entityID);
59916           var memberships = [];
59917
59918           entity.members.slice(0, 1000).forEach(function(member, index) {
59919               memberships.push({
59920                   index: index,
59921                   id: member.id,
59922                   type: member.type,
59923                   role: member.role,
59924                   relation: entity,
59925                   member: context.hasEntity(member.id)
59926               });
59927           });
59928
59929           var gt = entity.members.length > 1000 ? '>' : '';
59930           selection$$1.call(uiDisclosure(context, 'raw_member_editor', true)
59931               .title(t('inspector.all_members') + ' (' + gt + memberships.length + ')')
59932               .expanded(true)
59933               .updatePreference(false)
59934               .on('toggled', function(expanded) {
59935                   if (expanded) {
59936                       selection$$1.node().parentNode.scrollTop += 200;
59937                   }
59938               })
59939               .content(content)
59940           );
59941
59942
59943           function content(selection$$1) {
59944               var list = selection$$1.selectAll('.member-list')
59945                   .data([0]);
59946
59947               list = list.enter()
59948                   .append('ul')
59949                   .attr('class', 'member-list')
59950                   .merge(list);
59951
59952
59953               var items = list.selectAll('li')
59954                   .data(memberships, function(d) {
59955                       return osmEntity$$1.key(d.relation) + ',' + d.index + ',' +
59956                           (d.member ? osmEntity$$1.key(d.member) : 'incomplete');
59957                   });
59958
59959               items.exit()
59960                   .each(unbind)
59961                   .remove();
59962
59963               var itemsEnter = items.enter()
59964                   .append('li')
59965                   .attr('class', 'member-row form-field')
59966                   .classed('member-incomplete', function(d) { return !d.member; });
59967
59968               itemsEnter
59969                   .each(function(d) {
59970                       var item = select(this);
59971
59972                       var label = item
59973                           .append('label')
59974                           .attr('class', 'form-field-label');
59975
59976                       if (d.member) {
59977                           // highlight the member feature in the map while hovering on the list item
59978                           item
59979                               .on('mouseover', function() {
59980                                   utilHighlightEntity(d.id, true, context);
59981                               })
59982                               .on('mouseout', function() {
59983                                   utilHighlightEntity(d.id, false, context);
59984                               });
59985
59986                           var labelLink = label
59987                               .append('span')
59988                               .attr('class', 'label-text')
59989                               .append('a')
59990                               .attr('href', '#')
59991                               .on('click', selectMember);
59992
59993                           labelLink
59994                               .append('span')
59995                               .attr('class', 'member-entity-type')
59996                               .text(function(d) {
59997                                   var matched = context.presets().match(d.member, context.graph());
59998                                   return (matched && matched.name()) || utilDisplayType(d.member.id);
59999                               });
60000
60001                           labelLink
60002                               .append('span')
60003                               .attr('class', 'member-entity-name')
60004                               .text(function(d) { return utilDisplayName(d.member); });
60005
60006                           label
60007                               .append('button')
60008                               .attr('class', 'member-zoom')
60009                               .attr('title', t('icons.zoom_to'))
60010                               .attr('tabindex', -1)
60011                               .call(svgIcon('#iD-icon-geolocate'))
60012                               .on('click', zoomToMember);
60013
60014                       } else {
60015                           var labelText = label
60016                               .append('span')
60017                               .attr('class', 'label-text');
60018
60019                           labelText
60020                               .append('span')
60021                               .attr('class', 'member-entity-type')
60022                               .text(t('inspector.' + d.type, { id: d.id }));
60023
60024                           labelText
60025                               .append('span')
60026                               .attr('class', 'member-entity-name')
60027                               .text(t('inspector.incomplete', { id: d.id }));
60028
60029                           label
60030                               .append('button')
60031                               .attr('class', 'member-download')
60032                               .attr('title', t('icons.download'))
60033                               .attr('tabindex', -1)
60034                               .call(svgIcon('#iD-icon-load'))
60035                               .on('click', downloadMember);
60036                       }
60037                   });
60038
60039               var wrapEnter = itemsEnter
60040                   .append('div')
60041                   .attr('class', 'form-field-input-wrap form-field-input-member');
60042
60043               wrapEnter
60044                   .append('input')
60045                   .attr('class', 'member-role')
60046                   .property('type', 'text')
60047                   .attr('maxlength', 255)
60048                   .attr('placeholder', t('inspector.role'))
60049                   .call(utilNoAuto);
60050
60051               wrapEnter
60052                   .append('button')
60053                   .attr('tabindex', -1)
60054                   .attr('title', t('icons.remove'))
60055                   .attr('class', 'remove form-field-button member-delete')
60056                   .call(svgIcon('#iD-operation-delete'));
60057
60058               if (taginfo) {
60059                   wrapEnter.each(bindTypeahead);
60060               }
60061
60062
60063               // update
60064               items = items
60065                   .merge(itemsEnter);
60066
60067               items.select('input.member-role')
60068                   .property('value', function(d) { return d.role; })
60069                   .on('blur', changeRole)
60070                   .on('change', changeRole);
60071
60072               items.select('button.member-delete')
60073                   .on('click', deleteMember);
60074
60075
60076
60077               function bindTypeahead(d) {
60078                   var row = select(this);
60079                   var role = row.selectAll('input.member-role');
60080                   var origValue = role.property('value');
60081
60082                   function sort(value, data) {
60083                       var sameletter = [];
60084                       var other = [];
60085                       for (var i = 0; i < data.length; i++) {
60086                           if (data[i].value.substring(0, value.length) === value) {
60087                               sameletter.push(data[i]);
60088                           } else {
60089                               other.push(data[i]);
60090                           }
60091                       }
60092                       return sameletter.concat(other);
60093                   }
60094
60095                   role.call(uiCombobox(context, 'member-role')
60096                       .fetcher(function(role, callback) {
60097                           // The `geometry` param is used in the `taginfo.js` interface for
60098                           // filtering results, as a key into the `tag_members_fractions`
60099                           // object.  If we don't know the geometry because the member is
60100                           // not yet downloaded, it's ok to guess based on type.
60101                           var geometry;
60102                           if (d.member) {
60103                               geometry = context.geometry(d.member.id);
60104                           } else if (d.type === 'relation') {
60105                               geometry = 'relation';
60106                           } else if (d.type === 'way') {
60107                               geometry = 'line';
60108                           } else {
60109                               geometry = 'point';
60110                           }
60111
60112                           var rtype = entity.tags.type;
60113                           taginfo.roles({
60114                               debounce: true,
60115                               rtype: rtype || '',
60116                               geometry: geometry,
60117                               query: role
60118                           }, function(err, data) {
60119                               if (!err) callback(sort(role, data));
60120                           });
60121                       })
60122                       .on('cancel', function() {
60123                           role.property('value', origValue);
60124                       })
60125                   );
60126               }
60127
60128
60129               function unbind() {
60130                   var row = select(this);
60131
60132                   row.selectAll('input.member-role')
60133                       .call(uiCombobox.off);
60134               }
60135           }
60136       }
60137
60138
60139       rawMemberEditor.entityID = function(val) {
60140           if (!arguments.length) return _entityID;
60141           _entityID = val;
60142           return rawMemberEditor;
60143       };
60144
60145
60146       return rawMemberEditor;
60147   }
60148
60149   function uiRawMembershipEditor$$1(context) {
60150       var taginfo = services.taginfo;
60151       var nearbyCombo = uiCombobox(context, 'parent-relation')
60152           .minItems(1)
60153           .fetcher(fetchNearbyRelations);
60154       var _inChange = false;
60155       var _entityID;
60156       var _showBlank;
60157
60158
60159       function selectRelation(d) {
60160           event.preventDefault();
60161
60162           // remove the hover-highlight styling
60163           utilHighlightEntity(d.relation.id, false, context);
60164
60165           context.enter(modeSelect(context, [d.relation.id]));
60166       }
60167
60168
60169       function changeRole(d) {
60170           if (d === 0) return;    // called on newrow (shoudn't happen)
60171           if (_inChange) return;  // avoid accidental recursive call #5731
60172
60173           var oldRole = d.member.role;
60174           var newRole = select(this).property('value');
60175
60176           if (oldRole !== newRole) {
60177               _inChange = true;
60178               context.perform(
60179                   actionChangeMember(d.relation.id, assignIn({}, d.member, { role: newRole }), d.index),
60180                   t('operations.change_role.annotation')
60181               );
60182           }
60183           _inChange = false;
60184       }
60185
60186
60187       function addMembership(d, role) {
60188           this.blur();           // avoid keeping focus on the button
60189           _showBlank = false;
60190
60191           var member = { id: _entityID, type: context.entity(_entityID).type, role: role };
60192
60193           if (d.relation) {
60194               context.perform(
60195                   actionAddMember(d.relation.id, member),
60196                   t('operations.add_member.annotation')
60197               );
60198
60199           } else {
60200               var relation = osmRelation();
60201               context.perform(
60202                   actionAddEntity(relation),
60203                   actionAddMember(relation.id, member),
60204                   t('operations.add.annotation.relation')
60205               );
60206
60207               context.enter(modeSelect(context, [relation.id]).newFeature(true));
60208           }
60209       }
60210
60211
60212       function deleteMembership(d) {
60213           this.blur();           // avoid keeping focus on the button
60214           if (d === 0) return;   // called on newrow (shoudn't happen)
60215
60216           context.perform(
60217               actionDeleteMember(d.relation.id, d.index),
60218               t('operations.delete_member.annotation')
60219           );
60220       }
60221
60222
60223       function fetchNearbyRelations(q, callback) {
60224           var newRelation = { relation: null, value: t('inspector.new_relation') };
60225           var result = [];
60226           var graph = context.graph();
60227
60228           context.intersects(context.extent()).forEach(function(entity) {
60229               if (entity.type !== 'relation' || entity.id === _entityID) return;
60230
60231               var matched = context.presets().match(entity, graph);
60232               var presetName = (matched && matched.name()) || t('inspector.relation');
60233               var entityName = utilDisplayName(entity) || '';
60234
60235               var value = presetName + ' ' + entityName;
60236               if (q && value.toLowerCase().indexOf(q.toLowerCase()) === -1) return;
60237
60238               result.push({ relation: entity, value: value });
60239           });
60240
60241           result.sort(function(a, b) {
60242               return osmRelation.creationOrder(a.relation, b.relation);
60243           });
60244
60245           // Dedupe identical names by appending relation id - see #2891
60246           var dupeGroups = filter(
60247               groupBy(result, 'value'),
60248               function(v) { return v.length > 1; }
60249           );
60250
60251           dupeGroups.forEach(function(group) {
60252               group.forEach(function(obj) {
60253                   obj.value += ' ' + obj.relation.id;
60254               });
60255           });
60256
60257           result.forEach(function(obj) {
60258               obj.title = obj.value;
60259           });
60260
60261           result.unshift(newRelation);
60262           callback(result);
60263       }
60264
60265
60266       function rawMembershipEditor(selection$$1) {
60267           var entity = context.entity(_entityID);
60268           var parents = context.graph().parentRelations(entity);
60269           var memberships = [];
60270
60271           parents.slice(0, 1000).forEach(function(relation) {
60272               relation.members.forEach(function(member, index) {
60273                   if (member.id === entity.id) {
60274                       memberships.push({ relation: relation, member: member, index: index });
60275                   }
60276               });
60277           });
60278
60279           var gt = parents.length > 1000 ? '>' : '';
60280           selection$$1.call(uiDisclosure(context, 'raw_membership_editor', true)
60281               .title(t('inspector.all_relations') + ' (' + gt + memberships.length + ')')
60282               .expanded(true)
60283               .updatePreference(false)
60284               .on('toggled', function(expanded) {
60285                   if (expanded) { selection$$1.node().parentNode.scrollTop += 200; }
60286               })
60287               .content(content)
60288           );
60289
60290
60291           function content(selection$$1) {
60292               var list = selection$$1.selectAll('.member-list')
60293                   .data([0]);
60294
60295               list = list.enter()
60296                   .append('ul')
60297                   .attr('class', 'member-list')
60298                   .merge(list);
60299
60300
60301               var items = list.selectAll('li.member-row-normal')
60302                   .data(memberships, function(d) {
60303                       return osmEntity$$1.key(d.relation) + ',' + d.index;
60304                   });
60305
60306               items.exit()
60307                   .each(unbind)
60308                   .remove();
60309
60310               // Enter
60311               var itemsEnter = items.enter()
60312                   .append('li')
60313                   .attr('class', 'member-row member-row-normal form-field');
60314
60315               itemsEnter.each(function(d){
60316                   // highlight the relation in the map while hovering on the list item
60317                   select(this)
60318                       .on('mouseover', function() {
60319                           utilHighlightEntity(d.relation.id, true, context);
60320                       })
60321                       .on('mouseout', function() {
60322                           utilHighlightEntity(d.relation.id, false, context);
60323                       });
60324               });
60325
60326               var labelEnter = itemsEnter
60327                   .append('label')
60328                   .attr('class', 'form-field-label')
60329                   .append('span')
60330                   .attr('class', 'label-text')
60331                   .append('a')
60332                   .attr('href', '#')
60333                   .on('click', selectRelation);
60334
60335               labelEnter
60336                   .append('span')
60337                   .attr('class', 'member-entity-type')
60338                   .text(function(d) {
60339                       var matched = context.presets().match(d.relation, context.graph());
60340                       return (matched && matched.name()) || t('inspector.relation');
60341                   });
60342
60343               labelEnter
60344                   .append('span')
60345                   .attr('class', 'member-entity-name')
60346                   .text(function(d) { return utilDisplayName(d.relation); });
60347
60348               var wrapEnter = itemsEnter
60349                   .append('div')
60350                   .attr('class', 'form-field-input-wrap form-field-input-member');
60351
60352               wrapEnter
60353                   .append('input')
60354                   .attr('class', 'member-role')
60355                   .property('type', 'text')
60356                   .attr('maxlength', 255)
60357                   .attr('placeholder', t('inspector.role'))
60358                   .call(utilNoAuto)
60359                   .property('value', function(d) { return d.member.role; })
60360                   .on('blur', changeRole)
60361                   .on('change', changeRole);
60362
60363               wrapEnter
60364                   .append('button')
60365                   .attr('tabindex', -1)
60366                   .attr('class', 'remove form-field-button member-delete')
60367                   .call(svgIcon('#iD-operation-delete'))
60368                   .on('click', deleteMembership);
60369
60370               if (taginfo) {
60371                   wrapEnter.each(bindTypeahead);
60372               }
60373
60374
60375               var newMembership = list.selectAll('.member-row-new')
60376                   .data(_showBlank ? [0] : []);
60377
60378               // Exit
60379               newMembership.exit()
60380                   .remove();
60381
60382               // Enter
60383               var newMembershipEnter = newMembership.enter()
60384                   .append('li')
60385                   .attr('class', 'member-row member-row-new form-field');
60386
60387               newMembershipEnter
60388                   .append('label')
60389                   .attr('class', 'form-field-label')
60390                   .append('input')
60391                   .attr('placeholder', t('inspector.choose_relation'))
60392                   .attr('type', 'text')
60393                   .attr('class', 'member-entity-input')
60394                   .call(utilNoAuto);
60395
60396               var newWrapEnter = newMembershipEnter
60397                   .append('div')
60398                   .attr('class', 'form-field-input-wrap form-field-input-member');
60399
60400               newWrapEnter
60401                   .append('input')
60402                   .attr('class', 'member-role')
60403                   .property('type', 'text')
60404                   .attr('maxlength', 255)
60405                   .attr('placeholder', t('inspector.role'))
60406                   .call(utilNoAuto);
60407
60408               newWrapEnter
60409                   .append('button')
60410                   .attr('tabindex', -1)
60411                   .attr('class', 'remove form-field-button member-delete')
60412                   .call(svgIcon('#iD-operation-delete'))
60413                   .on('click', function() {
60414                       list.selectAll('.member-row-new')
60415                           .remove();
60416                   });
60417
60418               // Update
60419               newMembership = newMembership
60420                   .merge(newMembershipEnter);
60421
60422               newMembership.selectAll('.member-entity-input')
60423                   .call(nearbyCombo
60424                       .on('accept', acceptEntity)
60425                       .on('cancel', cancelEntity)
60426                   );
60427
60428
60429               // Container for the Add button
60430               var addRow = selection$$1.selectAll('.add-row')
60431                   .data([0]);
60432
60433               // enter
60434               var addRowEnter = addRow.enter()
60435                   .append('div')
60436                   .attr('class', 'add-row');
60437
60438               addRowEnter
60439                   .append('button')
60440                   .attr('class', 'add-relation')
60441                   .call(svgIcon('#iD-icon-plus', 'light'));
60442
60443               addRowEnter
60444                   .append('div')
60445                   .attr('class', 'space-value');   // preserve space
60446
60447               addRowEnter
60448                   .append('div')
60449                   .attr('class', 'space-buttons');  // preserve space
60450
60451               // update
60452               addRow = addRow
60453                   .merge(addRowEnter);
60454
60455               addRow.select('.add-relation')
60456                   .on('click', function() {
60457                       _showBlank = true;
60458                       content(selection$$1);
60459                       list.selectAll('.member-entity-input').node().focus();
60460                   });
60461
60462
60463
60464               function acceptEntity(d) {
60465                   if (!d) {
60466                       cancelEntity();
60467                       return;
60468                   }
60469                   var role = list.selectAll('.member-row-new .member-role').property('value');
60470                   addMembership(d, role);
60471               }
60472
60473
60474               function cancelEntity() {
60475                   var input = newMembership.selectAll('.member-entity-input');
60476                   input.property('value', '');
60477               }
60478
60479
60480               function bindTypeahead(d) {
60481                   var row = select(this);
60482                   var role = row.selectAll('input.member-role');
60483                   var origValue = role.property('value');
60484
60485                   function sort(value, data) {
60486                       var sameletter = [];
60487                       var other = [];
60488                       for (var i = 0; i < data.length; i++) {
60489                           if (data[i].value.substring(0, value.length) === value) {
60490                               sameletter.push(data[i]);
60491                           } else {
60492                               other.push(data[i]);
60493                           }
60494                       }
60495                       return sameletter.concat(other);
60496                   }
60497
60498                   role.call(uiCombobox(context, 'member-role')
60499                       .fetcher(function(role, callback) {
60500                           var rtype = d.relation.tags.type;
60501                           taginfo.roles({
60502                               debounce: true,
60503                               rtype: rtype || '',
60504                               geometry: context.geometry(_entityID),
60505                               query: role
60506                           }, function(err, data) {
60507                               if (!err) callback(sort(role, data));
60508                           });
60509                       })
60510                       .on('cancel', function() {
60511                           role.property('value', origValue);
60512                       })
60513                   );
60514               }
60515
60516
60517               function unbind() {
60518                   var row = select(this);
60519
60520                   row.selectAll('input.member-role')
60521                       .call(uiCombobox.off);
60522               }
60523           }
60524       }
60525
60526
60527       rawMembershipEditor.entityID = function(val) {
60528           if (!arguments.length) return _entityID;
60529           _entityID = val;
60530           _showBlank = false;
60531           return rawMembershipEditor;
60532       };
60533
60534
60535       return rawMembershipEditor;
60536   }
60537
60538   function uiEntityEditor(context) {
60539       var dispatch$$1 = dispatch('choose');
60540       var _state = 'select';
60541       var _coalesceChanges = false;
60542       var _modified = false;
60543       var _base;
60544       var _entityID;
60545       var _activePreset;
60546       var _tagReference;
60547
60548       var quickLinks = uiQuickLinks();
60549       var presetEditor = uiPresetEditor(context).on('change', changeTags);
60550       var rawTagEditor = uiRawTagEditor$$1(context).on('change', changeTags);
60551       var rawMemberEditor = uiRawMemberEditor$$1(context);
60552       var rawMembershipEditor = uiRawMembershipEditor$$1(context);
60553
60554       function entityEditor(selection$$1) {
60555           var entity = context.entity(_entityID);
60556           var tags = clone(entity.tags);
60557
60558           // Header
60559           var header = selection$$1.selectAll('.header')
60560               .data([0]);
60561
60562           // Enter
60563           var headerEnter = header.enter()
60564               .append('div')
60565               .attr('class', 'header fillL cf');
60566
60567           headerEnter
60568               .append('button')
60569               .attr('class', 'fl preset-reset preset-choose')
60570               .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-forward' : '#iD-icon-backward'));
60571
60572           headerEnter
60573               .append('button')
60574               .attr('class', 'fr preset-close')
60575               .on('click', function() { context.enter(modeBrowse(context)); })
60576               .call(svgIcon(_modified ? '#iD-icon-apply' : '#iD-icon-close'));
60577
60578           headerEnter
60579               .append('h3')
60580               .text(t('inspector.edit'));
60581
60582           // Update
60583           header = header
60584               .merge(headerEnter);
60585
60586           header.selectAll('.preset-reset')
60587               .on('click', function() {
60588                   dispatch$$1.call('choose', this, _activePreset);
60589               });
60590
60591
60592           // Body
60593           var body = selection$$1.selectAll('.inspector-body')
60594               .data([0]);
60595
60596           // Enter
60597           var bodyEnter = body.enter()
60598               .append('div')
60599               .attr('class', 'inspector-body');
60600
60601           bodyEnter
60602               .append('div')
60603               .attr('class', 'preset-list-item inspector-inner')
60604               .append('div')
60605               .attr('class', 'preset-list-button-wrap')
60606               .append('button')
60607               .attr('class', 'preset-list-button preset-reset')
60608               .call(tooltip().title(t('inspector.back_tooltip')).placement('bottom'))
60609               .append('div')
60610               .attr('class', 'label')
60611               .append('div')
60612               .attr('class', 'label-inner');
60613
60614           bodyEnter
60615               .append('div')
60616               .attr('class', 'preset-quick-links');
60617
60618           bodyEnter
60619               .append('div')
60620               .attr('class', 'preset-editor');
60621
60622           bodyEnter
60623               .append('div')
60624               .attr('class', 'raw-tag-editor inspector-inner');
60625
60626           bodyEnter
60627               .append('div')
60628               .attr('class', 'raw-member-editor inspector-inner');
60629
60630           bodyEnter
60631               .append('div')
60632               .attr('class', 'raw-membership-editor inspector-inner');
60633
60634           bodyEnter
60635               .append('input')
60636               .attr('type', 'text')
60637               .attr('class', 'key-trap');
60638
60639
60640           // Update
60641           body = body
60642               .merge(bodyEnter);
60643
60644           // update header
60645           if (_tagReference) {
60646               body.selectAll('.preset-list-button-wrap')
60647                   .call(_tagReference.button);
60648
60649               body.selectAll('.preset-list-item')
60650                   .call(_tagReference.body);
60651           }
60652
60653           body.selectAll('.preset-reset')
60654               .on('click', function() {
60655                   dispatch$$1.call('choose', this, _activePreset);
60656               });
60657
60658           body.select('.preset-list-item button')
60659               .call(uiPresetIcon()
60660                   .geometry(context.geometry(_entityID))
60661                   .preset(_activePreset)
60662               );
60663
60664           // NOTE: split on en-dash, not a hypen (to avoid conflict with hyphenated names)
60665           var label = body.select('.label-inner');
60666           var nameparts = label.selectAll('.namepart')
60667               .data(_activePreset.name().split(' – '), function(d) { return d; });
60668
60669           nameparts.exit()
60670               .remove();
60671
60672           nameparts
60673               .enter()
60674               .append('div')
60675               .attr('class', 'namepart')
60676               .text(function(d) { return d; });
60677
60678
60679           // update quick links
60680           var choices = [{
60681               id: 'zoom_to',
60682               label: 'inspector.zoom_to.title',
60683               tooltip: function() {
60684                   return uiTooltipHtml(t('inspector.zoom_to.tooltip_feature'), t('inspector.zoom_to.key'));
60685               },
60686               click: function zoomTo() {
60687                   context.mode().zoomToSelected();
60688               }
60689           }];
60690
60691           body.select('.preset-quick-links')
60692               .call(quickLinks.choices(choices));
60693
60694
60695           // update editor sections
60696           body.select('.preset-editor')
60697               .call(presetEditor
60698                   .preset(_activePreset)
60699                   .entityID(_entityID)
60700                   .tags(tags)
60701                   .state(_state)
60702               );
60703
60704           body.select('.raw-tag-editor')
60705               .call(rawTagEditor
60706                   .preset(_activePreset)
60707                   .entityID(_entityID)
60708                   .tags(tags)
60709                   .state(_state)
60710               );
60711
60712           if (entity.type === 'relation') {
60713               body.select('.raw-member-editor')
60714                   .style('display', 'block')
60715                   .call(rawMemberEditor
60716                       .entityID(_entityID)
60717                   );
60718           } else {
60719               body.select('.raw-member-editor')
60720                   .style('display', 'none');
60721           }
60722
60723           body.select('.raw-membership-editor')
60724               .call(rawMembershipEditor
60725                   .entityID(_entityID)
60726               );
60727
60728           body.select('.key-trap')
60729               .on('keydown.key-trap', function() {
60730                   // On tabbing, send focus back to the first field on the inspector-body
60731                   // (probably the `name` field) #4159
60732                   if (event.keyCode === 9 && !event.shiftKey) {
60733                       event.preventDefault();
60734                       body.select('input').node().focus();
60735                   }
60736               });
60737
60738           context.history()
60739               .on('change.entity-editor', historyChanged);
60740
60741
60742           function historyChanged() {
60743               if (_state === 'hide') return;
60744
60745               var entity = context.hasEntity(_entityID);
60746               var graph = context.graph();
60747               if (!entity) return;
60748
60749               var match = context.presets().match(entity, graph);
60750               var activePreset = entityEditor.preset();
60751               var weakPreset = activePreset && isEmpty(activePreset.addTags);
60752
60753               // A "weak" preset doesn't set any tags. (e.g. "Address")
60754               // Don't replace a weak preset with a fallback preset (e.g. "Point")
60755               if (!(weakPreset && match.isFallback())) {
60756                   entityEditor.preset(match);
60757               }
60758               entityEditor.modified(_base !== graph);
60759               entityEditor(selection$$1);
60760           }
60761       }
60762
60763
60764       // Tag changes that fire on input can all get coalesced into a single
60765       // history operation when the user leaves the field.  #2342
60766       function changeTags(changed, onInput) {
60767           var entity = context.entity(_entityID);
60768           var annotation = t('operations.change_tags.annotation');
60769           var tags = clone(entity.tags);
60770
60771           for (var k in changed) {
60772               if (!k) continue;
60773               var v = changed[k];
60774               if (v !== undefined || tags.hasOwnProperty(k)) {
60775                   tags[k] = v;
60776               }
60777           }
60778
60779           if (!onInput) {
60780               tags = utilCleanTags(tags);
60781           }
60782
60783           if (!isEqual(entity.tags, tags)) {
60784               if (_coalesceChanges) {
60785                   context.overwrite(actionChangeTags(_entityID, tags), annotation);
60786               } else {
60787                   context.perform(actionChangeTags(_entityID, tags), annotation);
60788                   _coalesceChanges = !!onInput;
60789               }
60790           }
60791       }
60792
60793
60794       entityEditor.modified = function(val) {
60795           if (!arguments.length) return _modified;
60796           _modified = val;
60797           d3_selectAll('button.preset-close use')
60798               .attr('xlink:href', (_modified ? '#iD-icon-apply' : '#iD-icon-close'));
60799           return entityEditor;
60800       };
60801
60802
60803       entityEditor.state = function(val) {
60804           if (!arguments.length) return _state;
60805           _state = val;
60806           return entityEditor;
60807       };
60808
60809
60810       entityEditor.entityID = function(val) {
60811           if (!arguments.length) return _entityID;
60812           _entityID = val;
60813           _base = context.graph();
60814           _coalesceChanges = false;
60815
60816           // reset the scroll to the top of the inspector
60817           var body = d3_selectAll('.entity-editor-pane .inspector-body');
60818           if (!body.empty()) {
60819               body.node().scrollTop = 0;
60820           }
60821
60822           var presetMatch = context.presets().match(context.entity(_entityID), _base);
60823
60824           return entityEditor
60825               .preset(presetMatch)
60826               .modified(false);
60827       };
60828
60829
60830       entityEditor.preset = function(val) {
60831           if (!arguments.length) return _activePreset;
60832           if (val !== _activePreset) {
60833               _activePreset = val;
60834               _tagReference = uiTagReference(_activePreset.reference(context.geometry(_entityID)), context)
60835                   .showing(false);
60836           }
60837           return entityEditor;
60838       };
60839
60840
60841       return utilRebind(entityEditor, dispatch$$1, 'on');
60842   }
60843
60844   var pair_1 = pair$1;
60845
60846   function search(x, dims, r) {
60847     if (!dims) dims = 'NSEW';
60848     if (typeof x !== 'string') return { val: null, regex: r };
60849
60850     r = r || /[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)°?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/gi;
60851
60852     var m = r.exec(x);
60853     if (!m) return { val: null, regex: r };
60854
60855     var dim = m[1] || m[5];
60856     if (dim && dims.indexOf(dim) === -1) return { val: null, regex: r };
60857
60858     return {
60859       val: (((m[2]) ? parseFloat(m[2]) : 0) +
60860             ((m[3] ? parseFloat(m[3]) / 60 : 0)) +
60861             ((m[4] ? parseFloat(m[4]) / 3600 : 0))) *
60862             ((dim === 'S' || dim === 'W') ? -1 : 1),
60863       regex: r,
60864       raw: m[0],
60865       dim: dim
60866     };
60867   }
60868
60869   function pair$1(x, dims) {
60870     x = x.trim();
60871     var one = search(x, dims);
60872     if (one.val === null) return null;
60873     var two = search(x, dims, one.regex);
60874     if (two.val === null) return null;
60875     // null if one/two are not contiguous.
60876     if (one.raw + two.raw !== x) return null;
60877     if (one.dim) {
60878       return swapdim(one.val, two.val, one.dim);
60879     } else {
60880       return [one.val, two.val];
60881     }
60882   }
60883
60884   function swapdim(a, b, dim) {
60885     if (dim === 'N' || dim === 'S') return [a, b];
60886     if (dim === 'W' || dim === 'E') return [b, a];
60887   }
60888
60889   /*
60890       iD.Difference represents the difference between two graphs.
60891       It knows how to calculate the set of entities that were
60892       created, modified, or deleted, and also contains the logic
60893       for recursively extending a difference to the complete set
60894       of entities that will require a redraw, taking into account
60895       child and parent relationships.
60896    */
60897   function coreDifference(base, head) {
60898       var _changes = {};
60899       var _diff = {};
60900       var _length = 0;
60901       var i, k, h, b, keys;
60902
60903       function changed(h, b) {
60904           if (h === b) return false;
60905           if (!h || !b) return true;
60906
60907           if (h.loc || b.loc) {
60908               if (!h.loc && b.loc || h.loc && !b.loc ||
60909                   h.loc[0] !== b.loc[0] || h.loc[1] !== b.loc[1]) return true;
60910           }
60911           if (h.nodes || b.nodes) {
60912               if (!isEqual(h.nodes, b.nodes)) return true;
60913           }
60914           if (h.members || b.members) {
60915               if (!isEqual(h.members, b.members)) return true;
60916           }
60917           return !isEqual(h.tags, b.tags);
60918       }
60919
60920
60921       keys = Object.keys(head.entities);
60922       for (i = 0; i < keys.length; i++) {
60923           k = keys[i];
60924           h = head.entities[k];
60925           b = base.entities[k];
60926           if (changed(h, b)) {
60927               _changes[k] = {base: b, head: h};
60928               _length++;
60929           }
60930       }
60931
60932       keys = Object.keys(base.entities);
60933       for (i = 0; i < keys.length; i++) {
60934           k = keys[i];
60935           h = head.entities[k];
60936           b = base.entities[k];
60937           if (!_changes[k] && changed(h, b)) {
60938               _changes[k] = {base: b, head: h};
60939               _length++;
60940           }
60941       }
60942
60943
60944       function addParents(parents, result) {
60945           for (var i = 0; i < parents.length; i++) {
60946               var parent = parents[i];
60947
60948               if (parent.id in result)
60949                   continue;
60950
60951               result[parent.id] = parent;
60952               addParents(head.parentRelations(parent), result);
60953           }
60954       }
60955
60956
60957       _diff.length = function length() {
60958           return _length;
60959       };
60960
60961
60962       _diff.changes = function changes() {
60963           return _changes;
60964       };
60965
60966
60967       _diff.extantIDs = function extantIDs() {
60968           var result = [];
60969           forEach(_changes, function(change, id) {
60970               if (change.head) result.push(id);
60971           });
60972           return result;
60973       };
60974
60975
60976       _diff.modified = function modified() {
60977           var result = [];
60978           forEach(_changes, function(change) {
60979               if (change.base && change.head) result.push(change.head);
60980           });
60981           return result;
60982       };
60983
60984
60985       _diff.created = function created() {
60986           var result = [];
60987           forEach(_changes, function(change) {
60988               if (!change.base && change.head) result.push(change.head);
60989           });
60990           return result;
60991       };
60992
60993
60994       _diff.deleted = function deleted() {
60995           var result = [];
60996           forEach(_changes, function(change) {
60997               if (change.base && !change.head) result.push(change.base);
60998           });
60999           return result;
61000       };
61001
61002
61003       _diff.summary = function summary() {
61004           var relevant = {};
61005
61006           function addEntity(entity, graph, changeType) {
61007               relevant[entity.id] = {
61008                   entity: entity,
61009                   graph: graph,
61010                   changeType: changeType
61011               };
61012           }
61013
61014           function addParents(entity) {
61015               var parents = head.parentWays(entity);
61016               for (var j = parents.length - 1; j >= 0; j--) {
61017                   var parent = parents[j];
61018                   if (!(parent.id in relevant)) addEntity(parent, head, 'modified');
61019               }
61020           }
61021
61022           var keys = Object.keys(_changes);
61023           for (var i = 0; i < keys.length; i++) {
61024               var change = _changes[keys[i]];
61025
61026               if (change.head && change.head.geometry(head) !== 'vertex') {
61027                   addEntity(change.head, head, change.base ? 'modified' : 'created');
61028
61029               } else if (change.base && change.base.geometry(base) !== 'vertex') {
61030                   addEntity(change.base, base, 'deleted');
61031
61032               } else if (change.base && change.head) { // modified vertex
61033                   var moved    = !isEqual(change.base.loc,  change.head.loc);
61034                   var retagged = !isEqual(change.base.tags, change.head.tags);
61035
61036                   if (moved) {
61037                       addParents(change.head);
61038                   }
61039
61040                   if (retagged || (moved && change.head.hasInterestingTags())) {
61041                       addEntity(change.head, head, 'modified');
61042                   }
61043
61044               } else if (change.head && change.head.hasInterestingTags()) { // created vertex
61045                   addEntity(change.head, head, 'created');
61046
61047               } else if (change.base && change.base.hasInterestingTags()) { // deleted vertex
61048                   addEntity(change.base, base, 'deleted');
61049               }
61050           }
61051
61052           return values$1(relevant);
61053       };
61054
61055
61056       _diff.complete = function complete(extent) {
61057           var result = {};
61058           var id, change;
61059
61060           for (id in _changes) {
61061               change = _changes[id];
61062
61063               var h = change.head;
61064               var b = change.base;
61065               var entity = h || b;
61066
61067               if (extent &&
61068                   (!h || !h.intersects(extent, head)) &&
61069                   (!b || !b.intersects(extent, base)))
61070                   continue;
61071
61072               result[id] = h;
61073
61074               if (entity.type === 'way') {
61075                   var nh = h ? h.nodes : [];
61076                   var nb = b ? b.nodes : [];
61077                   var diff, i;
61078
61079                   diff = difference(nh, nb);
61080                   for (i = 0; i < diff.length; i++) {
61081                       result[diff[i]] = head.hasEntity(diff[i]);
61082                   }
61083
61084                   diff = difference(nb, nh);
61085                   for (i = 0; i < diff.length; i++) {
61086                       result[diff[i]] = head.hasEntity(diff[i]);
61087                   }
61088               }
61089
61090               addParents(head.parentWays(entity), result);
61091               addParents(head.parentRelations(entity), result);
61092           }
61093
61094           return result;
61095       };
61096
61097
61098       return _diff;
61099   }
61100
61101   function coreTree(head) {
61102       var rtree = rbush_1(),
61103           bboxes = {},
61104           tree = {};
61105
61106
61107       function entityBBox(entity) {
61108           var bbox = entity.extent(head).bbox();
61109           bbox.id = entity.id;
61110           bboxes[entity.id] = bbox;
61111           return bbox;
61112       }
61113
61114
61115       function updateParents(entity, insertions, memo) {
61116           head.parentWays(entity).forEach(function(way) {
61117               if (bboxes[way.id]) {
61118                   rtree.remove(bboxes[way.id]);
61119                   insertions[way.id] = way;
61120               }
61121               updateParents(way, insertions, memo);
61122           });
61123
61124           head.parentRelations(entity).forEach(function(relation) {
61125               if (memo[entity.id]) return;
61126               memo[entity.id] = true;
61127               if (bboxes[relation.id]) {
61128                   rtree.remove(bboxes[relation.id]);
61129                   insertions[relation.id] = relation;
61130               }
61131               updateParents(relation, insertions, memo);
61132           });
61133       }
61134
61135
61136       tree.rebase = function(entities, force) {
61137           var insertions = {};
61138
61139           for (var i = 0; i < entities.length; i++) {
61140               var entity = entities[i];
61141
61142               if (!entity.visible)
61143                   continue;
61144
61145               if (head.entities.hasOwnProperty(entity.id) || bboxes[entity.id]) {
61146                   if (!force) {
61147                       continue;
61148                   } else if (bboxes[entity.id]) {
61149                       rtree.remove(bboxes[entity.id]);
61150                   }
61151               }
61152
61153               insertions[entity.id] = entity;
61154               updateParents(entity, insertions, {});
61155           }
61156
61157           rtree.load(map$3(insertions, entityBBox));
61158
61159           return tree;
61160       };
61161
61162
61163       tree.intersects = function(extent, graph) {
61164           if (graph !== head) {
61165               var diff = coreDifference(head, graph),
61166                   insertions = {};
61167
61168               head = graph;
61169
61170               diff.deleted().forEach(function(entity) {
61171                   rtree.remove(bboxes[entity.id]);
61172                   delete bboxes[entity.id];
61173               });
61174
61175               diff.modified().forEach(function(entity) {
61176                   rtree.remove(bboxes[entity.id]);
61177                   insertions[entity.id] = entity;
61178                   updateParents(entity, insertions, {});
61179               });
61180
61181               diff.created().forEach(function(entity) {
61182                   insertions[entity.id] = entity;
61183               });
61184
61185               rtree.load(map$3(insertions, entityBBox));
61186           }
61187
61188           return rtree.search(extent.bbox()).map(function(bbox) {
61189               return head.entity(bbox.id);
61190           });
61191       };
61192
61193
61194       return tree;
61195   }
61196
61197   function uiFeatureList(context) {
61198       var _geocodeResults;
61199
61200
61201       function featureList(selection$$1) {
61202           var header = selection$$1
61203               .append('div')
61204               .attr('class', 'header fillL cf');
61205
61206           header
61207               .append('h3')
61208               .text(t('inspector.feature_list'));
61209
61210           var searchWrap = selection$$1
61211               .append('div')
61212               .attr('class', 'search-header');
61213
61214           var search = searchWrap
61215               .append('input')
61216               .attr('placeholder', t('inspector.search'))
61217               .attr('type', 'search')
61218               .call(utilNoAuto)
61219               .on('keypress', keypress)
61220               .on('keydown', keydown)
61221               .on('input', inputevent);
61222
61223           searchWrap
61224               .call(svgIcon('#iD-icon-search', 'pre-text'));
61225
61226           var listWrap = selection$$1
61227               .append('div')
61228               .attr('class', 'inspector-body');
61229
61230           var list = listWrap
61231               .append('div')
61232               .attr('class', 'feature-list cf');
61233
61234           context
61235               .on('exit.feature-list', clearSearch);
61236           context.map()
61237               .on('drawn.feature-list', mapDrawn);
61238
61239           context.keybinding()
61240               .on(uiCmd('⌘F'), focusSearch);
61241
61242
61243           function focusSearch() {
61244               var mode = context.mode() && context.mode().id;
61245               if (mode !== 'browse') return;
61246
61247               event.preventDefault();
61248               search.node().focus();
61249           }
61250
61251
61252           function keydown() {
61253               if (event.keyCode === 27) {  // escape
61254                   search.node().blur();
61255               }
61256           }
61257
61258
61259           function keypress() {
61260               var q = search.property('value'),
61261                   items = list.selectAll('.feature-list-item');
61262               if (event.keyCode === 13 && q.length && items.size()) {  // return
61263                   click(items.datum());
61264               }
61265           }
61266
61267
61268           function inputevent() {
61269               _geocodeResults = undefined;
61270               drawList();
61271           }
61272
61273
61274           function clearSearch() {
61275               search.property('value', '');
61276               drawList();
61277           }
61278
61279
61280           function mapDrawn(e) {
61281               if (e.full) {
61282                   drawList();
61283               }
61284           }
61285
61286
61287           function features() {
61288               var entities = {};
61289               var result = [];
61290               var graph = context.graph();
61291               var q = search.property('value').toLowerCase();
61292
61293               if (!q) return result;
61294
61295               var idMatch = q.match(/^([nwr])([0-9]+)$/);
61296
61297               if (idMatch) {
61298                   result.push({
61299                       id: idMatch[0],
61300                       geometry: idMatch[1] === 'n' ? 'point' : idMatch[1] === 'w' ? 'line' : 'relation',
61301                       type: idMatch[1] === 'n' ? t('inspector.node') : idMatch[1] === 'w' ? t('inspector.way') : t('inspector.relation'),
61302                       name: idMatch[2]
61303                   });
61304               }
61305
61306               var locationMatch = pair_1(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/);
61307
61308               if (locationMatch) {
61309                   var loc = [parseFloat(locationMatch[0]), parseFloat(locationMatch[1])];
61310                   result.push({
61311                       id: -1,
61312                       geometry: 'point',
61313                       type: t('inspector.location'),
61314                       name: dmsCoordinatePair([loc[1], loc[0]]),
61315                       location: loc
61316                   });
61317               }
61318
61319               function addEntity(entity) {
61320                   if (entity.id in entities || result.length > 200)
61321                       return;
61322
61323                   entities[entity.id] = true;
61324
61325                   var name = utilDisplayName(entity) || '';
61326                   if (name.toLowerCase().indexOf(q) >= 0) {
61327                       var matched = context.presets().match(entity, graph);
61328                       var type = (matched && matched.name()) || utilDisplayType(entity.id);
61329
61330                       result.push({
61331                           id: entity.id,
61332                           entity: entity,
61333                           geometry: context.geometry(entity.id),
61334                           type: type,
61335                           name: name
61336                       });
61337                   }
61338
61339                   graph.parentRelations(entity).forEach(function(parent) {
61340                       addEntity(parent);
61341                   });
61342               }
61343
61344               var visible = context.surface().selectAll('.point, .line, .area').nodes();
61345               for (var i = 0; i < visible.length && result.length <= 200; i++) {
61346                   var datum = visible[i].__data__;
61347                   var entity = datum && datum.properties && datum.properties.entity;
61348                   if (entity) { addEntity(entity); }
61349               }
61350
61351               (_geocodeResults || []).forEach(function(d) {
61352                   if (d.osm_type && d.osm_id) {    // some results may be missing these - #1890
61353
61354                       // Make a temporary osmEntity so we can preset match
61355                       // and better localize the search result - #4725
61356                       var id = osmEntity$$1.id.fromOSM(d.osm_type, d.osm_id);
61357                       var tags = {};
61358                       tags[d.class] = d.type;
61359
61360                       var attrs = { id: id, type: d.osm_type, tags: tags };
61361                       if (d.osm_type === 'way') {   // for ways, add some fake closed nodes
61362                           attrs.nodes = ['a','a'];  // so that geometry area is possible
61363                       }
61364
61365                       var tempEntity = osmEntity$$1(attrs);
61366                       var tempGraph = coreGraph$$1([tempEntity]);
61367                       var matched = context.presets().match(tempEntity, tempGraph);
61368                       var type = (matched && matched.name()) || utilDisplayType(id);
61369
61370                       result.push({
61371                           id: tempEntity.id,
61372                           geometry: tempEntity.geometry(tempGraph),
61373                           type: type,
61374                           name: d.display_name,
61375                           extent: new geoExtent$$1(
61376                               [parseFloat(d.boundingbox[3]), parseFloat(d.boundingbox[0])],
61377                               [parseFloat(d.boundingbox[2]), parseFloat(d.boundingbox[1])])
61378                       });
61379                   }
61380               });
61381
61382               return result;
61383           }
61384
61385
61386           function drawList() {
61387               var value = search.property('value');
61388               var results = features();
61389
61390               list.classed('filtered', value.length);
61391
61392               var noResultsWorldwide = _geocodeResults && _geocodeResults.length === 0;
61393
61394               var resultsIndicator = list.selectAll('.no-results-item')
61395                   .data([0])
61396                   .enter()
61397                   .append('button')
61398                   .property('disabled', true)
61399                   .attr('class', 'no-results-item')
61400                   .call(svgIcon('#iD-icon-alert', 'pre-text'));
61401
61402               resultsIndicator.append('span')
61403                   .attr('class', 'entity-name');
61404
61405               list.selectAll('.no-results-item .entity-name')
61406                   .text(noResultsWorldwide ? t('geocoder.no_results_worldwide') : t('geocoder.no_results_visible'));
61407
61408               if (services.geocoder) {
61409                 list.selectAll('.geocode-item')
61410                     .data([0])
61411                     .enter()
61412                     .append('button')
61413                     .attr('class', 'geocode-item')
61414                     .on('click', geocoderSearch)
61415                     .append('div')
61416                     .attr('class', 'label')
61417                     .append('span')
61418                     .attr('class', 'entity-name')
61419                     .text(t('geocoder.search'));
61420               }
61421
61422               list.selectAll('.no-results-item')
61423                   .style('display', (value.length && !results.length) ? 'block' : 'none');
61424
61425               list.selectAll('.geocode-item')
61426                   .style('display', (value && _geocodeResults === undefined) ? 'block' : 'none');
61427
61428               list.selectAll('.feature-list-item')
61429                   .data([-1])
61430                   .remove();
61431
61432               var items = list.selectAll('.feature-list-item')
61433                   .data(results, function(d) { return d.id; });
61434
61435               var enter = items.enter()
61436                   .insert('button', '.geocode-item')
61437                   .attr('class', 'feature-list-item')
61438                   .on('mouseover', mouseover)
61439                   .on('mouseout', mouseout)
61440                   .on('click', click);
61441
61442               var label = enter
61443                   .append('div')
61444                   .attr('class', 'label');
61445
61446               label
61447                   .each(function(d) {
61448                       select(this)
61449                           .call(svgIcon('#iD-icon-' + d.geometry, 'pre-text'));
61450                   });
61451
61452               label
61453                   .append('span')
61454                   .attr('class', 'entity-type')
61455                   .text(function(d) { return d.type; });
61456
61457               label
61458                   .append('span')
61459                   .attr('class', 'entity-name')
61460                   .text(function(d) { return d.name; });
61461
61462               enter
61463                   .style('opacity', 0)
61464                   .transition()
61465                   .style('opacity', 1);
61466
61467               items.order();
61468
61469               items.exit()
61470                   .remove();
61471           }
61472
61473
61474           function mouseover(d) {
61475               if (d.id === -1) return;
61476
61477               context.surface().selectAll(utilEntityOrMemberSelector([d.id], context.graph()))
61478                   .classed('hover', true);
61479           }
61480
61481
61482           function mouseout() {
61483               context.surface().selectAll('.hover')
61484                   .classed('hover', false);
61485           }
61486
61487
61488           function click(d) {
61489               event.preventDefault();
61490               if (d.location) {
61491                   context.map().centerZoomEase([d.location[1], d.location[0]], 19);
61492               }
61493               else if (d.entity) {
61494                   if (d.entity.type === 'node') {
61495                       context.map().center(d.entity.loc);
61496                   } else if (d.entity.type === 'way') {
61497                       var center = context.projection(context.map().center());
61498                       var edge = geoChooseEdge(context.childNodes(d.entity), center, context.projection);
61499                       context.map().center(edge.loc);
61500                   }
61501                   context.enter(modeSelect(context, [d.entity.id]));
61502               } else {
61503                   context.zoomToEntity(d.id);
61504               }
61505           }
61506
61507
61508           function geocoderSearch() {
61509               services.geocoder.search(search.property('value'), function (err, resp) {
61510                   _geocodeResults = resp || [];
61511                   drawList();
61512               });
61513           }
61514       }
61515
61516
61517       return featureList;
61518   }
61519
61520   var _flashTimer;
61521
61522
61523   function uiFlash() {
61524       var _duration = 2000;
61525       var _iconName = '#iD-icon-no';
61526       var _iconClass = 'disabled';
61527       var _text = '';
61528       var _textClass;
61529
61530
61531       function flash() {
61532           if (_flashTimer) {
61533               _flashTimer.stop();
61534           }
61535
61536           select('#footer-wrap')
61537               .attr('class', 'footer-hide');
61538           select('#flash-wrap')
61539               .attr('class', 'footer-show');
61540
61541           var content = select('#flash-wrap').selectAll('.flash-content')
61542               .data([0]);
61543
61544           // Enter
61545           var contentEnter = content.enter()
61546               .append('div')
61547               .attr('class', 'flash-content');
61548
61549           var iconEnter = contentEnter
61550               .append('svg')
61551               .attr('class', 'flash-icon')
61552               .append('g')
61553               .attr('transform', 'translate(10,10)');
61554
61555           iconEnter
61556               .append('circle')
61557               .attr('r', 9);
61558
61559           iconEnter
61560               .append('use')
61561               .attr('transform', 'translate(-7,-7)')
61562               .attr('width', '14')
61563               .attr('height', '14');
61564
61565           contentEnter
61566               .append('div')
61567               .attr('class', 'flash-text');
61568
61569
61570           // Update
61571           content = content
61572               .merge(contentEnter);
61573
61574           content
61575               .selectAll('.flash-icon')
61576               .attr('class', 'flash-icon ' + (_iconClass || ''));
61577
61578           content
61579               .selectAll('.flash-icon use')
61580               .attr('xlink:href', _iconName);
61581
61582           content
61583               .selectAll('.flash-text')
61584               .attr('class', 'flash-text ' + (_textClass || ''))
61585               .text(_text);
61586
61587
61588           _flashTimer = timeout$1(function() {
61589               _flashTimer = null;
61590               select('#footer-wrap')
61591                   .attr('class', 'footer-show');
61592               select('#flash-wrap')
61593                   .attr('class', 'footer-hide');
61594           }, _duration);
61595
61596           return content;
61597       }
61598
61599
61600       flash.duration = function(_) {
61601           if (!arguments.length) return _duration;
61602           _duration = _;
61603           return flash;
61604       };
61605
61606       flash.text = function(_) {
61607           if (!arguments.length) return _text;
61608           _text = _;
61609           return flash;
61610       };
61611
61612       flash.textClass = function(_) {
61613           if (!arguments.length) return _textClass;
61614           _textClass = _;
61615           return flash;
61616       };
61617
61618       flash.iconName = function(_) {
61619           if (!arguments.length) return _iconName;
61620           _iconName = _;
61621           return flash;
61622       };
61623
61624       flash.iconClass = function(_) {
61625           if (!arguments.length) return _iconClass;
61626           _iconClass = _;
61627           return flash;
61628       };
61629
61630       return flash;
61631   }
61632
61633   function operationCircularize(selectedIDs, context) {
61634       var entityId = selectedIDs[0],
61635           entity = context.entity(entityId),
61636           extent = entity.extent(context.graph()),
61637           geometry = context.geometry(entityId),
61638           action = actionCircularize(entityId, context.projection);
61639
61640
61641       var operation = function() {
61642           context.perform(action, operation.annotation());
61643       };
61644
61645
61646       operation.available = function() {
61647           return selectedIDs.length === 1 &&
61648               entity.type === 'way' &&
61649               uniq(entity.nodes).length > 1;
61650       };
61651
61652
61653       operation.disabled = function() {
61654           var reason;
61655           if (extent.percentContainedIn(context.extent()) < 0.8) {
61656               reason = 'too_large';
61657           } else if (context.hasHiddenConnections(entityId)) {
61658               reason = 'connected_to_hidden';
61659           }
61660           return action.disabled(context.graph()) || reason;
61661       };
61662
61663
61664       operation.tooltip = function() {
61665           var disable = operation.disabled();
61666           return disable ?
61667               t('operations.circularize.' + disable) :
61668               t('operations.circularize.description.' + geometry);
61669       };
61670
61671
61672       operation.annotation = function() {
61673           return t('operations.circularize.annotation.' + geometry);
61674       };
61675
61676
61677       operation.id = 'circularize';
61678       operation.keys = [t('operations.circularize.key')];
61679       operation.title = t('operations.circularize.title');
61680       operation.behavior = behaviorOperation(context).which(operation);
61681
61682       return operation;
61683   }
61684
61685   function operationContinue(selectedIDs, context) {
61686       var graph = context.graph(),
61687           entities = selectedIDs.map(function(id) { return graph.entity(id); }),
61688           geometries = assignIn({ line: [], vertex: [] },
61689               groupBy(entities, function(entity) { return entity.geometry(graph); })),
61690           vertex = geometries.vertex[0];
61691
61692
61693       function candidateWays() {
61694           return graph.parentWays(vertex).filter(function(parent) {
61695               return parent.geometry(graph) === 'line' &&
61696                   !parent.isClosed() &&
61697                   parent.affix(vertex.id) &&
61698                   (geometries.line.length === 0 || geometries.line[0] === parent);
61699           });
61700       }
61701
61702
61703       var operation = function() {
61704           var candidate = candidateWays()[0];
61705           context.enter(
61706               modeDrawLine(context, candidate.id, context.graph(), candidate.affix(vertex.id))
61707           );
61708       };
61709
61710
61711       operation.available = function() {
61712           return geometries.vertex.length === 1 && geometries.line.length <= 1 &&
61713               !context.features().hasHiddenConnections(vertex, context.graph());
61714       };
61715
61716
61717       operation.disabled = function() {
61718           var candidates = candidateWays();
61719           if (candidates.length === 0)
61720               return 'not_eligible';
61721           if (candidates.length > 1)
61722               return 'multiple';
61723       };
61724
61725
61726       operation.tooltip = function() {
61727           var disable = operation.disabled();
61728           return disable ?
61729               t('operations.continue.' + disable) :
61730               t('operations.continue.description');
61731       };
61732
61733
61734       operation.annotation = function() {
61735           return t('operations.continue.annotation.line');
61736       };
61737
61738
61739       operation.id = 'continue';
61740       operation.keys = [t('operations.continue.key')];
61741       operation.title = t('operations.continue.title');
61742       operation.behavior = behaviorOperation(context).which(operation);
61743
61744       return operation;
61745   }
61746
61747   function operationDelete(selectedIDs, context) {
61748       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
61749           action = actionDeleteMultiple(selectedIDs),
61750           extent = selectedIDs.reduce(function(extent, id) {
61751                   return extent.extend(context.entity(id).extent(context.graph()));
61752               }, geoExtent$$1());
61753
61754
61755       var operation = function() {
61756           var nextSelectedID;
61757           var nextSelectedLoc;
61758
61759           if (selectedIDs.length === 1) {
61760               var id = selectedIDs[0],
61761                   entity = context.entity(id),
61762                   geometry = context.geometry(id),
61763                   parents = context.graph().parentWays(entity),
61764                   parent = parents[0];
61765
61766               // Select the next closest node in the way.
61767               if (geometry === 'vertex') {
61768                   var nodes = parent.nodes,
61769                       i = nodes.indexOf(id);
61770
61771                   if (i === 0) {
61772                       i++;
61773                   } else if (i === nodes.length - 1) {
61774                       i--;
61775                   } else {
61776                       var a = geoSphericalDistance(entity.loc, context.entity(nodes[i - 1]).loc),
61777                           b = geoSphericalDistance(entity.loc, context.entity(nodes[i + 1]).loc);
61778                       i = a < b ? i - 1 : i + 1;
61779                   }
61780
61781                   nextSelectedID = nodes[i];
61782                   nextSelectedLoc = context.entity(nextSelectedID).loc;
61783               }
61784           }
61785
61786           context.perform(action, operation.annotation());
61787
61788           if (nextSelectedID && nextSelectedLoc) {
61789               if (context.hasEntity(nextSelectedID)) {
61790                   context.enter(modeSelect(context, [nextSelectedID]).follow(true));
61791               } else {
61792                   context.map().centerEase(nextSelectedLoc);
61793                   context.enter(modeBrowse(context));
61794               }
61795           } else {
61796               context.enter(modeBrowse(context));
61797           }
61798
61799       };
61800
61801
61802       operation.available = function() {
61803           return true;
61804       };
61805
61806
61807       operation.disabled = function() {
61808           var reason;
61809           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
61810               reason = 'too_large';
61811           } else if (some(selectedIDs, context.hasHiddenConnections)) {
61812               reason = 'connected_to_hidden';
61813           } else if (some(selectedIDs, protectedMember)) {
61814               reason = 'part_of_relation';
61815           } else if (some(selectedIDs, incompleteRelation)) {
61816               reason = 'incomplete_relation';
61817           }
61818           return reason;
61819
61820           function incompleteRelation(id) {
61821               var entity = context.entity(id);
61822               return entity.type === 'relation' && !entity.isComplete(context.graph());
61823           }
61824
61825           function protectedMember(id) {
61826               var entity = context.entity(id);
61827               if (entity.type !== 'way') return false;
61828
61829               var parents = context.graph().parentRelations(entity);
61830               for (var i = 0; i < parents.length; i++) {
61831                   var parent = parents[i],
61832                       type = parent.tags.type,
61833                       role = parent.memberById(id).role || 'outer';
61834                   if (type === 'route' || type === 'boundary' || (type === 'multipolygon' && role === 'outer')) {
61835                       return true;
61836                   }
61837               }
61838               return false;
61839           }
61840
61841       };
61842
61843
61844       operation.tooltip = function() {
61845           var disable = operation.disabled();
61846           return disable ?
61847               t('operations.delete.' + disable + '.' + multi) :
61848               t('operations.delete.description' + '.' + multi);
61849       };
61850
61851
61852       operation.annotation = function() {
61853           return selectedIDs.length === 1 ?
61854               t('operations.delete.annotation.' + context.geometry(selectedIDs[0])) :
61855               t('operations.delete.annotation.multiple', { n: selectedIDs.length });
61856       };
61857
61858
61859       operation.id = 'delete';
61860       operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
61861       operation.title = t('operations.delete.title');
61862       operation.behavior = behaviorOperation(context).which(operation);
61863
61864       return operation;
61865   }
61866
61867   function operationDisconnect(selectedIDs, context) {
61868       var vertices = filter(selectedIDs, function(entityId) {
61869           return context.geometry(entityId) === 'vertex';
61870       });
61871
61872       var entityId = vertices[0],
61873           action = actionDisconnect(entityId);
61874
61875       if (selectedIDs.length > 1) {
61876           action.limitWays(without(selectedIDs, entityId));
61877       }
61878
61879
61880       var operation = function() {
61881           context.perform(action, operation.annotation());
61882       };
61883
61884
61885       operation.available = function() {
61886           return vertices.length === 1;
61887       };
61888
61889
61890       operation.disabled = function() {
61891           var reason;
61892           if (some(selectedIDs, context.hasHiddenConnections)) {
61893               reason = 'connected_to_hidden';
61894           }
61895           return action.disabled(context.graph()) || reason;
61896       };
61897
61898
61899       operation.tooltip = function() {
61900           var disable = operation.disabled();
61901           return disable ?
61902               t('operations.disconnect.' + disable) :
61903               t('operations.disconnect.description');
61904       };
61905
61906
61907       operation.annotation = function() {
61908           return t('operations.disconnect.annotation');
61909       };
61910
61911
61912       operation.id = 'disconnect';
61913       operation.keys = [t('operations.disconnect.key')];
61914       operation.title = t('operations.disconnect.title');
61915       operation.behavior = behaviorOperation(context).which(operation);
61916
61917       return operation;
61918   }
61919
61920   function operationMerge(selectedIDs, context) {
61921
61922       function updatePresetTags(newGraph, ids) {
61923           var id = ids[0];
61924           var newEntity = newGraph.hasEntity(id);
61925
61926           if (!newEntity) return;
61927           var newPreset = context.presets().match(newEntity, newGraph);
61928           context.replace(actionChangePreset(id, null, newPreset), operation.annotation());
61929       }
61930
61931
61932       var join = actionJoin(selectedIDs);
61933       var merge = actionMerge(selectedIDs);
61934       var mergePolygon = actionMergePolygon(selectedIDs);
61935       var mergeNodes = actionMergeNodes(selectedIDs);
61936
61937
61938       var operation = function() {
61939           var doUpdateTags;
61940           var action;
61941
61942           if (!join.disabled(context.graph())) {
61943               doUpdateTags = false;
61944               action = join;
61945           } else if (!merge.disabled(context.graph())) {
61946               doUpdateTags = true;
61947               action = merge;
61948           } else if (!mergePolygon.disabled(context.graph())) {
61949               doUpdateTags = false;
61950               action = mergePolygon;
61951           } else {
61952               doUpdateTags = true;
61953               action = mergeNodes;
61954           }
61955
61956           context.perform(action, operation.annotation());
61957
61958           var ids = selectedIDs.filter(function(id) {
61959               var entity = context.hasEntity(id);
61960               return entity && entity.type !== 'node';
61961           });
61962
61963           // if we merged tags, rematch preset to update tags if necessary (#3851)
61964           if (doUpdateTags) {
61965               updatePresetTags(context.graph(), ids);
61966           }
61967
61968           context.enter(modeSelect(context, ids));
61969       };
61970
61971
61972       operation.available = function() {
61973           return selectedIDs.length >= 2;
61974       };
61975
61976
61977       operation.disabled = function() {
61978           return join.disabled(context.graph()) &&
61979               merge.disabled(context.graph()) &&
61980               mergePolygon.disabled(context.graph()) &&
61981               mergeNodes.disabled(context.graph());
61982       };
61983
61984
61985       operation.tooltip = function() {
61986           var j = join.disabled(context.graph());          // 'not_eligible', 'not_adjacent', 'restriction', 'conflicting_tags'
61987           var m = merge.disabled(context.graph());         // 'not_eligible'
61988           var p = mergePolygon.disabled(context.graph());  // 'not_eligible', 'incomplete_relation'
61989           var n = mergeNodes.disabled(context.graph());    // 'not_eligible', 'relation', 'restriction'
61990
61991           // disabled for one of various reasons
61992           if (j && m && p && n) {
61993               if (j === 'restriction' || n === 'restriction') {
61994                   return t('operations.merge.restriction',
61995                       { relation: context.presets().item('type/restriction').name() });
61996
61997               } else if (p === 'incomplete_relation') {
61998                   return t('operations.merge.incomplete_relation');
61999
62000               } else if (n === 'relation') {
62001                   return t('operations.merge.relation');
62002
62003               } else {
62004                   return t('operations.merge.' + j);
62005               }
62006
62007           } else {
62008               return t('operations.merge.description');
62009           }
62010       };
62011
62012
62013       operation.annotation = function() {
62014           return t('operations.merge.annotation', { n: selectedIDs.length });
62015       };
62016
62017
62018       operation.id = 'merge';
62019       operation.keys = [t('operations.merge.key')];
62020       operation.title = t('operations.merge.title');
62021       operation.behavior = behaviorOperation(context).which(operation);
62022
62023       return operation;
62024   }
62025
62026   function operationMove(selectedIDs, context) {
62027       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
62028       var extent = selectedIDs.reduce(function(extent, id) {
62029           return extent.extend(context.entity(id).extent(context.graph()));
62030       }, geoExtent$$1());
62031
62032
62033       var operation = function() {
62034           context.enter(modeMove$$1(context, selectedIDs));
62035       };
62036
62037
62038       operation.available = function() {
62039           return selectedIDs.length > 1 ||
62040               context.entity(selectedIDs[0]).type !== 'node';
62041       };
62042
62043
62044       operation.disabled = function() {
62045           var reason;
62046           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
62047               reason = 'too_large';
62048           } else if (some(selectedIDs, context.hasHiddenConnections)) {
62049               reason = 'connected_to_hidden';
62050           } else if (some(selectedIDs, incompleteRelation)) {
62051               reason = 'incomplete_relation';
62052           }
62053           return reason;
62054
62055           function incompleteRelation(id) {
62056               var entity = context.entity(id);
62057               return entity.type === 'relation' && !entity.isComplete(context.graph());
62058           }
62059       };
62060
62061
62062       operation.tooltip = function() {
62063           var disable = operation.disabled();
62064           return disable ?
62065               t('operations.move.' + disable + '.' + multi) :
62066               t('operations.move.description.' + multi);
62067       };
62068
62069
62070       operation.annotation = function() {
62071           return selectedIDs.length === 1 ?
62072               t('operations.move.annotation.' + context.geometry(selectedIDs[0])) :
62073               t('operations.move.annotation.multiple');
62074       };
62075
62076
62077       operation.id = 'move';
62078       operation.keys = [t('operations.move.key')];
62079       operation.title = t('operations.move.title');
62080       operation.behavior = behaviorOperation(context).which(operation);
62081
62082       return operation;
62083   }
62084
62085   function operationOrthogonalize(selectedIDs, context) {
62086       var entityId = selectedIDs[0],
62087           entity = context.entity(entityId),
62088           extent = entity.extent(context.graph()),
62089           geometry = context.geometry(entityId),
62090           action = actionOrthogonalize(entityId, context.projection);
62091
62092
62093       var operation = function() {
62094           context.perform(action, operation.annotation());
62095       };
62096
62097
62098       operation.available = function() {
62099           return selectedIDs.length === 1 &&
62100               entity.type === 'way' &&
62101               entity.isClosed() &&
62102               uniq(entity.nodes).length > 2;
62103       };
62104
62105
62106       operation.disabled = function() {
62107           var reason;
62108           if (extent.percentContainedIn(context.extent()) < 0.8) {
62109               reason = 'too_large';
62110           } else if (context.hasHiddenConnections(entityId)) {
62111               reason = 'connected_to_hidden';
62112           }
62113           return action.disabled(context.graph()) || reason;
62114       };
62115
62116
62117       operation.tooltip = function() {
62118           var disable = operation.disabled();
62119           return disable ?
62120               t('operations.orthogonalize.' + disable) :
62121               t('operations.orthogonalize.description.' + geometry);
62122       };
62123
62124
62125       operation.annotation = function() {
62126           return t('operations.orthogonalize.annotation.' + geometry);
62127       };
62128
62129
62130       operation.id = 'orthogonalize';
62131       operation.keys = [t('operations.orthogonalize.key')];
62132       operation.title = t('operations.orthogonalize.title');
62133       operation.behavior = behaviorOperation(context).which(operation);
62134
62135       return operation;
62136   }
62137
62138   function operationReflectShort(selectedIDs, context) {
62139       return operationReflect(selectedIDs, context, 'short');
62140   }
62141
62142
62143   function operationReflectLong(selectedIDs, context) {
62144       return operationReflect(selectedIDs, context, 'long');
62145   }
62146
62147
62148   function operationReflect(selectedIDs, context, axis) {
62149       axis = axis || 'long';
62150       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
62151           extent = selectedIDs.reduce(function(extent, id) {
62152               return extent.extend(context.entity(id).extent(context.graph()));
62153           }, geoExtent$$1());
62154
62155
62156       var operation = function() {
62157           var action = actionReflect(selectedIDs, context.projection)
62158               .useLongAxis(Boolean(axis === 'long'));
62159           context.perform(action, operation.annotation());
62160       };
62161
62162
62163       operation.available = function() {
62164           var nodes = utilGetAllNodes(selectedIDs, context.graph());
62165           return uniqBy(nodes, function(n) { return n.loc; }).length >= 3;
62166       };
62167
62168
62169       operation.disabled = function() {
62170           var reason;
62171           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
62172               reason = 'too_large';
62173           } else if (some(selectedIDs, context.hasHiddenConnections)) {
62174               reason = 'connected_to_hidden';
62175           } else if (some(selectedIDs, incompleteRelation)) {
62176               reason = 'incomplete_relation';
62177           }
62178           return reason;
62179
62180           function incompleteRelation(id) {
62181               var entity = context.entity(id);
62182               return entity.type === 'relation' && !entity.isComplete(context.graph());
62183           }
62184       };
62185
62186
62187       operation.tooltip = function() {
62188           var disable = operation.disabled();
62189           return disable ?
62190               t('operations.reflect.' + disable + '.' + multi) :
62191               t('operations.reflect.description.' + axis + '.' + multi);
62192       };
62193
62194
62195       operation.annotation = function() {
62196           return t('operations.reflect.annotation.' + axis + '.' + multi);
62197       };
62198
62199
62200       operation.id = 'reflect-' + axis;
62201       operation.keys = [t('operations.reflect.key.' + axis)];
62202       operation.title = t('operations.reflect.title.' + axis);
62203       operation.behavior = behaviorOperation(context).which(operation);
62204
62205       return operation;
62206   }
62207
62208   function operationReverse(selectedIDs, context) {
62209       var entityId = selectedIDs[0];
62210
62211       var operation = function() {
62212           context.perform(actionReverse(entityId), operation.annotation());
62213       };
62214
62215
62216       operation.available = function() {
62217           return selectedIDs.length === 1 && context.geometry(entityId) === 'line';
62218       };
62219
62220
62221       operation.disabled = function() {
62222           return false;
62223       };
62224
62225
62226       operation.tooltip = function() {
62227           return t('operations.reverse.description');
62228       };
62229
62230
62231       operation.annotation = function() {
62232           return t('operations.reverse.annotation');
62233       };
62234
62235
62236       operation.id = 'reverse';
62237       operation.keys = [t('operations.reverse.key')];
62238       operation.title = t('operations.reverse.title');
62239       operation.behavior = behaviorOperation(context).which(operation);
62240
62241       return operation;
62242   }
62243
62244   function operationRotate(selectedIDs, context) {
62245       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
62246           extent = selectedIDs.reduce(function(extent, id) {
62247               return extent.extend(context.entity(id).extent(context.graph()));
62248           }, geoExtent$$1());
62249
62250
62251       var operation = function() {
62252           context.enter(modeRotate$$1(context, selectedIDs));
62253       };
62254
62255
62256       operation.available = function() {
62257           var nodes = utilGetAllNodes(selectedIDs, context.graph());
62258           return uniqBy(nodes, function(n) { return n.loc; }).length >= 2;
62259       };
62260
62261
62262       operation.disabled = function() {
62263           var reason;
62264           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
62265               reason = 'too_large';
62266           } else if (some(selectedIDs, context.hasHiddenConnections)) {
62267               reason = 'connected_to_hidden';
62268           } else if (some(selectedIDs, incompleteRelation)) {
62269               reason = 'incomplete_relation';
62270           }
62271           return reason;
62272
62273           function incompleteRelation(id) {
62274               var entity = context.entity(id);
62275               return entity.type === 'relation' && !entity.isComplete(context.graph());
62276           }
62277       };
62278
62279
62280       operation.tooltip = function() {
62281           var disable = operation.disabled();
62282           return disable ?
62283               t('operations.rotate.' + disable + '.' + multi) :
62284               t('operations.rotate.description.' + multi);
62285       };
62286
62287
62288       operation.annotation = function() {
62289           return selectedIDs.length === 1 ?
62290               t('operations.rotate.annotation.' + context.geometry(selectedIDs[0])) :
62291               t('operations.rotate.annotation.multiple');
62292       };
62293
62294
62295       operation.id = 'rotate';
62296       operation.keys = [t('operations.rotate.key')];
62297       operation.title = t('operations.rotate.title');
62298       operation.behavior = behaviorOperation(context).which(operation);
62299
62300       return operation;
62301   }
62302
62303   function operationSplit(selectedIDs, context) {
62304       var vertices = filter(selectedIDs, function(entityId) {
62305           return context.geometry(entityId) === 'vertex';
62306       });
62307
62308       var entityId = vertices[0],
62309           action = actionSplit(entityId),
62310           ways = [];
62311
62312       if (vertices.length === 1) {
62313           if (selectedIDs.length > 1) {
62314               action.limitWays(without(selectedIDs, entityId));
62315           }
62316           ways = action.ways(context.graph());
62317       }
62318
62319
62320       var operation = function() {
62321           var difference = context.perform(action, operation.annotation());
62322           context.enter(modeSelect(context, difference.extantIDs()));
62323       };
62324
62325
62326       operation.available = function() {
62327           return vertices.length === 1;
62328       };
62329
62330
62331       operation.disabled = function() {
62332           var reason;
62333           if (some(selectedIDs, context.hasHiddenConnections)) {
62334               reason = 'connected_to_hidden';
62335           }
62336           return action.disabled(context.graph()) || reason;
62337       };
62338
62339
62340       operation.tooltip = function() {
62341           var disable = operation.disabled();
62342           if (disable) {
62343               return t('operations.split.' + disable);
62344           }
62345           if (ways.length === 1) {
62346               return t('operations.split.description.' + context.geometry(ways[0].id));
62347           } else {
62348               return t('operations.split.description.multiple');
62349           }
62350       };
62351
62352
62353       operation.annotation = function() {
62354           return ways.length === 1 ?
62355               t('operations.split.annotation.' + context.geometry(ways[0].id)) :
62356               t('operations.split.annotation.multiple', { n: ways.length });
62357       };
62358
62359
62360       operation.id = 'split';
62361       operation.keys = [t('operations.split.key')];
62362       operation.title = t('operations.split.title');
62363       operation.behavior = behaviorOperation(context).which(operation);
62364
62365       return operation;
62366   }
62367
62368   function operationStraighten(selectedIDs, context) {
62369       var entityId = selectedIDs[0],
62370           action = actionStraighten(entityId, context.projection);
62371
62372
62373       function operation() {
62374           context.perform(action, operation.annotation());
62375       }
62376
62377
62378       operation.available = function() {
62379           var entity = context.entity(entityId);
62380           return selectedIDs.length === 1 &&
62381               entity.type === 'way' &&
62382               !entity.isClosed() &&
62383               uniq(entity.nodes).length > 2;
62384       };
62385
62386
62387       operation.disabled = function() {
62388           var reason;
62389           if (context.hasHiddenConnections(entityId)) {
62390               reason = 'connected_to_hidden';
62391           }
62392           return action.disabled(context.graph()) || reason;
62393       };
62394
62395
62396       operation.tooltip = function() {
62397           var disable = operation.disabled();
62398           return disable ?
62399               t('operations.straighten.' + disable) :
62400               t('operations.straighten.description');
62401       };
62402
62403
62404       operation.annotation = function() {
62405           return t('operations.straighten.annotation');
62406       };
62407
62408
62409       operation.id = 'straighten';
62410       operation.keys = [t('operations.straighten.key')];
62411       operation.title = t('operations.straighten.title');
62412       operation.behavior = behaviorOperation(context).which(operation);
62413
62414       return operation;
62415   }
62416
62417   function operationDetachNode(selectedIDs, context) {
62418       var nodeID = selectedIDs.length && selectedIDs[0];
62419       var action = actionDetachNode(nodeID);
62420
62421       var operation = function () {
62422           context.perform(action);  // do the detach
62423
62424           var mouse = context.map().mouseCoordinates();
62425           if (mouse.some(isNaN)) {
62426               enterMoveMode();
62427
62428           } else {
62429               // move detached node to the mouse location (transitioned)
62430               context.perform(actionMoveNode(nodeID, mouse));
62431
62432               // after transition completes, put at final mouse location and enter move mode.
62433               window.setTimeout(function() {
62434                   mouse = context.map().mouseCoordinates();
62435                   context.replace(actionMoveNode(nodeID, mouse));
62436                   enterMoveMode();
62437               }, 150);
62438           }
62439
62440           function enterMoveMode() {
62441               var baseGraph = context.graph();
62442               context.enter(modeMove$$1(context, [nodeID], baseGraph));
62443           }
62444       };
62445
62446
62447       operation.available = function () {
62448           if (selectedIDs.length !== 1) return false;
62449
62450           var graph = context.graph();
62451           var entity = graph.hasEntity(nodeID);
62452           if (!entity) return false;
62453
62454           return entity.type === 'node' &&
62455               entity.hasInterestingTags() &&
62456               graph.parentWays(entity).length > 0;
62457       };
62458
62459
62460       operation.disabled = function () {
62461           var reason;
62462           if (some(selectedIDs, context.hasHiddenConnections)) {
62463               reason = 'connected_to_hidden';
62464           }
62465           return action.disabled(context.graph()) || reason;
62466       };
62467
62468
62469       operation.tooltip = function () {
62470           var disableReason = operation.disabled();
62471           if (disableReason) {
62472               return t('operations.detach_node.' + disableReason,
62473                   { relation: context.presets().item('type/restriction').name() });
62474           } else {
62475               return t('operations.detach_node.description');
62476           }
62477       };
62478
62479
62480       operation.annotation = function () {
62481           return t('operations.detach_node.annotation');
62482       };
62483
62484
62485       operation.id = 'detach-node';
62486       operation.keys = [t('operations.detach_node.key')];
62487       operation.title = t('operations.detach_node.title');
62488       operation.behavior = behaviorOperation(context).which(operation);
62489
62490
62491       return operation;
62492   }
62493
62494
62495
62496   var Operations = /*#__PURE__*/Object.freeze({
62497     operationCircularize: operationCircularize,
62498     operationContinue: operationContinue,
62499     operationDelete: operationDelete,
62500     operationDisconnect: operationDisconnect,
62501     operationMerge: operationMerge,
62502     operationMove: operationMove,
62503     operationOrthogonalize: operationOrthogonalize,
62504     operationReflectShort: operationReflectShort,
62505     operationReflectLong: operationReflectLong,
62506     operationReverse: operationReverse,
62507     operationRotate: operationRotate,
62508     operationSplit: operationSplit,
62509     operationStraighten: operationStraighten,
62510     operationDetachNode: operationDetachNode
62511   });
62512
62513   function uiPresetList(context) {
62514       var dispatch$$1 = dispatch('choose');
62515       var _entityID;
62516       var _currentPreset;
62517       var _autofocus = false;
62518
62519
62520       function presetList(selection$$1) {
62521           var entity = context.entity(_entityID);
62522           var geometry = context.geometry(_entityID);
62523
62524           // Treat entities on addr:interpolation lines as points, not vertices (#3241)
62525           if (geometry === 'vertex' && entity.isOnAddressLine(context.graph())) {
62526               geometry = 'point';
62527           }
62528
62529           var presets = context.presets().matchGeometry(geometry);
62530
62531           selection$$1.html('');
62532
62533           var messagewrap = selection$$1
62534               .append('div')
62535               .attr('class', 'header fillL cf');
62536
62537           var message = messagewrap
62538               .append('h3')
62539               .text(t('inspector.choose'));
62540
62541           messagewrap
62542               .append('button')
62543               .attr('class', 'preset-choose')
62544               .on('click', function() { dispatch$$1.call('choose', this, _currentPreset); })
62545               .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'));
62546
62547           function initialKeydown() {
62548               // hack to let delete shortcut work when search is autofocused
62549               if (search.property('value').length === 0 &&
62550                   (event.keyCode === utilKeybinding.keyCodes['⌫'] ||
62551                    event.keyCode === utilKeybinding.keyCodes['⌦'])) {
62552                   event.preventDefault();
62553                   event.stopPropagation();
62554                   operationDelete([_entityID], context)();
62555
62556               // hack to let undo work when search is autofocused
62557               } else if (search.property('value').length === 0 &&
62558                   (event.ctrlKey || event.metaKey) &&
62559                   event.keyCode === utilKeybinding.keyCodes.z) {
62560                   event.preventDefault();
62561                   event.stopPropagation();
62562                   context.undo();
62563               } else if (!event.ctrlKey && !event.metaKey) {
62564                   // don't check for delete/undo hack on future keydown events
62565                   select(this).on('keydown', keydown);
62566                   keydown.call(this);
62567               }
62568           }
62569
62570           function keydown() {
62571               // down arrow
62572               if (event.keyCode === utilKeybinding.keyCodes['↓'] &&
62573                   // if insertion point is at the end of the string
62574                   search.node().selectionStart === search.property('value').length) {
62575                   event.preventDefault();
62576                   event.stopPropagation();
62577                   // move focus to the first item in the preset list
62578                   list.select('.preset-list-button').node().focus();
62579               }
62580           }
62581
62582           function keypress() {
62583               // enter
62584               var value = search.property('value');
62585               if (event.keyCode === 13 && value.length) {
62586                   list.selectAll('.preset-list-item:first-child').datum().choose();
62587               }
62588           }
62589
62590           function inputevent() {
62591               var value = search.property('value');
62592               list.classed('filtered', value.length);
62593               if (value.length) {
62594                   var results = presets.search(value, geometry);
62595                   message.text(t('inspector.results', {
62596                       n: results.collection.length,
62597                       search: value
62598                   }));
62599                   list.call(drawList, results);
62600               } else {
62601                   list.call(drawList, context.presets().defaults(geometry, 36));
62602                   message.text(t('inspector.choose'));
62603               }
62604           }
62605
62606           var searchWrap = selection$$1
62607               .append('div')
62608               .attr('class', 'search-header');
62609
62610           var search = searchWrap
62611               .append('input')
62612               .attr('class', 'preset-search-input')
62613               .attr('placeholder', t('inspector.search'))
62614               .attr('type', 'search')
62615               .call(utilNoAuto)
62616               .on('keydown', initialKeydown)
62617               .on('keypress', keypress)
62618               .on('input', inputevent);
62619
62620           searchWrap
62621               .call(svgIcon('#iD-icon-search', 'pre-text'));
62622
62623           if (_autofocus) {
62624               search.node().focus();
62625           }
62626
62627           var listWrap = selection$$1
62628               .append('div')
62629               .attr('class', 'inspector-body');
62630
62631           var list = listWrap
62632               .append('div')
62633               .attr('class', 'preset-list fillL cf')
62634               .call(drawList, context.presets().defaults(geometry, 36));
62635       }
62636
62637
62638       function drawList(list, presets) {
62639           var collection = presets.collection.reduce(function(collection, preset) {
62640               if (preset.members) {
62641                   collection.push(CategoryItem(preset));
62642               } else if (preset.visible()) {
62643                   collection.push(PresetItem(preset));
62644               }
62645               return collection;
62646           }, []);
62647
62648           var items = list.selectAll('.preset-list-item')
62649               .data(collection, function(d) { return d.preset.id; });
62650
62651           items.order();
62652
62653           items.exit()
62654               .remove();
62655
62656           items.enter()
62657               .append('div')
62658               .attr('class', function(item) { return 'preset-list-item preset-' + item.preset.id.replace('/', '-'); })
62659               .classed('current', function(item) { return item.preset === _currentPreset; })
62660               .each(function(item) { select(this).call(item); })
62661               .style('opacity', 0)
62662               .transition()
62663               .style('opacity', 1);
62664       }
62665
62666       function itemKeydown(){
62667           // the actively focused item
62668           var item = select(this.closest('.preset-list-item'));
62669           var parentItem = select(item.node().parentElement.closest('.preset-list-item'));
62670
62671           // arrow down, move focus to the next, lower item
62672           if (event.keyCode === utilKeybinding.keyCodes['↓']) {
62673               event.preventDefault();
62674               event.stopPropagation();
62675               // the next item in the list at the same level
62676               var nextItem = select(item.node().nextElementSibling);
62677               // if there is no next item in this list
62678               if (nextItem.empty()) {
62679                   // if there is a parent item
62680                   if (!parentItem.empty()) {
62681                       // the item is the last item of a sublist,
62682                       // select the next item at the parent level
62683                       nextItem = select(parentItem.node().nextElementSibling);
62684                   }
62685               // if the focused item is expanded
62686               } else if (select(this).classed('expanded')) {
62687                   // select the first subitem instead
62688                   nextItem = item.select('.subgrid .preset-list-item:first-child');
62689               }
62690               if (!nextItem.empty()) {
62691                   // focus on the next item
62692                   nextItem.select('.preset-list-button').node().focus();
62693               }
62694
62695           // arrow up, move focus to the previous, higher item
62696           } else if (event.keyCode === utilKeybinding.keyCodes['↑']) {
62697               event.preventDefault();
62698               event.stopPropagation();
62699               // the previous item in the list at the same level
62700               var previousItem = select(item.node().previousElementSibling);
62701
62702               // if there is no previous item in this list
62703               if (previousItem.empty()) {
62704                   // if there is a parent item
62705                   if (!parentItem.empty()) {
62706                       // the item is the first subitem of a sublist select the parent item
62707                       previousItem = parentItem;
62708                   }
62709               // if the previous item is expanded
62710               } else if (previousItem.select('.preset-list-button').classed('expanded')) {
62711                   // select the last subitem of the sublist of the previous item
62712                   previousItem = previousItem.select('.subgrid .preset-list-item:last-child');
62713               }
62714
62715               if (!previousItem.empty()) {
62716                   // focus on the previous item
62717                   previousItem.select('.preset-list-button').node().focus();
62718               } else {
62719                   // the focus is at the top of the list, move focus back to the search field
62720                   var search = select(this.closest('.preset-list-pane')).select('.preset-search-input');
62721                   search.node().focus();
62722               }
62723
62724           // arrow left, move focus to the parent item if there is one
62725           } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '→' : '←']) {
62726               event.preventDefault();
62727               event.stopPropagation();
62728               // if there is a parent item, focus on the parent item
62729               if (!parentItem.empty()) {
62730                   parentItem.select('.preset-list-button').node().focus();
62731               }
62732
62733           // arrow right, choose this item
62734           } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '←' : '→']) {
62735               event.preventDefault();
62736               event.stopPropagation();
62737               item.datum().choose();
62738           }
62739       }
62740
62741
62742       function CategoryItem(preset) {
62743           var box, sublist, shown = false;
62744
62745           function item(selection$$1) {
62746               var wrap = selection$$1.append('div')
62747                   .attr('class', 'preset-list-button-wrap category col12');
62748
62749               function click() {
62750                   var isExpanded = select(this).classed('expanded');
62751                   var iconName = isExpanded ?
62752                       (textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward') : '#iD-icon-down';
62753                   select(this)
62754                       .classed('expanded', !isExpanded);
62755                   select(this).selectAll('div.label-inner svg.icon use')
62756                       .attr('href', iconName);
62757                   item.choose();
62758               }
62759
62760               var button = wrap
62761                   .append('button')
62762                   .attr('class', 'preset-list-button')
62763                   .classed('expanded', false)
62764                   .call(uiPresetIcon()
62765                       .geometry(context.geometry(_entityID))
62766                       .preset(preset))
62767                   .on('click', click)
62768                   .on('keydown', function() {
62769                       // right arrow, expand the focused item
62770                       if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '←' : '→']) {
62771                           event.preventDefault();
62772                           event.stopPropagation();
62773                           // if the item isn't expanded
62774                           if (!select(this).classed('expanded')) {
62775                               // toggle expansion (expand the item)
62776                               click.call(this);
62777                           }
62778                       // left arrow, collapse the focused item
62779                       } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '→' : '←']) {
62780                           event.preventDefault();
62781                           event.stopPropagation();
62782                           // if the item is expanded
62783                           if (select(this).classed('expanded')) {
62784                               // toggle expansion (collapse the item)
62785                               click.call(this);
62786                           }
62787                       } else {
62788                           itemKeydown.call(this);
62789                       }
62790                   });
62791
62792               var label = button
62793                   .append('div')
62794                   .attr('class', 'label')
62795                   .append('div')
62796                   .attr('class', 'label-inner');
62797
62798               label
62799                   .append('div')
62800                   .attr('class', 'namepart')
62801                   .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'))
62802                   .append('span')
62803                   .html(function() { return preset.name() + '&hellip;'; });
62804
62805               box = selection$$1.append('div')
62806                   .attr('class', 'subgrid col12')
62807                   .style('max-height', '0px')
62808                   .style('opacity', 0);
62809
62810               box.append('div')
62811                   .attr('class', 'arrow');
62812
62813               sublist = box.append('div')
62814                   .attr('class', 'preset-list fillL3 cf fl');
62815           }
62816
62817
62818           item.choose = function() {
62819               if (!box || !sublist) return;
62820
62821               if (shown) {
62822                   shown = false;
62823                   box.transition()
62824                       .duration(200)
62825                       .style('opacity', '0')
62826                       .style('max-height', '0px')
62827                       .style('padding-bottom', '0px');
62828               } else {
62829                   shown = true;
62830                   sublist.call(drawList, preset.members);
62831                   box.transition()
62832                       .duration(200)
62833                       .style('opacity', '1')
62834                       .style('max-height', 200 + preset.members.collection.length * 190 + 'px')
62835                       .style('padding-bottom', '20px');
62836               }
62837           };
62838
62839           item.preset = preset;
62840           return item;
62841       }
62842
62843
62844       function PresetItem(preset) {
62845           function item(selection$$1) {
62846               var wrap = selection$$1.append('div')
62847                   .attr('class', 'preset-list-button-wrap col12');
62848
62849               var button = wrap.append('button')
62850                   .attr('class', 'preset-list-button')
62851                   .call(uiPresetIcon()
62852                       .geometry(context.geometry(_entityID))
62853                       .preset(preset))
62854                   .on('click', item.choose)
62855                   .on('keydown', itemKeydown);
62856
62857               var label = button
62858                   .append('div')
62859                   .attr('class', 'label')
62860                   .append('div')
62861                   .attr('class', 'label-inner');
62862
62863               // NOTE: split/join on en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
62864               label.selectAll('.namepart')
62865                   .data(preset.name().split(' – '))
62866                   .enter()
62867                   .append('div')
62868                   .attr('class', 'namepart')
62869                   .text(function(d) { return d; });
62870
62871               wrap.call(item.reference.button);
62872               selection$$1.call(item.reference.body);
62873           }
62874
62875           item.choose = function() {
62876               context.presets().choose(preset);
62877               context.perform(
62878                   actionChangePreset(_entityID, _currentPreset, preset),
62879                   t('operations.change_tags.annotation')
62880               );
62881
62882               dispatch$$1.call('choose', this, preset);
62883           };
62884
62885           item.help = function() {
62886               event.stopPropagation();
62887               item.reference.toggle();
62888           };
62889
62890           item.preset = preset;
62891           item.reference = uiTagReference(preset.reference(context.geometry(_entityID)), context);
62892
62893           return item;
62894       }
62895
62896
62897       presetList.autofocus = function(val) {
62898           if (!arguments.length) return _autofocus;
62899           _autofocus = val;
62900           return presetList;
62901       };
62902
62903
62904       presetList.entityID = function(val) {
62905           if (!arguments.length) return _entityID;
62906           _entityID = val;
62907           presetList.preset(context.presets().match(context.entity(_entityID), context.graph()));
62908           return presetList;
62909       };
62910
62911
62912       presetList.preset = function(val) {
62913           if (!arguments.length) return _currentPreset;
62914           _currentPreset = val;
62915           return presetList;
62916       };
62917
62918
62919       return utilRebind(presetList, dispatch$$1, 'on');
62920   }
62921
62922   function uiViewOnOSM(context) {
62923       var _what;   // an osmEntity or osmNote
62924
62925
62926       function viewOnOSM(selection) {
62927           var url;
62928           if (_what instanceof osmEntity$$1) {
62929               url = context.connection().entityURL(_what);
62930           } else if (_what instanceof osmNote) {
62931               url = context.connection().noteURL(_what);
62932           }
62933
62934           var data = ((!_what || _what.isNew()) ? [] : [_what]);
62935           var link = selection.selectAll('.view-on-osm')
62936               .data(data, function(d) { return d.id; });
62937
62938           // exit
62939           link.exit()
62940               .remove();
62941
62942           // enter
62943           var linkEnter = link.enter()
62944               .append('a')
62945               .attr('class', 'view-on-osm')
62946               .attr('target', '_blank')
62947               .attr('href', url)
62948               .call(svgIcon('#iD-icon-out-link', 'inline'));
62949
62950           linkEnter
62951               .append('span')
62952               .text(t('inspector.view_on_osm'));
62953       }
62954
62955
62956       viewOnOSM.what = function(_) {
62957           if (!arguments.length) return _what;
62958           _what = _;
62959           return viewOnOSM;
62960       };
62961
62962       return viewOnOSM;
62963   }
62964
62965   function uiInspector(context) {
62966       var presetList = uiPresetList(context);
62967       var entityEditor = uiEntityEditor(context);
62968       var _state = 'select';
62969       var _entityID;
62970       var _newFeature = false;
62971
62972
62973       function inspector(selection$$1, newFeature) {
62974           presetList
62975               .entityID(_entityID)
62976               .autofocus(_newFeature)
62977               .on('choose', setPreset);
62978
62979           entityEditor
62980               .state(_state)
62981               .entityID(_entityID)
62982               .on('choose', showList);
62983
62984           var wrap = selection$$1.selectAll('.panewrap')
62985               .data([0]);
62986
62987           var enter = wrap.enter()
62988               .append('div')
62989               .attr('class', 'panewrap');
62990
62991           enter
62992               .append('div')
62993               .attr('class', 'preset-list-pane pane');
62994
62995           enter
62996               .append('div')
62997               .attr('class', 'entity-editor-pane pane');
62998
62999           wrap = wrap.merge(enter);
63000           var presetPane = wrap.selectAll('.preset-list-pane');
63001           var editorPane = wrap.selectAll('.entity-editor-pane');
63002
63003           var entity = context.entity(_entityID);
63004
63005           var isTaglessOrIntersectionVertex = entity.geometry(context.graph()) === 'vertex' &&
63006               (!entity.hasNonGeometryTags() && !entity.isHighwayIntersection(context.graph()));
63007           // start with the preset list if the feature is new or is an uninteresting vertex
63008           var showPresetList = newFeature || isTaglessOrIntersectionVertex;
63009
63010           if (showPresetList) {
63011               wrap.style('right', '-100%');
63012               presetPane.call(presetList);
63013           } else {
63014               wrap.style('right', '0%');
63015               editorPane.call(entityEditor);
63016           }
63017
63018           var footer = selection$$1.selectAll('.footer')
63019               .data([0]);
63020
63021           footer = footer.enter()
63022               .append('div')
63023               .attr('class', 'footer')
63024               .merge(footer);
63025
63026           footer
63027               .call(uiViewOnOSM(context)
63028                   .what(context.hasEntity(_entityID))
63029               );
63030
63031
63032           function showList(preset) {
63033               wrap.transition()
63034                   .styleTween('right', function() { return interpolate('0%', '-100%'); });
63035
63036               presetPane
63037                   .call(presetList.preset(preset).autofocus(true));
63038           }
63039
63040
63041           function setPreset(preset) {
63042               wrap.transition()
63043                   .styleTween('right', function() { return interpolate('-100%', '0%'); });
63044
63045               editorPane
63046                   .call(entityEditor.preset(preset));
63047           }
63048       }
63049
63050
63051       inspector.state = function(val) {
63052           if (!arguments.length) return _state;
63053           _state = val;
63054           entityEditor.state(_state);
63055
63056           // remove any old field help overlay that might have gotten attached to the inspector
63057           d3_selectAll('.field-help-body').remove();
63058
63059           return inspector;
63060       };
63061
63062
63063       inspector.entityID = function(val) {
63064           if (!arguments.length) return _entityID;
63065           _entityID = val;
63066           return inspector;
63067       };
63068
63069
63070       inspector.newFeature = function(val) {
63071           if (!arguments.length) return _newFeature;
63072           _newFeature = val;
63073           return inspector;
63074       };
63075
63076
63077       return inspector;
63078   }
63079
63080   function uiKeepRightDetails(context) {
63081       var _error;
63082
63083
63084       function errorDetail(d) {
63085           var unknown = t('inspector.unknown');
63086
63087           if (!d) return unknown;
63088           var errorType = d.error_type;
63089           var parentErrorType = d.parent_error_type;
63090
63091           var et = en.QA.keepRight.errorTypes[errorType];
63092           var pt = en.QA.keepRight.errorTypes[parentErrorType];
63093
63094           var detail;
63095           if (et && et.description) {
63096               detail = t('QA.keepRight.errorTypes.' + errorType + '.description', d.replacements);
63097           } else if (pt && pt.description) {
63098               detail = t('QA.keepRight.errorTypes.' + parentErrorType + '.description', d.replacements);
63099           } else {
63100               detail = unknown;
63101           }
63102
63103           return detail;
63104       }
63105
63106
63107       function keepRightDetails(selection$$1) {
63108           var details = selection$$1.selectAll('.kr_error-details')
63109               .data(
63110                   (_error ? [_error] : []),
63111                   function(d) { return d.id + '-' + (d.status || 0); }
63112               );
63113
63114           details.exit()
63115               .remove();
63116
63117           var detailsEnter = details.enter()
63118               .append('div')
63119               .attr('class', 'kr_error-details kr_error-details-container');
63120
63121
63122           // description
63123           var descriptionEnter = detailsEnter
63124               .append('div')
63125               .attr('class', 'kr_error-details-description');
63126
63127           descriptionEnter
63128               .append('h4')
63129               .text(function() { return t('QA.keepRight.detail_description'); });
63130
63131           descriptionEnter
63132               .append('div')
63133               .attr('class', 'kr_error-details-description-text')
63134               .html(errorDetail);
63135
63136           // If there are entity links in the error message..
63137           descriptionEnter.selectAll('.kr_error_entity_link, .kr_error_object_link')
63138               .each(function() {
63139                   var link = select(this);
63140                   var isObjectLink = link.classed('kr_error_object_link');
63141                   var entityID = isObjectLink ?
63142                       (utilEntityRoot(_error.object_type) + _error.object_id)
63143                       : this.textContent;
63144                   var entity = context.hasEntity(entityID);
63145
63146                   // Add click handler
63147                   link
63148                       .on('mouseover', function() {
63149                           context.surface().selectAll(utilEntityOrMemberSelector([entityID], context.graph()))
63150                               .classed('hover', true);
63151                       })
63152                       .on('mouseout', function() {
63153                           context.surface().selectAll('.hover')
63154                               .classed('hover', false);
63155                       })
63156                       .on('click', function() {
63157                           event.preventDefault();
63158                           var osmlayer = context.layers().layer('osm');
63159                           if (!osmlayer.enabled()) {
63160                               osmlayer.enabled(true);
63161                           }
63162
63163                           context.map().centerZoomEase(_error.loc, 20);
63164
63165                           if (entity) {
63166                               context.enter(modeSelect(context, [entityID]));
63167                           } else {
63168                               context.loadEntity(entityID, function() {
63169                                   context.enter(modeSelect(context, [entityID]));
63170                               });
63171                           }
63172                       });
63173
63174                   // Replace with friendly name if possible
63175                   // (The entity may not yet be loaded into the graph)
63176                   if (entity) {
63177                       var name = utilDisplayName(entity);  // try to use common name
63178
63179                       if (!name && !isObjectLink) {
63180                           var preset = context.presets().match(entity, context.graph());
63181                           name = preset && !preset.isFallback() && preset.name();  // fallback to preset name
63182                       }
63183
63184                       if (name) {
63185                           this.innerText = name;
63186                       }
63187                   }
63188               });
63189       }
63190
63191
63192       keepRightDetails.error = function(val) {
63193           if (!arguments.length) return _error;
63194           _error = val;
63195           return keepRightDetails;
63196       };
63197
63198
63199       return keepRightDetails;
63200   }
63201
63202   function uiKeepRightEditor$$1(context) {
63203       var dispatch$$1 = dispatch('change');
63204       var keepRightDetails = uiKeepRightDetails(context);
63205       var keepRightHeader = uiKeepRightHeader(context);
63206       var quickLinks = uiQuickLinks();
63207
63208       var _error;
63209
63210
63211       function keepRightEditor(selection$$1) {
63212           // quick links
63213           var choices = [{
63214               id: 'zoom_to',
63215               label: 'inspector.zoom_to.title',
63216               tooltip: function() {
63217                   return uiTooltipHtml(t('inspector.zoom_to.tooltip_issue'), t('inspector.zoom_to.key'));
63218               },
63219               click: function zoomTo() {
63220                   context.mode().zoomToSelected();
63221               }
63222           }];
63223
63224
63225           var header = selection$$1.selectAll('.header')
63226               .data([0]);
63227
63228           var headerEnter = header.enter()
63229               .append('div')
63230               .attr('class', 'header fillL');
63231
63232           headerEnter
63233               .append('button')
63234               .attr('class', 'fr keepRight-editor-close')
63235               .on('click', function() {
63236                   context.enter(modeBrowse(context));
63237               })
63238               .call(svgIcon('#iD-icon-close'));
63239
63240           headerEnter
63241               .append('h3')
63242               .text(t('QA.keepRight.title'));
63243
63244
63245           var body = selection$$1.selectAll('.body')
63246               .data([0]);
63247
63248           body = body.enter()
63249               .append('div')
63250               .attr('class', 'body')
63251               .merge(body);
63252
63253           var editor = body.selectAll('.keepRight-editor')
63254               .data([0]);
63255
63256           editor.enter()
63257               .append('div')
63258               .attr('class', 'modal-section keepRight-editor')
63259               .merge(editor)
63260               .call(keepRightHeader.error(_error))
63261               .call(quickLinks.choices(choices))
63262               .call(keepRightDetails.error(_error))
63263               .call(keepRightSaveSection);
63264
63265
63266           var footer = selection$$1.selectAll('.footer')
63267               .data([0]);
63268
63269           footer.enter()
63270               .append('div')
63271               .attr('class', 'footer')
63272               .merge(footer)
63273               .call(uiViewOnKeepRight(context).what(_error));
63274       }
63275
63276
63277       function keepRightSaveSection(selection$$1) {
63278           var isSelected = (_error && _error.id === context.selectedErrorID());
63279           var isShown = (_error && (isSelected || _error.newComment || _error.comment));
63280           var saveSection = selection$$1.selectAll('.error-save')
63281               .data(
63282                   (isShown ? [_error] : []),
63283                   function(d) { return d.id + '-' + (d.status || 0); }
63284               );
63285
63286           // exit
63287           saveSection.exit()
63288               .remove();
63289
63290           // enter
63291           var saveSectionEnter = saveSection.enter()
63292               .append('div')
63293               .attr('class', 'keepRight-save save-section cf');
63294
63295           saveSectionEnter
63296               .append('h4')
63297               .attr('class', '.error-save-header')
63298               .text(t('QA.keepRight.comment'));
63299
63300           saveSectionEnter
63301               .append('textarea')
63302               .attr('class', 'new-comment-input')
63303               .attr('placeholder', t('QA.keepRight.comment_placeholder'))
63304               .attr('maxlength', 1000)
63305               .property('value', function(d) { return d.newComment || d.comment; })
63306               .call(utilNoAuto)
63307               .on('input', changeInput)
63308               .on('blur', changeInput);
63309
63310           // update
63311           saveSection = saveSectionEnter
63312               .merge(saveSection)
63313               .call(keepRightSaveButtons);
63314
63315
63316           function changeInput() {
63317               var input = select(this);
63318               var val = input.property('value').trim();
63319
63320               if (val === _error.comment) {
63321                   val = undefined;
63322               }
63323
63324               // store the unsaved comment with the error itself
63325               _error = _error.update({ newComment: val });
63326
63327               var keepRight = services.keepRight;
63328               if (keepRight) {
63329                   keepRight.replaceError(_error);  // update keepright cache
63330               }
63331
63332               saveSection
63333                   .call(keepRightSaveButtons);
63334           }
63335       }
63336
63337
63338       function keepRightSaveButtons(selection$$1) {
63339           var isSelected = (_error && _error.id === context.selectedErrorID());
63340           var buttonSection = selection$$1.selectAll('.buttons')
63341               .data((isSelected ? [_error] : []), function(d) { return d.status + d.id; });
63342
63343           // exit
63344           buttonSection.exit()
63345               .remove();
63346
63347           // enter
63348           var buttonEnter = buttonSection.enter()
63349               .append('div')
63350               .attr('class', 'buttons');
63351
63352           buttonEnter
63353               .append('button')
63354               .attr('class', 'button comment-button action')
63355               .text(t('QA.keepRight.save_comment'));
63356
63357           buttonEnter
63358               .append('button')
63359               .attr('class', 'button close-button action');
63360
63361           buttonEnter
63362               .append('button')
63363               .attr('class', 'button ignore-button action');
63364
63365
63366           // update
63367           buttonSection = buttonSection
63368               .merge(buttonEnter);
63369
63370           buttonSection.select('.comment-button')   // select and propagate data
63371               .attr('disabled', function(d) {
63372                   return d.newComment === undefined ? true : null;
63373               })
63374               .on('click.comment', function(d) {
63375                   this.blur();    // avoid keeping focus on the button - #4641
63376                   var keepRight = services.keepRight;
63377                   if (keepRight) {
63378                       keepRight.postKeepRightUpdate(d, function(err, error) {
63379                           dispatch$$1.call('change', error);
63380                       });
63381                   }
63382               });
63383
63384           buttonSection.select('.close-button')   // select and propagate data
63385               .text(function(d) {
63386                   var andComment = (d.newComment !== undefined ? '_comment' : '');
63387                   return t('QA.keepRight.close' + andComment);
63388               })
63389               .on('click.close', function(d) {
63390                   this.blur();    // avoid keeping focus on the button - #4641
63391                   var keepRight = services.keepRight;
63392                   if (keepRight) {
63393                       d.state = 'ignore_t';   // ignore temporarily (error fixed)
63394                       keepRight.postKeepRightUpdate(d, function(err, error) {
63395                           dispatch$$1.call('change', error);
63396                       });
63397                   }
63398               });
63399
63400           buttonSection.select('.ignore-button')   // select and propagate data
63401               .text(function(d) {
63402                   var andComment = (d.newComment !== undefined ? '_comment' : '');
63403                   return t('QA.keepRight.ignore' + andComment);
63404               })
63405               .on('click.ignore', function(d) {
63406                   this.blur();    // avoid keeping focus on the button - #4641
63407                   var keepRight = services.keepRight;
63408                   if (keepRight) {
63409                       d.state = 'ignore';   // ignore permanently (false positive)
63410                       keepRight.postKeepRightUpdate(d, function(err, error) {
63411                           dispatch$$1.call('change', error);
63412                       });
63413                   }
63414               });
63415       }
63416
63417
63418       keepRightEditor.error = function(val) {
63419           if (!arguments.length) return _error;
63420           _error = val;
63421           return keepRightEditor;
63422       };
63423
63424
63425       return utilRebind(keepRightEditor, dispatch$$1, 'on');
63426   }
63427
63428   function uiKeepRightHeader() {
63429       var _error;
63430
63431
63432       function errorTitle(d) {
63433           var unknown = t('inspector.unknown');
63434
63435           if (!d) return unknown;
63436           var errorType = d.error_type;
63437           var parentErrorType = d.parent_error_type;
63438
63439           var et = en.QA.keepRight.errorTypes[errorType];
63440           var pt = en.QA.keepRight.errorTypes[parentErrorType];
63441
63442           if (et && et.title) {
63443               return t('QA.keepRight.errorTypes.' + errorType + '.title');
63444           } else if (pt && pt.title) {
63445               return t('QA.keepRight.errorTypes.' + parentErrorType + '.title');
63446           } else {
63447               return unknown;
63448           }
63449       }
63450
63451
63452       function keepRightHeader(selection) {
63453           var header = selection.selectAll('.kr_error-header')
63454               .data(
63455                   (_error ? [_error] : []),
63456                   function(d) { return d.id + '-' + (d.status || 0); }
63457               );
63458
63459           header.exit()
63460               .remove();
63461
63462           var headerEnter = header.enter()
63463               .append('div')
63464               .attr('class', 'kr_error-header');
63465
63466           var iconEnter = headerEnter
63467               .append('div')
63468               .attr('class', 'kr_error-header-icon')
63469               .classed('new', function(d) { return d.id < 0; });
63470
63471           iconEnter
63472               .append('div')
63473               .attr('class', function(d) {
63474                   return 'preset-icon-28 kr_error kr_error-' + d.id + ' kr_error_type_' + d.parent_error_type;
63475               })
63476               .call(svgIcon('#iD-icon-bolt', 'kr_error-fill'));
63477
63478           headerEnter
63479               .append('div')
63480               .attr('class', 'kr_error-header-label')
63481               .text(errorTitle);
63482       }
63483
63484
63485       keepRightHeader.error = function(val) {
63486           if (!arguments.length) return _error;
63487           _error = val;
63488           return keepRightHeader;
63489       };
63490
63491
63492       return keepRightHeader;
63493   }
63494
63495   function uiLasso(context) {
63496       var group, polygon;
63497
63498       lasso.coordinates = [];
63499
63500       function lasso(selection$$1) {
63501           context.container()
63502               .classed('lasso', true);
63503
63504           group = selection$$1
63505               .append('g')
63506               .attr('class', 'lasso hide');
63507
63508           polygon = group
63509               .append('path')
63510               .attr('class', 'lasso-path');
63511
63512           group
63513               .call(uiToggle(true));
63514       }
63515
63516
63517       function draw() {
63518           if (polygon) {
63519               polygon.data([lasso.coordinates])
63520                   .attr('d', function(d) { return 'M' + d.join(' L') + ' Z'; });
63521           }
63522       }
63523
63524
63525       lasso.extent = function () {
63526           return lasso.coordinates.reduce(function(extent, point$$1) {
63527               return extent.extend(geoExtent$$1(point$$1));
63528           }, geoExtent$$1());
63529       };
63530
63531
63532       lasso.p = function(_) {
63533           if (!arguments.length) return lasso;
63534           lasso.coordinates.push(_);
63535           draw();
63536           return lasso;
63537       };
63538
63539
63540       lasso.close = function() {
63541           if (group) {
63542               group.call(uiToggle(false, function() {
63543                   select(this).remove();
63544               }));
63545           }
63546           context.container().classed('lasso', false);
63547       };
63548
63549
63550       return lasso;
63551   }
63552
63553   function uiNoteComments() {
63554       var _note;
63555
63556
63557       function noteComments(selection$$1) {
63558           if (_note.isNew()) return; // don't draw .comments-container
63559
63560           var comments = selection$$1.selectAll('.comments-container')
63561               .data([0]);
63562
63563           comments = comments.enter()
63564               .append('div')
63565               .attr('class', 'comments-container')
63566               .merge(comments);
63567
63568           var commentEnter = comments.selectAll('.comment')
63569               .data(_note.comments)
63570               .enter()
63571               .append('div')
63572               .attr('class', 'comment');
63573
63574           commentEnter
63575               .append('div')
63576               .attr('class', function(d) { return 'comment-avatar user-' + d.uid; })
63577               .call(svgIcon('#iD-icon-avatar', 'comment-avatar-icon'));
63578
63579           var mainEnter = commentEnter
63580               .append('div')
63581               .attr('class', 'comment-main');
63582
63583           var metadataEnter = mainEnter
63584               .append('div')
63585               .attr('class', 'comment-metadata');
63586
63587           metadataEnter
63588               .append('div')
63589               .attr('class', 'comment-author')
63590               .each(function(d) {
63591                   var selection$$1 = select(this);
63592                   var osm = services.osm;
63593                   if (osm && d.user) {
63594                       selection$$1 = selection$$1
63595                           .append('a')
63596                           .attr('class', 'comment-author-link')
63597                           .attr('href', osm.userURL(d.user))
63598                           .attr('tabindex', -1)
63599                           .attr('target', '_blank');
63600                   }
63601                   selection$$1
63602                       .text(function(d) { return d.user || t('note.anonymous'); });
63603               });
63604
63605           metadataEnter
63606               .append('div')
63607               .attr('class', 'comment-date')
63608               .text(function(d) {
63609                   return t('note.status.' + d.action, { when: localeDateString(d.date) });
63610               });
63611
63612           mainEnter
63613               .append('div')
63614               .attr('class', 'comment-text')
63615               .html(function(d) { return d.html; });
63616
63617           comments
63618               .call(replaceAvatars);
63619       }
63620
63621
63622       function replaceAvatars(selection$$1) {
63623           var osm = services.osm;
63624           if (!osm) return;
63625
63626           var uids = {};  // gather uids in the comment thread
63627           _note.comments.forEach(function(d) {
63628               if (d.uid) uids[d.uid] = true;
63629           });
63630
63631           Object.keys(uids).forEach(function(uid) {
63632               osm.loadUser(uid, function(err, user) {
63633                   if (!user || !user.image_url) return;
63634
63635                   selection$$1.selectAll('.comment-avatar.user-' + uid)
63636                       .html('')
63637                       .append('img')
63638                       .attr('class', 'icon comment-avatar-icon')
63639                       .attr('src', user.image_url)
63640                       .attr('alt', user.display_name);
63641               });
63642           });
63643       }
63644
63645
63646       function localeDateString(s) {
63647           if (!s) return null;
63648           var detected = utilDetect();
63649           var options = { day: 'numeric', month: 'short', year: 'numeric' };
63650           s = s.replace(/-/g, '/'); // fix browser-specific Date() issues
63651           var d = new Date(s);
63652           if (isNaN(d.getTime())) return null;
63653           return d.toLocaleDateString(detected.locale, options);
63654       }
63655
63656
63657       noteComments.note = function(val) {
63658           if (!arguments.length) return _note;
63659           _note = val;
63660           return noteComments;
63661       };
63662
63663
63664       return noteComments;
63665   }
63666
63667   function uiNoteEditor$$1(context) {
63668       var dispatch$$1 = dispatch('change');
63669       var quickLinks = uiQuickLinks();
63670       var noteComments = uiNoteComments();
63671       var noteHeader = uiNoteHeader();
63672
63673       // var formFields = uiFormFields(context);
63674
63675       var _note;
63676       // var _fieldsArr;
63677
63678
63679       function noteEditor(selection$$1) {
63680           // quick links
63681           var choices = [{
63682               id: 'zoom_to',
63683               label: 'inspector.zoom_to.title',
63684               tooltip: function() {
63685                   return uiTooltipHtml(t('inspector.zoom_to.tooltip_note'), t('inspector.zoom_to.key'));
63686               },
63687               click: function zoomTo() {
63688                   context.mode().zoomToSelected();
63689               }
63690           }];
63691
63692
63693           var header = selection$$1.selectAll('.header')
63694               .data([0]);
63695
63696           var headerEnter = header.enter()
63697               .append('div')
63698               .attr('class', 'header fillL');
63699
63700           headerEnter
63701               .append('button')
63702               .attr('class', 'fr note-editor-close')
63703               .on('click', function() {
63704                   context.enter(modeBrowse(context));
63705               })
63706               .call(svgIcon('#iD-icon-close'));
63707
63708           headerEnter
63709               .append('h3')
63710               .text(t('note.title'));
63711
63712
63713           var body = selection$$1.selectAll('.body')
63714               .data([0]);
63715
63716           body = body.enter()
63717               .append('div')
63718               .attr('class', 'body')
63719               .merge(body);
63720
63721           var editor = body.selectAll('.note-editor')
63722               .data([0]);
63723
63724           editor.enter()
63725               .append('div')
63726               .attr('class', 'modal-section note-editor')
63727               .merge(editor)
63728               .call(noteHeader.note(_note))
63729               .call(quickLinks.choices(choices))
63730               .call(noteComments.note(_note))
63731               .call(noteSaveSection);
63732
63733
63734           var footer = selection$$1.selectAll('.footer')
63735               .data([0]);
63736
63737           footer.enter()
63738               .append('div')
63739               .attr('class', 'footer')
63740               .merge(footer)
63741               .call(uiViewOnOSM(context).what(_note))
63742               .call(uiNoteReport(context).note(_note));
63743
63744
63745           // rerender the note editor on any auth change
63746           var osm = services.osm;
63747           if (osm) {
63748               osm.on('change.note-save', function() {
63749                   selection$$1.call(noteEditor);
63750               });
63751           }
63752       }
63753
63754
63755       function noteSaveSection(selection$$1) {
63756           var isSelected = (_note && _note.id === context.selectedNoteID());
63757           var noteSave = selection$$1.selectAll('.note-save')
63758               .data((isSelected ? [_note] : []), function(d) { return d.status + d.id; });
63759
63760           // exit
63761           noteSave.exit()
63762               .remove();
63763
63764           // enter
63765           var noteSaveEnter = noteSave.enter()
63766               .append('div')
63767               .attr('class', 'note-save save-section cf');
63768
63769           // // if new note, show categories to pick from
63770           // if (_note.isNew()) {
63771           //     var presets = context.presets();
63772
63773           //     // NOTE: this key isn't a age and therefore there is no documentation (yet)
63774           //     _fieldsArr = [
63775           //         uiField(context, presets.field('category'), null, { show: true, revert: false }),
63776           //     ];
63777
63778           //     _fieldsArr.forEach(function(field) {
63779           //         field
63780           //             .on('change', changeCategory);
63781           //     });
63782
63783           //     noteSaveEnter
63784           //         .append('div')
63785           //         .attr('class', 'note-category')
63786           //         .call(formFields.fieldsArr(_fieldsArr));
63787           // }
63788
63789           // function changeCategory() {
63790           //     // NOTE: perhaps there is a better way to get value
63791           //     var val = d3_select('input[name=\'category\']:checked').property('__data__') || undefined;
63792
63793           //     // store the unsaved category with the note itself
63794           //     _note = _note.update({ newCategory: val });
63795           //     var osm = services.osm;
63796           //     if (osm) {
63797           //         osm.replaceNote(_note);  // update note cache
63798           //     }
63799           //     noteSave
63800           //         .call(noteSaveButtons);
63801           // }
63802
63803           noteSaveEnter
63804               .append('h4')
63805               .attr('class', '.note-save-header')
63806               .text(function() {
63807                   return _note.isNew() ? t('note.newDescription') : t('note.newComment');
63808               });
63809
63810           noteSaveEnter
63811               .append('textarea')
63812               .attr('class', 'new-comment-input')
63813               .attr('placeholder', t('note.inputPlaceholder'))
63814               .attr('maxlength', 1000)
63815               .property('value', function(d) { return d.newComment; })
63816               .call(utilNoAuto)
63817               .on('keydown.note-input', keydown)
63818               .on('input.note-input', changeInput)
63819               .on('blur.note-input', changeInput);
63820
63821           // update
63822           noteSave = noteSaveEnter
63823               .merge(noteSave)
63824               .call(userDetails)
63825               .call(noteSaveButtons);
63826
63827
63828           // fast submit if user presses cmd+enter
63829           function keydown() {
63830               if (!(event.keyCode === 13 && event.metaKey)) return;
63831
63832               var osm = services.osm;
63833               if (!osm) return;
63834
63835               var hasAuth = osm.authenticated();
63836               if (!hasAuth) return;
63837
63838               if (!_note.newComment) return;
63839
63840               event.preventDefault();
63841
63842               select(this)
63843                   .on('keydown.note-input', null);
63844
63845               // focus on button and submit
63846               window.setTimeout(function() {
63847                   if (_note.isNew()) {
63848                       noteSave.selectAll('.save-button').node().focus();
63849                       clickSave(_note);
63850                   } else  {
63851                       noteSave.selectAll('.comment-button').node().focus();
63852                       clickComment(_note);
63853                   }
63854               }, 10);
63855           }
63856
63857
63858           function changeInput() {
63859               var input = select(this);
63860               var val = input.property('value').trim() || undefined;
63861
63862               // store the unsaved comment with the note itself
63863               _note = _note.update({ newComment: val });
63864
63865               var osm = services.osm;
63866               if (osm) {
63867                   osm.replaceNote(_note);  // update note cache
63868               }
63869
63870               noteSave
63871                   .call(noteSaveButtons);
63872           }
63873       }
63874
63875
63876       function userDetails(selection$$1) {
63877           var detailSection = selection$$1.selectAll('.detail-section')
63878               .data([0]);
63879
63880           detailSection = detailSection.enter()
63881               .append('div')
63882               .attr('class', 'detail-section')
63883               .merge(detailSection);
63884
63885           var osm = services.osm;
63886           if (!osm) return;
63887
63888           // Add warning if user is not logged in
63889           var hasAuth = osm.authenticated();
63890           var authWarning = detailSection.selectAll('.auth-warning')
63891               .data(hasAuth ? [] : [0]);
63892
63893           authWarning.exit()
63894               .transition()
63895               .duration(200)
63896               .style('opacity', 0)
63897               .remove();
63898
63899           var authEnter = authWarning.enter()
63900               .insert('div', '.tag-reference-body')
63901               .attr('class', 'field-warning auth-warning')
63902               .style('opacity', 0);
63903
63904           authEnter
63905               .call(svgIcon('#iD-icon-alert', 'inline'));
63906
63907           authEnter
63908               .append('span')
63909               .text(t('note.login'));
63910
63911           authEnter
63912               .append('a')
63913               .attr('target', '_blank')
63914               .call(svgIcon('#iD-icon-out-link', 'inline'))
63915               .append('span')
63916               .text(t('login'))
63917               .on('click.note-login', function() {
63918                   event.preventDefault();
63919                   osm.authenticate();
63920               });
63921
63922           authEnter
63923               .transition()
63924               .duration(200)
63925               .style('opacity', 1);
63926
63927
63928           var prose = detailSection.selectAll('.note-save-prose')
63929               .data(hasAuth ? [0] : []);
63930
63931           prose.exit()
63932               .remove();
63933
63934           prose = prose.enter()
63935               .append('p')
63936               .attr('class', 'note-save-prose')
63937               .text(t('note.upload_explanation'))
63938               .merge(prose);
63939
63940           osm.userDetails(function(err, user) {
63941               if (err) return;
63942
63943               var userLink = select(document.createElement('div'));
63944
63945               if (user.image_url) {
63946                   userLink
63947                       .append('img')
63948                       .attr('src', user.image_url)
63949                       .attr('class', 'icon pre-text user-icon');
63950               }
63951
63952               userLink
63953                   .append('a')
63954                   .attr('class', 'user-info')
63955                   .text(user.display_name)
63956                   .attr('href', osm.userURL(user.display_name))
63957                   .attr('tabindex', -1)
63958                   .attr('target', '_blank');
63959
63960               prose
63961                   .html(t('note.upload_explanation_with_user', { user: userLink.html() }));
63962           });
63963       }
63964
63965
63966       function noteSaveButtons(selection$$1) {
63967           var osm = services.osm;
63968           var hasAuth = osm && osm.authenticated();
63969
63970           var isSelected = (_note && _note.id === context.selectedNoteID());
63971           var buttonSection = selection$$1.selectAll('.buttons')
63972               .data((isSelected ? [_note] : []), function(d) { return d.status + d.id; });
63973
63974           // exit
63975           buttonSection.exit()
63976               .remove();
63977
63978           // enter
63979           var buttonEnter = buttonSection.enter()
63980               .append('div')
63981               .attr('class', 'buttons');
63982
63983           if (_note.isNew()) {
63984               buttonEnter
63985                   .append('button')
63986                   .attr('class', 'button cancel-button secondary-action')
63987                   .text(t('confirm.cancel'));
63988
63989               buttonEnter
63990                   .append('button')
63991                   .attr('class', 'button save-button action')
63992                   .text(t('note.save'));
63993
63994           } else {
63995               buttonEnter
63996                   .append('button')
63997                   .attr('class', 'button status-button action');
63998
63999               buttonEnter
64000                   .append('button')
64001                   .attr('class', 'button comment-button action')
64002                   .text(t('note.comment'));
64003           }
64004
64005
64006           // update
64007           buttonSection = buttonSection
64008               .merge(buttonEnter);
64009
64010           buttonSection.select('.cancel-button')   // select and propagate data
64011               .on('click.cancel', clickCancel);
64012
64013           buttonSection.select('.save-button')     // select and propagate data
64014               .attr('disabled', isSaveDisabled)
64015               .on('click.save', clickSave);
64016
64017           buttonSection.select('.status-button')   // select and propagate data
64018               .attr('disabled', (hasAuth ? null : true))
64019               .text(function(d) {
64020                   var action = (d.status === 'open' ? 'close' : 'open');
64021                   var andComment = (d.newComment ? '_comment' : '');
64022                   return t('note.' + action + andComment);
64023               })
64024               .on('click.status', clickStatus);
64025
64026           buttonSection.select('.comment-button')   // select and propagate data
64027               .attr('disabled', isSaveDisabled)
64028               .on('click.comment', clickComment);
64029
64030
64031           function isSaveDisabled(d) {
64032               return (hasAuth && d.status === 'open' && d.newComment) ? null : true;
64033           }
64034       }
64035
64036
64037
64038       function clickCancel(d) {
64039           this.blur();    // avoid keeping focus on the button - #4641
64040           var osm = services.osm;
64041           if (osm) {
64042               osm.removeNote(d);
64043           }
64044           context.enter(modeBrowse(context));
64045           dispatch$$1.call('change');
64046       }
64047
64048
64049       function clickSave(d) {
64050           this.blur();    // avoid keeping focus on the button - #4641
64051           var osm = services.osm;
64052           if (osm) {
64053               osm.postNoteCreate(d, function(err, note) {
64054                   dispatch$$1.call('change', note);
64055               });
64056           }
64057       }
64058
64059
64060       function clickStatus(d) {
64061           this.blur();    // avoid keeping focus on the button - #4641
64062           var osm = services.osm;
64063           if (osm) {
64064               var setStatus = (d.status === 'open' ? 'closed' : 'open');
64065               osm.postNoteUpdate(d, setStatus, function(err, note) {
64066                   dispatch$$1.call('change', note);
64067               });
64068           }
64069       }
64070
64071       function clickComment(d) {
64072           this.blur();    // avoid keeping focus on the button - #4641
64073           var osm = services.osm;
64074           if (osm) {
64075               osm.postNoteUpdate(d, d.status, function(err, note) {
64076                   dispatch$$1.call('change', note);
64077               });
64078           }
64079       }
64080
64081
64082       noteEditor.note = function(val) {
64083           if (!arguments.length) return _note;
64084           _note = val;
64085           return noteEditor;
64086       };
64087
64088
64089       return utilRebind(noteEditor, dispatch$$1, 'on');
64090   }
64091
64092   function uiNoteHeader() {
64093       var _note;
64094
64095
64096       function noteHeader(selection) {
64097           var header = selection.selectAll('.note-header')
64098               .data(
64099                   (_note ? [_note] : []),
64100                   function(d) { return d.status + d.id; }
64101               );
64102
64103           header.exit()
64104               .remove();
64105
64106           var headerEnter = header.enter()
64107               .append('div')
64108               .attr('class', 'note-header');
64109
64110           var iconEnter = headerEnter
64111               .append('div')
64112               .attr('class', function(d) { return 'note-header-icon ' + d.status; })
64113               .classed('new', function(d) { return d.id < 0; });
64114
64115           iconEnter
64116               .append('div')
64117               .attr('class', 'preset-icon-28')
64118               .call(svgIcon('#iD-icon-note', 'note-fill'));
64119
64120           iconEnter.each(function(d) {
64121               var statusIcon = '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply'));
64122               iconEnter
64123                   .append('div')
64124                   .attr('class', 'note-icon-annotation')
64125                   .call(svgIcon(statusIcon, 'note-annotation'));
64126           });
64127
64128           headerEnter
64129               .append('div')
64130               .attr('class', 'note-header-label')
64131               .text(function(d) {
64132                   if (_note.isNew()) { return t('note.new'); }
64133                   return t('note.note') + ' ' + d.id + ' ' +
64134                       (d.status === 'closed' ? t('note.closed') : '');
64135               });
64136       }
64137
64138
64139       noteHeader.note = function(val) {
64140           if (!arguments.length) return _note;
64141           _note = val;
64142           return noteHeader;
64143       };
64144
64145
64146       return noteHeader;
64147   }
64148
64149   function uiNoteReport() {
64150       var _note;
64151
64152       function noteReport(selection) {
64153           var url;
64154           if (services.osm && (_note instanceof osmNote) && (!_note.isNew())) {
64155               url = services.osm.noteReportURL(_note);
64156           }
64157
64158           var link = selection.selectAll('.note-report')
64159               .data(url ? [url] : []);
64160
64161           // exit
64162           link.exit()
64163               .remove();
64164
64165           // enter
64166           var linkEnter = link.enter()
64167               .append('a')
64168               .attr('class', 'note-report')
64169               .attr('target', '_blank')
64170               .attr('href', function(d) { return d; })
64171               .call(svgIcon('#iD-icon-out-link', 'inline'));
64172
64173           linkEnter
64174               .append('span')
64175               .text(t('note.report'));
64176       }
64177
64178
64179       noteReport.note = function(val) {
64180           if (!arguments.length) return _note;
64181           _note = val;
64182           return noteReport;
64183       };
64184
64185       return noteReport;
64186   }
64187
64188   function uiRadialMenu(context, operations) {
64189       var menu;
64190       var center = [0, 0];
64191       var tooltip;
64192
64193
64194       var radialMenu = function(selection$$1) {
64195           if (!operations.length) return;
64196
64197           selection$$1.node().parentNode.focus();
64198
64199           function click(operation) {
64200               event.stopPropagation();
64201               if (operation.disabled()) return;
64202               operation();
64203               radialMenu.close();
64204           }
64205
64206           menu = selection$$1
64207               .append('g')
64208               .attr('class', 'radial-menu')
64209               .attr('transform', 'translate(' + center + ')')
64210               .attr('opacity', 0);
64211
64212           menu
64213               .transition()
64214               .attr('opacity', 1);
64215
64216           var r = 50;
64217           var a = Math.PI / 4;
64218           var a0 = -Math.PI / 4;
64219           var a1 = a0 + (operations.length - 1) * a;
64220
64221           menu
64222               .append('path')
64223               .attr('class', 'radial-menu-background')
64224               .attr('d', 'M' + r * Math.sin(a0) + ',' +
64225                                r * Math.cos(a0) +
64226                         ' A' + r + ',' + r + ' 0 ' + (operations.length > 5 ? '1' : '0') + ',0 ' +
64227                                (r * Math.sin(a1) + 1e-3) + ',' +
64228                                (r * Math.cos(a1) + 1e-3)) // Force positive-length path (#1305)
64229               .attr('stroke-width', 50)
64230               .attr('stroke-linecap', 'round');
64231
64232           var button = menu.selectAll()
64233               .data(operations)
64234               .enter()
64235               .append('g')
64236               .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
64237               .classed('disabled', function(d) { return d.disabled(); })
64238               .attr('transform', function(d, i) {
64239                   return 'translate(' + geoVecFloor([
64240                           r * Math.sin(a0 + i * a),
64241                           r * Math.cos(a0 + i * a)]).join(',') + ')';
64242               });
64243
64244           button
64245               .append('circle')
64246               .attr('r', 15)
64247               .on('click', click)
64248               .on('mousedown', mousedown)
64249               .on('mouseover', mouseover)
64250               .on('mouseout', mouseout);
64251
64252           button
64253               .append('use')
64254               .attr('transform', 'translate(-10,-10)')
64255               .attr('width', '20')
64256               .attr('height', '20')
64257               .attr('xlink:href', function(d) { return '#iD-operation-' + d.id; });
64258
64259           tooltip = select(document.body)
64260               .append('div')
64261               .attr('class', 'tooltip-inner radial-menu-tooltip');
64262
64263           function mousedown() {
64264               event.stopPropagation(); // https://github.com/openstreetmap/iD/issues/1869
64265           }
64266
64267           function mouseover(d, i) {
64268               var rect = context.surfaceRect();
64269               var angle = a0 + i * a;
64270               var top = rect.top + (r + 25) * Math.cos(angle) + center[1] + 'px';
64271               var left = rect.left + (r + 25) * Math.sin(angle) + center[0] + 'px';
64272               var bottom = rect.height - (r + 25) * Math.cos(angle) - center[1] + 'px';
64273               var right = rect.width - (r + 25) * Math.sin(angle) - center[0] + 'px';
64274
64275               tooltip
64276                   .style('top', null)
64277                   .style('left', null)
64278                   .style('bottom', null)
64279                   .style('right', null)
64280                   .style('display', 'block')
64281                   .html(uiTooltipHtml(d.tooltip(), d.keys[0]));
64282
64283               if (i === 0) {
64284                   tooltip
64285                       .style('right', right)
64286                       .style('top', top);
64287               } else if (i >= 4) {
64288                   tooltip
64289                       .style('left', left)
64290                       .style('bottom', bottom);
64291               } else {
64292                   tooltip
64293                       .style('left', left)
64294                       .style('top', top);
64295               }
64296           }
64297
64298           function mouseout() {
64299               tooltip.style('display', 'none');
64300           }
64301       };
64302
64303
64304       radialMenu.close = function() {
64305           if (menu) {
64306               menu
64307                   .style('pointer-events', 'none')
64308                   .transition()
64309                   .attr('opacity', 0)
64310                   .remove();
64311           }
64312
64313           if (tooltip) {
64314               tooltip.remove();
64315           }
64316       };
64317
64318
64319       radialMenu.center = function(_) {
64320           if (!arguments.length) return center;
64321           center = _;
64322           return radialMenu;
64323       };
64324
64325
64326       return radialMenu;
64327   }
64328
64329   function uiSelectionList(context, selectedIDs) {
64330
64331       function selectEntity(entity) {
64332           context.enter(modeSelect(context, [entity.id]));
64333       }
64334
64335
64336       function deselectEntity(entity) {
64337           event.stopPropagation();
64338           var index = selectedIDs.indexOf(entity.id);
64339           if (index > -1) {
64340               selectedIDs.splice(index, 1);
64341           }
64342           context.enter(modeSelect(context, selectedIDs));
64343       }
64344
64345
64346       function selectionList(selection$$1) {
64347           selection$$1.classed('selection-list-pane', true);
64348
64349           var header = selection$$1
64350               .append('div')
64351               .attr('class', 'header fillL cf');
64352
64353           header
64354               .append('h3')
64355               .text(t('inspector.multiselect'));
64356
64357           var listWrap = selection$$1
64358               .append('div')
64359               .attr('class', 'inspector-body');
64360
64361           var list = listWrap
64362               .append('div')
64363               .attr('class', 'feature-list cf');
64364
64365           context.history().on('change.selection-list', drawList);
64366           drawList();
64367
64368
64369           function drawList() {
64370               var entities = selectedIDs
64371                   .map(function(id) { return context.hasEntity(id); })
64372                   .filter(function(entity) { return entity; });
64373
64374               var items = list.selectAll('.feature-list-item')
64375                   .data(entities, osmEntity$$1.key);
64376
64377               items.exit()
64378                   .remove();
64379
64380               // Enter
64381               var enter = items.enter()
64382                   .append('div')
64383                   .attr('class', 'feature-list-item')
64384                   .on('click', selectEntity);
64385
64386               enter
64387                   .each(function(d) {
64388                   // highlight the feature in the map while hovering on the list item
64389                   select(this).on('mouseover', function() {
64390                       utilHighlightEntity(d.id, true, context);
64391                   });
64392                   select(this).on('mouseout', function() {
64393                       utilHighlightEntity(d.id, false, context);
64394                   });
64395               });
64396
64397               var label = enter
64398                   .append('button')
64399                   .attr('class', 'label');
64400
64401               enter
64402                   .append('button')
64403                   .attr('class', 'close')
64404                   .on('click', deselectEntity)
64405                   .call(svgIcon('#iD-icon-close'));
64406
64407               label
64408                   .append('span')
64409                   .attr('class', 'entity-geom-icon')
64410                   .call(svgIcon('', 'pre-text'));
64411
64412               label
64413                   .append('span')
64414                   .attr('class', 'entity-type');
64415
64416               label
64417                   .append('span')
64418                   .attr('class', 'entity-name');
64419
64420               // Update
64421               items = items.merge(enter);
64422
64423               items.selectAll('.entity-geom-icon use')
64424                   .attr('href', function() {
64425                       var entity = this.parentNode.parentNode.__data__;
64426                       return '#iD-icon-' + context.geometry(entity.id);
64427                   });
64428
64429               items.selectAll('.entity-type')
64430                   .text(function(entity) { return context.presets().match(entity, context.graph()).name(); });
64431
64432               items.selectAll('.entity-name')
64433                   .text(function(entity) { return utilDisplayName(entity); });
64434           }
64435       }
64436
64437       return selectionList;
64438   }
64439
64440   function uiSourceSwitch(context) {
64441       var keys;
64442
64443
64444       function click() {
64445           event.preventDefault();
64446
64447           var osm = context.connection();
64448           if (!osm) return;
64449
64450           if (context.inIntro()) return;
64451
64452           if (context.history().hasChanges() &&
64453               !window.confirm(t('source_switch.lose_changes'))) return;
64454
64455           var isLive = select(this)
64456               .classed('live');
64457
64458           isLive = !isLive;
64459           context.enter(modeBrowse(context));
64460           context.history().clearSaved();          // remove saved history
64461           context.flush();                         // remove stored data
64462
64463           select(this)
64464               .text(isLive ? t('source_switch.live') : t('source_switch.dev'))
64465               .classed('live', isLive);
64466
64467           osm.switch(isLive ? keys[0] : keys[1]);  // switch connection (warning: dispatches 'change' event)
64468       }
64469
64470       var sourceSwitch = function(selection$$1) {
64471           selection$$1
64472               .append('a')
64473               .attr('href', '#')
64474               .text(t('source_switch.live'))
64475               .classed('live', true)
64476               .attr('tabindex', -1)
64477               .on('click', click);
64478       };
64479
64480
64481       sourceSwitch.keys = function(_) {
64482           if (!arguments.length) return keys;
64483           keys = _;
64484           return sourceSwitch;
64485       };
64486
64487
64488       return sourceSwitch;
64489   }
64490
64491   function uiSuccess$$1(context) {
64492       var MAXEVENTS = 2;
64493
64494       // All else being equal, rank more "social" communities higher
64495       // (anything not in this list receives no adjustment)
64496       var COMMUNITYRANK = {
64497           'meetup': +5,
64498           'slack': +4,
64499           'facebook': +3,
64500           'reddit': +2,
64501           'forum': -2,
64502           'mailinglist': -3,
64503           'irc': -4
64504       };
64505
64506       var detected = utilDetect();
64507       var dispatch$$1 = dispatch('cancel');
64508       var _changeset;
64509       var _location;
64510
64511
64512       // string-to-date parsing in JavaScript is weird
64513       function parseEventDate(when) {
64514           if (!when) return;
64515
64516           var raw = when.trim();
64517           if (!raw) return;
64518
64519           if (!/Z$/.test(raw)) {    // if no trailing 'Z', add one
64520               raw += 'Z';           // this forces date to be parsed as a UTC date
64521           }
64522
64523           var parsed = new Date(raw);
64524           return new Date(parsed.toUTCString().substr(0, 25));  // convert to local timezone
64525       }
64526
64527
64528       function success(selection$$1) {
64529           var header = selection$$1
64530               .append('div')
64531               .attr('class', 'header fillL');
64532
64533           header
64534               .append('button')
64535               .attr('class', 'fr')
64536               .on('click', function() { dispatch$$1.call('cancel'); })
64537               .call(svgIcon('#iD-icon-close'));
64538
64539           header
64540               .append('h3')
64541               .text(t('success.just_edited'));
64542
64543           var body = selection$$1
64544               .append('div')
64545               .attr('class', 'body save-success fillL');
64546
64547           var summary = body
64548               .append('div')
64549               .attr('class', 'save-summary');
64550
64551           summary
64552               .append('h3')
64553               .text(t('success.thank_you' + (_location ? '_location' : ''), { where: _location }));
64554
64555           summary
64556               .append('p')
64557               .text(t('success.help_html'))
64558               .append('a')
64559               .attr('class', 'link-out')
64560               .attr('target', '_blank')
64561               .attr('tabindex', -1)
64562               .attr('href', t('success.help_link_url'))
64563               .call(svgIcon('#iD-icon-out-link', 'inline'))
64564               .append('span')
64565               .text(t('success.help_link_text'));
64566
64567           var osm = context.connection();
64568           if (!osm) return;
64569
64570           var changesetURL = osm.changesetURL(_changeset.id);
64571
64572           var table = summary
64573               .append('table')
64574               .attr('class', 'summary-table');
64575
64576           var row = table
64577               .append('tr')
64578               .attr('class', 'summary-row');
64579
64580           row
64581               .append('td')
64582               .attr('class', 'cell-icon summary-icon')
64583               .append('a')
64584               .attr('target', '_blank')
64585               .attr('href', changesetURL)
64586               .append('svg')
64587               .attr('class', 'logo-small')
64588               .append('use')
64589               .attr('xlink:href', '#iD-logo-osm');
64590
64591           var summaryDetail = row
64592               .append('td')
64593               .attr('class', 'cell-detail summary-detail');
64594
64595           summaryDetail
64596               .append('a')
64597               .attr('class', 'cell-detail summary-view-on-osm')
64598               .attr('target', '_blank')
64599               .attr('href', changesetURL)
64600               .text(t('success.view_on_osm'));
64601
64602           summaryDetail
64603               .append('div')
64604               .text(t('success.changeset_id', { changeset_id: _changeset.id }));
64605
64606
64607           // Gather community polygon IDs intersecting the map..
64608           var matchFeatures = data.community.query(context.map().center(), true) || [];
64609           var matchIDs = matchFeatures.map(function(feature) { return feature.id; });
64610
64611           // Gather community resources that are either global or match a polygon.
64612           var matchResources = filter(data.community.resources, function(v) {
64613               return !v.featureId || matchIDs.indexOf(v.featureId) !== -1;
64614           });
64615
64616           if (matchResources.length) {
64617               // sort by size ascending, then by community rank
64618               matchResources.sort(function(a, b) {
64619                   var aSize = Infinity;
64620                   var bSize = Infinity;
64621                   var aRank = COMMUNITYRANK[a.type] || 0;
64622                   var bRank = COMMUNITYRANK[b.type] || 0;
64623
64624                   if (a.featureId) {
64625                       aSize = data.community.features[a.featureId].properties.area;
64626                   }
64627                   if (b.featureId) {
64628                       bSize = data.community.features[b.featureId].properties.area;
64629                   }
64630
64631                   return aSize < bSize ? -1 : aSize > bSize ? 1 : bRank - aRank;
64632               });
64633
64634               body
64635                   .call(showCommunityLinks, matchResources);
64636           }
64637       }
64638
64639
64640       function showCommunityLinks(selection$$1, matchResources) {
64641           var communityLinks = selection$$1
64642               .append('div')
64643               .attr('class', 'save-communityLinks');
64644
64645           communityLinks
64646               .append('h3')
64647               .text(t('success.like_osm'));
64648
64649           var table = communityLinks
64650               .append('table')
64651               .attr('class', 'community-table');
64652
64653           var row = table.selectAll('.community-row')
64654               .data(matchResources);
64655
64656           var rowEnter = row.enter()
64657               .append('tr')
64658               .attr('class', 'community-row');
64659
64660           rowEnter
64661               .append('td')
64662               .attr('class', 'cell-icon community-icon')
64663               .append('a')
64664               .attr('target', '_blank')
64665               .attr('href', function(d) { return d.url; })
64666               .append('svg')
64667               .attr('class', 'logo-small')
64668               .append('use')
64669               .attr('xlink:href', function(d) { return '#community-' + d.type; });
64670
64671           var communityDetail = rowEnter
64672               .append('td')
64673               .attr('class', 'cell-detail community-detail');
64674
64675           communityDetail
64676               .each(showCommunityDetails);
64677
64678           communityLinks
64679               .append('div')
64680               .attr('class', 'community-missing')
64681               .text(t('success.missing'))
64682               .append('a')
64683               .attr('class', 'link-out')
64684               .attr('target', '_blank')
64685               .attr('tabindex', -1)
64686               .call(svgIcon('#iD-icon-out-link', 'inline'))
64687               .attr('href', 'https://github.com/osmlab/osm-community-index/issues')
64688               .append('span')
64689               .text(t('success.tell_us'));
64690       }
64691
64692
64693       function showCommunityDetails(d) {
64694           var selection$$1 = select(this);
64695           var communityID = d.id;
64696           var replacements = {
64697               url: linkify(d.url),
64698               signupUrl: linkify(d.signupUrl || d.url)
64699           };
64700
64701           selection$$1
64702               .append('div')
64703               .attr('class', 'community-name')
64704               .append('a')
64705               .attr('target', '_blank')
64706               .attr('href', d.url)
64707               .text(t('community.' + d.id + '.name'));
64708
64709           var descriptionHTML = t('community.' + d.id + '.description', replacements);
64710
64711           if (d.type === 'reddit') {   // linkify subreddits  #4997
64712               descriptionHTML = descriptionHTML
64713                   .replace(/(\/r\/\w*\/*)/i, function(match) { return linkify(d.url, match); });
64714           }
64715
64716           selection$$1
64717               .append('div')
64718               .attr('class', 'community-description')
64719               .html(descriptionHTML);
64720
64721           if (d.extendedDescription || (d.languageCodes && d.languageCodes.length)) {
64722               selection$$1
64723                   .append('div')
64724                   .call(uiDisclosure(context, 'community-more-' + d.id, false)
64725                       .expanded(false)
64726                       .updatePreference(false)
64727                       .title(t('success.more'))
64728                       .content(showMore)
64729                   );
64730           }
64731
64732           var nextEvents = (d.events || [])
64733               .map(function(event$$1) {
64734                   event$$1.date = parseEventDate(event$$1.when);
64735                   return event$$1;
64736               })
64737               .filter(function(event$$1) {               // date is valid and future (or today)
64738                   var t$$1 = event$$1.date.getTime();
64739                   var now = (new Date()).setHours(0,0,0,0);
64740                   return !isNaN(t$$1) && t$$1 >= now;
64741               })
64742               .sort(function(a, b) {                  // sort by date ascending
64743                   return a.date < b.date ? -1 : a.date > b.date ? 1 : 0;
64744               })
64745               .slice(0, MAXEVENTS);                   // limit number of events shown
64746
64747           if (nextEvents.length) {
64748               selection$$1
64749                   .append('div')
64750                   .call(uiDisclosure(context, 'community-events-' + d.id, false)
64751                       .expanded(false)
64752                       .updatePreference(false)
64753                       .title(t('success.events'))
64754                       .content(showNextEvents)
64755                   )
64756                   .select('.hide-toggle')
64757                   .append('span')
64758                   .attr('class', 'badge-text')
64759                   .text(nextEvents.length);
64760           }
64761
64762
64763           function showMore(selection$$1) {
64764               var more = selection$$1
64765                   .append('div')
64766                   .attr('class', 'community-more');
64767
64768               if (d.extendedDescription) {
64769                   more
64770                       .append('div')
64771                       .attr('class', 'community-extended-description')
64772                       .html(t('community.' + d.id + '.extendedDescription', replacements));
64773               }
64774
64775               if (d.languageCodes && d.languageCodes.length) {
64776                   more
64777                       .append('div')
64778                       .attr('class', 'community-languages')
64779                       .text(t('success.languages', { languages: d.languageCodes.join(', ') }));
64780               }
64781           }
64782
64783
64784           function showNextEvents(selection$$1) {
64785               var events = selection$$1
64786                   .append('div')
64787                   .attr('class', 'community-events');
64788
64789               var item = events.selectAll('.community-event')
64790                   .data(nextEvents);
64791
64792               var itemEnter = item.enter()
64793                   .append('div')
64794                   .attr('class', 'community-event');
64795
64796               itemEnter
64797                   .append('div')
64798                   .attr('class', 'community-event-name')
64799                   .append('a')
64800                   .attr('target', '_blank')
64801                   .attr('href', function(d) { return d.url; })
64802                   .text(function(d) {
64803                       var name = d.name;
64804                       if (d.i18n && d.id) {
64805                           name = t('community.' + communityID + '.events.' + d.id + '.name', { default: name });
64806                       }
64807                       return name;
64808                   });
64809
64810               itemEnter
64811                   .append('div')
64812                   .attr('class', 'community-event-when')
64813                   .text(function(d) {
64814                       var options = {
64815                           weekday: 'short', day: 'numeric', month: 'short', year: 'numeric'
64816                       };
64817                       if (d.date.getHours() || d.date.getMinutes()) {   // include time if it has one
64818                           options.hour = 'numeric';
64819                           options.minute = 'numeric';
64820                       }
64821                       return d.date.toLocaleString(detected.locale, options);
64822                   });
64823
64824               itemEnter
64825                   .append('div')
64826                   .attr('class', 'community-event-where')
64827                   .text(function(d) {
64828                       var where = d.where;
64829                       if (d.i18n && d.id) {
64830                           where = t('community.' + communityID + '.events.' + d.id + '.where', { default: where });
64831                       }
64832                       return where;
64833                   });
64834
64835               itemEnter
64836                   .append('div')
64837                   .attr('class', 'community-event-description')
64838                   .text(function(d) {
64839                       var description = d.description;
64840                       if (d.i18n && d.id) {
64841                           description = t('community.' + communityID + '.events.' + d.id + '.description', { default: description });
64842                       }
64843                       return description;
64844                   });
64845           }
64846
64847
64848           function linkify(url, text) {
64849               text = text || url;
64850               return '<a target="_blank" href="' + url + '">' + text + '</a>';
64851           }
64852       }
64853
64854
64855       success.changeset = function(_) {
64856           if (!arguments.length) return _changeset;
64857           _changeset = _;
64858           return success;
64859       };
64860
64861
64862       success.location = function(_) {
64863           if (!arguments.length) return _location;
64864           _location = _;
64865           return success;
64866       };
64867
64868
64869       return utilRebind(success, dispatch$$1, 'on');
64870   }
64871
64872   function uiViewOnKeepRight() {
64873       var _error;   // a keepright error
64874
64875
64876       function viewOnKeepRight(selection) {
64877           var url;
64878           if (services.keepRight && (_error instanceof krError)) {
64879               url = services.keepRight.errorURL(_error);
64880           }
64881
64882           var link = selection.selectAll('.view-on-keepRight')
64883               .data(url ? [url] : []);
64884
64885           // exit
64886           link.exit()
64887               .remove();
64888
64889           // enter
64890           var linkEnter = link.enter()
64891               .append('a')
64892               .attr('class', 'view-on-keepRight')
64893               .attr('target', '_blank')
64894               .attr('href', function(d) { return d; })
64895               .call(svgIcon('#iD-icon-out-link', 'inline'));
64896
64897           linkEnter
64898               .append('span')
64899               .text(t('inspector.view_on_keepRight'));
64900       }
64901
64902
64903       viewOnKeepRight.what = function(val) {
64904           if (!arguments.length) return _error;
64905           _error = val;
64906           return viewOnKeepRight;
64907       };
64908
64909       return viewOnKeepRight;
64910   }
64911
64912   function behaviorCopy(context) {
64913
64914       function groupEntities(ids, graph) {
64915           var entities = ids.map(function (id) { return graph.entity(id); });
64916           return assignIn({relation: [], way: [], node: []},
64917               groupBy(entities, function(entity) { return entity.type; }));
64918       }
64919
64920
64921       function getDescendants(id, graph, descendants) {
64922           var entity = graph.entity(id);
64923           var children;
64924
64925           descendants = descendants || {};
64926
64927           if (entity.type === 'relation') {
64928               children = map$3(entity.members, 'id');
64929           } else if (entity.type === 'way') {
64930               children = entity.nodes;
64931           } else {
64932               children = [];
64933           }
64934
64935           for (var i = 0; i < children.length; i++) {
64936               if (!descendants[children[i]]) {
64937                   descendants[children[i]] = true;
64938                   descendants = getDescendants(children[i], graph, descendants);
64939               }
64940           }
64941
64942           return descendants;
64943       }
64944
64945
64946       function getSelectionText() {
64947           return window.getSelection().toString();
64948       }
64949
64950
64951       function doCopy() {
64952           if (!getSelectionText()) {
64953               event.preventDefault();
64954           }
64955
64956           var graph = context.graph();
64957           var selected = groupEntities(context.selectedIDs(), graph);
64958           var canCopy = [];
64959           var skip = {};
64960           var entity;
64961           var i;
64962
64963           for (i = 0; i < selected.relation.length; i++) {
64964               entity = selected.relation[i];
64965               if (!skip[entity.id] && entity.isComplete(graph)) {
64966                   canCopy.push(entity.id);
64967                   skip = getDescendants(entity.id, graph, skip);
64968               }
64969           }
64970           for (i = 0; i < selected.way.length; i++) {
64971               entity = selected.way[i];
64972               if (!skip[entity.id]) {
64973                   canCopy.push(entity.id);
64974                   skip = getDescendants(entity.id, graph, skip);
64975               }
64976           }
64977           for (i = 0; i < selected.node.length; i++) {
64978               entity = selected.node[i];
64979               if (!skip[entity.id]) {
64980                   canCopy.push(entity.id);
64981               }
64982           }
64983
64984           context.copyIDs(canCopy);
64985       }
64986
64987
64988       function behavior() {
64989           context.keybinding().on(uiCmd('⌘C'), doCopy);
64990           return behavior;
64991       }
64992
64993       behavior.off = function() {
64994           context.keybinding().off(uiCmd('⌘C'));
64995       };
64996
64997
64998       return behavior;
64999   }
65000
65001   /*
65002       `behaviorDrag` is like `d3_behavior.drag`, with the following differences:
65003
65004       * The `origin` function is expected to return an [x, y] tuple rather than an
65005         {x, y} object.
65006       * The events are `start`, `move`, and `end`.
65007         (https://github.com/mbostock/d3/issues/563)
65008       * The `start` event is not dispatched until the first cursor movement occurs.
65009         (https://github.com/mbostock/d3/pull/368)
65010       * The `move` event has a `point` and `delta` [x, y] tuple properties rather
65011         than `x`, `y`, `dx`, and `dy` properties.
65012       * The `end` event is not dispatched if no movement occurs.
65013       * An `off` function is available that unbinds the drag's internal event handlers.
65014    */
65015
65016   function behaviorDrag() {
65017       var dispatch$$1 = dispatch('start', 'move', 'end');
65018       var _origin = null;
65019       var _selector = '';
65020       var _event;
65021       var _target;
65022       var _surface;
65023
65024
65025       var d3_event_userSelectProperty = utilPrefixCSSProperty('UserSelect');
65026       var d3_event_userSelectSuppress = function() {
65027               var selection$$1 = selection();
65028               var select$$1 = selection$$1.style(d3_event_userSelectProperty);
65029               selection$$1.style(d3_event_userSelectProperty, 'none');
65030               return function() {
65031                   selection$$1.style(d3_event_userSelectProperty, select$$1);
65032               };
65033           };
65034
65035
65036       function d3_eventCancel() {
65037           event.stopPropagation();
65038           event.preventDefault();
65039       }
65040
65041
65042       function eventOf(thiz, argumentz) {
65043           return function(e1) {
65044               e1.target = behavior;
65045               customEvent(e1, dispatch$$1.apply, dispatch$$1, [e1.type, thiz, argumentz]);
65046           };
65047       }
65048
65049
65050       function dragstart() {
65051           _target = this;
65052           _event = eventOf(_target, arguments);
65053
65054           var eventTarget = event.target;
65055           var touchId = event.touches ? event.changedTouches[0].identifier : null;
65056           var offset;
65057           var startOrigin = point$$1();
65058           var started = false;
65059           var selectEnable = d3_event_userSelectSuppress(touchId !== null ? 'drag-' + touchId : 'drag');
65060
65061           select(window)
65062               .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', dragmove)
65063               .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', dragend, true);
65064
65065           if (_origin) {
65066               offset = _origin.apply(_target, arguments);
65067               offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]];
65068           } else {
65069               offset = [0, 0];
65070           }
65071
65072           if (touchId === null) {
65073               event.stopPropagation();
65074           }
65075
65076
65077           function point$$1() {
65078               var p = _surface || _target.parentNode;
65079               return touchId !== null ? d3_touches(p).filter(function(p) {
65080                   return p.identifier === touchId;
65081               })[0] : mouse(p);
65082           }
65083
65084
65085           function dragmove() {
65086               var p = point$$1();
65087               var dx = p[0] - startOrigin[0];
65088               var dy = p[1] - startOrigin[1];
65089
65090               if (dx === 0 && dy === 0)
65091                   return;
65092
65093               startOrigin = p;
65094               d3_eventCancel();
65095
65096               if (!started) {
65097                   started = true;
65098                   _event({ type: 'start' });
65099               } else {
65100                   _event({
65101                       type: 'move',
65102                       point: [p[0] + offset[0],  p[1] + offset[1]],
65103                       delta: [dx, dy]
65104                   });
65105               }
65106           }
65107
65108
65109           function dragend() {
65110               if (started) {
65111                   _event({ type: 'end' });
65112
65113                   d3_eventCancel();
65114                   if (event.target === eventTarget) {
65115                       select(window)
65116                           .on('click.drag', click, true);
65117                   }
65118               }
65119
65120               select(window)
65121                   .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', null)
65122                   .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', null);
65123
65124               selectEnable();
65125           }
65126
65127
65128           function click() {
65129               d3_eventCancel();
65130               select(window)
65131                   .on('click.drag', null);
65132           }
65133       }
65134
65135
65136       function behavior(selection$$1) {
65137           var matchesSelector = utilPrefixDOMProperty('matchesSelector');
65138           var delegate = dragstart;
65139
65140           if (_selector) {
65141               delegate = function() {
65142                   var root = this;
65143                   var target = event.target;
65144                   for (; target && target !== root; target = target.parentNode) {
65145                       var datum = target.__data__;
65146
65147                       var entity = datum instanceof osmNote ? datum
65148                           : datum && datum.properties && datum.properties.entity;
65149
65150                       if (entity && target[matchesSelector](_selector)) {
65151                           return dragstart.call(target, entity);
65152                       }
65153                   }
65154               };
65155           }
65156
65157           selection$$1
65158               .on('mousedown.drag' + _selector, delegate)
65159               .on('touchstart.drag' + _selector, delegate);
65160       }
65161
65162
65163       behavior.off = function(selection$$1) {
65164           selection$$1
65165               .on('mousedown.drag' + _selector, null)
65166               .on('touchstart.drag' + _selector, null);
65167       };
65168
65169
65170       behavior.selector = function(_) {
65171           if (!arguments.length) return _selector;
65172           _selector = _;
65173           return behavior;
65174       };
65175
65176
65177       behavior.origin = function(_) {
65178           if (!arguments.length) return _origin;
65179           _origin = _;
65180           return behavior;
65181       };
65182
65183
65184       behavior.cancel = function() {
65185           select(window)
65186               .on('mousemove.drag', null)
65187               .on('mouseup.drag', null);
65188           return behavior;
65189       };
65190
65191
65192       behavior.target = function() {
65193           if (!arguments.length) return _target;
65194           _target = arguments[0];
65195           _event = eventOf(_target, Array.prototype.slice.call(arguments, 1));
65196           return behavior;
65197       };
65198
65199
65200       behavior.surface = function() {
65201           if (!arguments.length) return _surface;
65202           _surface = arguments[0];
65203           return behavior;
65204       };
65205
65206
65207       return utilRebind(behavior, dispatch$$1, 'on');
65208   }
65209
65210   function behaviorDrawWay(context, wayId, index, mode, startGraph) {
65211       var origWay = context.entity(wayId);
65212       var annotation = t((origWay.isDegenerate() ?
65213           'operations.start.annotation.' :
65214           'operations.continue.annotation.') + context.geometry(wayId)
65215       );
65216       var behavior = behaviorDraw(context);
65217       var _tempEdits = 0;
65218
65219       var end = osmNode({ loc: context.map().mouseCoordinates() });
65220
65221       // Push an annotated state for undo to return back to.
65222       // We must make sure to remove this edit later.
65223       context.perform(actionNoop(), annotation);
65224       _tempEdits++;
65225
65226       // Add the drawing node to the graph.
65227       // We must make sure to remove this edit later.
65228       context.perform(_actionAddDrawNode());
65229       _tempEdits++;
65230
65231
65232       function keydown() {
65233           if (event.keyCode === utilKeybinding.modifierCodes.alt) {
65234               if (context.surface().classed('nope')) {
65235                   context.surface()
65236                       .classed('nope-suppressed', true);
65237               }
65238               context.surface()
65239                   .classed('nope', false)
65240                   .classed('nope-disabled', true);
65241           }
65242       }
65243
65244
65245       function keyup() {
65246           if (event.keyCode === utilKeybinding.modifierCodes.alt) {
65247               if (context.surface().classed('nope-suppressed')) {
65248                   context.surface()
65249                       .classed('nope', true);
65250               }
65251               context.surface()
65252                   .classed('nope-suppressed', false)
65253                   .classed('nope-disabled', false);
65254           }
65255       }
65256
65257
65258       // related code
65259       // - `mode/drag_node.js`     `doMode()`
65260       // - `behavior/draw.js`      `click()`
65261       // - `behavior/draw_way.js`  `move()`
65262       function move(datum) {
65263           context.surface().classed('nope-disabled', event.altKey);
65264
65265           var targetLoc = datum && datum.properties && datum.properties.entity && datum.properties.entity.loc;
65266           var targetNodes = datum && datum.properties && datum.properties.nodes;
65267           var loc = context.map().mouseCoordinates();
65268
65269           if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
65270               loc = targetLoc;
65271
65272           } else if (targetNodes) {   // snap to way - a line target with `.nodes`
65273               var choice = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
65274               if (choice) {
65275                   loc = choice.loc;
65276               }
65277           }
65278
65279           context.replace(actionMoveNode(end.id, loc));
65280           end = context.entity(end.id);
65281           checkGeometry(false);
65282       }
65283
65284
65285       // Check whether this edit causes the geometry to break.
65286       // If so, class the surface with a nope cursor.
65287       // `finishDraw` - Only checks the relevant line segments if finishing drawing
65288       function checkGeometry(finishDraw) {
65289           var nopeDisabled = context.surface().classed('nope-disabled');
65290           var isInvalid = isInvalidGeometry(end, context.graph(), finishDraw);
65291
65292           if (nopeDisabled) {
65293               context.surface()
65294                   .classed('nope', false)
65295                   .classed('nope-suppressed', isInvalid);
65296           } else {
65297               context.surface()
65298                   .classed('nope', isInvalid)
65299                   .classed('nope-suppressed', false);
65300           }
65301       }
65302
65303
65304       function isInvalidGeometry(entity, graph, finishDraw) {
65305           var parents = graph.parentWays(entity);
65306
65307           for (var i = 0; i < parents.length; i++) {
65308               var parent = parents[i];
65309               var nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
65310
65311               if (origWay.isClosed()) { // Check if Area
65312                   if (finishDraw) {
65313                       nodes.splice(-2, 1);
65314                       entity = nodes[nodes.length-2];
65315                   } else {
65316                       nodes.pop();
65317                   }
65318               } else { // Line
65319                   if (finishDraw) {
65320                       nodes.pop();
65321                   }
65322               }
65323
65324               if (geoHasSelfIntersections(nodes, entity.id)) {
65325                   return true;
65326               }
65327           }
65328
65329           return false;
65330       }
65331
65332
65333       function undone() {
65334           // Undo popped the history back to the initial annotated no-op edit.
65335           // Remove initial no-op edit and whatever edit happened immediately before it.
65336           context.pop(2);
65337           _tempEdits = 0;
65338
65339           if (context.hasEntity(wayId)) {
65340               context.enter(mode);
65341           } else {
65342               context.enter(modeBrowse(context));
65343           }
65344       }
65345
65346
65347       function setActiveElements() {
65348           context.surface().selectAll('.' + end.id)
65349               .classed('active', true);
65350       }
65351
65352
65353       var drawWay = function(surface) {
65354           behavior
65355               .on('move', move)
65356               .on('click', drawWay.add)
65357               .on('clickWay', drawWay.addWay)
65358               .on('clickNode', drawWay.addNode)
65359               .on('undo', context.undo)
65360               .on('cancel', drawWay.cancel)
65361               .on('finish', drawWay.finish);
65362
65363           select(window)
65364               .on('keydown.drawWay', keydown)
65365               .on('keyup.drawWay', keyup);
65366
65367           context.map()
65368               .dblclickEnable(false)
65369               .on('drawn.draw', setActiveElements);
65370
65371           setActiveElements();
65372
65373           surface.call(behavior);
65374
65375           context.history()
65376               .on('undone.draw', undone);
65377       };
65378
65379
65380       drawWay.off = function(surface) {
65381           // Drawing was interrupted unexpectedly.
65382           // This can happen if the user changes modes,
65383           // clicks geolocate button, a hashchange event occurs, etc.
65384           if (_tempEdits) {
65385               context.pop(_tempEdits);
65386               while (context.graph() !== startGraph) {
65387                   context.pop();
65388               }
65389           }
65390
65391           context.map()
65392               .on('drawn.draw', null);
65393
65394           surface.call(behavior.off)
65395               .selectAll('.active')
65396               .classed('active', false);
65397
65398           surface
65399               .classed('nope', false)
65400               .classed('nope-suppressed', false)
65401               .classed('nope-disabled', false);
65402
65403           select(window)
65404               .on('keydown.hover', null)
65405               .on('keyup.hover', null);
65406
65407           context.history()
65408               .on('undone.draw', null);
65409       };
65410
65411
65412       function _actionAddDrawNode() {
65413           return function(graph) {
65414               return graph
65415                   .replace(end)
65416                   .replace(origWay.addNode(end.id, index));
65417           };
65418       }
65419
65420
65421       function _actionReplaceDrawNode(newNode) {
65422           return function(graph) {
65423               return graph
65424                   .replace(origWay.addNode(newNode.id, index))
65425                   .remove(end);
65426           };
65427       }
65428
65429
65430       // Accept the current position of the drawing node and continue drawing.
65431       drawWay.add = function(loc, d) {
65432           if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
65433               return;   // can't click here
65434           }
65435
65436           context.pop(_tempEdits);
65437           _tempEdits = 0;
65438
65439           context.perform(
65440               _actionAddDrawNode(),
65441               annotation
65442           );
65443
65444           checkGeometry(false);   // finishDraw = false
65445           context.enter(mode);
65446       };
65447
65448
65449       // Connect the way to an existing way.
65450       drawWay.addWay = function(loc, edge, d) {
65451           if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
65452               return;   // can't click here
65453           }
65454
65455           context.pop(_tempEdits);
65456           _tempEdits = 0;
65457
65458           context.perform(
65459               _actionAddDrawNode(),
65460               actionAddMidpoint({ loc: loc, edge: edge }, end),
65461               annotation
65462           );
65463
65464           checkGeometry(false);   // finishDraw = false
65465           context.enter(mode);
65466       };
65467
65468
65469       // Connect the way to an existing node and continue drawing.
65470       drawWay.addNode = function(node, d) {
65471           if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
65472               return;   // can't click here
65473           }
65474
65475           context.pop(_tempEdits);
65476           _tempEdits = 0;
65477
65478           context.perform(
65479               _actionReplaceDrawNode(node),
65480               annotation
65481           );
65482
65483           checkGeometry(false);   // finishDraw = false
65484           context.enter(mode);
65485       };
65486
65487
65488       // Finish the draw operation, removing the temporary edits.
65489       // If the way has enough nodes to be valid, it's selected.
65490       // Otherwise, delete everything and return to browse mode.
65491       drawWay.finish = function() {
65492           checkGeometry(true);   // finishDraw = true
65493           if (context.surface().classed('nope')) {
65494               return;   // can't click here
65495           }
65496
65497           context.pop(_tempEdits);
65498           _tempEdits = 0;
65499
65500           var way = context.hasEntity(wayId);
65501           if (!way || way.isDegenerate()) {
65502               drawWay.cancel();
65503               return;
65504           }
65505
65506           window.setTimeout(function() {
65507               context.map().dblclickEnable(true);
65508           }, 1000);
65509
65510           context.enter(modeSelect(context, [wayId]).newFeature(true));
65511       };
65512
65513
65514       // Cancel the draw operation, delete everything, and return to browse mode.
65515       drawWay.cancel = function() {
65516           context.pop(_tempEdits);
65517           _tempEdits = 0;
65518
65519           while (context.graph() !== startGraph) {
65520               context.pop();
65521           }
65522
65523           window.setTimeout(function() {
65524               context.map().dblclickEnable(true);
65525           }, 1000);
65526
65527           context.surface()
65528               .classed('nope', false)
65529               .classed('nope-disabled', false)
65530               .classed('nope-suppressed', false);
65531
65532           context.enter(modeBrowse(context));
65533       };
65534
65535
65536       drawWay.activeID = function() {
65537           if (!arguments.length) return end.id;
65538           // no assign
65539           return drawWay;
65540       };
65541
65542
65543       drawWay.tail = function(text) {
65544           behavior.tail(text);
65545           return drawWay;
65546       };
65547
65548
65549       return drawWay;
65550   }
65551
65552   function behaviorHash(context) {
65553       var s0 = null; // cached window.location.hash
65554       var lat = 90 - 1e-8; // allowable latitude range
65555
65556
65557       var parser = function(map, s) {
65558           var q = utilStringQs(s);
65559           var args = (q.map || '').split('/').map(Number);
65560
65561           if (args.length < 3 || args.some(isNaN)) {
65562               return true; // replace bogus hash
65563
65564           } else if (s !== formatter(map).slice(1)) {   // hash has changed
65565               var mode = context.mode(),
65566                   dist = geoSphericalDistance(map.center(), [args[2], args[1]]),
65567                   maxdist = 500;
65568
65569               // Don't allow the hash location to change too much while drawing
65570               // This can happen if the user accidently hit the back button.  #3996
65571               if (mode && mode.id.match(/^draw/) !== null && dist > maxdist) {
65572                   context.enter(modeBrowse(context));
65573               }
65574
65575               map.centerZoom([args[2], Math.min(lat, Math.max(-lat, args[1]))], args[0]);
65576           }
65577       };
65578
65579
65580       var formatter = function(map) {
65581           var center = map.center();
65582           var zoom = map.zoom();
65583           var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
65584           var q = omit(utilStringQs(window.location.hash.substring(1)),
65585               ['comment', 'source', 'hashtags', 'walkthrough']
65586           );
65587           var newParams = {};
65588
65589           delete q.id;
65590           var selected = context.selectedIDs().filter(function(id) {
65591               return !context.entity(id).isNew();
65592           });
65593           if (selected.length) {
65594               newParams.id = selected.join(',');
65595           }
65596
65597           newParams.map = zoom.toFixed(2) +
65598               '/' + center[1].toFixed(precision) +
65599               '/' + center[0].toFixed(precision);
65600
65601           return '#' + utilQsString(assign(q, newParams), true);
65602       };
65603
65604
65605       function update() {
65606           if (context.inIntro()) return;
65607           var s1 = formatter(context.map());
65608           if (s0 !== s1) {
65609               window.location.replace(s0 = s1);  // don't recenter the map!
65610           }
65611       }
65612
65613
65614       var throttledUpdate = throttle(update, 500);
65615
65616
65617       function hashchange() {
65618           if (window.location.hash === s0) return;  // ignore spurious hashchange events
65619           if (parser(context.map(), (s0 = window.location.hash).substring(1))) {
65620               update(); // replace bogus hash
65621           }
65622       }
65623
65624
65625       function behavior() {
65626           context.map()
65627               .on('move.hash', throttledUpdate);
65628
65629           context
65630               .on('enter.hash', throttledUpdate);
65631
65632           select(window)
65633               .on('hashchange.hash', hashchange);
65634
65635           if (window.location.hash) {
65636               var q = utilStringQs(window.location.hash.substring(1));
65637
65638               if (q.id) {
65639                   context.zoomToEntity(q.id.split(',')[0], !q.map);
65640               }
65641
65642               if (q.comment) {
65643                   context.storage('comment', q.comment);
65644                   context.storage('commentDate', Date.now());
65645               }
65646
65647               if (q.source) {
65648                   context.storage('source', q.source);
65649                   context.storage('commentDate', Date.now());
65650               }
65651
65652               if (q.hashtags) {
65653                   context.storage('hashtags', q.hashtags);
65654               }
65655
65656               if (q.walkthrough === 'true') {
65657                   behavior.startWalkthrough = true;
65658               }
65659
65660               hashchange();
65661
65662               if (q.map) {
65663                   behavior.hadHash = true;
65664               }
65665           }
65666       }
65667
65668
65669       behavior.off = function() {
65670           throttledUpdate.cancel();
65671
65672           context.map()
65673               .on('move.hash', null);
65674
65675           context
65676               .on('enter.hash', null);
65677
65678           select(window)
65679               .on('hashchange.hash', null);
65680
65681           window.location.hash = '';
65682       };
65683
65684
65685       return behavior;
65686   }
65687
65688   function behaviorLasso(context) {
65689
65690       var behavior = function(selection$$1) {
65691           var lasso;
65692
65693
65694           function mousedown() {
65695               var button = 0;  // left
65696               if (event.button === button && event.shiftKey === true) {
65697                   lasso = null;
65698
65699                   select(window)
65700                       .on('mousemove.lasso', mousemove)
65701                       .on('mouseup.lasso', mouseup);
65702
65703                   event.stopPropagation();
65704               }
65705           }
65706
65707
65708           function mousemove() {
65709               if (!lasso) {
65710                   lasso = uiLasso(context);
65711                   context.surface().call(lasso);
65712               }
65713
65714               lasso.p(context.mouse());
65715           }
65716
65717
65718           function normalize(a, b) {
65719               return [
65720                   [Math.min(a[0], b[0]), Math.min(a[1], b[1])],
65721                   [Math.max(a[0], b[0]), Math.max(a[1], b[1])]];
65722           }
65723
65724
65725           function lassoed() {
65726               if (!lasso) return [];
65727
65728               var graph = context.graph();
65729               var bounds = lasso.extent().map(context.projection.invert);
65730               var extent = geoExtent$$1(normalize(bounds[0], bounds[1]));
65731
65732               return map$3(context.intersects(extent).filter(function(entity) {
65733                   return entity.type === 'node' &&
65734                       geoPointInPolygon(context.projection(entity.loc), lasso.coordinates) &&
65735                       !context.features().isHidden(entity, graph, entity.geometry(graph));
65736               }), 'id');
65737           }
65738
65739
65740           function mouseup() {
65741               select(window)
65742                   .on('mousemove.lasso', null)
65743                   .on('mouseup.lasso', null);
65744
65745               if (!lasso) return;
65746
65747               var ids = lassoed();
65748               lasso.close();
65749
65750               if (ids.length) {
65751                   context.enter(modeSelect(context, ids));
65752               }
65753           }
65754
65755           selection$$1
65756               .on('mousedown.lasso', mousedown);
65757       };
65758
65759
65760       behavior.off = function(selection$$1) {
65761           selection$$1.on('mousedown.lasso', null);
65762       };
65763
65764
65765       return behavior;
65766   }
65767
65768   /* Creates a keybinding behavior for an operation */
65769   function behaviorOperation(context) {
65770       var _operation;
65771
65772       function keypress() {
65773           event.preventDefault();
65774           var disabled = _operation.disabled();
65775           var flash;
65776
65777           if (disabled) {
65778               flash = uiFlash()
65779                   .duration(4000)
65780                   .iconName('#iD-operation-' + _operation.id)
65781                   .iconClass('operation disabled')
65782                   .text(_operation.tooltip);
65783
65784               flash();
65785
65786           } else {
65787               flash = uiFlash()
65788                   .duration(2000)
65789                   .iconName('#iD-operation-' + _operation.id)
65790                   .iconClass('operation')
65791                   .text(_operation.annotation() || _operation.title);
65792
65793               flash();
65794               _operation();
65795           }
65796       }
65797
65798
65799       function behavior() {
65800           if (_operation && _operation.available()) {
65801               context.keybinding()
65802                   .on(_operation.keys, keypress);
65803           }
65804
65805           return behavior;
65806       }
65807
65808
65809       behavior.off = function() {
65810           context.keybinding()
65811               .off(_operation.keys);
65812       };
65813
65814
65815       behavior.which = function (_) {
65816           if (!arguments.length) return _operation;
65817           _operation = _;
65818           return behavior;
65819       };
65820
65821
65822       return behavior;
65823   }
65824
65825   /**
65826    * The base implementation of `_.invert` and `_.invertBy` which inverts
65827    * `object` with values transformed by `iteratee` and set by `setter`.
65828    *
65829    * @private
65830    * @param {Object} object The object to iterate over.
65831    * @param {Function} setter The function to set `accumulator` values.
65832    * @param {Function} iteratee The iteratee to transform values.
65833    * @param {Object} accumulator The initial inverted object.
65834    * @returns {Function} Returns `accumulator`.
65835    */
65836   function baseInverter(object, setter, iteratee, accumulator) {
65837     baseForOwn(object, function(value, key, object) {
65838       setter(accumulator, iteratee(value), key, object);
65839     });
65840     return accumulator;
65841   }
65842
65843   /**
65844    * Creates a function like `_.invertBy`.
65845    *
65846    * @private
65847    * @param {Function} setter The function to set accumulator values.
65848    * @param {Function} toIteratee The function to resolve iteratees.
65849    * @returns {Function} Returns the new inverter function.
65850    */
65851   function createInverter(setter, toIteratee) {
65852     return function(object, iteratee) {
65853       return baseInverter(object, setter, toIteratee(iteratee), {});
65854     };
65855   }
65856
65857   /** Used for built-in method references. */
65858   var objectProto$j = Object.prototype;
65859
65860   /**
65861    * Used to resolve the
65862    * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
65863    * of values.
65864    */
65865   var nativeObjectToString$2 = objectProto$j.toString;
65866
65867   /**
65868    * Creates an object composed of the inverted keys and values of `object`.
65869    * If `object` contains duplicate values, subsequent values overwrite
65870    * property assignments of previous values.
65871    *
65872    * @static
65873    * @memberOf _
65874    * @since 0.7.0
65875    * @category Object
65876    * @param {Object} object The object to invert.
65877    * @returns {Object} Returns the new inverted object.
65878    * @example
65879    *
65880    * var object = { 'a': 1, 'b': 2, 'c': 1 };
65881    *
65882    * _.invert(object);
65883    * // => { '1': 'c', '2': 'b' }
65884    */
65885   var invert = createInverter(function(result, value, key) {
65886     if (value != null &&
65887         typeof value.toString != 'function') {
65888       value = nativeObjectToString$2.call(value);
65889     }
65890
65891     result[value] = key;
65892   }, constant$d(identity$8));
65893
65894   /**
65895    * Creates an object with the same keys as `object` and values generated
65896    * by running each own enumerable string keyed property of `object` thru
65897    * `iteratee`. The iteratee is invoked with three arguments:
65898    * (value, key, object).
65899    *
65900    * @static
65901    * @memberOf _
65902    * @since 2.4.0
65903    * @category Object
65904    * @param {Object} object The object to iterate over.
65905    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
65906    * @returns {Object} Returns the new mapped object.
65907    * @see _.mapKeys
65908    * @example
65909    *
65910    * var users = {
65911    *   'fred':    { 'user': 'fred',    'age': 40 },
65912    *   'pebbles': { 'user': 'pebbles', 'age': 1 }
65913    * };
65914    *
65915    * _.mapValues(users, function(o) { return o.age; });
65916    * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
65917    *
65918    * // The `_.property` iteratee shorthand.
65919    * _.mapValues(users, 'age');
65920    * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
65921    */
65922   function mapValues(object, iteratee) {
65923     var result = {};
65924     iteratee = baseIteratee(iteratee, 3);
65925
65926     baseForOwn(object, function(value, key, object) {
65927       baseAssignValue(result, key, iteratee(value, key, object));
65928     });
65929     return result;
65930   }
65931
65932   function behaviorPaste(context) {
65933
65934       function doPaste() {
65935           event.preventDefault();
65936
65937           var baseGraph = context.graph();
65938           var mouse$$1 = context.mouse();
65939           var projection = context.projection;
65940           var viewport = geoExtent$$1(projection.clipExtent()).polygon();
65941
65942           if (!geoPointInPolygon(mouse$$1, viewport)) return;
65943
65944           var extent = geoExtent$$1();
65945           var oldIDs = context.copyIDs();
65946           var oldGraph = context.copyGraph();
65947           var newIDs = [];
65948
65949           if (!oldIDs.length) return;
65950
65951           var action = actionCopyEntities(oldIDs, oldGraph);
65952           context.perform(action);
65953
65954           var copies = action.copies();
65955           var originals = invert(mapValues(copies, 'id'));
65956           for (var id in copies) {
65957               var oldEntity = oldGraph.entity(id);
65958               var newEntity = copies[id];
65959
65960               extent._extend(oldEntity.extent(oldGraph));
65961
65962               // Exclude child nodes from newIDs if their parent way was also copied.
65963               var parents = context.graph().parentWays(newEntity);
65964               var parentCopied = false;
65965               for (var i = 0; i < parents.length; i++) {
65966                   if (originals[parents[i].id]) {
65967                       parentCopied = true;
65968                       break;
65969                   }
65970               }
65971
65972               if (!parentCopied) {
65973                   newIDs.push(newEntity.id);
65974               }
65975           }
65976
65977           // Put pasted objects where mouse pointer is..
65978           var center = projection(extent.center());
65979           var delta = geoVecSubtract(mouse$$1, center);
65980
65981           context.perform(actionMove(newIDs, delta, projection));
65982           context.enter(modeMove$$1(context, newIDs, baseGraph));
65983       }
65984
65985
65986       function behavior() {
65987           context.keybinding().on(uiCmd('⌘V'), doPaste);
65988           return behavior;
65989       }
65990
65991
65992       behavior.off = function() {
65993           context.keybinding().off(uiCmd('⌘V'));
65994       };
65995
65996
65997       return behavior;
65998   }
65999
66000   function behaviorSelect(context) {
66001       var lastMouse = null;
66002       var suppressMenu = true;
66003       var tolerance = 4;
66004       var p1 = null;
66005
66006
66007       function point$$1() {
66008           return mouse(context.container().node());
66009       }
66010
66011
66012       function keydown() {
66013           var e = event;
66014           if (e && e.shiftKey) {
66015               context.surface()
66016                   .classed('behavior-multiselect', true);
66017           }
66018
66019           if (e && e.keyCode === 93) {  // context menu
66020               e.preventDefault();
66021               e.stopPropagation();
66022           }
66023       }
66024
66025
66026       function keyup() {
66027           var e = event;
66028           if (!e || !e.shiftKey) {
66029               context.surface()
66030                   .classed('behavior-multiselect', false);
66031           }
66032
66033
66034           if (e && e.keyCode === 93) {  // context menu
66035               e.preventDefault();
66036               e.stopPropagation();
66037               contextmenu();
66038           }
66039       }
66040
66041
66042       function mousedown() {
66043           if (!p1) p1 = point$$1();
66044           select(window)
66045               .on('mouseup.select', mouseup, true);
66046
66047           var isShowAlways = +context.storage('edit-menu-show-always') === 1;
66048           suppressMenu = !isShowAlways;
66049       }
66050
66051
66052       function mousemove() {
66053           if (event) lastMouse = event;
66054       }
66055
66056
66057       function mouseup() {
66058           click();
66059       }
66060
66061
66062       function contextmenu() {
66063           var e = event;
66064           e.preventDefault();
66065           e.stopPropagation();
66066
66067           if (!+e.clientX && !+e.clientY) {
66068               if (lastMouse) {
66069                   e.sourceEvent = lastMouse;
66070               } else {
66071                   return;
66072               }
66073           }
66074
66075           if (!p1) p1 = point$$1();
66076           suppressMenu = false;
66077           click();
66078       }
66079
66080
66081       function click() {
66082           select(window)
66083               .on('mouseup.select', null, true);
66084
66085           if (!p1) return;
66086           var p2 = point$$1();
66087           var dist = geoVecLength(p1, p2);
66088
66089           p1 = null;
66090           if (dist > tolerance) {
66091               return;
66092           }
66093
66094           var isMultiselect = event.shiftKey || select('#surface .lasso').node();
66095           var isShowAlways = +context.storage('edit-menu-show-always') === 1;
66096           var datum = event.target.__data__ || (lastMouse && lastMouse.target.__data__);
66097           var mode = context.mode();
66098
66099           var entity = datum && datum.properties && datum.properties.entity;
66100           if (entity) datum = entity;
66101
66102           if (datum && datum.type === 'midpoint') {
66103               datum = datum.parents[0];
66104           }
66105
66106           if (datum instanceof osmEntity$$1) {    // clicked an entity..
66107               var selectedIDs = context.selectedIDs();
66108               context.selectedNoteID(null);
66109               context.selectedErrorID(null);
66110
66111               if (!isMultiselect) {
66112                   if (selectedIDs.length > 1 && (!suppressMenu && !isShowAlways)) {
66113                       // multiple things already selected, just show the menu...
66114                       mode.suppressMenu(false).reselect();
66115                   } else {
66116                       // select a single thing..
66117                       context.enter(modeSelect(context, [datum.id]).suppressMenu(suppressMenu));
66118                   }
66119
66120               } else {
66121                   if (selectedIDs.indexOf(datum.id) !== -1) {
66122                       // clicked entity is already in the selectedIDs list..
66123                       if (!suppressMenu && !isShowAlways) {
66124                           // don't deselect clicked entity, just show the menu.
66125                           mode.suppressMenu(false).reselect();
66126                       } else {
66127                           // deselect clicked entity, then reenter select mode or return to browse mode..
66128                           selectedIDs = without(selectedIDs, datum.id);
66129                           context.enter(selectedIDs.length ? modeSelect(context, selectedIDs) : modeBrowse(context));
66130                       }
66131                   } else {
66132                       // clicked entity is not in the selected list, add it..
66133                       selectedIDs = selectedIDs.concat([datum.id]);
66134                       context.enter(modeSelect(context, selectedIDs).suppressMenu(suppressMenu));
66135                   }
66136               }
66137
66138           } else if (datum && datum.__featurehash__ && !isMultiselect) {    // clicked Data..
66139               context
66140                   .selectedNoteID(null)
66141                   .enter(modeSelectData$$1(context, datum));
66142
66143           } else if (datum instanceof osmNote && !isMultiselect) {    // clicked a Note..
66144               context
66145                   .selectedNoteID(datum.id)
66146                   .enter(modeSelectNote$$1(context, datum.id));
66147           } else if (datum instanceof krError & !isMultiselect) {     // clicked a krError error
66148               context
66149                   .selectedErrorID(datum.id)
66150                   .enter(modeSelectError$$1(context, datum.id));
66151           } else {    // clicked nothing..
66152               context.selectedNoteID(null);
66153               context.selectedErrorID(null);
66154               if (!isMultiselect && mode.id !== 'browse') {
66155                   context.enter(modeBrowse(context));
66156               }
66157           }
66158
66159           // reset for next time..
66160           suppressMenu = true;
66161       }
66162
66163
66164       function behavior(selection$$1) {
66165           lastMouse = null;
66166           suppressMenu = true;
66167           p1 = null;
66168
66169           select(window)
66170               .on('keydown.select', keydown)
66171               .on('keyup.select', keyup)
66172               .on('contextmenu.select-window', function() {
66173                   // Edge and IE really like to show the contextmenu on the
66174                   // menubar when user presses a keyboard menu button
66175                   // even after we've already preventdefaulted the key event.
66176                   var e = event;
66177                   if (+e.clientX === 0 && +e.clientY === 0) {
66178                       event.preventDefault();
66179                       event.stopPropagation();
66180                   }
66181               });
66182
66183           selection$$1
66184               .on('mousedown.select', mousedown)
66185               .on('mousemove.select', mousemove)
66186               .on('contextmenu.select', contextmenu);
66187
66188           if (event && event.shiftKey) {
66189               context.surface()
66190                   .classed('behavior-multiselect', true);
66191           }
66192       }
66193
66194
66195       behavior.off = function(selection$$1) {
66196           select(window)
66197               .on('keydown.select', null)
66198               .on('keyup.select', null)
66199               .on('contextmenu.select-window', null)
66200               .on('mouseup.select', null, true);
66201
66202           selection$$1
66203               .on('mousedown.select', null)
66204               .on('mousemove.select', null)
66205               .on('contextmenu.select', null);
66206
66207           context.surface()
66208               .classed('behavior-multiselect', false);
66209       };
66210
66211
66212       return behavior;
66213   }
66214
66215   function modeAddArea$$1(context) {
66216       var mode = {
66217           id: 'add-area',
66218           button: 'area',
66219           title: t('modes.add_area.title'),
66220           description: t('modes.add_area.description'),
66221           key: '3'
66222       };
66223
66224       var behavior = behaviorAddWay(context)
66225           .tail(t('modes.add_area.tail'))
66226           .on('start', start)
66227           .on('startFromWay', startFromWay)
66228           .on('startFromNode', startFromNode);
66229
66230       var defaultTags = { area: 'yes' };
66231
66232
66233       function actionClose(wayId) {
66234           return function (graph) {
66235               return graph.replace(graph.entity(wayId).close());
66236           };
66237       }
66238
66239
66240       function start(loc) {
66241           var startGraph = context.graph();
66242           var node = osmNode({ loc: loc });
66243           var way = osmWay({ tags: defaultTags });
66244
66245           context.perform(
66246               actionAddEntity(node),
66247               actionAddEntity(way),
66248               actionAddVertex(way.id, node.id),
66249               actionClose(way.id)
66250           );
66251
66252           context.enter(modeDrawArea(context, way.id, startGraph));
66253       }
66254
66255
66256       function startFromWay(loc, edge) {
66257           var startGraph = context.graph();
66258           var node = osmNode({ loc: loc });
66259           var way = osmWay({ tags: defaultTags });
66260
66261           context.perform(
66262               actionAddEntity(node),
66263               actionAddEntity(way),
66264               actionAddVertex(way.id, node.id),
66265               actionClose(way.id),
66266               actionAddMidpoint({ loc: loc, edge: edge }, node)
66267           );
66268
66269           context.enter(modeDrawArea(context, way.id, startGraph));
66270       }
66271
66272
66273       function startFromNode(node) {
66274           var startGraph = context.graph();
66275           var way = osmWay({ tags: defaultTags });
66276
66277           context.perform(
66278               actionAddEntity(way),
66279               actionAddVertex(way.id, node.id),
66280               actionClose(way.id)
66281           );
66282
66283           context.enter(modeDrawArea(context, way.id, startGraph));
66284       }
66285
66286
66287       mode.enter = function() {
66288           context.install(behavior);
66289       };
66290
66291
66292       mode.exit = function() {
66293           context.uninstall(behavior);
66294       };
66295
66296
66297       return mode;
66298   }
66299
66300   function modeAddLine$$1(context) {
66301       var mode = {
66302           id: 'add-line',
66303           button: 'line',
66304           title: t('modes.add_line.title'),
66305           description: t('modes.add_line.description'),
66306           key: '2'
66307       };
66308
66309       var behavior = behaviorAddWay(context)
66310           .tail(t('modes.add_line.tail'))
66311           .on('start', start)
66312           .on('startFromWay', startFromWay)
66313           .on('startFromNode', startFromNode);
66314
66315
66316       function start(loc) {
66317           var startGraph = context.graph();
66318           var node = osmNode({ loc: loc });
66319           var way = osmWay();
66320
66321           context.perform(
66322               actionAddEntity(node),
66323               actionAddEntity(way),
66324               actionAddVertex(way.id, node.id)
66325           );
66326
66327           context.enter(modeDrawLine(context, way.id, startGraph));
66328       }
66329
66330
66331       function startFromWay(loc, edge) {
66332           var startGraph = context.graph();
66333           var node = osmNode({ loc: loc });
66334           var way = osmWay();
66335
66336           context.perform(
66337               actionAddEntity(node),
66338               actionAddEntity(way),
66339               actionAddVertex(way.id, node.id),
66340               actionAddMidpoint({ loc: loc, edge: edge }, node)
66341           );
66342
66343           context.enter(modeDrawLine(context, way.id, startGraph));
66344       }
66345
66346
66347       function startFromNode(node) {
66348           var startGraph = context.graph();
66349           var way = osmWay();
66350
66351           context.perform(
66352               actionAddEntity(way),
66353               actionAddVertex(way.id, node.id)
66354           );
66355
66356           context.enter(modeDrawLine(context, way.id, startGraph));
66357       }
66358
66359
66360       mode.enter = function() {
66361           context.install(behavior);
66362       };
66363
66364
66365       mode.exit = function() {
66366           context.uninstall(behavior);
66367       };
66368
66369       return mode;
66370   }
66371
66372   function modeAddPoint$$1(context) {
66373       var mode = {
66374           id: 'add-point',
66375           button: 'point',
66376           title: t('modes.add_point.title'),
66377           description: t('modes.add_point.description'),
66378           key: '1'
66379       };
66380
66381       var behavior = behaviorDraw(context)
66382           .tail(t('modes.add_point.tail'))
66383           .on('click', add)
66384           .on('clickWay', addWay)
66385           .on('clickNode', addNode)
66386           .on('cancel', cancel)
66387           .on('finish', cancel);
66388
66389
66390       function add(loc) {
66391           var node = osmNode({ loc: loc });
66392
66393           context.perform(
66394               actionAddEntity(node),
66395               t('operations.add.annotation.point')
66396           );
66397
66398           context.enter(
66399               modeSelect(context, [node.id]).newFeature(true)
66400           );
66401       }
66402
66403
66404       function addWay(loc, edge) {
66405           var node =  osmNode();
66406
66407           context.perform(
66408               actionAddMidpoint({loc: loc, edge: edge}, node),
66409               t('operations.add.annotation.vertex')
66410           );
66411
66412           context.enter(
66413               modeSelect(context, [node.id]).newFeature(true)
66414           );
66415       }
66416
66417
66418       function addNode(node) {
66419           add(node.loc);
66420       }
66421
66422
66423       function cancel() {
66424           context.enter(modeBrowse(context));
66425       }
66426
66427
66428       mode.enter = function() {
66429           context.install(behavior);
66430       };
66431
66432
66433       mode.exit = function() {
66434           context.uninstall(behavior);
66435       };
66436
66437
66438       return mode;
66439   }
66440
66441   function modeAddNote$$1(context) {
66442       var mode = {
66443           id: 'add-note',
66444           button: 'note',
66445           title: t('modes.add_note.title'),
66446           description: t('modes.add_note.description'),
66447           key: '4'
66448       };
66449
66450       var behavior = behaviorDraw(context)
66451           .tail(t('modes.add_note.tail'))
66452           .on('click', add)
66453           .on('cancel', cancel)
66454           .on('finish', cancel);
66455
66456
66457       function add(loc) {
66458           var osm = services.osm;
66459           if (!osm) return;
66460
66461           var note = osmNote({ loc: loc, status: 'open', comments: [] });
66462           osm.replaceNote(note);
66463
66464           // force a reraw (there is no history change that would otherwise do this)
66465           context.pan([0,0]);
66466
66467           context
66468               .selectedNoteID(note.id)
66469               .enter(modeSelectNote$$1(context, note.id).newFeature(true));
66470       }
66471
66472
66473       function cancel() {
66474           context.enter(modeBrowse(context));
66475       }
66476
66477
66478       mode.enter = function() {
66479           context.install(behavior);
66480       };
66481
66482
66483       mode.exit = function() {
66484           context.uninstall(behavior);
66485       };
66486
66487
66488       return mode;
66489   }
66490
66491   function modeDrawArea(context, wayId, startGraph) {
66492       var mode = {
66493           button: 'area',
66494           id: 'draw-area'
66495       };
66496
66497       var behavior;
66498
66499
66500       mode.enter = function() {
66501           var way = context.entity(wayId);
66502
66503           behavior = behaviorDrawWay(context, wayId, undefined, mode, startGraph)
66504               .tail(t('modes.draw_area.tail'));
66505
66506           var addNode = behavior.addNode;
66507
66508           behavior.addNode = function(node, d) {
66509               var length = way.nodes.length;
66510               var penultimate = length > 2 ? way.nodes[length - 2] : null;
66511
66512               if (node.id === way.first() || node.id === penultimate) {
66513                   behavior.finish();
66514               } else {
66515                   addNode(node, d);
66516               }
66517           };
66518
66519           context.install(behavior);
66520       };
66521
66522
66523       mode.exit = function() {
66524           context.uninstall(behavior);
66525       };
66526
66527
66528       mode.selectedIDs = function() {
66529           return [wayId];
66530       };
66531
66532
66533       mode.activeID = function() {
66534           return (behavior && behavior.activeID()) || [];
66535       };
66536
66537
66538       return mode;
66539   }
66540
66541   function modeDrawLine(context, wayID, startGraph, affix) {
66542       var mode = {
66543           button: 'line',
66544           id: 'draw-line'
66545       };
66546
66547       var behavior;
66548
66549
66550       mode.enter = function() {
66551           var way = context.entity(wayID);
66552           var index = (affix === 'prefix') ? 0 : undefined;
66553           var headID = (affix === 'prefix') ? way.first() : way.last();
66554
66555           behavior = behaviorDrawWay(context, wayID, index, mode, startGraph)
66556               .tail(t('modes.draw_line.tail'));
66557
66558           var addNode = behavior.addNode;
66559           behavior.addNode = function(node, d) {
66560               if (node.id === headID) {
66561                   behavior.finish();
66562               } else {
66563                   addNode(node, d);
66564               }
66565           };
66566
66567           context.install(behavior);
66568       };
66569
66570
66571       mode.exit = function() {
66572           context.uninstall(behavior);
66573       };
66574
66575
66576       mode.selectedIDs = function() {
66577           return [wayID];
66578       };
66579
66580
66581       mode.activeID = function() {
66582           return (behavior && behavior.activeID()) || [];
66583       };
66584
66585       return mode;
66586   }
66587
66588   function modeMove$$1(context, entityIDs, baseGraph) {
66589       var mode = {
66590           id: 'move',
66591           button: 'browse'
66592       };
66593
66594       var keybinding = utilKeybinding('move');
66595       var behaviors = [
66596           behaviorEdit(context),
66597           operationCircularize(entityIDs, context).behavior,
66598           operationDelete(entityIDs, context).behavior,
66599           operationOrthogonalize(entityIDs, context).behavior,
66600           operationReflectLong(entityIDs, context).behavior,
66601           operationReflectShort(entityIDs, context).behavior,
66602           operationRotate(entityIDs, context).behavior
66603       ];
66604       var annotation = entityIDs.length === 1 ?
66605           t('operations.move.annotation.' + context.geometry(entityIDs[0])) :
66606           t('operations.move.annotation.multiple');
66607
66608       var _prevGraph;
66609       var _cache;
66610       var _origin;
66611       var _nudgeInterval;
66612
66613
66614       function doMove(nudge) {
66615           nudge = nudge || [0, 0];
66616
66617           var fn;
66618           if (_prevGraph !== context.graph()) {
66619               _cache = {};
66620               _origin = context.map().mouseCoordinates();
66621               fn = context.perform;
66622           } else {
66623               fn = context.overwrite;
66624           }
66625
66626           var currMouse = context.mouse();
66627           var origMouse = context.projection(_origin);
66628           var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge);
66629
66630           fn(actionMove(entityIDs, delta, context.projection, _cache), annotation);
66631           _prevGraph = context.graph();
66632       }
66633
66634
66635       function startNudge(nudge) {
66636           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
66637           _nudgeInterval = window.setInterval(function() {
66638               context.pan(nudge);
66639               doMove(nudge);
66640           }, 50);
66641       }
66642
66643
66644       function stopNudge() {
66645           if (_nudgeInterval) {
66646               window.clearInterval(_nudgeInterval);
66647               _nudgeInterval = null;
66648           }
66649       }
66650
66651
66652       function move() {
66653           doMove();
66654           var nudge = geoViewportEdge(context.mouse(), context.map().dimensions());
66655           if (nudge) {
66656               startNudge(nudge);
66657           } else {
66658               stopNudge();
66659           }
66660       }
66661
66662
66663       function finish() {
66664           event.stopPropagation();
66665           context.enter(modeSelect(context, entityIDs));
66666           stopNudge();
66667       }
66668
66669
66670       function cancel() {
66671           if (baseGraph) {
66672               while (context.graph() !== baseGraph) context.pop();
66673               context.enter(modeBrowse(context));
66674           } else {
66675               context.pop();
66676               context.enter(modeSelect(context, entityIDs));
66677           }
66678           stopNudge();
66679       }
66680
66681
66682       function undone() {
66683           context.enter(modeBrowse(context));
66684       }
66685
66686
66687       mode.enter = function() {
66688           _origin = context.map().mouseCoordinates();
66689           _prevGraph = null;
66690           _cache = {};
66691
66692           behaviors.forEach(function(behavior) {
66693               context.install(behavior);
66694           });
66695
66696           context.surface()
66697               .on('mousemove.move', move)
66698               .on('click.move', finish);
66699
66700           context.history()
66701               .on('undone.move', undone);
66702
66703           keybinding
66704               .on('⎋', cancel)
66705               .on('↩', finish);
66706
66707           select(document)
66708               .call(keybinding);
66709       };
66710
66711
66712       mode.exit = function() {
66713           stopNudge();
66714
66715           behaviors.forEach(function(behavior) {
66716               context.uninstall(behavior);
66717           });
66718
66719           context.surface()
66720               .on('mousemove.move', null)
66721               .on('click.move', null);
66722
66723           context.history()
66724               .on('undone.move', null);
66725
66726           select(document)
66727               .call(keybinding.unbind);
66728       };
66729
66730
66731       mode.selectedIDs = function() {
66732           if (!arguments.length) return entityIDs;
66733           // no assign
66734           return mode;
66735       };
66736
66737
66738       return mode;
66739   }
66740
66741   function modeRotate$$1(context, entityIDs) {
66742       var mode = {
66743           id: 'rotate',
66744           button: 'browse'
66745       };
66746
66747       var keybinding = utilKeybinding('rotate');
66748       var behaviors = [
66749           behaviorEdit(context),
66750           operationCircularize(entityIDs, context).behavior,
66751           operationDelete(entityIDs, context).behavior,
66752           operationMove(entityIDs, context).behavior,
66753           operationOrthogonalize(entityIDs, context).behavior,
66754           operationReflectLong(entityIDs, context).behavior,
66755           operationReflectShort(entityIDs, context).behavior
66756       ];
66757       var annotation = entityIDs.length === 1 ?
66758           t('operations.rotate.annotation.' + context.geometry(entityIDs[0])) :
66759           t('operations.rotate.annotation.multiple');
66760
66761       var _prevGraph;
66762       var _prevAngle;
66763       var _prevTransform;
66764       var _pivot;
66765
66766
66767       function doRotate() {
66768           var fn;
66769           if (context.graph() !== _prevGraph) {
66770               fn = context.perform;
66771           } else {
66772               fn = context.replace;
66773           }
66774
66775           // projection changed, recalculate _pivot
66776           var projection = context.projection;
66777           var currTransform = projection.transform();
66778           if (!_prevTransform ||
66779               currTransform.k !== _prevTransform.k ||
66780               currTransform.x !== _prevTransform.x ||
66781               currTransform.y !== _prevTransform.y) {
66782
66783               var nodes = utilGetAllNodes(entityIDs, context.graph());
66784               var points = nodes.map(function(n) { return projection(n.loc); });
66785
66786               if (points.length === 1) {  // degenerate case
66787                   _pivot = points[0];
66788               } else if (points.length === 2) {
66789                   _pivot = geoVecInterp(points[0], points[1], 0.5);
66790               } else {
66791                   _pivot = d3_polygonCentroid(d3_polygonHull(points));
66792               }
66793               _prevAngle = undefined;
66794           }
66795
66796
66797           var currMouse = context.mouse();
66798           var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]);
66799
66800           if (typeof _prevAngle === 'undefined') _prevAngle = currAngle;
66801           var delta = currAngle - _prevAngle;
66802
66803           fn(actionRotate(entityIDs, _pivot, delta, projection), annotation);
66804
66805           _prevTransform = currTransform;
66806           _prevAngle = currAngle;
66807           _prevGraph = context.graph();
66808       }
66809
66810
66811       function finish() {
66812           event.stopPropagation();
66813           context.enter(modeSelect(context, entityIDs));
66814       }
66815
66816
66817       function cancel() {
66818           context.pop();
66819           context.enter(modeSelect(context, entityIDs));
66820       }
66821
66822
66823       function undone() {
66824           context.enter(modeBrowse(context));
66825       }
66826
66827
66828       mode.enter = function() {
66829           behaviors.forEach(context.install);
66830
66831           context.surface()
66832               .on('mousemove.rotate', doRotate)
66833               .on('click.rotate', finish);
66834
66835           context.history()
66836               .on('undone.rotate', undone);
66837
66838           keybinding
66839               .on('⎋', cancel)
66840               .on('↩', finish);
66841
66842           select(document)
66843               .call(keybinding);
66844       };
66845
66846
66847       mode.exit = function() {
66848           behaviors.forEach(context.uninstall);
66849
66850           context.surface()
66851               .on('mousemove.rotate', null)
66852               .on('click.rotate', null);
66853
66854           context.history()
66855               .on('undone.rotate', null);
66856
66857           select(document)
66858               .call(keybinding.unbind);
66859       };
66860
66861
66862       mode.selectedIDs = function() {
66863           if (!arguments.length) return entityIDs;
66864           // no assign
66865           return mode;
66866       };
66867
66868
66869       return mode;
66870   }
66871
66872   var _isSaving = false;
66873
66874
66875   function modeSave$$1(context) {
66876       var mode = { id: 'save' };
66877       var keybinding = utilKeybinding('modeSave');
66878
66879       var loading = uiLoading(context)
66880           .message(t('save.uploading'))
66881           .blocking(true);
66882
66883       var commit = uiCommit(context)
66884           .on('cancel', cancel)
66885           .on('save', save);
66886
66887       var _toCheck = [];
66888       var _toLoad = [];
66889       var _loaded = {};
66890       var _toLoadCount = 0;
66891       var _toLoadTotal = 0;
66892
66893       var _conflicts = [];
66894       var _errors = [];
66895       var _origChanges;
66896       var _location;
66897
66898
66899       function cancel(selectedID) {
66900           if (selectedID) {
66901               context.enter(modeSelect(context, [selectedID]));
66902           } else {
66903               context.enter(modeBrowse(context));
66904           }
66905       }
66906
66907
66908       function save(changeset, tryAgain, checkConflicts) {
66909           // Guard against accidentally entering save code twice - #4641
66910           if (_isSaving && !tryAgain) {
66911               return;
66912           }
66913
66914           var osm = context.connection();
66915           if (!osm) {
66916               cancel();
66917               return;
66918           }
66919
66920           // If user somehow got logged out mid-save, try to reauthenticate..
66921           // This can happen if they were logged in from before, but the tokens are no longer valid.
66922           if (!osm.authenticated()) {
66923               osm.authenticate(function(err) {
66924                   if (err) {
66925                       cancel();   // quit save mode..
66926                   } else {
66927                       save(changeset, tryAgain, checkConflicts);  // continue where we left off..
66928                   }
66929               });
66930               return;
66931           }
66932
66933           if (!_isSaving) {
66934               keybindingOff();
66935               context.container().call(loading);  // block input
66936               _isSaving = true;
66937           }
66938
66939           var history = context.history();
66940           var localGraph = context.graph();
66941           var remoteGraph = coreGraph$$1(history.base(), true);
66942
66943           _conflicts = [];
66944           _errors = [];
66945
66946           // Store original changes, in case user wants to download them as an .osc file
66947           _origChanges = history.changes(actionDiscardTags(history.difference()));
66948
66949           // First time, `history.perform` a no-op action.
66950           // Any conflict resolutions will be done as `history.replace`
66951           if (!tryAgain) {
66952               history.perform(actionNoop());
66953           }
66954
66955           // Attempt a fast upload.. If there are conflicts, re-enter with `checkConflicts = true`
66956           if (!checkConflicts) {
66957               upload(changeset);
66958
66959           // Do the full (slow) conflict check..
66960           } else {
66961               var modified = filter(history.difference().summary(), { changeType: 'modified' });
66962               _toCheck = map$3(map$3(modified, 'entity'), 'id');
66963               _toLoad = withChildNodes(_toCheck, localGraph);
66964               _loaded = {};
66965               _toLoadCount = 0;
66966               _toLoadTotal = _toLoad.length;
66967
66968               if (_toCheck.length) {
66969                   showProgress(_toLoadCount, _toLoadTotal);
66970                   _toLoad.forEach(function(id) { _loaded[id] = false; });
66971                   osm.loadMultiple(_toLoad, loaded);
66972               } else {
66973                   upload(changeset);
66974               }
66975           }
66976
66977           return;
66978
66979
66980           function withChildNodes(ids, graph) {
66981               return uniq(reduce(ids, function(result, id) {
66982                   var entity = graph.entity(id);
66983                   if (entity.type === 'way') {
66984                       try {
66985                           var children = graph.childNodes(entity);
66986                           result.push.apply(result, map$3(filter(children, 'version'), 'id'));
66987                       } catch (err) {
66988                           /* eslint-disable no-console */
66989                           if (typeof console !== 'undefined') console.error(err);
66990                           /* eslint-enable no-console */
66991                       }
66992                   }
66993                   return result;
66994               }, clone(ids)));
66995           }
66996
66997
66998           // Reload modified entities into an alternate graph and check for conflicts..
66999           function loaded(err, result) {
67000               if (_errors.length) return;
67001
67002               if (err) {
67003                   _errors.push({
67004                       msg: err.message || err.responseText,
67005                       details: [ t('save.status_code', { code: err.status }) ]
67006                   });
67007                   showErrors();
67008
67009               } else {
67010                   var loadMore = [];
67011
67012                   result.data.forEach(function(entity) {
67013                       remoteGraph.replace(entity);
67014                       _loaded[entity.id] = true;
67015                       _toLoad = without(_toLoad, entity.id);
67016
67017                       if (!entity.visible) return;
67018
67019                       // Because loadMultiple doesn't download /full like loadEntity,
67020                       // need to also load children that aren't already being checked..
67021                       var i, id;
67022                       if (entity.type === 'way') {
67023                           for (i = 0; i < entity.nodes.length; i++) {
67024                               id = entity.nodes[i];
67025                               if (_loaded[id] === undefined) {
67026                                   _loaded[id] = false;
67027                                   loadMore.push(id);
67028                               }
67029                           }
67030                       } else if (entity.type === 'relation' && entity.isMultipolygon()) {
67031                           for (i = 0; i < entity.members.length; i++) {
67032                               id = entity.members[i].id;
67033                               if (_loaded[id] === undefined) {
67034                                   _loaded[id] = false;
67035                                   loadMore.push(id);
67036                               }
67037                           }
67038                       }
67039                   });
67040
67041                   _toLoadCount += result.data.length;
67042                   _toLoadTotal += loadMore.length;
67043                   showProgress(_toLoadCount, _toLoadTotal);
67044
67045                   if (loadMore.length) {
67046                       _toLoad.push.apply(_toLoad, loadMore);
67047                       osm.loadMultiple(loadMore, loaded);
67048                   }
67049
67050                   if (!_toLoad.length) {
67051                       detectConflicts();
67052                   }
67053               }
67054           }
67055
67056
67057           function detectConflicts() {
67058               function choice(id, text, action) {
67059                   return { id: id, text: text, action: function() { history.replace(action); } };
67060               }
67061               function formatUser(d) {
67062                   return '<a href="' + osm.userURL(d) + '" target="_blank">' + d + '</a>';
67063               }
67064               function entityName(entity) {
67065                   return utilDisplayName(entity) || (utilDisplayType(entity.id) + ' ' + entity.id);
67066               }
67067
67068               function sameVersions(local$$1, remote) {
67069                   if (local$$1.version !== remote.version) return false;
67070
67071                   if (local$$1.type === 'way') {
67072                       var children = union(local$$1.nodes, remote.nodes);
67073                       for (var i = 0; i < children.length; i++) {
67074                           var a = localGraph.hasEntity(children[i]);
67075                           var b = remoteGraph.hasEntity(children[i]);
67076                           if (a && b && a.version !== b.version) return false;
67077                       }
67078                   }
67079
67080                   return true;
67081               }
67082
67083               _toCheck.forEach(function(id) {
67084                   var local$$1 = localGraph.entity(id);
67085                   var remote = remoteGraph.entity(id);
67086
67087                   if (sameVersions(local$$1, remote)) return;
67088
67089                   var action = actionMergeRemoteChanges;
67090                   var merge = action(id, localGraph, remoteGraph, formatUser);
67091
67092                   history.replace(merge);
67093
67094                   var mergeConflicts = merge.conflicts();
67095                   if (!mergeConflicts.length) return;  // merged safely
67096
67097                   var forceLocal = action(id, localGraph, remoteGraph).withOption('force_local');
67098                   var forceRemote = action(id, localGraph, remoteGraph).withOption('force_remote');
67099                   var keepMine = t('save.conflict.' + (remote.visible ? 'keep_local' : 'restore'));
67100                   var keepTheirs = t('save.conflict.' + (remote.visible ? 'keep_remote' : 'delete'));
67101
67102                   _conflicts.push({
67103                       id: id,
67104                       name: entityName(local$$1),
67105                       details: mergeConflicts,
67106                       chosen: 1,
67107                       choices: [
67108                           choice(id, keepMine, forceLocal),
67109                           choice(id, keepTheirs, forceRemote)
67110                       ]
67111                   });
67112               });
67113
67114               upload(changeset);
67115           }
67116       }
67117
67118
67119       function upload(changeset) {
67120           var osm = context.connection();
67121           if (!osm) {
67122               _errors.push({ msg: 'No OSM Service' });
67123           }
67124
67125           if (_conflicts.length) {
67126               _conflicts.sort(function(a, b) { return b.id.localeCompare(a.id); });
67127               showConflicts(changeset);
67128
67129           } else if (_errors.length) {
67130               showErrors();
67131
67132           } else {
67133               var history = context.history();
67134               var changes = history.changes(actionDiscardTags(history.difference()));
67135               if (changes.modified.length || changes.created.length || changes.deleted.length) {
67136                   loadLocation();  // so it is ready when we display the save screen
67137                   osm.putChangeset(changeset, changes, uploadCallback);
67138               } else {        // changes were insignificant or reverted by user
67139                   select('.inspector-wrap *').remove();
67140                   loading.close();
67141                   _isSaving = false;
67142                   context.flush();
67143                   cancel();
67144               }
67145           }
67146       }
67147
67148
67149       function uploadCallback(err, changeset) {
67150           if (err) {
67151               if (err.status === 409) {          // 409 Conflict
67152                   save(changeset, true, true);   // tryAgain = true, checkConflicts = true
67153               } else {
67154                   _errors.push({
67155                       msg: err.message || err.responseText,
67156                       details: [ t('save.status_code', { code: err.status }) ]
67157                   });
67158                   showErrors();
67159               }
67160
67161           } else {
67162               context.history().clearSaved();
67163               success(changeset);
67164               // Add delay to allow for postgres replication #1646 #2678
67165               window.setTimeout(function() {
67166                   select('.inspector-wrap *').remove();
67167                   loading.close();
67168                   _isSaving = false;
67169                   context.flush();
67170               }, 2500);
67171           }
67172       }
67173
67174
67175       function showProgress(num, total) {
67176           var modal = context.container().select('.loading-modal .modal-section');
67177           var progress = modal.selectAll('.progress')
67178               .data([0]);
67179
67180           // enter/update
67181           progress.enter()
67182               .append('div')
67183               .attr('class', 'progress')
67184               .merge(progress)
67185               .text(t('save.conflict_progress', { num: num, total: total }));
67186       }
67187
67188
67189       function showConflicts(changeset) {
67190           var history = context.history();
67191           var selection$$1 = context.container()
67192               .select('#sidebar')
67193               .append('div')
67194               .attr('class','sidebar-component');
67195
67196           loading.close();
67197           _isSaving = false;
67198
67199           var ui = uiConflicts(context)
67200               .conflictList(_conflicts)
67201               .origChanges(_origChanges)
67202               .on('cancel', function() {
67203                   history.pop();
67204                   selection$$1.remove();
67205                   keybindingOn();
67206               })
67207               .on('save', function() {
67208                   for (var i = 0; i < _conflicts.length; i++) {
67209                       if (_conflicts[i].chosen === 1) {  // user chose "keep theirs"
67210                           var entity = context.hasEntity(_conflicts[i].id);
67211                           if (entity && entity.type === 'way') {
67212                               var children = uniq(entity.nodes);
67213                               for (var j = 0; j < children.length; j++) {
67214                                   history.replace(actionRevert(children[j]));
67215                               }
67216                           }
67217                           history.replace(actionRevert(_conflicts[i].id));
67218                       }
67219                   }
67220
67221                   selection$$1.remove();
67222                   save(changeset, true, false);  // tryAgain = true, checkConflicts = false
67223               });
67224
67225           selection$$1.call(ui);
67226       }
67227
67228
67229       function showErrors() {
67230           keybindingOn();
67231           context.history().pop();
67232           loading.close();
67233           _isSaving = false;
67234
67235           var selection$$1 = uiConfirm(context.container());
67236           selection$$1
67237               .select('.modal-section.header')
67238               .append('h3')
67239               .text(t('save.error'));
67240
67241           addErrors(selection$$1, _errors);
67242           selection$$1.okButton();
67243       }
67244
67245
67246       function addErrors(selection$$1, data) {
67247           var message = selection$$1
67248               .select('.modal-section.message-text');
67249
67250           var items = message
67251               .selectAll('.error-container')
67252               .data(data);
67253
67254           var enter = items.enter()
67255               .append('div')
67256               .attr('class', 'error-container');
67257
67258           enter
67259               .append('a')
67260               .attr('class', 'error-description')
67261               .attr('href', '#')
67262               .classed('hide-toggle', true)
67263               .text(function(d) { return d.msg || t('save.unknown_error_details'); })
67264               .on('click', function() {
67265                   event.preventDefault();
67266
67267                   var error = select(this);
67268                   var detail = select(this.nextElementSibling);
67269                   var exp = error.classed('expanded');
67270
67271                   detail.style('display', exp ? 'none' : 'block');
67272                   error.classed('expanded', !exp);
67273               });
67274
67275           var details = enter
67276               .append('div')
67277               .attr('class', 'error-detail-container')
67278               .style('display', 'none');
67279
67280           details
67281               .append('ul')
67282               .attr('class', 'error-detail-list')
67283               .selectAll('li')
67284               .data(function(d) { return d.details || []; })
67285               .enter()
67286               .append('li')
67287               .attr('class', 'error-detail-item')
67288               .text(function(d) { return d; });
67289
67290           items.exit()
67291               .remove();
67292       }
67293
67294
67295       function success(changeset) {
67296           commit.reset();
67297
67298           var ui = uiSuccess$$1(context)
67299               .changeset(changeset)
67300               .location(_location)
67301               .on('cancel', function() { context.ui().sidebar.hide(); });
67302
67303           context.enter(modeBrowse(context).sidebar(ui));
67304       }
67305
67306
67307       function keybindingOn() {
67308           select(document)
67309               .call(keybinding.on('⎋', cancel, true));
67310       }
67311
67312
67313       function keybindingOff() {
67314           select(document)
67315               .call(keybinding.unbind);
67316       }
67317
67318
67319       // Reverse geocode current map location so we can display a message on
67320       // the success screen like "Thank you for editing around city, state."
67321       function loadLocation() {
67322           _location = null;
67323           if (!services.geocoder) return;
67324
67325           services.geocoder.reverse(context.map().center(), function(err, result) {
67326               if (err || !result || !result.address) return;
67327
67328               var parts = [];
67329               var addr = result.address;
67330               var city = addr && (addr.town || addr.city || addr.county);
67331               if (city) parts.push(city);
67332               var region = addr && (addr.state || addr.country);
67333               if (region) parts.push(region);
67334
67335               _location = parts.join(', ');
67336           });
67337       }
67338
67339
67340       mode.enter = function() {
67341           // Show sidebar
67342           context.ui().sidebar.expand();
67343
67344           function done() {
67345               context.ui().sidebar.show(commit);
67346           }
67347
67348           keybindingOn();
67349
67350           context.container().selectAll('#content')
67351               .attr('class', 'inactive');
67352
67353           var osm = context.connection();
67354           if (!osm) {
67355               cancel();
67356               return;
67357           }
67358
67359           if (osm.authenticated()) {
67360               done();
67361           } else {
67362               osm.authenticate(function(err) {
67363                   if (err) {
67364                       cancel();
67365                   } else {
67366                       done();
67367                   }
67368               });
67369           }
67370       };
67371
67372
67373       mode.exit = function() {
67374           _isSaving = false;
67375
67376           keybindingOff();
67377
67378           context.container().selectAll('#content')
67379               .attr('class', 'active');
67380
67381           context.ui().sidebar.hide();
67382       };
67383
67384       return mode;
67385   }
67386
67387   var _relatedParent;
67388
67389
67390   function modeSelect(context, selectedIDs) {
67391       var mode = {
67392           id: 'select',
67393           button: 'browse'
67394       };
67395
67396       var keybinding = utilKeybinding('select');
67397       var timeout = null;
67398       var behaviors = [
67399           behaviorCopy(context),
67400           behaviorPaste(context),
67401           behaviorBreathe(context),
67402           behaviorHover(context),
67403           behaviorSelect(context),
67404           behaviorLasso(context),
67405           modeDragNode$$1(context).restoreSelectedIDs(selectedIDs).behavior,
67406           modeDragNote$$1(context).behavior
67407       ];
67408       var editMenu;
67409       var newFeature = false;
67410       var suppressMenu = true;
67411       var follow = false;
67412
67413
67414       var wrap = context.container()
67415           .select('.inspector-wrap');
67416
67417
67418       function singular() {
67419           if (selectedIDs.length === 1) {
67420               return context.hasEntity(selectedIDs[0]);
67421           }
67422       }
67423
67424
67425       function checkSelectedIDs() {
67426           var ids = [];
67427           if (Array.isArray(selectedIDs)) {
67428               ids = selectedIDs.filter(function(id) {
67429                   return context.hasEntity(id);
67430               });
67431           }
67432
67433           if (ids.length) {
67434               selectedIDs = ids;
67435           } else {
67436               context.enter(modeBrowse(context));
67437           }
67438           return !!ids.length;
67439       }
67440
67441
67442       // find the common parent ways for nextVertex, previousVertex
67443       function commonParents() {
67444           var graph = context.graph();
67445           var commonParents = [];
67446
67447           for (var i = 0; i < selectedIDs.length; i++) {
67448               var entity = context.hasEntity(selectedIDs[i]);
67449               if (!entity || entity.geometry(graph) !== 'vertex') {
67450                   return [];  // selection includes some not vertexes
67451               }
67452
67453               var currParents = map$3(graph.parentWays(entity), 'id');
67454               if (!commonParents.length) {
67455                   commonParents = currParents;
67456                   continue;
67457               }
67458
67459               commonParents = intersection(commonParents, currParents);
67460               if (!commonParents.length) {
67461                   return [];
67462               }
67463           }
67464
67465           return commonParents;
67466       }
67467
67468
67469       function singularParent() {
67470           var parents = commonParents();
67471           if (!parents || parents.length === 0) {
67472               _relatedParent = null;
67473               return null;
67474           }
67475
67476           // relatedParent is used when we visit a vertex with multiple
67477           // parents, and we want to remember which parent line we started on.
67478
67479           if (parents.length === 1) {
67480               _relatedParent = parents[0];  // remember this parent for later
67481               return _relatedParent;
67482           }
67483
67484           if (parents.indexOf(_relatedParent) !== -1) {
67485               return _relatedParent;   // prefer the previously seen parent
67486           }
67487
67488           return parents[0];
67489       }
67490
67491
67492       function closeMenu() {
67493           if (editMenu) {
67494               context.surface().call(editMenu.close);
67495           }
67496       }
67497
67498
67499       function positionMenu() {
67500           if (!editMenu) { return; }
67501
67502           var entity = singular();
67503           if (entity && context.geometry(entity.id) === 'relation') {
67504               suppressMenu = true;
67505           } else {
67506               var point$$1 = context.mouse();
67507               var viewport = geoExtent$$1(context.projection.clipExtent()).polygon();
67508
67509               if (point$$1 && geoPointInPolygon(point$$1, viewport)) {
67510                   editMenu.center(point$$1);
67511               } else {
67512                   suppressMenu = true;
67513               }
67514           }
67515       }
67516
67517
67518       function showMenu() {
67519           closeMenu();
67520           if (editMenu) {
67521               context.surface().call(editMenu);
67522           }
67523       }
67524
67525
67526       function toggleMenu() {
67527           // deprecation warning - Radial Menu to be removed in iD v3
67528           if (select('.edit-menu, .radial-menu').empty()) {
67529               positionMenu();
67530               showMenu();
67531           } else {
67532               closeMenu();
67533           }
67534       }
67535
67536
67537       mode.selectedIDs = function() {
67538           return selectedIDs;
67539       };
67540
67541
67542       mode.zoomToSelected = function() {
67543           var entity = singular();
67544           if (entity) {
67545               context.map().zoomToEase(entity);
67546           }
67547       };
67548
67549
67550       mode.reselect = function() {
67551           if (!checkSelectedIDs()) return;
67552
67553           var surfaceNode = context.surface().node();
67554           if (surfaceNode.focus) {   // FF doesn't support it
67555               surfaceNode.focus();
67556           }
67557
67558           positionMenu();
67559           if (!suppressMenu) {
67560               showMenu();
67561           }
67562       };
67563
67564
67565       mode.newFeature = function(_) {
67566           if (!arguments.length) return newFeature;
67567           newFeature = _;
67568           return mode;
67569       };
67570
67571
67572       mode.suppressMenu = function(_) {
67573           if (!arguments.length) return suppressMenu;
67574           suppressMenu = _;
67575           return mode;
67576       };
67577
67578
67579       mode.follow = function(_) {
67580           if (!arguments.length) return follow;
67581           follow = _;
67582           return mode;
67583       };
67584
67585
67586       mode.enter = function() {
67587           if (!checkSelectedIDs()) return;
67588
67589           var operations = without(values$1(Operations), operationDelete)
67590               .map(function(o) { return o(selectedIDs, context); })
67591               .filter(function(o) { return o.available(); });
67592
67593           // deprecation warning - Radial Menu to be removed in iD v3
67594           var isRadialMenu = context.storage('edit-menu-style') === 'radial';
67595           if (isRadialMenu) {
67596               operations = operations.slice(0,7);
67597               operations.unshift(operationDelete(selectedIDs, context));
67598           } else {
67599               operations.push(operationDelete(selectedIDs, context));
67600           }
67601
67602           operations.forEach(function(operation) {
67603               if (operation.behavior) {
67604                   behaviors.push(operation.behavior);
67605               }
67606           });
67607
67608           behaviors.forEach(context.install);
67609
67610           keybinding
67611               .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
67612               .on(['[', 'pgup'], previousVertex)
67613               .on([']', 'pgdown'], nextVertex)
67614               .on(['{', uiCmd('⌘['), 'home'], firstVertex)
67615               .on(['}', uiCmd('⌘]'), 'end'], lastVertex)
67616               .on(['\\', 'pause'], nextParent)
67617               .on('⎋', esc, true)
67618               .on('space', toggleMenu);
67619
67620           select(document)
67621               .call(keybinding);
67622
67623
67624           // deprecation warning - Radial Menu to be removed in iD v3
67625           editMenu = isRadialMenu
67626               ? uiRadialMenu(context, operations)
67627               : uiEditMenu(context, operations);
67628
67629           context.ui().sidebar
67630               .select(singular() ? singular().id : null, newFeature);
67631
67632           context.history()
67633               .on('undone.select', update)
67634               .on('redone.select', update);
67635
67636           context.map()
67637               .on('move.select', closeMenu)
67638               .on('drawn.select', selectElements);
67639
67640           context.surface()
67641               .on('dblclick.select', dblclick);
67642
67643
67644           selectElements();
67645
67646           if (selectedIDs.length > 1) {
67647               var entities = uiSelectionList(context, selectedIDs);
67648               context.ui().sidebar.show(entities);
67649           }
67650
67651           if (follow) {
67652               var extent = geoExtent$$1();
67653               var graph = context.graph();
67654               selectedIDs.forEach(function(id) {
67655                   var entity = context.entity(id);
67656                   extent._extend(entity.extent(graph));
67657               });
67658
67659               var loc = extent.center();
67660               context.map().centerEase(loc);
67661           } else if (singular() && singular().type === 'way') {
67662               context.map().pan([0,0]);  // full redraw, to adjust z-sorting #2914
67663           }
67664
67665           timeout = window.setTimeout(function() {
67666               positionMenu();
67667               if (!suppressMenu) {
67668                   showMenu();
67669               }
67670           }, 270);  /* after any centerEase completes */
67671
67672
67673           function update() {
67674               closeMenu();
67675               checkSelectedIDs();
67676           }
67677
67678
67679           function dblclick() {
67680               var target = select(event.target);
67681
67682               var datum = target.datum();
67683               var entity = datum && datum.properties && datum.properties.entity;
67684               if (!entity) return;
67685
67686               if (entity instanceof osmWay && target.classed('target')) {
67687                   var choice = geoChooseEdge(context.childNodes(entity), context.mouse(), context.projection);
67688                   var prev = entity.nodes[choice.index - 1];
67689                   var next = entity.nodes[choice.index];
67690
67691                   context.perform(
67692                       actionAddMidpoint({loc: choice.loc, edge: [prev, next]}, osmNode()),
67693                       t('operations.add.annotation.vertex')
67694                   );
67695
67696                   event.preventDefault();
67697                   event.stopPropagation();
67698
67699               } else if (entity.type === 'midpoint') {
67700                   context.perform(
67701                       actionAddMidpoint({loc: entity.loc, edge: entity.edge}, osmNode()),
67702                       t('operations.add.annotation.vertex'));
67703
67704                   event.preventDefault();
67705                   event.stopPropagation();
67706               }
67707           }
67708
67709
67710           function selectElements(drawn) {
67711               if (!checkSelectedIDs()) return;
67712
67713               var surface = context.surface();
67714               var entity = singular();
67715
67716               if (entity && context.geometry(entity.id) === 'relation') {
67717                   suppressMenu = true;
67718                   return;
67719               }
67720
67721               surface.selectAll('.related')
67722                   .classed('related', false);
67723
67724               singularParent();
67725               if (_relatedParent) {
67726                   surface.selectAll(utilEntitySelector([_relatedParent]))
67727                       .classed('related', true);
67728               }
67729
67730               var selection$$1 = context.surface()
67731                   .selectAll(utilEntityOrMemberSelector(selectedIDs, context.graph()));
67732
67733               if (selection$$1.empty()) {
67734                   // Return to browse mode if selected DOM elements have
67735                   // disappeared because the user moved them out of view..
67736                   var source = event && event.type === 'zoom' && event.sourceEvent;
67737                   if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
67738                       context.enter(modeBrowse(context));
67739                   }
67740               } else {
67741                   selection$$1
67742                       .classed('selected', true);
67743               }
67744           }
67745
67746
67747           function esc() {
67748               if (select('.combobox').size()) return;
67749               context.enter(modeBrowse(context));
67750           }
67751
67752
67753           function firstVertex() {
67754               event.preventDefault();
67755               var entity = singular();
67756               var parent = singularParent();
67757               var way;
67758
67759               if (entity && entity.type === 'way') {
67760                   way = entity;
67761               } else if (parent) {
67762                   way = context.entity(parent);
67763               }
67764
67765               if (way) {
67766                   context.enter(
67767                       modeSelect(context, [way.first()]).follow(true)
67768                   );
67769               }
67770           }
67771
67772
67773           function lastVertex() {
67774               event.preventDefault();
67775               var entity = singular();
67776               var parent = singularParent();
67777               var way;
67778
67779               if (entity && entity.type === 'way') {
67780                   way = entity;
67781               } else if (parent) {
67782                   way = context.entity(parent);
67783               }
67784
67785               if (way) {
67786                   context.enter(
67787                       modeSelect(context, [way.last()]).follow(true)
67788                   );
67789               }
67790           }
67791
67792
67793           function previousVertex() {
67794               event.preventDefault();
67795               var parent = singularParent();
67796               if (!parent) return;
67797
67798               var way = context.entity(parent);
67799               var length = way.nodes.length;
67800               var curr = way.nodes.indexOf(selectedIDs[0]);
67801               var index = -1;
67802
67803               if (curr > 0) {
67804                   index = curr - 1;
67805               } else if (way.isClosed()) {
67806                   index = length - 2;
67807               }
67808
67809               if (index !== -1) {
67810                   context.enter(
67811                       modeSelect(context, [way.nodes[index]]).follow(true)
67812                   );
67813               }
67814           }
67815
67816
67817           function nextVertex() {
67818               event.preventDefault();
67819               var parent = singularParent();
67820               if (!parent) return;
67821
67822               var way = context.entity(parent);
67823               var length = way.nodes.length;
67824               var curr = way.nodes.indexOf(selectedIDs[0]);
67825               var index = -1;
67826
67827               if (curr < length - 1) {
67828                   index = curr + 1;
67829               } else if (way.isClosed()) {
67830                   index = 0;
67831               }
67832
67833               if (index !== -1) {
67834                   context.enter(
67835                       modeSelect(context, [way.nodes[index]]).follow(true)
67836                   );
67837               }
67838           }
67839
67840
67841           function nextParent() {
67842               event.preventDefault();
67843               var parents = uniq(commonParents());
67844               if (!parents || parents.length < 2) return;
67845
67846               var index = parents.indexOf(_relatedParent);
67847               if (index < 0 || index > parents.length - 2) {
67848                   _relatedParent = parents[0];
67849               } else {
67850                   _relatedParent = parents[index + 1];
67851               }
67852
67853               var surface = context.surface();
67854               surface.selectAll('.related')
67855                   .classed('related', false);
67856
67857               if (_relatedParent) {
67858                   surface.selectAll(utilEntitySelector([_relatedParent]))
67859                       .classed('related', true);
67860               }
67861           }
67862       };
67863
67864
67865       mode.exit = function() {
67866           if (timeout) window.clearTimeout(timeout);
67867
67868           behaviors.forEach(context.uninstall);
67869
67870           select(document)
67871               .call(keybinding.unbind);
67872
67873           closeMenu();
67874           editMenu = undefined;
67875
67876           context.history()
67877               .on('undone.select', null)
67878               .on('redone.select', null);
67879
67880           var surface = context.surface();
67881
67882           surface
67883               .on('dblclick.select', null);
67884
67885           surface
67886               .selectAll('.selected')
67887               .classed('selected', false);
67888
67889           surface
67890               .selectAll('.related')
67891               .classed('related', false);
67892
67893           context.map().on('drawn.select', null);
67894           context.ui().sidebar.hide();
67895       };
67896
67897
67898       return mode;
67899   }
67900
67901   function modeSelectData$$1(context, selectedDatum) {
67902       var mode = {
67903           id: 'select-data',
67904           button: 'browse'
67905       };
67906
67907       var keybinding = utilKeybinding('select-data');
67908       var dataEditor = uiDataEditor$$1(context);
67909
67910       var behaviors = [
67911           behaviorBreathe(context),
67912           behaviorHover(context),
67913           behaviorSelect(context),
67914           behaviorLasso(context),
67915           modeDragNode$$1(context).behavior,
67916           modeDragNote$$1(context).behavior
67917       ];
67918
67919
67920       // class the data as selected, or return to browse mode if the data is gone
67921       function selectData(drawn) {
67922           var selection$$1 = context.surface().selectAll('.layer-mapdata .data' + selectedDatum.__featurehash__);
67923
67924           if (selection$$1.empty()) {
67925               // Return to browse mode if selected DOM elements have
67926               // disappeared because the user moved them out of view..
67927               var source = event && event.type === 'zoom' && event.sourceEvent;
67928               if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
67929                   context.enter(modeBrowse(context));
67930               }
67931           } else {
67932               selection$$1.classed('selected', true);
67933           }
67934       }
67935
67936
67937       function esc() {
67938           if (select('.combobox').size()) return;
67939           context.enter(modeBrowse(context));
67940       }
67941
67942
67943       mode.zoomToSelected = function() {
67944           var extent = geoExtent$$1(d3_geoBounds(selectedDatum));
67945           context.map().centerZoomEase(extent.center(), context.map().trimmedExtentZoom(extent));
67946       };
67947
67948
67949       mode.enter = function() {
67950           behaviors.forEach(context.install);
67951
67952           keybinding
67953               .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
67954               .on('⎋', esc, true);
67955
67956           select(document)
67957               .call(keybinding);
67958
67959           selectData();
67960
67961           var sidebar = context.ui().sidebar;
67962           sidebar.show(dataEditor.datum(selectedDatum));
67963
67964           // expand the sidebar, avoid obscuring the data if needed
67965           var extent = geoExtent$$1(d3_geoBounds(selectedDatum));
67966           sidebar.expand(sidebar.intersects(extent));
67967
67968           context.map()
67969               .on('drawn.select-data', selectData);
67970       };
67971
67972
67973       mode.exit = function() {
67974           behaviors.forEach(context.uninstall);
67975
67976           select(document)
67977               .call(keybinding.unbind);
67978
67979           context.surface()
67980               .selectAll('.layer-mapdata .selected')
67981               .classed('selected hover', false);
67982
67983           context.map()
67984               .on('drawn.select-data', null);
67985
67986           context.ui().sidebar
67987               .hide();
67988       };
67989
67990
67991       return mode;
67992   }
67993
67994   function modeSelectError$$1(context, selectedErrorID) {
67995       var mode = {
67996           id: 'select-error',
67997           button: 'browse'
67998       };
67999
68000       var keepRight = services.keepRight;
68001       var keybinding = utilKeybinding('select-error');
68002       var keepRightEditor = uiKeepRightEditor$$1(context)
68003           .on('change', function() {
68004               context.map().pan([0,0]);  // trigger a redraw
68005               var error = checkSelectedID();
68006               if (!error) return;
68007               context.ui().sidebar
68008                   .show(keepRightEditor.error(error));
68009           });
68010
68011       var behaviors = [
68012           behaviorBreathe(context),
68013           behaviorHover(context),
68014           behaviorSelect(context),
68015           behaviorLasso(context),
68016           modeDragNode$$1(context).behavior,
68017           modeDragNote$$1(context).behavior
68018       ];
68019
68020
68021       function checkSelectedID() {
68022           if (!keepRight) return;
68023           var error = keepRight.getError(selectedErrorID);
68024           if (!error) {
68025               context.enter(modeBrowse(context));
68026           }
68027           return error;
68028       }
68029
68030
68031       mode.zoomToSelected = function() {
68032           if (!keepRight) return;
68033           var error = keepRight.getError(selectedErrorID);
68034           if (error) {
68035               context.map().centerZoomEase(error.loc, 20);
68036           }
68037       };
68038
68039
68040       mode.enter = function() {
68041           var error = checkSelectedID();
68042           if (!error) return;
68043
68044           behaviors.forEach(context.install);
68045           keybinding
68046               .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
68047               .on('⎋', esc, true);
68048
68049           select(document)
68050               .call(keybinding);
68051
68052           selectError();
68053
68054           var sidebar = context.ui().sidebar;
68055           sidebar.show(keepRightEditor.error(error));
68056
68057           context.map()
68058               .on('drawn.select-error', selectError);
68059
68060
68061           // class the error as selected, or return to browse mode if the error is gone
68062           function selectError(drawn) {
68063               if (!checkSelectedID()) return;
68064
68065               var selection$$1 = context.surface()
68066                   .selectAll('.kr_error-' + selectedErrorID);
68067
68068               if (selection$$1.empty()) {
68069                   // Return to browse mode if selected DOM elements have
68070                   // disappeared because the user moved them out of view..
68071                   var source = event && event.type === 'zoom' && event.sourceEvent;
68072                   if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
68073                       context.enter(modeBrowse(context));
68074                   }
68075
68076               } else {
68077                   selection$$1
68078                       .classed('selected', true);
68079
68080                   context.selectedErrorID(selectedErrorID);
68081               }
68082           }
68083
68084           function esc() {
68085               if (select('.combobox').size()) return;
68086               context.enter(modeBrowse(context));
68087           }
68088       };
68089
68090
68091       mode.exit = function() {
68092           behaviors.forEach(context.uninstall);
68093
68094           select(document)
68095               .call(keybinding.unbind);
68096
68097           context.surface()
68098               .selectAll('.kr_error.selected')
68099               .classed('selected hover', false);
68100
68101           context.map()
68102               .on('drawn.select-error', null);
68103
68104           context.ui().sidebar
68105               .hide();
68106
68107           context.selectedErrorID(null);
68108       };
68109
68110
68111       return mode;
68112   }
68113
68114   function modeSelectNote$$1(context, selectedNoteID) {
68115       var mode = {
68116           id: 'select-note',
68117           button: 'browse'
68118       };
68119
68120       var osm = services.osm;
68121       var keybinding = utilKeybinding('select-note');
68122       var noteEditor = uiNoteEditor$$1(context)
68123           .on('change', function() {
68124               context.map().pan([0,0]);  // trigger a redraw
68125               var note = checkSelectedID();
68126               if (!note) return;
68127               context.ui().sidebar
68128                   .show(noteEditor.note(note));
68129           });
68130
68131       var behaviors = [
68132           behaviorBreathe(context),
68133           behaviorHover(context),
68134           behaviorSelect(context),
68135           behaviorLasso(context),
68136           modeDragNode$$1(context).behavior,
68137           modeDragNote$$1(context).behavior
68138       ];
68139
68140       var newFeature = false;
68141
68142
68143       function checkSelectedID() {
68144           if (!osm) return;
68145           var note = osm.getNote(selectedNoteID);
68146           if (!note) {
68147               context.enter(modeBrowse(context));
68148           }
68149           return note;
68150       }
68151
68152
68153       // class the note as selected, or return to browse mode if the note is gone
68154       function selectNote(drawn) {
68155           if (!checkSelectedID()) return;
68156
68157           var selection$$1 = context.surface().selectAll('.layer-notes .note-' + selectedNoteID);
68158
68159           if (selection$$1.empty()) {
68160               // Return to browse mode if selected DOM elements have
68161               // disappeared because the user moved them out of view..
68162               var source = event && event.type === 'zoom' && event.sourceEvent;
68163               if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
68164                   context.enter(modeBrowse(context));
68165               }
68166
68167           } else {
68168               selection$$1
68169                   .classed('selected', true);
68170
68171               context.selectedNoteID(selectedNoteID);
68172           }
68173       }
68174
68175
68176       function esc() {
68177           if (select('.combobox').size()) return;
68178           context.enter(modeBrowse(context));
68179       }
68180
68181
68182       mode.zoomToSelected = function() {
68183           if (!osm) return;
68184           var note = osm.getNote(selectedNoteID);
68185           if (note) {
68186               context.map().centerZoomEase(note.loc, 20);
68187           }
68188       };
68189
68190
68191       mode.newFeature = function(val) {
68192           if (!arguments.length) return newFeature;
68193           newFeature = val;
68194           return mode;
68195       };
68196
68197
68198       mode.enter = function() {
68199           var note = checkSelectedID();
68200           if (!note) return;
68201
68202           behaviors.forEach(context.install);
68203
68204           keybinding
68205               .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
68206               .on('⎋', esc, true);
68207
68208           select(document)
68209               .call(keybinding);
68210
68211           selectNote();
68212
68213           var sidebar = context.ui().sidebar;
68214           sidebar.show(noteEditor.note(note));
68215
68216           // expand the sidebar, avoid obscuring the note if needed
68217           sidebar.expand(sidebar.intersects(note.extent()));
68218
68219           context.map()
68220               .on('drawn.select', selectNote);
68221       };
68222
68223
68224       mode.exit = function() {
68225           behaviors.forEach(context.uninstall);
68226
68227           select(document)
68228               .call(keybinding.unbind);
68229
68230           context.surface()
68231               .selectAll('.layer-notes .selected')
68232               .classed('selected hover', false);
68233
68234           context.map()
68235               .on('drawn.select', null);
68236
68237           context.ui().sidebar
68238               .hide();
68239
68240           context.selectedNoteID(null);
68241       };
68242
68243
68244       return mode;
68245   }
68246
68247   var _keepRightEnabled = false;
68248   var _keepRightService;
68249
68250
68251   function svgKeepRight$$1(projection, context, dispatch) {
68252       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
68253       var minZoom = 12;
68254       var touchLayer = select(null);
68255       var drawLayer = select(null);
68256       var _keepRightVisible = false;
68257
68258
68259       function markerPath(selection$$1, klass) {
68260           selection$$1
68261               .attr('class', klass)
68262               .attr('transform', 'translate(-4, -24)')
68263               .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');
68264       }
68265
68266
68267       // Loosely-coupled keepRight service for fetching errors.
68268       function getService() {
68269           if (services.keepRight && !_keepRightService) {
68270               _keepRightService = services.keepRight;
68271               _keepRightService.on('loaded', throttledRedraw);
68272           } else if (!services.keepRight && _keepRightService) {
68273               _keepRightService = null;
68274           }
68275
68276           return _keepRightService;
68277       }
68278
68279
68280       // Show the errors
68281       function editOn() {
68282           if (!_keepRightVisible) {
68283               _keepRightVisible = true;
68284               drawLayer
68285                   .style('display', 'block');
68286           }
68287       }
68288
68289
68290       // Immediately remove the errors and their touch targets
68291       function editOff() {
68292           if (_keepRightVisible) {
68293               _keepRightVisible = false;
68294               drawLayer
68295                   .style('display', 'none');
68296               drawLayer.selectAll('.kr_error')
68297                   .remove();
68298               touchLayer.selectAll('.kr_error')
68299                   .remove();
68300           }
68301       }
68302
68303
68304       // Enable the layer.  This shows the errors and transitions them to visible.
68305       function layerOn() {
68306           editOn();
68307
68308           drawLayer
68309               .style('opacity', 0)
68310               .transition()
68311               .duration(250)
68312               .style('opacity', 1)
68313               .on('end interrupt', function () {
68314                   dispatch.call('change');
68315               });
68316       }
68317
68318
68319       // Disable the layer.  This transitions the layer invisible and then hides the errors.
68320       function layerOff() {
68321           throttledRedraw.cancel();
68322           drawLayer.interrupt();
68323           touchLayer.selectAll('.kr_error')
68324               .remove();
68325
68326           drawLayer
68327               .transition()
68328               .duration(250)
68329               .style('opacity', 0)
68330               .on('end interrupt', function () {
68331                   editOff();
68332                   dispatch.call('change');
68333               });
68334       }
68335
68336
68337       // Update the error markers
68338       function updateMarkers() {
68339           if (!_keepRightVisible || !_keepRightEnabled) return;
68340
68341           var service = getService();
68342           var selectedID = context.selectedErrorID();
68343           var data = (service ? service.getErrors(projection) : []);
68344           var getTransform = svgPointTransform(projection);
68345
68346           // Draw markers..
68347           var markers = drawLayer.selectAll('.kr_error')
68348               .data(data, function(d) { return d.id; });
68349
68350           // exit
68351           markers.exit()
68352               .remove();
68353
68354           // enter
68355           var markersEnter = markers.enter()
68356               .append('g')
68357               .attr('class', function(d) {
68358                   return 'kr_error kr_error-' + d.id + ' kr_error_type_' + d.parent_error_type; }
68359               );
68360
68361           markersEnter
68362               .append('ellipse')
68363               .attr('cx', 0.5)
68364               .attr('cy', 1)
68365               .attr('rx', 6.5)
68366               .attr('ry', 3)
68367               .attr('class', 'stroke');
68368
68369           markersEnter
68370               .append('path')
68371               .call(markerPath, 'shadow');
68372
68373           markersEnter
68374               .append('use')
68375               .attr('class', 'kr_error-fill')
68376               .attr('width', '20px')
68377               .attr('height', '20px')
68378               .attr('x', '-8px')
68379               .attr('y', '-22px')
68380               .attr('xlink:href', '#iD-icon-bolt');
68381
68382           // update
68383           markers
68384               .merge(markersEnter)
68385               .sort(sortY)
68386               .classed('selected', function(d) { return d.id === selectedID; })
68387               .attr('transform', getTransform);
68388
68389
68390           // Draw targets..
68391           if (touchLayer.empty()) return;
68392           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
68393
68394           var targets = touchLayer.selectAll('.kr_error')
68395               .data(data, function(d) { return d.id; });
68396
68397           // exit
68398           targets.exit()
68399               .remove();
68400
68401           // enter/update
68402           targets.enter()
68403               .append('rect')
68404               .attr('width', '20px')
68405               .attr('height', '20px')
68406               .attr('x', '-8px')
68407               .attr('y', '-22px')
68408               .merge(targets)
68409               .sort(sortY)
68410               .attr('class', function(d) {
68411                   return 'kr_error target kr_error-' + d.id + ' ' + fillClass;
68412               })
68413               .attr('transform', getTransform);
68414
68415
68416           function sortY(a, b) {
68417               return (a.id === selectedID) ? 1
68418                   : (b.id === selectedID) ? -1
68419                   : (a.severity === 'error' && b.severity !== 'error') ? 1
68420                   : (b.severity === 'error' && a.severity !== 'error') ? -1
68421                   : b.loc[1] - a.loc[1];
68422           }
68423       }
68424
68425
68426       // Draw the keepRight layer and schedule loading errors and updating markers.
68427       function drawKeepRight(selection$$1) {
68428           var service = getService();
68429
68430           var surface = context.surface();
68431           if (surface && !surface.empty()) {
68432               touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
68433           }
68434
68435           drawLayer = selection$$1.selectAll('.layer-keepRight')
68436               .data(service ? [0] : []);
68437
68438           drawLayer.exit()
68439               .remove();
68440
68441           drawLayer = drawLayer.enter()
68442               .append('g')
68443               .attr('class', 'layer-keepRight')
68444               .style('display', _keepRightEnabled ? 'block' : 'none')
68445               .merge(drawLayer);
68446
68447           if (_keepRightEnabled) {
68448               if (service && ~~context.map().zoom() >= minZoom) {
68449                   editOn();
68450                   service.loadErrors(projection);
68451                   updateMarkers();
68452               } else {
68453                   editOff();
68454               }
68455           }
68456       }
68457
68458
68459       // Toggles the layer on and off
68460       drawKeepRight.enabled = function(val) {
68461           if (!arguments.length) return _keepRightEnabled;
68462
68463           _keepRightEnabled = val;
68464           if (_keepRightEnabled) {
68465               layerOn();
68466           } else {
68467               layerOff();
68468               if (context.selectedErrorID()) {
68469                   context.enter(modeBrowse(context));
68470               }
68471           }
68472
68473           dispatch.call('change');
68474           return this;
68475       };
68476
68477
68478       drawKeepRight.supported = function() {
68479           return !!getService();
68480       };
68481
68482
68483       return drawKeepRight;
68484   }
68485
68486   // Touch targets control which other vertices we can drag a vertex onto.
68487   //
68488   // - the activeID - nope
68489   // - 1 away (adjacent) to the activeID - yes (vertices will be merged)
68490   // - 2 away from the activeID - nope (would create a self intersecting segment)
68491   // - all others on a linear way - yes
68492   // - all others on a closed way - nope (would create a self intersecting polygon)
68493   //
68494   // returns
68495   // 0 = active vertex - no touch/connect
68496   // 1 = passive vertex - yes touch/connect
68497   // 2 = adjacent vertex - yes but pay attention segmenting a line here
68498   //
68499   function svgPassiveVertex(node, graph, activeID) {
68500       if (!activeID) return 1;
68501       if (activeID === node.id) return 0;
68502
68503       var parents = graph.parentWays(node);
68504
68505       for (var i = 0; i < parents.length; i++) {
68506           var nodes = parents[i].nodes;
68507           var isClosed = parents[i].isClosed();
68508           for (var j = 0; j < nodes.length; j++) {   // find this vertex, look nearby
68509               if (nodes[j] === node.id) {
68510                   var ix1 = j - 2;
68511                   var ix2 = j - 1;
68512                   var ix3 = j + 1;
68513                   var ix4 = j + 2;
68514
68515                   if (isClosed) {  // wraparound if needed
68516                       var max = nodes.length - 1;
68517                       if (ix1 < 0)   ix1 = max + ix1;
68518                       if (ix2 < 0)   ix2 = max + ix2;
68519                       if (ix3 > max) ix3 = ix3 - max;
68520                       if (ix4 > max) ix4 = ix4 - max;
68521                   }
68522
68523                   if (nodes[ix1] === activeID) return 0;        // no - prevent self intersect
68524                   else if (nodes[ix2] === activeID) return 2;   // ok - adjacent
68525                   else if (nodes[ix3] === activeID) return 2;   // ok - adjacent
68526                   else if (nodes[ix4] === activeID) return 0;   // no - prevent self intersect
68527                   else if (isClosed && nodes.indexOf(activeID) !== -1) return 0;  // no - prevent self intersect
68528               }
68529           }
68530       }
68531
68532       return 1;   // ok
68533   }
68534
68535
68536   function svgMarkerSegments(projection$$1, graph, dt,
68537                                     shouldReverse,
68538                                     bothDirections) {
68539       return function(entity) {
68540           var i = 0;
68541           var offset = dt;
68542           var segments = [];
68543           var clip = d3_geoIdentity().clipExtent(projection$$1.clipExtent()).stream;
68544           var coordinates = graph.childNodes(entity).map(function(n) { return n.loc; });
68545           var a, b;
68546
68547           if (shouldReverse(entity)) {
68548               coordinates.reverse();
68549           }
68550
68551           geoStream({
68552               type: 'LineString',
68553               coordinates: coordinates
68554           }, projection$$1.stream(clip({
68555               lineStart: function() {},
68556               lineEnd: function() { a = null; },
68557               point: function(x, y) {
68558                   b = [x, y];
68559
68560                   if (a) {
68561                       var span = geoVecLength(a, b) - offset;
68562
68563                       if (span >= 0) {
68564                           var heading = geoVecAngle(a, b);
68565                           var dx = dt * Math.cos(heading);
68566                           var dy = dt * Math.sin(heading);
68567                           var p = [
68568                               a[0] + offset * Math.cos(heading),
68569                               a[1] + offset * Math.sin(heading)
68570                           ];
68571
68572                           // gather coordinates
68573                           var coord = [a, p];
68574                           for (span -= dt; span >= 0; span -= dt) {
68575                               p = geoVecAdd(p, [dx, dy]);
68576                               coord.push(p);
68577                           }
68578                           coord.push(b);
68579
68580                           // generate svg paths
68581                           var segment = '';
68582                           var j;
68583
68584                           for (j = 0; j < coord.length; j++) {
68585                               segment += (j === 0 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
68586                           }
68587                           segments.push({ id: entity.id, index: i++, d: segment });
68588
68589                           if (bothDirections(entity)) {
68590                               segment = '';
68591                               for (j = coord.length - 1; j >= 0; j--) {
68592                                   segment += (j === coord.length - 1 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
68593                               }
68594                               segments.push({ id: entity.id, index: i++, d: segment });
68595                           }
68596                       }
68597
68598                       offset = -span;
68599                   }
68600
68601                   a = b;
68602               }
68603           })));
68604
68605           return segments;
68606       };
68607   }
68608
68609
68610   function svgPath(projection$$1, graph, isArea) {
68611
68612       // Explanation of magic numbers:
68613       // "padding" here allows space for strokes to extend beyond the viewport,
68614       // so that the stroke isn't drawn along the edge of the viewport when
68615       // the shape is clipped.
68616       //
68617       // When drawing lines, pad viewport by 5px.
68618       // When drawing areas, pad viewport by 65px in each direction to allow
68619       // for 60px area fill stroke (see ".fill-partial path.fill" css rule)
68620
68621       var cache = {};
68622       var padding = isArea ? 65 : 5;
68623       var viewport = projection$$1.clipExtent();
68624       var paddedExtent = [
68625           [viewport[0][0] - padding, viewport[0][1] - padding],
68626           [viewport[1][0] + padding, viewport[1][1] + padding]
68627       ];
68628       var clip = d3_geoIdentity().clipExtent(paddedExtent).stream;
68629       var project = projection$$1.stream;
68630       var path = d3_geoPath()
68631           .projection({stream: function(output) { return project(clip(output)); }});
68632
68633       var svgpath = function(entity) {
68634           if (entity.id in cache) {
68635               return cache[entity.id];
68636           } else {
68637               return cache[entity.id] = path(entity.asGeoJSON(graph));
68638           }
68639       };
68640
68641       svgpath.geojson = function(d) {
68642           if (d.__featurehash__ !== undefined) {
68643               if (d.__featurehash__ in cache) {
68644                   return cache[d.__featurehash__];
68645               } else {
68646                   return cache[d.__featurehash__] = path(d);
68647               }
68648           } else {
68649               return path(d);
68650           }
68651       };
68652
68653       return svgpath;
68654   }
68655
68656
68657   function svgPointTransform(projection$$1) {
68658       var svgpoint = function(entity) {
68659           // http://jsperf.com/short-array-join
68660           var pt = projection$$1(entity.loc);
68661           return 'translate(' + pt[0] + ',' + pt[1] + ')';
68662       };
68663
68664       svgpoint.geojson = function(d) {
68665           return svgpoint(d.properties.entity);
68666       };
68667
68668       return svgpoint;
68669   }
68670
68671
68672   function svgRelationMemberTags(graph) {
68673       return function(entity) {
68674           var tags = entity.tags;
68675           graph.parentRelations(entity).forEach(function(relation) {
68676               var type = relation.tags.type;
68677               if (type === 'multipolygon' || type === 'boundary') {
68678                   tags = assignIn({}, relation.tags, tags);
68679               }
68680           });
68681           return tags;
68682       };
68683   }
68684
68685
68686   function svgSegmentWay(way, graph, activeID) {
68687       // When there is no activeID, we can memoize this expensive computation
68688       if (activeID === undefined) {
68689           return graph.transient(way, 'waySegments', getWaySegments);
68690       } else {
68691           return getWaySegments();
68692       }
68693
68694       function getWaySegments() {
68695           var isActiveWay = (way.nodes.indexOf(activeID) !== -1);
68696           var features = { passive: [], active: [] };
68697           var start = {};
68698           var end = {};
68699           var node, type;
68700
68701           for (var i = 0; i < way.nodes.length; i++) {
68702               node = graph.entity(way.nodes[i]);
68703               type = svgPassiveVertex(node, graph, activeID);
68704               end = { node: node, type: type };
68705
68706               if (start.type !== undefined) {
68707                   if (start.node.id === activeID || end.node.id === activeID) ; else if (isActiveWay && (start.type === 2 || end.type === 2)) {   // one adjacent vertex
68708                       pushActive(start, end, i);
68709                   } else if (start.type === 0 && end.type === 0) {   // both active vertices
68710                       pushActive(start, end, i);
68711                   } else {
68712                       pushPassive(start, end, i);
68713                   }
68714               }
68715
68716               start = end;
68717           }
68718
68719           return features;
68720
68721           function pushActive(start, end, index) {
68722               features.active.push({
68723                   type: 'Feature',
68724                   id: way.id + '-' + index + '-nope',
68725                   properties: {
68726                       nope: true,
68727                       target: true,
68728                       entity: way,
68729                       nodes: [start.node, end.node],
68730                       index: index
68731                   },
68732                   geometry: {
68733                       type: 'LineString',
68734                       coordinates: [start.node.loc, end.node.loc]
68735                   }
68736               });
68737           }
68738
68739           function pushPassive(start, end, index) {
68740               features.passive.push({
68741                   type: 'Feature',
68742                   id: way.id + '-' + index,
68743                   properties: {
68744                       target: true,
68745                       entity: way,
68746                       nodes: [start.node, end.node],
68747                       index: index
68748                   },
68749                   geometry: {
68750                       type: 'LineString',
68751                       coordinates: [start.node.loc, end.node.loc]
68752                   }
68753               });
68754           }
68755       }
68756   }
68757
68758   function svgGeolocate(projection) {
68759       var layer = select(null);
68760       var _position;
68761
68762
68763       function init() {
68764           if (svgGeolocate.initialized) return;  // run once
68765           svgGeolocate.enabled = false;
68766           svgGeolocate.initialized = true;
68767       }
68768
68769       function showLayer() {
68770           layer.style('display', 'block');
68771       }
68772
68773
68774       function hideLayer() {
68775           layer
68776               .transition()
68777               .duration(250)
68778               .style('opacity', 0);
68779       }
68780
68781       function layerOn() {
68782           layer
68783               .style('opacity', 0)
68784               .transition()
68785               .duration(250)
68786               .style('opacity', 1);
68787
68788       }
68789
68790       function layerOff() {
68791           layer.style('display', 'none');
68792       }
68793
68794       function transform(d) {
68795           return svgPointTransform(projection)(d);
68796       }
68797
68798       function accuracy(accuracy, loc) { // converts accuracy to pixels...
68799           var degreesRadius = geoMetersToLat(accuracy),
68800               tangentLoc = [loc[0], loc[1] + degreesRadius],
68801               projectedTangent = projection(tangentLoc),
68802               projectedLoc = projection([loc[0], loc[1]]);
68803
68804           // southern most point will have higher pixel value...
68805          return Math.round(projectedLoc[1] - projectedTangent[1]).toString();
68806       }
68807
68808       function update() {
68809           var geolocation = { loc: [_position.coords.longitude, _position.coords.latitude] };
68810
68811           var groups = layer.selectAll('.geolocations').selectAll('.geolocation')
68812               .data([geolocation]);
68813
68814           groups.exit()
68815               .remove();
68816
68817           var pointsEnter = groups.enter()
68818               .append('g')
68819               .attr('class', 'geolocation');
68820
68821           pointsEnter
68822               .append('circle')
68823               .attr('id', 'geolocate-radius')
68824               .attr('dx', '0')
68825               .attr('dy', '0')
68826               .attr('fill', 'rgb(15,128,225)')
68827               .attr('fill-opacity', '0.3')
68828               .attr('r', '0');
68829
68830           pointsEnter
68831               .append('circle')
68832               .attr('dx', '0')
68833               .attr('dy', '0')
68834               .attr('fill', 'rgb(15,128,225)')
68835               .attr('stroke', 'white')
68836               .attr('stroke-width', '1.5')
68837               .attr('r', '6');
68838
68839           groups.merge(pointsEnter)
68840               .attr('transform', transform);
68841
68842           select('#geolocate-radius').attr('r', accuracy(_position.coords.accuracy, geolocation.loc));
68843       }
68844
68845       function drawLocation(selection$$1) {
68846           var enabled = svgGeolocate.enabled;
68847
68848           layer = selection$$1.selectAll('.layer-geolocate')
68849               .data([0]);
68850
68851           layer.exit()
68852               .remove();
68853
68854           var layerEnter = layer.enter()
68855               .append('g')
68856               .attr('class', 'layer-geolocate')
68857               .style('display', enabled ? 'block' : 'none');
68858
68859           layerEnter
68860               .append('g')
68861               .attr('class', 'geolocations');
68862
68863           layer = layerEnter
68864               .merge(layer);
68865
68866           if (enabled) {
68867               update();
68868           } else {
68869               layerOff();
68870           }
68871       }
68872
68873       drawLocation.enabled = function (position, enabled) {
68874           if (!arguments.length) return svgGeolocate.enabled;
68875           _position = position;
68876           svgGeolocate.enabled = enabled;
68877           if (svgGeolocate.enabled) {
68878               showLayer();
68879               layerOn();
68880           } else {
68881               hideLayer();
68882           }
68883           return this;
68884       };
68885
68886       init();
68887       return drawLocation;
68888   }
68889
68890   function svgLabels(projection$$1, context) {
68891       var path = d3_geoPath(projection$$1);
68892       var detected = utilDetect();
68893       var baselineHack = (detected.ie || detected.browser.toLowerCase() === 'edge');
68894       var _rdrawn = rbush_1();
68895       var _rskipped = rbush_1();
68896       var _textWidthCache = {};
68897       var _entitybboxes = {};
68898
68899       // Listed from highest to lowest priority
68900       var labelStack = [
68901           ['line', 'aeroway', '*', 12],
68902           ['line', 'highway', 'motorway', 12],
68903           ['line', 'highway', 'trunk', 12],
68904           ['line', 'highway', 'primary', 12],
68905           ['line', 'highway', 'secondary', 12],
68906           ['line', 'highway', 'tertiary', 12],
68907           ['line', 'highway', '*', 12],
68908           ['line', 'railway', '*', 12],
68909           ['line', 'waterway', '*', 12],
68910           ['area', 'aeroway', '*', 12],
68911           ['area', 'amenity', '*', 12],
68912           ['area', 'building', '*', 12],
68913           ['area', 'historic', '*', 12],
68914           ['area', 'leisure', '*', 12],
68915           ['area', 'man_made', '*', 12],
68916           ['area', 'natural', '*', 12],
68917           ['area', 'shop', '*', 12],
68918           ['area', 'tourism', '*', 12],
68919           ['area', 'camp_site', '*', 12],
68920           ['point', 'aeroway', '*', 10],
68921           ['point', 'amenity', '*', 10],
68922           ['point', 'building', '*', 10],
68923           ['point', 'historic', '*', 10],
68924           ['point', 'leisure', '*', 10],
68925           ['point', 'man_made', '*', 10],
68926           ['point', 'natural', '*', 10],
68927           ['point', 'shop', '*', 10],
68928           ['point', 'tourism', '*', 10],
68929           ['point', 'camp_site', '*', 10],
68930           ['line', 'name', '*', 12],
68931           ['area', 'name', '*', 12],
68932           ['point', 'name', '*', 10]
68933       ];
68934
68935
68936       function blacklisted(preset) {
68937           var noIcons = ['building', 'landuse', 'natural'];
68938           return some(noIcons, function(s) {
68939               return preset.id.indexOf(s) >= 0;
68940           });
68941       }
68942
68943
68944       function get(array, prop) {
68945           return function(d, i) { return array[i][prop]; };
68946       }
68947
68948
68949       function textWidth(text, size, elem) {
68950           var c = _textWidthCache[size];
68951           if (!c) c = _textWidthCache[size] = {};
68952
68953           if (c[text]) {
68954               return c[text];
68955
68956           } else if (elem) {
68957               c[text] = elem.getComputedTextLength();
68958               return c[text];
68959
68960           } else {
68961               var str = encodeURIComponent(text).match(/%[CDEFcdef]/g);
68962               if (str === null) {
68963                   return size / 3 * 2 * text.length;
68964               } else {
68965                   return size / 3 * (2 * text.length + str.length);
68966               }
68967           }
68968       }
68969
68970
68971       function drawLinePaths(selection, entities, filter, classes, labels) {
68972           var paths = selection.selectAll('path')
68973               .filter(filter)
68974               .data(entities, osmEntity$$1.key);
68975
68976           // exit
68977           paths.exit()
68978               .remove();
68979
68980           // enter/update
68981           paths.enter()
68982               .append('path')
68983               .style('stroke-width', get(labels, 'font-size'))
68984               .attr('id', function(d) { return 'labelpath-' + d.id; })
68985               .attr('class', classes)
68986               .merge(paths)
68987               .attr('d', get(labels, 'lineString'));
68988       }
68989
68990
68991       function drawLineLabels(selection, entities, filter, classes, labels) {
68992           var texts = selection.selectAll('text.' + classes)
68993               .filter(filter)
68994               .data(entities, osmEntity$$1.key);
68995
68996           // exit
68997           texts.exit()
68998               .remove();
68999
69000           // enter
69001           texts.enter()
69002               .append('text')
69003               .attr('class', function(d, i) { return classes + ' ' + labels[i].classes + ' ' + d.id; })
69004               .attr('dy', baselineHack ? '0.35em' : null)
69005               .append('textPath')
69006               .attr('class', 'textpath');
69007
69008           // update
69009           selection.selectAll('text.' + classes).selectAll('.textpath')
69010               .filter(filter)
69011               .data(entities, osmEntity$$1.key)
69012               .attr('startOffset', '50%')
69013               .attr('xlink:href', function(d) { return '#labelpath-' + d.id; })
69014               .text(utilDisplayNameForPath);
69015       }
69016
69017
69018       function drawPointLabels(selection, entities, filter, classes, labels) {
69019           var texts = selection.selectAll('text.' + classes)
69020               .filter(filter)
69021               .data(entities, osmEntity$$1.key);
69022
69023           // exit
69024           texts.exit()
69025               .remove();
69026
69027           // enter/update
69028           texts.enter()
69029               .append('text')
69030               .attr('class', function(d, i) {
69031                   return classes + ' ' + labels[i].classes + ' ' + d.id;
69032               })
69033               .merge(texts)
69034               .attr('x', get(labels, 'x'))
69035               .attr('y', get(labels, 'y'))
69036               .style('text-anchor', get(labels, 'textAnchor'))
69037               .text(utilDisplayName)
69038               .each(function(d, i) {
69039                   textWidth(utilDisplayName(d), labels[i].height, this);
69040               });
69041       }
69042
69043
69044       function drawAreaLabels(selection, entities, filter, classes, labels) {
69045           entities = entities.filter(hasText);
69046           labels = labels.filter(hasText);
69047           drawPointLabels(selection, entities, filter, classes, labels);
69048
69049           function hasText(d, i) {
69050               return labels[i].hasOwnProperty('x') && labels[i].hasOwnProperty('y');
69051           }
69052       }
69053
69054
69055       function drawAreaIcons(selection, entities, filter, classes, labels) {
69056           var icons = selection.selectAll('use.' + classes)
69057               .filter(filter)
69058               .data(entities, osmEntity$$1.key);
69059
69060           // exit
69061           icons.exit()
69062               .remove();
69063
69064           // enter/update
69065           icons.enter()
69066               .append('use')
69067               .attr('class', 'icon ' + classes)
69068               .attr('width', '17px')
69069               .attr('height', '17px')
69070               .merge(icons)
69071               .attr('transform', get(labels, 'transform'))
69072               .attr('xlink:href', function(d) {
69073                   var preset = context.presets().match(d, context.graph());
69074                   var picon = preset && preset.icon;
69075
69076                   if (!picon) {
69077                       return '';
69078                   } else {
69079                       var isMaki = /^maki-/.test(picon);
69080                       return '#' + picon + (isMaki ? '-15' : '');
69081                   }
69082               });
69083       }
69084
69085
69086       function drawCollisionBoxes(selection, rtree, which) {
69087           var classes = 'debug ' + which + ' ' + (which === 'debug-skipped' ? 'orange' : 'yellow');
69088
69089           var gj = [];
69090           if (context.getDebug('collision')) {
69091               gj = rtree.all().map(function(d) {
69092                   return { type: 'Polygon', coordinates: [[
69093                       [d.minX, d.minY],
69094                       [d.maxX, d.minY],
69095                       [d.maxX, d.maxY],
69096                       [d.minX, d.maxY],
69097                       [d.minX, d.minY]
69098                   ]]};
69099               });
69100           }
69101
69102           var boxes = selection.selectAll('.' + which)
69103               .data(gj);
69104
69105           // exit
69106           boxes.exit()
69107               .remove();
69108
69109           // enter/update
69110           boxes.enter()
69111               .append('path')
69112               .attr('class', classes)
69113               .merge(boxes)
69114               .attr('d', d3_geoPath());
69115       }
69116
69117
69118       function drawLabels(selection, graph, entities, filter, dimensions, fullRedraw) {
69119           var wireframe = context.surface().classed('fill-wireframe');
69120           var zoom = geoScaleToZoom(projection$$1.scale());
69121
69122           var labelable = [];
69123           var renderNodeAs = {};
69124           var i, j, k, entity, geometry;
69125
69126           for (i = 0; i < labelStack.length; i++) {
69127               labelable.push([]);
69128           }
69129
69130           if (fullRedraw) {
69131               _rdrawn.clear();
69132               _rskipped.clear();
69133               _entitybboxes = {};
69134
69135           } else {
69136               for (i = 0; i < entities.length; i++) {
69137                   entity = entities[i];
69138                   var toRemove = []
69139                       .concat(_entitybboxes[entity.id] || [])
69140                       .concat(_entitybboxes[entity.id + 'I'] || []);
69141
69142                   for (j = 0; j < toRemove.length; j++) {
69143                       _rdrawn.remove(toRemove[j]);
69144                       _rskipped.remove(toRemove[j]);
69145                   }
69146               }
69147           }
69148
69149           // Loop through all the entities to do some preprocessing
69150           for (i = 0; i < entities.length; i++) {
69151               entity = entities[i];
69152               geometry = entity.geometry(graph);
69153
69154               // Insert collision boxes around interesting points/vertices
69155               if (geometry === 'point' || (geometry === 'vertex' && isInterestingVertex(entity))) {
69156                   var hasDirections = entity.directions(graph, projection$$1).length;
69157                   var markerPadding;
69158
69159                   if (!wireframe && geometry === 'point' && !(zoom >= 18 && hasDirections)) {
69160                       renderNodeAs[entity.id] = 'point';
69161                       markerPadding = 20;   // extra y for marker height
69162                   } else {
69163                       renderNodeAs[entity.id] = 'vertex';
69164                       markerPadding = 0;
69165                   }
69166
69167                   var coord = projection$$1(entity.loc);
69168                   var nodePadding = 10;
69169                   var bbox = {
69170                       minX: coord[0] - nodePadding,
69171                       minY: coord[1] - nodePadding - markerPadding,
69172                       maxX: coord[0] + nodePadding,
69173                       maxY: coord[1] + nodePadding
69174                   };
69175
69176                   doInsert(bbox, entity.id + 'P');
69177               }
69178
69179               // From here on, treat vertices like points
69180               if (geometry === 'vertex') {
69181                   geometry = 'point';
69182               }
69183
69184               // Determine which entities are label-able
69185               var preset = geometry === 'area' && context.presets().match(entity, graph);
69186               var icon = preset && !blacklisted(preset) && preset.icon;
69187
69188               if (!icon && !utilDisplayName(entity))
69189                   continue;
69190
69191               for (k = 0; k < labelStack.length; k++) {
69192                   var matchGeom = labelStack[k][0];
69193                   var matchKey = labelStack[k][1];
69194                   var matchVal = labelStack[k][2];
69195                   var hasVal = entity.tags[matchKey];
69196
69197                   if (geometry === matchGeom && hasVal && (matchVal === '*' || matchVal === hasVal)) {
69198                       labelable[k].push(entity);
69199                       break;
69200                   }
69201               }
69202           }
69203
69204           var positions = {
69205               point: [],
69206               line: [],
69207               area: []
69208           };
69209
69210           var labelled = {
69211               point: [],
69212               line: [],
69213               area: []
69214           };
69215
69216           // Try and find a valid label for labellable entities
69217           for (k = 0; k < labelable.length; k++) {
69218               var fontSize = labelStack[k][3];
69219
69220               for (i = 0; i < labelable[k].length; i++) {
69221                   entity = labelable[k][i];
69222                   geometry = entity.geometry(graph);
69223
69224                   var getName = (geometry === 'line') ? utilDisplayNameForPath : utilDisplayName;
69225                   var name = getName(entity);
69226                   var width = name && textWidth(name, fontSize);
69227                   var p = null;
69228
69229                   if (geometry === 'point' || geometry === 'vertex') {
69230                       // no point or vertex labels in wireframe mode
69231                       // no vertex labels at low zooms (vertices have no icons)
69232                       if (wireframe) continue;
69233                       var renderAs = renderNodeAs[entity.id];
69234                       if (renderAs === 'vertex' && zoom < 17) continue;
69235
69236                       p = getPointLabel(entity, width, fontSize, renderAs);
69237
69238                   } else if (geometry === 'line') {
69239                       p = getLineLabel(entity, width, fontSize);
69240
69241                   } else if (geometry === 'area') {
69242                       p = getAreaLabel(entity, width, fontSize);
69243                   }
69244
69245                   if (p) {
69246                       if (geometry === 'vertex') { geometry = 'point'; }  // treat vertex like point
69247                       p.classes = geometry + ' tag-' + labelStack[k][1];
69248                       positions[geometry].push(p);
69249                       labelled[geometry].push(entity);
69250                   }
69251               }
69252           }
69253
69254
69255           function isInterestingVertex(entity) {
69256               var selectedIDs = context.selectedIDs();
69257
69258               return entity.hasInterestingTags() ||
69259                   entity.isEndpoint(graph) ||
69260                   entity.isConnected(graph) ||
69261                   selectedIDs.indexOf(entity.id) !== -1 ||
69262                   some(graph.parentWays(entity), function(parent) {
69263                       return selectedIDs.indexOf(parent.id) !== -1;
69264                   });
69265           }
69266
69267
69268           function getPointLabel(entity, width, height, geometry) {
69269               var y = (geometry === 'point' ? -12 : 0);
69270               var pointOffsets = {
69271                   ltr: [15, y, 'start'],
69272                   rtl: [-15, y, 'end']
69273               };
69274
69275               var coord = projection$$1(entity.loc);
69276               var textPadding = 2;
69277               var offset = pointOffsets[textDirection];
69278               var p = {
69279                   height: height,
69280                   width: width,
69281                   x: coord[0] + offset[0],
69282                   y: coord[1] + offset[1],
69283                   textAnchor: offset[2]
69284               };
69285
69286               // insert a collision box for the text label..
69287               var bbox;
69288               if (textDirection === 'rtl') {
69289                   bbox = {
69290                       minX: p.x - width - textPadding,
69291                       minY: p.y - (height / 2) - textPadding,
69292                       maxX: p.x + textPadding,
69293                       maxY: p.y + (height / 2) + textPadding
69294                   };
69295               } else {
69296                   bbox = {
69297                       minX: p.x - textPadding,
69298                       minY: p.y - (height / 2) - textPadding,
69299                       maxX: p.x + width + textPadding,
69300                       maxY: p.y + (height / 2) + textPadding
69301                   };
69302               }
69303
69304               if (tryInsert([bbox], entity.id, true)) {
69305                   return p;
69306               }
69307           }
69308
69309
69310           function getLineLabel(entity, width, height) {
69311               var viewport = geoExtent$$1(context.projection.clipExtent()).polygon();
69312               var points = map$3(graph.childNodes(entity), 'loc').map(projection$$1);
69313               var length = geoPathLength(points);
69314
69315               if (length < width + 20) return;
69316
69317               // todo: properly clip points to viewport
69318
69319               // % along the line to attempt to place the label
69320               var lineOffsets = [50, 45, 55, 40, 60, 35, 65, 30, 70,
69321                                  25, 75, 20, 80, 15, 95, 10, 90, 5, 95];
69322               var padding = 3;
69323
69324               for (var i = 0; i < lineOffsets.length; i++) {
69325                   var offset = lineOffsets[i];
69326                   var middle = offset / 100 * length;
69327                   var start = middle - width / 2;
69328
69329                   if (start < 0 || start + width > length) continue;
69330
69331                   // generate subpath and ignore paths that are invalid or don't cross viewport.
69332                   var sub = subpath(points, start, start + width);
69333                   if (!sub || !geoPolygonIntersectsPolygon(viewport, sub, true)) {
69334                       continue;
69335                   }
69336
69337                   var isReverse = reverse(sub);
69338                   if (isReverse) {
69339                       sub = sub.reverse();
69340                   }
69341
69342                   var bboxes = [];
69343                   var boxsize = (height + 2) / 2;
69344
69345                   for (var j = 0; j < sub.length - 1; j++) {
69346                       var a = sub[j];
69347                       var b = sub[j + 1];
69348
69349                       // split up the text into small collision boxes
69350                       var num = Math.max(1, Math.floor(geoVecLength(a, b) / boxsize / 2));
69351
69352                       for (var box = 0; box < num; box++) {
69353                           var p = geoVecInterp(a, b, box / num);
69354                           var x0 = p[0] - boxsize - padding;
69355                           var y0 = p[1] - boxsize - padding;
69356                           var x1 = p[0] + boxsize + padding;
69357                           var y1 = p[1] + boxsize + padding;
69358
69359                           bboxes.push({
69360                               minX: Math.min(x0, x1),
69361                               minY: Math.min(y0, y1),
69362                               maxX: Math.max(x0, x1),
69363                               maxY: Math.max(y0, y1)
69364                           });
69365                       }
69366                   }
69367
69368                   if (tryInsert(bboxes, entity.id, false)) {   // accept this one
69369                       return {
69370                           'font-size': height + 2,
69371                           lineString: lineString(sub),
69372                           startOffset: offset + '%'
69373                       };
69374                   }
69375               }
69376
69377               function reverse(p) {
69378                   var angle = Math.atan2(p[1][1] - p[0][1], p[1][0] - p[0][0]);
69379                   return !(p[0][0] < p[p.length - 1][0] && angle < Math.PI/2 && angle > -Math.PI/2);
69380               }
69381
69382               function lineString(points) {
69383                   return 'M' + points.join('L');
69384               }
69385
69386               function subpath(points, from, to) {
69387                   var sofar = 0;
69388                   var start, end, i0, i1;
69389
69390                   for (var i = 0; i < points.length - 1; i++) {
69391                       var a = points[i];
69392                       var b = points[i + 1];
69393                       var current = geoVecLength(a, b);
69394                       var portion;
69395                       if (!start && sofar + current >= from) {
69396                           portion = (from - sofar) / current;
69397                           start = [
69398                               a[0] + portion * (b[0] - a[0]),
69399                               a[1] + portion * (b[1] - a[1])
69400                           ];
69401                           i0 = i + 1;
69402                       }
69403                       if (!end && sofar + current >= to) {
69404                           portion = (to - sofar) / current;
69405                           end = [
69406                               a[0] + portion * (b[0] - a[0]),
69407                               a[1] + portion * (b[1] - a[1])
69408                           ];
69409                           i1 = i + 1;
69410                       }
69411                       sofar += current;
69412                   }
69413
69414                   var result = points.slice(i0, i1);
69415                   result.unshift(start);
69416                   result.push(end);
69417                   return result;
69418               }
69419           }
69420
69421
69422           function getAreaLabel(entity, width, height) {
69423               var centroid = path.centroid(entity.asGeoJSON(graph, true));
69424               var extent = entity.extent(graph);
69425               var areaWidth = projection$$1(extent[1])[0] - projection$$1(extent[0])[0];
69426
69427               if (isNaN(centroid[0]) || areaWidth < 20) return;
69428
69429               var preset = context.presets().match(entity, context.graph());
69430               var picon = preset && preset.icon;
69431               var iconSize = 17;
69432               var padding = 2;
69433               var p = {};
69434
69435               if (picon) {  // icon and label..
69436                   if (addIcon()) {
69437                       addLabel(iconSize + padding);
69438                       return p;
69439                   }
69440               } else {   // label only..
69441                   if (addLabel(0)) {
69442                       return p;
69443                   }
69444               }
69445
69446
69447               function addIcon() {
69448                   var iconX = centroid[0] - (iconSize / 2);
69449                   var iconY = centroid[1] - (iconSize / 2);
69450                   var bbox = {
69451                       minX: iconX,
69452                       minY: iconY,
69453                       maxX: iconX + iconSize,
69454                       maxY: iconY + iconSize
69455                   };
69456
69457                   if (tryInsert([bbox], entity.id + 'I', true)) {
69458                       p.transform = 'translate(' + iconX + ',' + iconY + ')';
69459                       return true;
69460                   }
69461                   return false;
69462               }
69463
69464               function addLabel(yOffset) {
69465                   if (width && areaWidth >= width + 20) {
69466                       var labelX = centroid[0];
69467                       var labelY = centroid[1] + yOffset;
69468                       var bbox = {
69469                           minX: labelX - (width / 2) - padding,
69470                           minY: labelY - (height / 2) - padding,
69471                           maxX: labelX + (width / 2) + padding,
69472                           maxY: labelY + (height / 2) + padding
69473                       };
69474
69475                       if (tryInsert([bbox], entity.id, true)) {
69476                           p.x = labelX;
69477                           p.y = labelY;
69478                           p.textAnchor = 'middle';
69479                           p.height = height;
69480                           return true;
69481                       }
69482                   }
69483                   return false;
69484               }
69485           }
69486
69487
69488           // force insert a singular bounding box
69489           // singular box only, no array, id better be unique
69490           function doInsert(bbox, id) {
69491               bbox.id = id;
69492
69493               var oldbox = _entitybboxes[id];
69494               if (oldbox) {
69495                   _rdrawn.remove(oldbox);
69496               }
69497               _entitybboxes[id] = bbox;
69498               _rdrawn.insert(bbox);
69499           }
69500
69501
69502           function tryInsert(bboxes, id, saveSkipped) {
69503               var skipped = false;
69504
69505               for (var i = 0; i < bboxes.length; i++) {
69506                   var bbox = bboxes[i];
69507                   bbox.id = id;
69508
69509                   // Check that label is visible
69510                   if (bbox.minX < 0 || bbox.minY < 0 || bbox.maxX > dimensions[0] || bbox.maxY > dimensions[1]) {
69511                       skipped = true;
69512                       break;
69513                   }
69514                   if (_rdrawn.collides(bbox)) {
69515                       skipped = true;
69516                       break;
69517                   }
69518               }
69519
69520               _entitybboxes[id] = bboxes;
69521
69522               if (skipped) {
69523                   if (saveSkipped) {
69524                       _rskipped.load(bboxes);
69525                   }
69526               } else {
69527                   _rdrawn.load(bboxes);
69528               }
69529
69530               return !skipped;
69531           }
69532
69533
69534           var layer = selection.selectAll('.layer-osm.labels');
69535           layer.selectAll('.labels-group')
69536               .data(['halo', 'label', 'debug'])
69537               .enter()
69538               .append('g')
69539               .attr('class', function(d) { return 'labels-group ' + d; });
69540
69541           var halo = layer.selectAll('.labels-group.halo');
69542           var label = layer.selectAll('.labels-group.label');
69543           var debug = layer.selectAll('.labels-group.debug');
69544
69545           // points
69546           drawPointLabels(label, labelled.point, filter, 'pointlabel', positions.point);
69547           drawPointLabels(halo, labelled.point, filter, 'pointlabel-halo', positions.point);
69548
69549           // lines
69550           drawLinePaths(layer, labelled.line, filter, '', positions.line);
69551           drawLineLabels(label, labelled.line, filter, 'linelabel', positions.line);
69552           drawLineLabels(halo, labelled.line, filter, 'linelabel-halo', positions.line);
69553
69554           // areas
69555           drawAreaLabels(label, labelled.area, filter, 'arealabel', positions.area);
69556           drawAreaLabels(halo, labelled.area, filter, 'arealabel-halo', positions.area);
69557           drawAreaIcons(label, labelled.area, filter, 'areaicon', positions.area);
69558           drawAreaIcons(halo, labelled.area, filter, 'areaicon-halo', positions.area);
69559
69560           // debug
69561           drawCollisionBoxes(debug, _rskipped, 'debug-skipped');
69562           drawCollisionBoxes(debug, _rdrawn, 'debug-drawn');
69563
69564           layer.call(filterLabels);
69565       }
69566
69567
69568       function filterLabels(selection) {
69569           var drawLayer = selection.selectAll('.layer-osm.labels');
69570           var layers = drawLayer.selectAll('.labels-group.halo, .labels-group.label');
69571
69572           layers.selectAll('.nolabel')
69573               .classed('nolabel', false);
69574
69575           var mouse = context.mouse();
69576           var graph = context.graph();
69577           var selectedIDs = context.selectedIDs();
69578           var ids = [];
69579           var pad, bbox;
69580
69581           // hide labels near the mouse
69582           if (mouse) {
69583               pad = 20;
69584               bbox = { minX: mouse[0] - pad, minY: mouse[1] - pad, maxX: mouse[0] + pad, maxY: mouse[1] + pad };
69585               ids.push.apply(ids, map$3(_rdrawn.search(bbox), 'id'));
69586           }
69587
69588           // hide labels on selected nodes (they look weird when dragging / haloed)
69589           for (var i = 0; i < selectedIDs.length; i++) {
69590               var entity = graph.hasEntity(selectedIDs[i]);
69591               if (entity && entity.type === 'node') {
69592                   ids.push(selectedIDs[i]);
69593               }
69594           }
69595
69596           layers.selectAll(utilEntitySelector(ids))
69597               .classed('nolabel', true);
69598
69599
69600           // draw the mouse bbox if debugging is on..
69601           var debug = selection.selectAll('.labels-group.debug');
69602           var gj = [];
69603           if (context.getDebug('collision')) {
69604               gj = bbox ? [{
69605                   type: 'Polygon',
69606                   coordinates: [[
69607                       [bbox.minX, bbox.minY],
69608                       [bbox.maxX, bbox.minY],
69609                       [bbox.maxX, bbox.maxY],
69610                       [bbox.minX, bbox.maxY],
69611                       [bbox.minX, bbox.minY]
69612                   ]]
69613               }] : [];
69614           }
69615
69616           var box = debug.selectAll('.debug-mouse')
69617               .data(gj);
69618
69619           // exit
69620           box.exit()
69621               .remove();
69622
69623           // enter/update
69624           box.enter()
69625               .append('path')
69626               .attr('class', 'debug debug-mouse yellow')
69627               .merge(box)
69628               .attr('d', d3_geoPath());
69629       }
69630
69631
69632       var throttleFilterLabels = throttle(utilCallWhenIdle(filterLabels), 100);
69633
69634
69635       drawLabels.observe = function(selection) {
69636           var listener = function() { throttleFilterLabels(selection); };
69637           selection.on('mousemove.hidelabels', listener);
69638           context.on('enter.hidelabels', listener);
69639       };
69640
69641
69642       drawLabels.off = function(selection) {
69643           throttleFilterLabels.cancel();
69644           selection.on('mousemove.hidelabels', null);
69645           context.on('enter.hidelabels', null);
69646       };
69647
69648
69649       return drawLabels;
69650   }
69651
69652   function svgStreetside$$1(projection, context, dispatch) {
69653       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
69654       var minZoom = 14;
69655       var minMarkerZoom = 16;
69656       var minViewfieldZoom = 18;
69657       var layer = select(null);
69658       var _viewerYaw = 0;
69659       var _selectedSequence = null;
69660       var _hoveredBubble = null;
69661       var _streetside;
69662
69663       /**
69664        * init().
69665        */
69666       function init() {
69667           if (svgStreetside$$1.initialized) return;  // run once
69668           svgStreetside$$1.enabled = false;
69669           svgStreetside$$1.initialized = true;
69670       }
69671
69672       /**
69673        * getService().
69674        */
69675       function getService() {
69676           if (services.streetside && !_streetside) {
69677               _streetside = services.streetside;
69678               _streetside.event
69679                   .on('viewerChanged', viewerChanged)
69680                   .on('loadedBubbles', throttledRedraw);
69681           } else if (!services.streetside && _streetside) {
69682               _streetside = null;
69683           }
69684
69685           return _streetside;
69686       }
69687
69688       /**
69689        * showLayer().
69690        */
69691       function showLayer() {
69692           var service = getService();
69693           if (!service) return;
69694
69695           service.loadViewer(context);
69696           editOn();
69697
69698           layer
69699               .style('opacity', 0)
69700               .transition()
69701               .duration(250)
69702               .style('opacity', 1)
69703               .on('end', function () { dispatch.call('change'); });
69704       }
69705
69706       /**
69707        * hideLayer().
69708        */
69709       function hideLayer() {
69710           var service = getService();
69711           if (service) {
69712               service.hideViewer();
69713           }
69714
69715           throttledRedraw.cancel();
69716
69717           layer
69718               .transition()
69719               .duration(250)
69720               .style('opacity', 0)
69721               .on('end', editOff);
69722       }
69723
69724       /**
69725        * editOn().
69726        */
69727       function editOn() {
69728           layer.style('display', 'block');
69729       }
69730
69731       /**
69732        * editOff().
69733        */
69734       function editOff() {
69735           layer.selectAll('.viewfield-group').remove();
69736           layer.style('display', 'none');
69737       }
69738
69739       /**
69740        * click() Handles 'bubble' point click event.
69741        */
69742       function click(d) {
69743           var service = getService();
69744           if (!service) return;
69745
69746           // try to preserve the viewer rotation when staying on the same sequence
69747           if (d.sequenceKey !== _selectedSequence) {
69748               _viewerYaw = 0;  // reset
69749           }
69750           _selectedSequence = d.sequenceKey;
69751
69752           service
69753               .selectImage(d)
69754               .then(function(r) {
69755                   if (r.status === 'ok'){
69756                       service.showViewer(_viewerYaw);
69757                   }
69758               });
69759
69760
69761           context.map().centerEase(d.loc);
69762       }
69763
69764       /**
69765        * mouseover().
69766        */
69767       function mouseover(d) {
69768           var service = getService();
69769           _hoveredBubble = d;
69770           if (service) service.setStyles(d, true);
69771       }
69772
69773       /**
69774        * mouseout().
69775        */
69776       function mouseout() {
69777           var service = getService();
69778           _hoveredBubble = null;
69779           if (service) service.setStyles(null, true);
69780       }
69781
69782       /**
69783        * transform().
69784        */
69785       function transform(d) {
69786           var t = svgPointTransform(projection)(d);
69787           var rot = d.ca + _viewerYaw;
69788           if (rot) {
69789               t += ' rotate(' + Math.floor(rot) + ',0,0)';
69790           }
69791           return t;
69792       }
69793
69794
69795       function viewerChanged() {
69796           var service = getService();
69797           if (!service) return;
69798
69799           var viewer = service.viewer();
69800           if (!viewer) return;
69801
69802           // update viewfield rotation
69803           _viewerYaw = viewer.getYaw();
69804
69805           // avoid updating if the map is currently transformed
69806           // e.g. during drags or easing.
69807           if (context.map().isTransformed()) return;
69808
69809           layer.selectAll('.viewfield-group.selected')
69810               .attr('transform', transform);
69811       }
69812
69813
69814       /**
69815        * update().
69816        */
69817       function update() {
69818           var viewer = select('#photoviewer');
69819           var selected = viewer.empty() ? undefined : viewer.datum();
69820           var z = ~~context.map().zoom();
69821           var showMarkers = (z >= minMarkerZoom);
69822           var showViewfields = (z >= minViewfieldZoom);
69823           var service = getService();
69824
69825           var sequences = (service ? service.sequences(projection) : []);
69826           var bubbles = (service && showMarkers ? service.bubbles(projection) : []);
69827
69828           var traces = layer.selectAll('.sequences').selectAll('.sequence')
69829               .data(sequences, function(d) { return d.properties.key; });
69830
69831           // exit
69832           traces.exit()
69833               .remove();
69834
69835           // enter/update
69836           traces = traces.enter()
69837               .append('path')
69838               .attr('class', 'sequence')
69839               .merge(traces)
69840               .attr('d', svgPath(projection).geojson);
69841
69842
69843           var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
69844               .data(bubbles, function(d) {
69845                   // force reenter once bubbles are attached to a sequence
69846                   return d.key + (d.sequenceKey ? 'v1' : 'v0');
69847               });
69848
69849           // exit
69850           groups.exit()
69851               .remove();
69852
69853           // enter
69854           var groupsEnter = groups.enter()
69855               .append('g')
69856               .attr('class', 'viewfield-group')
69857               .on('mouseover', mouseover)
69858               .on('mouseout', mouseout)
69859               .on('click', click);
69860
69861           groupsEnter
69862               .append('g')
69863               .attr('class', 'viewfield-scale');
69864
69865           // update
69866           var markers = groups
69867               .merge(groupsEnter)
69868               .sort(function(a, b) {
69869                   return (a === selected) ? 1
69870                       : (b === selected) ? -1
69871                       : b.loc[1] - a.loc[1];
69872               })
69873               .attr('transform', transform)
69874               .select('.viewfield-scale');
69875
69876
69877           markers.selectAll('circle')
69878               .data([0])
69879               .enter()
69880               .append('circle')
69881               .attr('dx', '0')
69882               .attr('dy', '0')
69883               .attr('r', '6');
69884
69885           var viewfields = markers.selectAll('.viewfield')
69886               .data(showViewfields ? [0] : []);
69887
69888           viewfields.exit()
69889               .remove();
69890
69891           // viewfields may or may not be drawn...
69892           // but if they are, draw below the circles
69893           viewfields.enter()
69894               .insert('path', 'circle')
69895               .attr('class', 'viewfield')
69896               .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
69897               .attr('d', viewfieldPath);
69898
69899
69900           if (service) {
69901               service.setStyles(_hoveredBubble, true);
69902           }
69903
69904
69905           function viewfieldPath() {
69906               var d = this.parentNode.__data__;
69907               if (d.pano) {
69908                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
69909               } else {
69910                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
69911               }
69912           }
69913
69914       }
69915
69916       /**
69917        * drawImages()
69918        * drawImages is the method that is returned (and that runs) everytime 'svgStreetside()' is called.
69919        * 'svgStreetside()' is called from index.js
69920        */
69921       function drawImages(selection$$1) {
69922           var enabled = svgStreetside$$1.enabled;
69923           var service = getService();
69924
69925           layer = selection$$1.selectAll('.layer-streetside-images')
69926               .data(service ? [0] : []);
69927
69928           layer.exit()
69929               .remove();
69930
69931           var layerEnter = layer.enter()
69932               .append('g')
69933               .attr('class', 'layer-streetside-images')
69934               .style('display', enabled ? 'block' : 'none');
69935
69936           layerEnter
69937               .append('g')
69938               .attr('class', 'sequences');
69939
69940           layerEnter
69941               .append('g')
69942               .attr('class', 'markers');
69943
69944           layer = layerEnter
69945               .merge(layer);
69946
69947           if (enabled) {
69948               if (service && ~~context.map().zoom() >= minZoom) {
69949                   editOn();
69950                   update();
69951                   service.loadBubbles(projection);
69952               } else {
69953                   editOff();
69954               }
69955           }
69956       }
69957
69958
69959       /**
69960        * drawImages.enabled().
69961        */
69962       drawImages.enabled = function(_) {
69963           if (!arguments.length) return svgStreetside$$1.enabled;
69964           svgStreetside$$1.enabled = _;
69965           if (svgStreetside$$1.enabled) {
69966               showLayer();
69967           } else {
69968               hideLayer();
69969           }
69970           dispatch.call('change');
69971           return this;
69972       };
69973
69974       /**
69975        * drawImages.supported().
69976        */
69977       drawImages.supported = function() {
69978           return !!getService();
69979       };
69980
69981       init();
69982
69983       return drawImages;
69984   }
69985
69986   function svgMapillaryImages$$1(projection, context, dispatch) {
69987       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
69988       var minZoom = 12;
69989       var minMarkerZoom = 16;
69990       var minViewfieldZoom = 18;
69991       var layer = select(null);
69992       var _mapillary;
69993       var viewerCompassAngle;
69994
69995
69996       function init() {
69997           if (svgMapillaryImages$$1.initialized) return;  // run once
69998           svgMapillaryImages$$1.enabled = false;
69999           svgMapillaryImages$$1.initialized = true;
70000       }
70001
70002
70003       function getService() {
70004           if (services.mapillary && !_mapillary) {
70005               _mapillary = services.mapillary;
70006               _mapillary.event.on('loadedImages', throttledRedraw);
70007               _mapillary.event.on('bearingChanged', function(e) {
70008                   viewerCompassAngle = e;
70009
70010                   // avoid updating if the map is currently transformed
70011                   // e.g. during drags or easing.
70012                   if (context.map().isTransformed()) return;
70013
70014                   layer.selectAll('.viewfield-group.selected')
70015                       .filter(function(d) {
70016                           return d.pano;
70017                       })
70018                       .attr('transform', transform);
70019               });
70020           } else if (!services.mapillary && _mapillary) {
70021               _mapillary = null;
70022           }
70023
70024           return _mapillary;
70025       }
70026
70027
70028       function showLayer() {
70029           var service = getService();
70030           if (!service) return;
70031
70032           service.loadViewer(context);
70033           editOn();
70034
70035           layer
70036               .style('opacity', 0)
70037               .transition()
70038               .duration(250)
70039               .style('opacity', 1)
70040               .on('end', function () { dispatch.call('change'); });
70041       }
70042
70043
70044       function hideLayer() {
70045           var service = getService();
70046           if (service) {
70047               service.hideViewer();
70048           }
70049
70050           throttledRedraw.cancel();
70051
70052           layer
70053               .transition()
70054               .duration(250)
70055               .style('opacity', 0)
70056               .on('end', editOff);
70057       }
70058
70059
70060       function editOn() {
70061           layer.style('display', 'block');
70062       }
70063
70064
70065       function editOff() {
70066           layer.selectAll('.viewfield-group').remove();
70067           layer.style('display', 'none');
70068       }
70069
70070
70071       function click(d) {
70072           var service = getService();
70073           if (!service) return;
70074
70075           service
70076               .selectImage(d)
70077               .updateViewer(d.key, context)
70078               .showViewer();
70079
70080           context.map().centerEase(d.loc);
70081       }
70082
70083
70084       function mouseover(d) {
70085           var service = getService();
70086           if (service) service.setStyles(d);
70087       }
70088
70089
70090       function mouseout() {
70091           var service = getService();
70092           if (service) service.setStyles(null);
70093       }
70094
70095
70096       function transform(d) {
70097           var t = svgPointTransform(projection)(d);
70098           if (d.pano && isNumber(viewerCompassAngle)) {
70099               t += ' rotate(' + Math.floor(viewerCompassAngle) + ',0,0)';
70100           } else if (d.ca) {
70101               t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
70102           }
70103           return t;
70104       }
70105
70106
70107       function update() {
70108           var viewer = select('#photoviewer');
70109           var selected = viewer.empty() ? undefined : viewer.datum();
70110
70111           var z = ~~context.map().zoom();
70112           var showMarkers = (z >= minMarkerZoom);
70113           var showViewfields = (z >= minViewfieldZoom);
70114
70115           var service = getService();
70116           var sequences = (service ? service.sequences(projection) : []);
70117           var images = (service && showMarkers ? service.images(projection) : []);
70118
70119           var traces = layer.selectAll('.sequences').selectAll('.sequence')
70120               .data(sequences, function(d) { return d.properties.key; });
70121
70122           // exit
70123           traces.exit()
70124               .remove();
70125
70126           // enter/update
70127           traces = traces.enter()
70128               .append('path')
70129               .attr('class', 'sequence')
70130               .merge(traces)
70131               .attr('d', svgPath(projection).geojson);
70132
70133
70134           var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
70135               .data(images, function(d) { return d.key; });
70136
70137           // exit
70138           groups.exit()
70139               .remove();
70140
70141           // enter
70142           var groupsEnter = groups.enter()
70143               .append('g')
70144               .attr('class', 'viewfield-group')
70145               .on('mouseover', mouseover)
70146               .on('mouseout', mouseout)
70147               .on('click', click);
70148
70149           groupsEnter
70150               .append('g')
70151               .attr('class', 'viewfield-scale');
70152
70153           // update
70154           var markers = groups
70155               .merge(groupsEnter)
70156               .sort(function(a, b) {
70157                   return (a === selected) ? 1
70158                       : (b === selected) ? -1
70159                       : b.loc[1] - a.loc[1];  // sort Y
70160               })
70161               .attr('transform', transform)
70162               .select('.viewfield-scale');
70163
70164
70165           markers.selectAll('circle')
70166               .data([0])
70167               .enter()
70168               .append('circle')
70169               .attr('dx', '0')
70170               .attr('dy', '0')
70171               .attr('r', '6');
70172
70173           var viewfields = markers.selectAll('.viewfield')
70174               .data(showViewfields ? [0] : []);
70175
70176           viewfields.exit()
70177               .remove();
70178
70179           viewfields.enter()               // viewfields may or may not be drawn...
70180               .insert('path', 'circle')    // but if they are, draw below the circles
70181               .attr('class', 'viewfield')
70182               .classed('pano', function() { return this.parentNode.__data__.pano; })
70183               .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
70184               .attr('d', viewfieldPath);
70185
70186           function viewfieldPath() {
70187               var d = this.parentNode.__data__;
70188               if (d.pano) {
70189                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
70190               } else {
70191                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
70192               }
70193           }
70194       }
70195
70196
70197       function drawImages(selection$$1) {
70198           var enabled = svgMapillaryImages$$1.enabled;
70199           var service = getService();
70200
70201           layer = selection$$1.selectAll('.layer-mapillary-images')
70202               .data(service ? [0] : []);
70203
70204           layer.exit()
70205               .remove();
70206
70207           var layerEnter = layer.enter()
70208               .append('g')
70209               .attr('class', 'layer-mapillary-images')
70210               .style('display', enabled ? 'block' : 'none');
70211
70212           layerEnter
70213               .append('g')
70214               .attr('class', 'sequences');
70215
70216           layerEnter
70217               .append('g')
70218               .attr('class', 'markers');
70219
70220           layer = layerEnter
70221               .merge(layer);
70222
70223           if (enabled) {
70224               if (service && ~~context.map().zoom() >= minZoom) {
70225                   editOn();
70226                   update();
70227                   service.loadImages(projection);
70228               } else {
70229                   editOff();
70230               }
70231           }
70232       }
70233
70234
70235       drawImages.enabled = function(_) {
70236           if (!arguments.length) return svgMapillaryImages$$1.enabled;
70237           svgMapillaryImages$$1.enabled = _;
70238           if (svgMapillaryImages$$1.enabled) {
70239               showLayer();
70240           } else {
70241               hideLayer();
70242           }
70243           dispatch.call('change');
70244           return this;
70245       };
70246
70247
70248       drawImages.supported = function() {
70249           return !!getService();
70250       };
70251
70252
70253       init();
70254       return drawImages;
70255   }
70256
70257   function svgMapillarySigns$$1(projection, context, dispatch) {
70258       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
70259       var minZoom = 12;
70260       var layer = select(null);
70261       var _mapillary;
70262
70263
70264       function init() {
70265           if (svgMapillarySigns$$1.initialized) return;  // run once
70266           svgMapillarySigns$$1.enabled = false;
70267           svgMapillarySigns$$1.initialized = true;
70268       }
70269
70270
70271       function getService() {
70272           if (services.mapillary && !_mapillary) {
70273               _mapillary = services.mapillary;
70274               _mapillary.event.on('loadedSigns', throttledRedraw);
70275           } else if (!services.mapillary && _mapillary) {
70276               _mapillary = null;
70277           }
70278           return _mapillary;
70279       }
70280
70281
70282       function showLayer() {
70283           var service = getService();
70284           if (!service) return;
70285
70286           service.loadViewer(context);
70287           editOn();
70288       }
70289
70290
70291       function hideLayer() {
70292           throttledRedraw.cancel();
70293           editOff();
70294       }
70295
70296
70297       function editOn() {
70298           layer.style('display', 'block');
70299       }
70300
70301
70302       function editOff() {
70303           layer.selectAll('.icon-sign').remove();
70304           layer.style('display', 'none');
70305       }
70306
70307
70308       function click(d) {
70309           var service = getService();
70310           if (!service) return;
70311
70312           context.map().centerEase(d.loc);
70313
70314           var selected = service.getSelectedImage();
70315           var selectedImageKey = selected && selected.key;
70316           var imageKey;
70317
70318           // Pick one of the images the sign was detected in,
70319           // preference given to an image already selected.
70320           d.detections.forEach(function(detection) {
70321               if (!imageKey || selectedImageKey === detection.image_key) {
70322                   imageKey = detection.image_key;
70323               }
70324           });
70325
70326           service
70327               .selectImage(null, imageKey)
70328               .updateViewer(imageKey, context)
70329               .showViewer();
70330       }
70331
70332
70333       function update() {
70334           var service = getService();
70335           var data = (service ? service.signs(projection) : []);
70336           var viewer = select('#photoviewer');
70337           var selected = viewer.empty() ? undefined : viewer.datum();
70338           var selectedImageKey = selected && selected.key;
70339           var transform = svgPointTransform(projection);
70340
70341           var signs = layer.selectAll('.icon-sign')
70342               .data(data, function(d) { return d.key; });
70343
70344           // exit
70345           signs.exit()
70346               .remove();
70347
70348           // enter
70349           var enter = signs.enter()
70350               .append('use')
70351               .attr('class', 'icon-sign')
70352               .attr('width', '24px')
70353               .attr('height', '24px')
70354               .attr('x', '-12px')
70355               .attr('y', '-12px')
70356               .attr('xlink:href', function(d) { return '#' + d.value; })
70357               .classed('selected', function(d) {
70358                   return some(d.detections, function(detection) {
70359                       return detection.image_key === selectedImageKey;
70360                   });
70361               })
70362               .on('click', click);
70363
70364           // update
70365           signs
70366               .merge(enter)
70367               .sort(function(a, b) {
70368                   return (a === selected) ? 1
70369                       : (b === selected) ? -1
70370                       : b.loc[1] - a.loc[1];  // sort Y
70371               })
70372               .attr('transform', transform);
70373       }
70374
70375
70376       function drawSigns(selection$$1) {
70377           var enabled = svgMapillarySigns$$1.enabled;
70378           var service = getService();
70379
70380           layer = selection$$1.selectAll('.layer-mapillary-signs')
70381               .data(service ? [0] : []);
70382
70383           layer.exit()
70384               .remove();
70385
70386           layer = layer.enter()
70387               .append('g')
70388               .attr('class', 'layer-mapillary-signs')
70389               .style('display', enabled ? 'block' : 'none')
70390               .merge(layer);
70391
70392           if (enabled) {
70393               if (service && ~~context.map().zoom() >= minZoom) {
70394                   editOn();
70395                   update();
70396                   service.loadSigns(context, projection);
70397               } else {
70398                   editOff();
70399               }
70400           }
70401       }
70402
70403
70404       drawSigns.enabled = function(_) {
70405           if (!arguments.length) return svgMapillarySigns$$1.enabled;
70406           svgMapillarySigns$$1.enabled = _;
70407           if (svgMapillarySigns$$1.enabled) {
70408               showLayer();
70409           } else {
70410               hideLayer();
70411           }
70412           dispatch.call('change');
70413           return this;
70414       };
70415
70416
70417       drawSigns.supported = function() {
70418           return !!getService();
70419       };
70420
70421
70422       init();
70423       return drawSigns;
70424   }
70425
70426   function svgOpenstreetcamImages$$1(projection, context, dispatch) {
70427       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
70428       var minZoom = 12;
70429       var minMarkerZoom = 16;
70430       var minViewfieldZoom = 18;
70431       var layer = select(null);
70432       var _openstreetcam;
70433
70434
70435       function init() {
70436           if (svgOpenstreetcamImages$$1.initialized) return;  // run once
70437           svgOpenstreetcamImages$$1.enabled = false;
70438           svgOpenstreetcamImages$$1.initialized = true;
70439       }
70440
70441
70442       function getService() {
70443           if (services.openstreetcam && !_openstreetcam) {
70444               _openstreetcam = services.openstreetcam;
70445               _openstreetcam.event.on('loadedImages', throttledRedraw);
70446           } else if (!services.openstreetcam && _openstreetcam) {
70447               _openstreetcam = null;
70448           }
70449
70450           return _openstreetcam;
70451       }
70452
70453
70454       function showLayer() {
70455           var service = getService();
70456           if (!service) return;
70457
70458           service.loadViewer(context);
70459           editOn();
70460
70461           layer
70462               .style('opacity', 0)
70463               .transition()
70464               .duration(250)
70465               .style('opacity', 1)
70466               .on('end', function () { dispatch.call('change'); });
70467       }
70468
70469
70470       function hideLayer() {
70471           var service = getService();
70472           if (service) {
70473               service.hideViewer();
70474           }
70475
70476           throttledRedraw.cancel();
70477
70478           layer
70479               .transition()
70480               .duration(250)
70481               .style('opacity', 0)
70482               .on('end', editOff);
70483       }
70484
70485
70486       function editOn() {
70487           layer.style('display', 'block');
70488       }
70489
70490
70491       function editOff() {
70492           layer.selectAll('.viewfield-group').remove();
70493           layer.style('display', 'none');
70494       }
70495
70496
70497       function click(d) {
70498           var service = getService();
70499           if (!service) return;
70500
70501           service
70502               .selectImage(d)
70503               .updateViewer(d)
70504               .showViewer();
70505
70506           context.map().centerEase(d.loc);
70507       }
70508
70509
70510       function mouseover(d) {
70511           var service = getService();
70512           if (service) service.setStyles(d);
70513       }
70514
70515
70516       function mouseout() {
70517           var service = getService();
70518           if (service) service.setStyles(null);
70519       }
70520
70521
70522       function transform(d) {
70523           var t = svgPointTransform(projection)(d);
70524           if (d.ca) {
70525               t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
70526           }
70527           return t;
70528       }
70529
70530
70531       function update() {
70532           var viewer = select('#photoviewer');
70533           var selected = viewer.empty() ? undefined : viewer.datum();
70534
70535           var z = ~~context.map().zoom();
70536           var showMarkers = (z >= minMarkerZoom);
70537           var showViewfields = (z >= minViewfieldZoom);
70538
70539           var service = getService();
70540           var sequences = (service ? service.sequences(projection) : []);
70541           var images = (service && showMarkers ? service.images(projection) : []);
70542
70543           var traces = layer.selectAll('.sequences').selectAll('.sequence')
70544               .data(sequences, function(d) { return d.properties.key; });
70545
70546           // exit
70547           traces.exit()
70548               .remove();
70549
70550           // enter/update
70551           traces = traces.enter()
70552               .append('path')
70553               .attr('class', 'sequence')
70554               .merge(traces)
70555               .attr('d', svgPath(projection).geojson);
70556
70557
70558           var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
70559               .data(images, function(d) { return d.key; });
70560
70561           // exit
70562           groups.exit()
70563               .remove();
70564
70565           // enter
70566           var groupsEnter = groups.enter()
70567               .append('g')
70568               .attr('class', 'viewfield-group')
70569               .on('mouseover', mouseover)
70570               .on('mouseout', mouseout)
70571               .on('click', click);
70572
70573           groupsEnter
70574               .append('g')
70575               .attr('class', 'viewfield-scale');
70576
70577           // update
70578           var markers = groups
70579               .merge(groupsEnter)
70580               .sort(function(a, b) {
70581                   return (a === selected) ? 1
70582                       : (b === selected) ? -1
70583                       : b.loc[1] - a.loc[1];  // sort Y
70584               })
70585               .attr('transform', transform)
70586               .select('.viewfield-scale');
70587
70588
70589           markers.selectAll('circle')
70590               .data([0])
70591               .enter()
70592               .append('circle')
70593               .attr('dx', '0')
70594               .attr('dy', '0')
70595               .attr('r', '6');
70596
70597           var viewfields = markers.selectAll('.viewfield')
70598               .data(showViewfields ? [0] : []);
70599
70600           viewfields.exit()
70601               .remove();
70602
70603           viewfields.enter()               // viewfields may or may not be drawn...
70604               .insert('path', 'circle')    // but if they are, draw below the circles
70605               .attr('class', 'viewfield')
70606               .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
70607               .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');
70608       }
70609
70610
70611       function drawImages(selection$$1) {
70612           var enabled = svgOpenstreetcamImages$$1.enabled,
70613               service = getService();
70614
70615           layer = selection$$1.selectAll('.layer-openstreetcam-images')
70616               .data(service ? [0] : []);
70617
70618           layer.exit()
70619               .remove();
70620
70621           var layerEnter = layer.enter()
70622               .append('g')
70623               .attr('class', 'layer-openstreetcam-images')
70624               .style('display', enabled ? 'block' : 'none');
70625
70626           layerEnter
70627               .append('g')
70628               .attr('class', 'sequences');
70629
70630           layerEnter
70631               .append('g')
70632               .attr('class', 'markers');
70633
70634           layer = layerEnter
70635               .merge(layer);
70636
70637           if (enabled) {
70638               if (service && ~~context.map().zoom() >= minZoom) {
70639                   editOn();
70640                   update();
70641                   service.loadImages(projection);
70642               } else {
70643                   editOff();
70644               }
70645           }
70646       }
70647
70648
70649       drawImages.enabled = function(_) {
70650           if (!arguments.length) return svgOpenstreetcamImages$$1.enabled;
70651           svgOpenstreetcamImages$$1.enabled = _;
70652           if (svgOpenstreetcamImages$$1.enabled) {
70653               showLayer();
70654           } else {
70655               hideLayer();
70656           }
70657           dispatch.call('change');
70658           return this;
70659       };
70660
70661
70662       drawImages.supported = function() {
70663           return !!getService();
70664       };
70665
70666
70667       init();
70668       return drawImages;
70669   }
70670
70671   function svgOsm(projection, context, dispatch) {
70672       var enabled = true;
70673
70674
70675       function drawOsm(selection) {
70676           selection.selectAll('.layer-osm')
70677               .data(['covered', 'areas', 'lines', 'points', 'labels'])
70678               .enter()
70679               .append('g')
70680               .attr('class', function(d) { return 'layer-osm ' + d; });
70681
70682           selection.selectAll('.layer-osm.points').selectAll('.points-group')
70683               .data(['points', 'midpoints', 'vertices', 'turns'])
70684               .enter()
70685               .append('g')
70686               .attr('class', function(d) { return 'points-group ' + d; });
70687       }
70688
70689
70690       function showLayer() {
70691           var layer = context.surface().selectAll('.data-layer.osm');
70692           layer.interrupt();
70693
70694           layer
70695               .classed('disabled', false)
70696               .style('opacity', 0)
70697               .transition()
70698               .duration(250)
70699               .style('opacity', 1)
70700               .on('end interrupt', function () {
70701                   dispatch.call('change');
70702               });
70703       }
70704
70705
70706       function hideLayer() {
70707           var layer = context.surface().selectAll('.data-layer.osm');
70708           layer.interrupt();
70709
70710           layer
70711               .transition()
70712               .duration(250)
70713               .style('opacity', 0)
70714               .on('end interrupt', function () {
70715                   layer.classed('disabled', true);
70716                   dispatch.call('change');
70717               });
70718       }
70719
70720
70721       drawOsm.enabled = function(_) {
70722           if (!arguments.length) return enabled;
70723           enabled = _;
70724
70725           if (enabled) {
70726               showLayer();
70727           } else {
70728               hideLayer();
70729           }
70730
70731           dispatch.call('change');
70732           return this;
70733       };
70734
70735
70736       return drawOsm;
70737   }
70738
70739   var _notesEnabled = false;
70740   var _osmService;
70741
70742
70743   function svgNotes$$1(projection, context, dispatch$$1) {
70744       if (!dispatch$$1) { dispatch$$1 = dispatch('change'); }
70745       var throttledRedraw = throttle(function () { dispatch$$1.call('change'); }, 1000);
70746       var minZoom = 12;
70747       var touchLayer = select(null);
70748       var drawLayer = select(null);
70749       var _notesVisible = false;
70750
70751
70752       function markerPath(selection$$1, klass) {
70753           selection$$1
70754               .attr('class', klass)
70755               .attr('transform', 'translate(-8, -22)')
70756               .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');
70757       }
70758
70759
70760       // Loosely-coupled osm service for fetching notes.
70761       function getService() {
70762           if (services.osm && !_osmService) {
70763               _osmService = services.osm;
70764               _osmService.on('loadedNotes', throttledRedraw);
70765           } else if (!services.osm && _osmService) {
70766               _osmService = null;
70767           }
70768
70769           return _osmService;
70770       }
70771
70772
70773       // Show the notes
70774       function editOn() {
70775           if (!_notesVisible) {
70776               _notesVisible = true;
70777               drawLayer
70778                   .style('display', 'block');
70779           }
70780       }
70781
70782
70783       // Immediately remove the notes and their touch targets
70784       function editOff() {
70785           if (_notesVisible) {
70786               _notesVisible = false;
70787               drawLayer
70788                   .style('display', 'none');
70789               drawLayer.selectAll('.note')
70790                   .remove();
70791               touchLayer.selectAll('.note')
70792                   .remove();
70793           }
70794       }
70795
70796
70797       // Enable the layer.  This shows the notes and transitions them to visible.
70798       function layerOn() {
70799           editOn();
70800
70801           drawLayer
70802               .style('opacity', 0)
70803               .transition()
70804               .duration(250)
70805               .style('opacity', 1)
70806               .on('end interrupt', function () {
70807                   dispatch$$1.call('change');
70808               });
70809       }
70810
70811
70812       // Disable the layer.  This transitions the layer invisible and then hides the notes.
70813       function layerOff() {
70814           throttledRedraw.cancel();
70815           drawLayer.interrupt();
70816           touchLayer.selectAll('.note')
70817               .remove();
70818
70819           drawLayer
70820               .transition()
70821               .duration(250)
70822               .style('opacity', 0)
70823               .on('end interrupt', function () {
70824                   editOff();
70825                   dispatch$$1.call('change');
70826               });
70827       }
70828
70829
70830       // Update the note markers
70831       function updateMarkers() {
70832           if (!_notesVisible || !_notesEnabled) return;
70833
70834           var service = getService();
70835           var selectedID = context.selectedNoteID();
70836           var data = (service ? service.notes(projection) : []);
70837           var getTransform = svgPointTransform(projection);
70838
70839           // Draw markers..
70840           var notes = drawLayer.selectAll('.note')
70841               .data(data, function(d) { return d.status + d.id; });
70842
70843           // exit
70844           notes.exit()
70845               .remove();
70846
70847           // enter
70848           var notesEnter = notes.enter()
70849               .append('g')
70850               .attr('class', function(d) { return 'note note-' + d.id + ' ' + d.status; })
70851               .classed('new', function(d) { return d.id < 0; });
70852
70853           notesEnter
70854               .append('ellipse')
70855               .attr('cx', 0.5)
70856               .attr('cy', 1)
70857               .attr('rx', 6.5)
70858               .attr('ry', 3)
70859               .attr('class', 'stroke');
70860
70861           notesEnter
70862               .append('path')
70863               .call(markerPath, 'shadow');
70864
70865           notesEnter
70866               .append('use')
70867               .attr('class', 'note-fill')
70868               .attr('width', '20px')
70869               .attr('height', '20px')
70870               .attr('x', '-8px')
70871               .attr('y', '-22px')
70872               .attr('xlink:href', '#iD-icon-note');
70873
70874           notesEnter.selectAll('.note-annotation')
70875               .data(function(d) { return [d]; })
70876               .enter()
70877               .append('use')
70878               .attr('class', 'note-annotation')
70879               .attr('width', '10px')
70880               .attr('height', '10px')
70881               .attr('x', '-3px')
70882               .attr('y', '-19px')
70883               .attr('xlink:href', function(d) {
70884                   return '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply'));
70885               });
70886
70887           // update
70888           notes
70889               .merge(notesEnter)
70890               .sort(sortY)
70891               .classed('selected', function(d) {
70892                   var mode = context.mode();
70893                   var isMoving = mode && mode.id === 'drag-note';  // no shadows when dragging
70894                   return !isMoving && d.id === selectedID;
70895               })
70896               .attr('transform', getTransform);
70897
70898
70899           // Draw targets..
70900           if (touchLayer.empty()) return;
70901           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
70902
70903           var targets = touchLayer.selectAll('.note')
70904               .data(data, function(d) { return d.id; });
70905
70906           // exit
70907           targets.exit()
70908               .remove();
70909
70910           // enter/update
70911           targets.enter()
70912               .append('rect')
70913               .attr('width', '20px')
70914               .attr('height', '20px')
70915               .attr('x', '-8px')
70916               .attr('y', '-22px')
70917               .merge(targets)
70918               .sort(sortY)
70919               .attr('class', function(d) {
70920                   var newClass = (d.id < 0 ? 'new' : '');
70921                   return 'note target note-' + d.id + ' ' + fillClass + newClass;
70922               })
70923               .attr('transform', getTransform);
70924
70925
70926           function sortY(a, b) {
70927               return (a.id === selectedID) ? 1 : (b.id === selectedID) ? -1 : b.loc[1] - a.loc[1];
70928           }
70929       }
70930
70931
70932       // Draw the notes layer and schedule loading notes and updating markers.
70933       function drawNotes(selection$$1) {
70934           var service = getService();
70935
70936           var surface = context.surface();
70937           if (surface && !surface.empty()) {
70938               touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
70939           }
70940
70941           drawLayer = selection$$1.selectAll('.layer-notes')
70942               .data(service ? [0] : []);
70943
70944           drawLayer.exit()
70945               .remove();
70946
70947           drawLayer = drawLayer.enter()
70948               .append('g')
70949               .attr('class', 'layer-notes')
70950               .style('display', _notesEnabled ? 'block' : 'none')
70951               .merge(drawLayer);
70952
70953           if (_notesEnabled) {
70954               if (service && ~~context.map().zoom() >= minZoom) {
70955                   editOn();
70956                   service.loadNotes(projection);
70957                   updateMarkers();
70958               } else {
70959                   editOff();
70960               }
70961           }
70962       }
70963
70964
70965       // Toggles the layer on and off
70966       drawNotes.enabled = function(val) {
70967           if (!arguments.length) return _notesEnabled;
70968
70969           _notesEnabled = val;
70970           if (_notesEnabled) {
70971               layerOn();
70972           } else {
70973               layerOff();
70974               if (context.selectedNoteID()) {
70975                   context.enter(modeBrowse(context));
70976               }
70977           }
70978
70979           dispatch$$1.call('change');
70980           return this;
70981       };
70982
70983
70984       return drawNotes;
70985   }
70986
70987   function svgTouch() {
70988
70989       function drawTouch(selection) {
70990           selection.selectAll('.layer-touch')
70991               .data(['areas', 'lines', 'points', 'turns', 'markers'])
70992               .enter()
70993               .append('g')
70994               .attr('class', function(d) { return 'layer-touch ' + d; });
70995       }
70996
70997       return drawTouch;
70998   }
70999
71000   function svgLayers(projection, context) {
71001       var dispatch$$1 = dispatch('change');
71002       var svg = select(null);
71003       var layers = [
71004           { id: 'osm', layer: svgOsm(projection, context, dispatch$$1) },
71005           { id: 'notes', layer: svgNotes$$1(projection, context, dispatch$$1) },
71006           { id: 'data', layer: svgData$$1(projection, context, dispatch$$1) },
71007           { id: 'keepRight', layer: svgKeepRight$$1(projection, context, dispatch$$1) },
71008           { id: 'streetside', layer: svgStreetside$$1(projection, context, dispatch$$1)},
71009           { id: 'mapillary-images', layer: svgMapillaryImages$$1(projection, context, dispatch$$1) },
71010           { id: 'mapillary-signs',  layer: svgMapillarySigns$$1(projection, context, dispatch$$1) },
71011           { id: 'openstreetcam-images', layer: svgOpenstreetcamImages$$1(projection, context, dispatch$$1) },
71012           { id: 'debug', layer: svgDebug$$1(projection, context, dispatch$$1) },
71013           { id: 'geolocate', layer: svgGeolocate(projection, context, dispatch$$1) },
71014           { id: 'touch', layer: svgTouch(projection, context, dispatch$$1) }
71015       ];
71016
71017
71018       function drawLayers(selection$$1) {
71019           svg = selection$$1.selectAll('.surface')
71020               .data([0]);
71021
71022           svg = svg.enter()
71023               .append('svg')
71024               .attr('class', 'surface')
71025               .merge(svg);
71026
71027           var defs = svg.selectAll('.surface-defs')
71028               .data([0]);
71029
71030           defs.enter()
71031               .append('defs')
71032               .attr('class', 'surface-defs');
71033
71034           var groups = svg.selectAll('.data-layer')
71035               .data(layers);
71036
71037           groups.exit()
71038               .remove();
71039
71040           groups.enter()
71041               .append('g')
71042               .attr('class', function(d) { return 'data-layer ' + d.id; })
71043               .merge(groups)
71044               .each(function(d) { select(this).call(d.layer); });
71045       }
71046
71047
71048       drawLayers.all = function() {
71049           return layers;
71050       };
71051
71052
71053       drawLayers.layer = function(id) {
71054           var obj = find$1(layers, function(o) {return o.id === id;});
71055           return obj && obj.layer;
71056       };
71057
71058
71059       drawLayers.only = function(what) {
71060           var arr = [].concat(what);
71061           drawLayers.remove(difference(map$3(layers, 'id'), arr));
71062           return this;
71063       };
71064
71065
71066       drawLayers.remove = function(what) {
71067           var arr = [].concat(what);
71068           arr.forEach(function(id) {
71069               layers = reject(layers, function(o) {return o.id === id;});
71070           });
71071           dispatch$$1.call('change');
71072           return this;
71073       };
71074
71075
71076       drawLayers.add = function(what) {
71077           var arr = [].concat(what);
71078           arr.forEach(function(obj) {
71079               if ('id' in obj && 'layer' in obj) {
71080                   layers.push(obj);
71081               }
71082           });
71083           dispatch$$1.call('change');
71084           return this;
71085       };
71086
71087
71088       drawLayers.dimensions = function(_) {
71089           if (!arguments.length) return utilGetDimensions(svg);
71090           utilSetDimensions(svg, _);
71091           return this;
71092       };
71093
71094
71095       return utilRebind(drawLayers, dispatch$$1, 'on');
71096   }
71097
71098   function svgLines$$1(projection, context) {
71099       var detected = utilDetect();
71100
71101       var highway_stack = {
71102           motorway: 0,
71103           motorway_link: 1,
71104           trunk: 2,
71105           trunk_link: 3,
71106           primary: 4,
71107           primary_link: 5,
71108           secondary: 6,
71109           tertiary: 7,
71110           unclassified: 8,
71111           residential: 9,
71112           service: 10,
71113           footway: 11
71114       };
71115
71116
71117       function drawTargets(selection, graph, entities, filter$$1) {
71118           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
71119           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
71120           var getPath = svgPath(projection).geojson;
71121           var activeID = context.activeID();
71122
71123           // The targets and nopes will be MultiLineString sub-segments of the ways
71124           var data = { targets: [], nopes: [] };
71125
71126           entities.forEach(function(way) {
71127               var features = svgSegmentWay(way, graph, activeID);
71128               data.targets.push.apply(data.targets, features.passive);
71129               data.nopes.push.apply(data.nopes, features.active);
71130           });
71131
71132
71133           // Targets allow hover and vertex snapping
71134           var targetData = data.targets.filter(getPath);
71135           var targets = selection.selectAll('.line.target-allowed')
71136               .filter(function(d) { return filter$$1(d.properties.entity); })
71137               .data(targetData, function key(d) { return d.id; });
71138
71139           // exit
71140           targets.exit()
71141               .remove();
71142
71143           // enter/update
71144           targets.enter()
71145               .append('path')
71146               .merge(targets)
71147               .attr('d', getPath)
71148               .attr('class', function(d) { return 'way line target target-allowed ' + targetClass + d.id; });
71149
71150
71151           // NOPE
71152           var nopeData = data.nopes.filter(getPath);
71153           var nopes = selection.selectAll('.line.target-nope')
71154               .filter(function(d) { return filter$$1(d.properties.entity); })
71155               .data(nopeData, function key(d) { return d.id; });
71156
71157           // exit
71158           nopes.exit()
71159               .remove();
71160
71161           // enter/update
71162           nopes.enter()
71163               .append('path')
71164               .merge(nopes)
71165               .attr('d', getPath)
71166               .attr('class', function(d) { return 'way line target target-nope ' + nopeClass + d.id; });
71167       }
71168
71169
71170       function drawLines(selection, graph, entities, filter$$1) {
71171
71172           function waystack(a, b) {
71173               var selected = context.selectedIDs();
71174               var scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0;
71175               var scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0;
71176
71177               if (a.tags.highway) { scoreA -= highway_stack[a.tags.highway]; }
71178               if (b.tags.highway) { scoreB -= highway_stack[b.tags.highway]; }
71179               return scoreA - scoreB;
71180           }
71181
71182
71183           function drawLineGroup(selection, klass, isSelected) {
71184               // Note: Don't add `.selected` class in draw modes
71185               var mode = context.mode();
71186               var isDrawing = mode && /^draw/.test(mode.id);
71187               var selectedClass = (!isDrawing && isSelected) ? 'selected ' : '';
71188
71189               var lines = selection
71190                   .selectAll('path')
71191                   .filter(filter$$1)
71192                   .data(getPathData(isSelected), osmEntity$$1.key);
71193
71194               lines.exit()
71195                   .remove();
71196
71197               // Optimization: Call expensive TagClasses only on enter selection. This
71198               // works because osmEntity.key is defined to include the entity v attribute.
71199               lines.enter()
71200                   .append('path')
71201                   .attr('class', function(d) {
71202                       var oldMPClass = oldMultiPolygonOuters[d.id] ? 'old-multipolygon ' : '';
71203                       return 'way line ' + klass + ' ' + selectedClass + oldMPClass + d.id;
71204                   })
71205                   .call(svgTagClasses())
71206                   .merge(lines)
71207                   .sort(waystack)
71208                   .attr('d', getPath)
71209                   .call(svgTagClasses().tags(svgRelationMemberTags(graph)));
71210
71211               return selection;
71212           }
71213
71214
71215           function getPathData(isSelected) {
71216               return function() {
71217                   var layer = this.parentNode.__data__;
71218                   var data = pathdata[layer] || [];
71219                   return data.filter(function(d) {
71220                       if (isSelected)
71221                           return context.selectedIDs().indexOf(d.id) !== -1;
71222                       else
71223                           return context.selectedIDs().indexOf(d.id) === -1;
71224                   });
71225               };
71226           }
71227
71228           function addMarkers(layergroup, pathclass, groupclass, groupdata, marker) {
71229               var markergroup = layergroup
71230                   .selectAll('g.' + groupclass)
71231                   .data([pathclass]);
71232
71233               markergroup = markergroup.enter()
71234                   .append('g')
71235                   .attr('class', groupclass)
71236                   .merge(markergroup);
71237
71238               var markers = markergroup
71239                   .selectAll('path')
71240                   .filter(filter$$1)
71241                   .data(
71242                       function data() { return groupdata[this.parentNode.__data__] || []; },
71243                       function key(d) { return [d.id, d.index]; }
71244                   );
71245
71246               markers.exit()
71247                   .remove();
71248
71249               markers = markers.enter()
71250                   .append('path')
71251                   .attr('class', pathclass)
71252                   .attr('marker-mid', marker)
71253                   .merge(markers)
71254                   .attr('d', function(d) { return d.d; });
71255
71256               if (detected.ie) {
71257                   markers.each(function() { this.parentNode.insertBefore(this, this); });
71258               }
71259           }
71260
71261
71262           var getPath = svgPath(projection, graph);
71263           var ways = [];
71264           var pathdata = {};
71265           var onewaydata = {};
71266           var sideddata = {};
71267           var oldMultiPolygonOuters = {};
71268
71269           for (var i = 0; i < entities.length; i++) {
71270               var entity = entities[i];
71271               var outer = osmSimpleMultipolygonOuterMember(entity, graph);
71272               if (outer) {
71273                   ways.push(entity.mergeTags(outer.tags));
71274                   oldMultiPolygonOuters[outer.id] = true;
71275               } else if (entity.geometry(graph) === 'line') {
71276                   ways.push(entity);
71277               }
71278           }
71279
71280           ways = ways.filter(getPath);
71281           pathdata = groupBy(ways, function(way) { return way.layer(); });
71282
71283           forOwn(pathdata, function(v, k) {
71284               var onewayArr = filter(v, function(d) { return d.isOneWay(); });
71285               var onewaySegments = svgMarkerSegments(
71286                   projection, graph, 35,
71287                   function shouldReverse(entity) { return entity.tags.oneway === '-1'; },
71288                   function bothDirections(entity) {
71289                       return entity.tags.oneway === 'reversible' || entity.tags.oneway === 'alternating';
71290                   }
71291               );
71292               onewaydata[k] = flatten(map$3(onewayArr, onewaySegments));
71293
71294               var sidedArr = filter(v, function(d) { return d.isSided(); });
71295               var sidedSegments = svgMarkerSegments(
71296                   projection, graph, 30,
71297                   function shouldReverse() { return false; },
71298                   function bothDirections() { return false; }
71299               );
71300               sideddata[k] = flatten(map$3(sidedArr, sidedSegments));
71301           });
71302
71303
71304           var covered = selection.selectAll('.layer-osm.covered');     // under areas
71305           var uncovered = selection.selectAll('.layer-osm.lines');     // over areas
71306           var touchLayer = selection.selectAll('.layer-touch.lines');
71307
71308           // Draw lines..
71309           [covered, uncovered].forEach(function(selection) {
71310               var range$$1 = (selection === covered ? range(-10,0) : range(0,11));
71311               var layergroup = selection
71312                   .selectAll('g.layergroup')
71313                   .data(range$$1);
71314
71315               layergroup = layergroup.enter()
71316                   .append('g')
71317                   .attr('class', function(d) { return 'layergroup layer' + String(d); })
71318                   .merge(layergroup);
71319
71320               layergroup
71321                   .selectAll('g.linegroup')
71322                   .data(['shadow', 'casing', 'stroke', 'shadow-highlighted', 'casing-highlighted', 'stroke-highlighted'])
71323                   .enter()
71324                   .append('g')
71325                   .attr('class', function(d) { return 'linegroup line-' + d; });
71326
71327               layergroup.selectAll('g.line-shadow')
71328                   .call(drawLineGroup, 'shadow', false);
71329               layergroup.selectAll('g.line-casing')
71330                   .call(drawLineGroup, 'casing', false);
71331               layergroup.selectAll('g.line-stroke')
71332                   .call(drawLineGroup, 'stroke', false);
71333
71334               layergroup.selectAll('g.line-shadow-highlighted')
71335                   .call(drawLineGroup, 'shadow', true);
71336               layergroup.selectAll('g.line-casing-highlighted')
71337                   .call(drawLineGroup, 'casing', true);
71338               layergroup.selectAll('g.line-stroke-highlighted')
71339                   .call(drawLineGroup, 'stroke', true);
71340
71341               addMarkers(layergroup, 'oneway', 'onewaygroup', onewaydata, 'url(#oneway-marker)');
71342               addMarkers(layergroup, 'sided', 'sidedgroup', sideddata,
71343                   function marker(d) {
71344                       var category = graph.entity(d.id).sidednessIdentifier();
71345                       return 'url(#sided-marker-' + category + ')';
71346                   }
71347               );
71348           });
71349
71350           // Draw touch targets..
71351           touchLayer
71352               .call(drawTargets, graph, ways, filter$$1);
71353       }
71354
71355
71356       return drawLines;
71357   }
71358
71359   function svgMidpoints$$1(projection, context) {
71360       var targetRadius = 8;
71361
71362       function drawTargets(selection, graph, entities, filter) {
71363           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
71364           var getTransform = svgPointTransform(projection).geojson;
71365
71366           var data = entities.map(function(midpoint) {
71367               return {
71368                   type: 'Feature',
71369                   id: midpoint.id,
71370                   properties: {
71371                       target: true,
71372                       entity: midpoint
71373                   },
71374                   geometry: {
71375                       type: 'Point',
71376                       coordinates: midpoint.loc
71377                   }
71378               };
71379           });
71380
71381           var targets = selection.selectAll('.midpoint.target')
71382               .filter(function(d) { return filter(d.properties.entity); })
71383               .data(data, function key(d) { return d.id; });
71384
71385           // exit
71386           targets.exit()
71387               .remove();
71388
71389           // enter/update
71390           targets.enter()
71391               .append('circle')
71392               .attr('r', targetRadius)
71393               .merge(targets)
71394               .attr('class', function(d) { return 'node midpoint target ' + fillClass + d.id; })
71395               .attr('transform', getTransform);
71396       }
71397
71398
71399       function drawMidpoints(selection, graph, entities, filter, extent) {
71400           var drawLayer = selection.selectAll('.layer-osm.points .points-group.midpoints');
71401           var touchLayer = selection.selectAll('.layer-touch.points');
71402
71403           var mode = context.mode();
71404           if (mode && mode.id !== 'select') {
71405               drawLayer.selectAll('.midpoint').remove();
71406               touchLayer.selectAll('.midpoint.target').remove();
71407               return;
71408           }
71409
71410           var poly = extent.polygon();
71411           var midpoints = {};
71412
71413           for (var i = 0; i < entities.length; i++) {
71414               var entity = entities[i];
71415
71416               if (entity.type !== 'way') continue;
71417               if (!filter(entity)) continue;
71418               if (context.selectedIDs().indexOf(entity.id) < 0) continue;
71419
71420               var nodes = graph.childNodes(entity);
71421               for (var j = 0; j < nodes.length - 1; j++) {
71422                   var a = nodes[j];
71423                   var b = nodes[j + 1];
71424                   var id = [a.id, b.id].sort().join('-');
71425
71426                   if (midpoints[id]) {
71427                       midpoints[id].parents.push(entity);
71428                   } else if (geoVecLength(projection(a.loc), projection(b.loc)) > 40) {
71429                       var point = geoVecInterp(a.loc, b.loc, 0.5);
71430                       var loc = null;
71431
71432                       if (extent.intersects(point)) {
71433                           loc = point;
71434                       } else {
71435                           for (var k = 0; k < 4; k++) {
71436                               point = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]);
71437                               if (point &&
71438                                   geoVecLength(projection(a.loc), projection(point)) > 20 &&
71439                                   geoVecLength(projection(b.loc), projection(point)) > 20)
71440                               {
71441                                   loc = point;
71442                                   break;
71443                               }
71444                           }
71445                       }
71446
71447                       if (loc) {
71448                           midpoints[id] = {
71449                               type: 'midpoint',
71450                               id: id,
71451                               loc: loc,
71452                               edge: [a.id, b.id],
71453                               parents: [entity]
71454                           };
71455                       }
71456                   }
71457               }
71458           }
71459
71460
71461           function midpointFilter(d) {
71462               if (midpoints[d.id])
71463                   return true;
71464
71465               for (var i = 0; i < d.parents.length; i++) {
71466                   if (filter(d.parents[i])) {
71467                       return true;
71468                   }
71469               }
71470
71471               return false;
71472           }
71473
71474
71475           var groups = drawLayer.selectAll('.midpoint')
71476               .filter(midpointFilter)
71477               .data(values$1(midpoints), function(d) { return d.id; });
71478
71479           groups.exit()
71480               .remove();
71481
71482           var enter = groups.enter()
71483               .insert('g', ':first-child')
71484               .attr('class', 'midpoint');
71485
71486           enter
71487               .append('polygon')
71488               .attr('points', '-6,8 10,0 -6,-8')
71489               .attr('class', 'shadow');
71490
71491           enter
71492               .append('polygon')
71493               .attr('points', '-3,4 5,0 -3,-4')
71494               .attr('class', 'fill');
71495
71496           groups = groups
71497               .merge(enter)
71498               .attr('transform', function(d) {
71499                   var translate = svgPointTransform(projection);
71500                   var a = graph.entity(d.edge[0]);
71501                   var b = graph.entity(d.edge[1]);
71502                   var angle = geoAngle(a, b, projection) * (180 / Math.PI);
71503                   return translate(d) + ' rotate(' + angle + ')';
71504               })
71505               .call(svgTagClasses().tags(
71506                   function(d) { return d.parents[0].tags; }
71507               ));
71508
71509           // Propagate data bindings.
71510           groups.select('polygon.shadow');
71511           groups.select('polygon.fill');
71512
71513
71514           // Draw touch targets..
71515           touchLayer
71516               .call(drawTargets, graph, values$1(midpoints), midpointFilter);
71517       }
71518
71519       return drawMidpoints;
71520   }
71521
71522   function svgPoints$$1(projection, context) {
71523
71524       function markerPath(selection, klass) {
71525           selection
71526               .attr('class', klass)
71527               .attr('transform', 'translate(-8, -23)')
71528               .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');
71529       }
71530
71531       function sortY(a, b) {
71532           return b.loc[1] - a.loc[1];
71533       }
71534
71535
71536       // Avoid exit/enter if we're just moving stuff around.
71537       // The node will get a new version but we only need to run the update selection.
71538       function fastEntityKey(d) {
71539           var mode = context.mode();
71540           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
71541           return isMoving ? d.id : osmEntity$$1.key(d);
71542       }
71543
71544
71545       function drawTargets(selection, graph, entities, filter) {
71546           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
71547           var getTransform = svgPointTransform(projection).geojson;
71548           var activeID = context.activeID();
71549           var data = [];
71550
71551           entities.forEach(function(node) {
71552               if (activeID === node.id) return;   // draw no target on the activeID
71553
71554               data.push({
71555                   type: 'Feature',
71556                   id: node.id,
71557                   properties: {
71558                       target: true,
71559                       entity: node
71560                   },
71561                   geometry: node.asGeoJSON()
71562               });
71563           });
71564
71565           var targets = selection.selectAll('.point.target')
71566               .filter(function(d) { return filter(d.properties.entity); })
71567               .data(data, function key(d) { return d.id; });
71568
71569           // exit
71570           targets.exit()
71571               .remove();
71572
71573           // enter/update
71574           targets.enter()
71575               .append('rect')
71576               .attr('x', -10)
71577               .attr('y', -26)
71578               .attr('width', 20)
71579               .attr('height', 30)
71580               .merge(targets)
71581               .attr('class', function(d) { return 'node point target ' + fillClass + d.id; })
71582               .attr('transform', getTransform);
71583       }
71584
71585
71586       function drawPoints(selection, graph, entities, filter) {
71587           var wireframe = context.surface().classed('fill-wireframe');
71588           var zoom = geoScaleToZoom(projection.scale());
71589
71590           // Points with a direction will render as vertices at higher zooms..
71591           function renderAsPoint(entity) {
71592               return entity.geometry(graph) === 'point' &&
71593                   !(zoom >= 18 && entity.directions(graph, projection).length);
71594           }
71595
71596           // All points will render as vertices in wireframe mode too..
71597           var points = wireframe ? [] : entities.filter(renderAsPoint);
71598           points.sort(sortY);
71599
71600
71601           var drawLayer = selection.selectAll('.layer-osm.points .points-group.points');
71602           var touchLayer = selection.selectAll('.layer-touch.points');
71603
71604           // Draw points..
71605           var groups = drawLayer.selectAll('g.point')
71606               .filter(filter)
71607               .data(points, fastEntityKey);
71608
71609           groups.exit()
71610               .remove();
71611
71612           var enter = groups.enter()
71613               .append('g')
71614               .attr('class', function(d) { return 'node point ' + d.id; })
71615               .order();
71616
71617           enter
71618               .append('path')
71619               .call(markerPath, 'shadow');
71620
71621           enter
71622               .append('ellipse')
71623               .attr('cx', 0.5)
71624               .attr('cy', 1)
71625               .attr('rx', 6.5)
71626               .attr('ry', 3)
71627               .attr('class', 'stroke');
71628
71629           enter
71630               .append('path')
71631               .call(markerPath, 'stroke');
71632
71633           enter
71634               .append('use')
71635               .attr('transform', 'translate(-5, -19)')
71636               .attr('class', 'icon')
71637               .attr('width', '11px')
71638               .attr('height', '11px');
71639
71640           groups = groups
71641               .merge(enter)
71642               .attr('transform', svgPointTransform(projection))
71643               .call(svgTagClasses());
71644
71645           // Selecting the following implicitly
71646           // sets the data (point entity) on the element
71647           groups.select('.shadow');
71648           groups.select('.stroke');
71649           groups.select('.icon')
71650               .attr('xlink:href', function(entity) {
71651                   var preset = context.presets().match(entity, graph);
71652                   var picon = preset && preset.icon;
71653
71654                   if (!picon) {
71655                       return '';
71656                   } else {
71657                       var isMaki = /^maki-/.test(picon);
71658                       return '#' + picon + (isMaki ? '-11' : '');
71659                   }
71660               });
71661
71662
71663           // Draw touch targets..
71664           touchLayer
71665               .call(drawTargets, graph, points, filter);
71666       }
71667
71668
71669       return drawPoints;
71670   }
71671
71672   function svgTagClasses() {
71673       var primaries = [
71674           'building', 'highway', 'railway', 'waterway', 'aeroway',
71675           'motorway', 'boundary', 'power', 'amenity', 'natural', 'landuse',
71676           'leisure', 'military', 'place', 'man_made', 'route', 'attraction'
71677       ];
71678       var statuses = [
71679           'proposed', 'construction', 'disused', 'abandoned', 'dismantled',
71680           'razed', 'demolished', 'obliterated', 'intermittent'
71681       ];
71682       var secondaries = [
71683           'oneway', 'bridge', 'tunnel', 'embankment', 'cutting', 'barrier',
71684           'surface', 'tracktype', 'footway', 'crossing', 'service', 'sport',
71685           'public_transport', 'location', 'parking'
71686       ];
71687       var _tags = function(entity) { return entity.tags; };
71688
71689
71690       var tagClasses = function(selection$$1) {
71691           selection$$1.each(function tagClassesEach(entity) {
71692               var value = this.className;
71693               var primary, status;
71694
71695               if (value.baseVal !== undefined) {
71696                   value = value.baseVal;
71697               }
71698
71699               var t = _tags(entity);
71700               var isMultiPolygon = (t.type === 'multipolygon');
71701               var shouldRenderLineAsArea = isMultiPolygon && !entity.hasInterestingTags();
71702
71703               var i, k, v;
71704
71705               // preserve base classes (nothing with `tag-`)
71706               var classes = value.trim().split(/\s+/)
71707                   .filter(function(klass) {
71708                       return klass.length && !/^tag-/.test(klass);
71709                   })
71710                   .map(function(klass) {  // style multipolygon inner/outers as areas not lines
71711                       return (klass === 'line' && shouldRenderLineAsArea) ? 'area' : klass;
71712                   });
71713
71714
71715               // pick at most one primary classification tag..
71716               for (i = 0; i < primaries.length; i++) {
71717                   k = primaries[i];
71718                   v = t[k];
71719                   if (!v || v === 'no') continue;
71720
71721                   primary = k;
71722                   if (statuses.indexOf(v) !== -1) {   // e.g. `railway=abandoned`
71723                       status = v;
71724                       classes.push('tag-' + k);
71725                   } else {
71726                       classes.push('tag-' + k);
71727                       classes.push('tag-' + k + '-' + v);
71728                   }
71729
71730                   break;
71731               }
71732
71733               // add at most one status tag, only if relates to primary tag..
71734               if (!status) {
71735                   for (i = 0; i < statuses.length; i++) {
71736                       k = statuses[i];
71737                       v = t[k];
71738                       if (!v || v === 'no') continue;
71739
71740                       if (v === 'yes') {   // e.g. `railway=rail + abandoned=yes`
71741                           status = k;
71742                       }
71743                       else if (primary && primary === v) {  // e.g. `railway=rail + abandoned=railway`
71744                           status = k;
71745                       } else if (!primary && primaries.indexOf(v) !== -1) {  // e.g. `abandoned=railway`
71746                           status = k;
71747                           primary = v;
71748                           classes.push('tag-' + v);
71749                       }  // else ignore e.g.  `highway=path + abandoned=railway`
71750
71751                       if (status) break;
71752                   }
71753               }
71754
71755               if (status) {
71756                   classes.push('tag-status');
71757                   classes.push('tag-status-' + status);
71758               }
71759
71760               // add any secondary tags
71761               for (i = 0; i < secondaries.length; i++) {
71762                   k = secondaries[i];
71763                   v = t[k];
71764                   if (!v || v === 'no') continue;
71765                   classes.push('tag-' + k);
71766                   classes.push('tag-' + k + '-' + v);
71767               }
71768
71769               // For highways, look for surface tagging..
71770               if (primary === 'highway' || primary === 'aeroway') {
71771                   var paved = (t.highway !== 'track');
71772                   for (k in t) {
71773                       v = t[k];
71774                       if (k in osmPavedTags) {
71775                           paved = !!osmPavedTags[k][v];
71776                           break;
71777                       }
71778                   }
71779                   if (!paved) {
71780                       classes.push('tag-unpaved');
71781                   }
71782               }
71783
71784
71785               var computed = classes.join(' ').trim();
71786               if (computed !== value) {
71787                   select(this).attr('class', computed);
71788               }
71789           });
71790       };
71791
71792
71793       tagClasses.tags = function(val) {
71794           if (!arguments.length) return _tags;
71795           _tags = val;
71796           return tagClasses;
71797       };
71798
71799       return tagClasses;
71800   }
71801
71802   function svgTurns(projection, context) {
71803
71804       function icon(turn) {
71805           var u = turn.u ? '-u' : '';
71806           if (turn.no) return '#iD-turn-no' + u;
71807           if (turn.only) return '#iD-turn-only' + u;
71808           return '#iD-turn-yes' + u;
71809       }
71810
71811       function drawTurns(selection, graph, turns) {
71812
71813           function turnTransform(d) {
71814               var pxRadius = 50;
71815               var toWay = graph.entity(d.to.way);
71816               var toPoints = graph.childNodes(toWay)
71817                   .map(function (n) { return n.loc; })
71818                   .map(projection);
71819               var toLength = geoPathLength(toPoints);
71820               var mid = toLength / 2;    // midpoint of destination way
71821
71822               var toNode = graph.entity(d.to.node);
71823               var toVertex = graph.entity(d.to.vertex);
71824               var a = geoAngle(toVertex, toNode, projection);
71825               var o = projection(toVertex.loc);
71826               var r = d.u ? 0                  // u-turn: no radius
71827                   : !toWay.__via ? pxRadius    // leaf way: put marker at pxRadius
71828                   : Math.min(mid, pxRadius);   // via way: prefer pxRadius, fallback to mid for very short ways
71829
71830               return 'translate(' + (r * Math.cos(a) + o[0]) + ',' + (r * Math.sin(a) + o[1]) + ') ' +
71831                   'rotate(' + a * 180 / Math.PI + ')';
71832           }
71833
71834
71835           var drawLayer = selection.selectAll('.layer-osm.points .points-group.turns');
71836           var touchLayer = selection.selectAll('.layer-touch.turns');
71837
71838           // Draw turns..
71839           var groups = drawLayer.selectAll('g.turn')
71840               .data(turns, function(d) { return d.key; });
71841
71842           // exit
71843           groups.exit()
71844               .remove();
71845
71846           // enter
71847           var groupsEnter = groups.enter()
71848               .append('g')
71849               .attr('class', function(d) { return 'turn ' + d.key; });
71850
71851           var turnsEnter = groupsEnter
71852               .filter(function(d) { return !d.u; });
71853
71854           turnsEnter.append('rect')
71855               .attr('transform', 'translate(-22, -12)')
71856               .attr('width', '44')
71857               .attr('height', '24');
71858
71859           turnsEnter.append('use')
71860               .attr('transform', 'translate(-22, -12)')
71861               .attr('width', '44')
71862               .attr('height', '24');
71863
71864           var uEnter = groupsEnter
71865               .filter(function(d) { return d.u; });
71866
71867           uEnter.append('circle')
71868               .attr('r', '16');
71869
71870           uEnter.append('use')
71871               .attr('transform', 'translate(-16, -16)')
71872               .attr('width', '32')
71873               .attr('height', '32');
71874
71875           // update
71876           groups = groups
71877               .merge(groupsEnter)
71878               .attr('opacity', function(d) { return d.direct === false ? '0.7' : null; })
71879               .attr('transform', turnTransform);
71880
71881           groups.select('use')
71882               .attr('xlink:href', icon);
71883
71884           groups.select('rect');      // propagate bound data
71885           groups.select('circle');    // propagate bound data
71886
71887
71888           // Draw touch targets..
71889           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
71890           groups = touchLayer.selectAll('g.turn')
71891               .data(turns, function(d) { return d.key; });
71892
71893           // exit
71894           groups.exit()
71895               .remove();
71896
71897           // enter
71898           groupsEnter = groups.enter()
71899               .append('g')
71900               .attr('class', function(d) { return 'turn ' + d.key; });
71901
71902           turnsEnter = groupsEnter
71903               .filter(function(d) { return !d.u; });
71904
71905           turnsEnter.append('rect')
71906               .attr('class', 'target ' + fillClass)
71907               .attr('transform', 'translate(-22, -12)')
71908               .attr('width', '44')
71909               .attr('height', '24');
71910
71911           uEnter = groupsEnter
71912               .filter(function(d) { return d.u; });
71913
71914           uEnter.append('circle')
71915               .attr('class', 'target ' + fillClass)
71916               .attr('r', '16');
71917
71918           // update
71919           groups = groups
71920               .merge(groupsEnter)
71921               .attr('transform', turnTransform);
71922
71923           groups.select('rect');      // propagate bound data
71924           groups.select('circle');    // propagate bound data
71925
71926
71927           return this;
71928       }
71929
71930       return drawTurns;
71931   }
71932
71933   function svgVertices$$1(projection, context) {
71934       var radiuses = {
71935           //       z16-, z17,   z18+,  w/icon
71936           shadow: [6,    7.5,   7.5,   12],
71937           stroke: [2.5,  3.5,   3.5,   8],
71938           fill:   [1,    1.5,   1.5,   1.5]
71939       };
71940
71941       var _currHoverTarget;
71942       var _currPersistent = {};
71943       var _currHover = {};
71944       var _prevHover = {};
71945       var _currSelected = {};
71946       var _prevSelected = {};
71947       var _radii = {};
71948
71949
71950       function sortY(a, b) {
71951           return b.loc[1] - a.loc[1];
71952       }
71953
71954       // Avoid exit/enter if we're just moving stuff around.
71955       // The node will get a new version but we only need to run the update selection.
71956       function fastEntityKey(d) {
71957           var mode = context.mode();
71958           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
71959           return isMoving ? d.id : osmEntity$$1.key(d);
71960       }
71961
71962
71963       function draw(selection$$1, graph, vertices, sets, filter) {
71964           sets = sets || { selected: {}, important: {}, hovered: {} };
71965
71966           var icons = {};
71967           var directions = {};
71968           var wireframe = context.surface().classed('fill-wireframe');
71969           var zoom = geoScaleToZoom(projection.scale());
71970           var z = (zoom < 17 ? 0 : zoom < 18 ? 1 : 2);
71971           var activeID = context.activeID();
71972
71973
71974           function getIcon(d) {
71975               // always check latest entity, as fastEntityKey avoids enter/exit now
71976               var entity = graph.entity(d.id);
71977               if (entity.id in icons) return icons[entity.id];
71978
71979               icons[entity.id] =
71980                   entity.hasInterestingTags() &&
71981                   context.presets().match(entity, graph).icon;
71982
71983               return icons[entity.id];
71984           }
71985
71986
71987           // memoize directions results, return false for empty arrays (for use in filter)
71988           function getDirections(entity) {
71989               if (entity.id in directions) return directions[entity.id];
71990
71991               var angles = entity.directions(graph, projection);
71992               directions[entity.id] = angles.length ? angles : false;
71993               return angles;
71994           }
71995
71996
71997           function updateAttributes(selection$$1) {
71998               ['shadow', 'stroke', 'fill'].forEach(function(klass) {
71999                   var rads = radiuses[klass];
72000                   selection$$1.selectAll('.' + klass)
72001                       .each(function(entity) {
72002                           var i = z && getIcon(entity);
72003                           var r = rads[i ? 3 : z];
72004
72005                           // slightly increase the size of unconnected endpoints #3775
72006                           if (entity.id !== activeID && entity.isEndpoint(graph) && !entity.isConnected(graph)) {
72007                               r += 1.5;
72008                           }
72009
72010                           if (klass === 'shadow') {   // remember this value, so we don't need to
72011                               _radii[entity.id] = r;  // recompute it when we draw the touch targets
72012                           }
72013
72014                           select(this)
72015                               .attr('r', r)
72016                               .attr('visibility', (i && klass === 'fill') ? 'hidden' : null);
72017                       });
72018               });
72019           }
72020
72021           vertices.sort(sortY);
72022
72023           var groups = selection$$1.selectAll('g.vertex')
72024               .filter(filter)
72025               .data(vertices, fastEntityKey);
72026
72027           // exit
72028           groups.exit()
72029               .remove();
72030
72031           // enter
72032           var enter = groups.enter()
72033               .append('g')
72034               .attr('class', function(d) { return 'node vertex ' + d.id; })
72035               .order();
72036
72037           enter
72038               .append('circle')
72039               .attr('class', 'shadow');
72040
72041           enter
72042               .append('circle')
72043               .attr('class', 'stroke');
72044
72045           // Vertices with tags get a fill.
72046           enter.filter(function(d) { return d.hasInterestingTags(); })
72047               .append('circle')
72048               .attr('class', 'fill');
72049
72050           // update
72051           groups = groups
72052               .merge(enter)
72053               .attr('transform', svgPointTransform(projection))
72054               .classed('sibling', function(d) { return d.id in sets.selected; })
72055               .classed('shared', function(d) { return graph.isShared(d); })
72056               .classed('endpoint', function(d) { return d.isEndpoint(graph); })
72057               .call(updateAttributes);
72058
72059
72060           // Vertices with icons get a `use`.
72061           var iconUse = groups
72062               .selectAll('.icon')
72063               .data(function data(d) { return zoom >= 17 && getIcon(d) ? [d] : []; }, fastEntityKey);
72064
72065           // exit
72066           iconUse.exit()
72067               .remove();
72068
72069           // enter
72070           iconUse.enter()
72071               .append('use')
72072               .attr('class', 'icon')
72073               .attr('width', '11px')
72074               .attr('height', '11px')
72075               .attr('transform', 'translate(-5.5, -5.5)')
72076               .attr('xlink:href', function(d) {
72077                   var picon = getIcon(d);
72078                   var isMaki = /^maki-/.test(picon);
72079                   return '#' + picon + (isMaki ? '-11' : '');
72080               });
72081
72082
72083           // Vertices with directions get viewfields
72084           var dgroups = groups
72085               .selectAll('.viewfieldgroup')
72086               .data(function data(d) { return zoom >= 18 && getDirections(d) ? [d] : []; }, fastEntityKey);
72087
72088           // exit
72089           dgroups.exit()
72090               .remove();
72091
72092           // enter/update
72093           dgroups = dgroups.enter()
72094               .insert('g', '.shadow')
72095               .attr('class', 'viewfieldgroup')
72096               .merge(dgroups);
72097
72098           var viewfields = dgroups.selectAll('.viewfield')
72099               .data(getDirections, function key(d) { return osmEntity$$1.key(d); });
72100
72101           // exit
72102           viewfields.exit()
72103               .remove();
72104
72105           // enter/update
72106           viewfields.enter()
72107               .append('path')
72108               .attr('class', 'viewfield')
72109               .attr('d', 'M0,0H0')
72110               .merge(viewfields)
72111               .attr('marker-start', 'url(#viewfield-marker' + (wireframe ? '-wireframe' : '') + ')')
72112               .attr('transform', function(d) { return 'rotate(' + d + ')'; });
72113       }
72114
72115
72116       function drawTargets(selection$$1, graph, entities, filter) {
72117           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
72118           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
72119           var getTransform = svgPointTransform(projection).geojson;
72120           var activeID = context.activeID();
72121           var data = { targets: [], nopes: [] };
72122
72123           entities.forEach(function(node) {
72124               if (activeID === node.id) return;   // draw no target on the activeID
72125
72126               var vertexType = svgPassiveVertex(node, graph, activeID);
72127               if (vertexType !== 0) {     // passive or adjacent - allow to connect
72128                   data.targets.push({
72129                       type: 'Feature',
72130                       id: node.id,
72131                       properties: {
72132                           target: true,
72133                           entity: node
72134                       },
72135                       geometry: node.asGeoJSON()
72136                   });
72137               } else {
72138                   data.nopes.push({
72139                       type: 'Feature',
72140                       id: node.id + '-nope',
72141                       properties: {
72142                           nope: true,
72143                           target: true,
72144                           entity: node
72145                       },
72146                       geometry: node.asGeoJSON()
72147                   });
72148               }
72149           });
72150
72151
72152           // Targets allow hover and vertex snapping
72153           var targets = selection$$1.selectAll('.vertex.target-allowed')
72154               .filter(function(d) { return filter(d.properties.entity); })
72155               .data(data.targets, function key(d) { return d.id; });
72156
72157           // exit
72158           targets.exit()
72159               .remove();
72160
72161           // enter/update
72162           targets.enter()
72163               .append('circle')
72164               .attr('r', function(d) { return (_radii[d.id] || radiuses.shadow[3]); })
72165               .merge(targets)
72166               .attr('class', function(d) { return 'node vertex target target-allowed ' + targetClass + d.id; })
72167               .attr('transform', getTransform);
72168
72169
72170           // NOPE
72171           var nopes = selection$$1.selectAll('.vertex.target-nope')
72172               .filter(function(d) { return filter(d.properties.entity); })
72173               .data(data.nopes, function key(d) { return d.id; });
72174
72175           // exit
72176           nopes.exit()
72177               .remove();
72178
72179           // enter/update
72180           nopes.enter()
72181               .append('circle')
72182               .attr('r', function(d) { return (_radii[d.properties.entity.id] || radiuses.shadow[3]); })
72183               .merge(nopes)
72184               .attr('class', function(d) { return 'node vertex target target-nope ' + nopeClass + d.id; })
72185               .attr('transform', getTransform);
72186       }
72187
72188
72189       // Points can also render as vertices:
72190       // 1. in wireframe mode or
72191       // 2. at higher zooms if they have a direction
72192       function renderAsVertex(entity, graph, wireframe, zoom) {
72193           var geometry = entity.geometry(graph);
72194           return geometry === 'vertex' || (geometry === 'point' && (
72195               wireframe || (zoom >= 18 && entity.directions(graph, projection).length)
72196           ));
72197       }
72198
72199
72200       function getSiblingAndChildVertices(ids, graph, wireframe, zoom) {
72201           var results = {};
72202
72203           function addChildVertices(entity) {
72204               var geometry = entity.geometry(graph);
72205               if (!context.features().isHiddenFeature(entity, graph, geometry)) {
72206                   var i;
72207                   if (entity.type === 'way') {
72208                       for (i = 0; i < entity.nodes.length; i++) {
72209                           var child = graph.hasEntity(entity.nodes[i]);
72210                           if (child) {
72211                               addChildVertices(child);
72212                           }
72213                       }
72214                   } else if (entity.type === 'relation') {
72215                       for (i = 0; i < entity.members.length; i++) {
72216                           var member = graph.hasEntity(entity.members[i].id);
72217                           if (member) {
72218                               addChildVertices(member);
72219                           }
72220                       }
72221                   } else if (renderAsVertex(entity, graph, wireframe, zoom)) {
72222                       results[entity.id] = entity;
72223                   }
72224               }
72225           }
72226
72227           ids.forEach(function(id) {
72228               var entity = graph.hasEntity(id);
72229               if (!entity) return;
72230
72231               if (entity.type === 'node') {
72232                   if (renderAsVertex(entity, graph, wireframe, zoom)) {
72233                       results[entity.id] = entity;
72234                       graph.parentWays(entity).forEach(function(entity) {
72235                           addChildVertices(entity);
72236                       });
72237                   }
72238               } else {  // way, relation
72239                   addChildVertices(entity);
72240               }
72241           });
72242
72243           return results;
72244       }
72245
72246
72247       function drawVertices(selection$$1, graph, entities, filter, extent, fullRedraw) {
72248           var wireframe = context.surface().classed('fill-wireframe');
72249           var zoom = geoScaleToZoom(projection.scale());
72250           var mode = context.mode();
72251           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
72252
72253           var drawLayer = selection$$1.selectAll('.layer-osm.points .points-group.vertices');
72254           var touchLayer = selection$$1.selectAll('.layer-touch.points');
72255
72256           if (fullRedraw) {
72257               _currPersistent = {};
72258               _radii = {};
72259           }
72260
72261           // Collect important vertices from the `entities` list..
72262           // (during a paritial redraw, it will not contain everything)
72263           for (var i = 0; i < entities.length; i++) {
72264               var entity = entities[i];
72265               var geometry = entity.geometry(graph);
72266               var keep = false;
72267
72268               // a point that looks like a vertex..
72269               if ((geometry === 'point') && renderAsVertex(entity, graph, wireframe, zoom)) {
72270                   _currPersistent[entity.id] = entity;
72271                   keep = true;
72272
72273               // a vertex of some importance..
72274               } else if (geometry === 'vertex' &&
72275                   (entity.hasInterestingTags() || entity.isEndpoint(graph) || entity.isConnected(graph))) {
72276                   _currPersistent[entity.id] = entity;
72277                   keep = true;
72278               }
72279
72280               // whatever this is, it's not a persistent vertex..
72281               if (!keep && !fullRedraw) {
72282                   delete _currPersistent[entity.id];
72283               }
72284           }
72285
72286           // 3 sets of vertices to consider:
72287           var sets = {
72288               persistent: _currPersistent,  // persistent = important vertices (render always)
72289               selected: _currSelected,      // selected + siblings of selected (render always)
72290               hovered: _currHover           // hovered + siblings of hovered (render only in draw modes)
72291           };
72292
72293           var all = assign({}, (isMoving ? _currHover : {}), _currSelected, _currPersistent);
72294
72295           // Draw the vertices..
72296           // The filter function controls the scope of what objects d3 will touch (exit/enter/update)
72297           // Adjust the filter function to expand the scope beyond whatever entities were passed in.
72298           var filterRendered = function(d) {
72299               return d.id in _currPersistent || d.id in _currSelected || d.id in _currHover || filter(d);
72300           };
72301           drawLayer
72302               .call(draw, graph, currentVisible(all), sets, filterRendered);
72303
72304           // Draw touch targets..
72305           // When drawing, render all targets (not just those affected by a partial redraw)
72306           var filterTouch = function(d) {
72307               return isMoving ? true : filterRendered(d);
72308           };
72309           touchLayer
72310               .call(drawTargets, graph, currentVisible(all), filterTouch);
72311
72312
72313           function currentVisible(which) {
72314               return Object.keys(which)
72315                   .map(graph.hasEntity, graph)     // the current version of this entity
72316                   .filter(function (entity) { return entity && entity.intersects(extent, graph); });
72317           }
72318       }
72319
72320
72321       // partial redraw - only update the selected items..
72322       drawVertices.drawSelected = function(selection$$1, graph, extent) {
72323           var wireframe = context.surface().classed('fill-wireframe');
72324           var zoom = geoScaleToZoom(projection.scale());
72325
72326           _prevSelected = _currSelected || {};
72327           _currSelected = getSiblingAndChildVertices(context.selectedIDs(), graph, wireframe, zoom);
72328
72329           // note that drawVertices will add `_currSelected` automatically if needed..
72330           var filter = function(d) { return d.id in _prevSelected; };
72331           drawVertices(selection$$1, graph, values$1(_prevSelected), filter, extent, false);
72332       };
72333
72334
72335       // partial redraw - only update the hovered items..
72336       drawVertices.drawHover = function(selection$$1, graph, target, extent) {
72337           if (target === _currHoverTarget) return;  // continue only if something changed
72338
72339           var wireframe = context.surface().classed('fill-wireframe');
72340           var zoom = geoScaleToZoom(projection.scale());
72341
72342           _prevHover = _currHover || {};
72343           _currHoverTarget = target;
72344           var entity = target && target.properties && target.properties.entity;
72345
72346           if (entity) {
72347               _currHover = getSiblingAndChildVertices([entity.id], graph, wireframe, zoom);
72348           } else {
72349               _currHover = {};
72350           }
72351
72352           // note that drawVertices will add `_currHover` automatically if needed..
72353           var filter = function(d) { return d.id in _prevHover; };
72354           drawVertices(selection$$1, graph, values$1(_prevHover), filter, extent, false);
72355       };
72356
72357       return drawVertices;
72358   }
72359
72360   /* global Mapillary:false */
72361
72362
72363   var apibase = 'https://a.mapillary.com/v3/';
72364   var viewercss = 'mapillary-js/mapillary.min.css';
72365   var viewerjs = 'mapillary-js/mapillary.min.js';
72366   var clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi';
72367   var maxResults = 1000;
72368   var tileZoom = 14;
72369   var tiler$1 = utilTiler().zoomExtent([tileZoom, tileZoom]).skipNullIsland(true);
72370   var dispatch$2 = dispatch('loadedImages', 'loadedSigns', 'bearingChanged');
72371   var _mlyFallback = false;
72372   var _mlyCache;
72373   var _mlyClicks;
72374   var _mlySelectedImage;
72375   var _mlyViewer;
72376
72377
72378   function abortRequest$1(i) {
72379       i.abort();
72380   }
72381
72382
72383   function maxPageAtZoom(z) {
72384       if (z < 15)   return 2;
72385       if (z === 15) return 5;
72386       if (z === 16) return 10;
72387       if (z === 17) return 20;
72388       if (z === 18) return 40;
72389       if (z > 18)   return 80;
72390   }
72391
72392
72393   function loadTiles(which, url, projection) {
72394       var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
72395       var tiles = tiler$1.getTiles(projection);
72396
72397       // abort inflight requests that are no longer needed
72398       var cache = _mlyCache[which];
72399       forEach(cache.inflight, function(v, k) {
72400           var wanted = find$1(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; });
72401
72402           if (!wanted) {
72403               abortRequest$1(v);
72404               delete cache.inflight[k];
72405           }
72406       });
72407
72408       tiles.forEach(function(tile) {
72409           loadNextTilePage(which, currZoom, url, tile);
72410       });
72411   }
72412
72413
72414   function loadNextTilePage(which, currZoom, url, tile) {
72415       var cache = _mlyCache[which];
72416       var rect = tile.extent.rectangle();
72417       var maxPages = maxPageAtZoom(currZoom);
72418       var nextPage = cache.nextPage[tile.id] || 0;
72419       var nextURL = cache.nextURL[tile.id] || url +
72420           utilQsString({
72421               per_page: maxResults,
72422               page: nextPage,
72423               client_id: clientId,
72424               bbox: [rect[0], rect[1], rect[2], rect[3]].join(','),
72425           });
72426
72427       if (nextPage > maxPages) return;
72428
72429       var id = tile.id + ',' + String(nextPage);
72430       if (cache.loaded[id] || cache.inflight[id]) return;
72431       cache.inflight[id] = request(nextURL)
72432           .mimeType('application/json')
72433           .response(function(xhr) {
72434               var linkHeader = xhr.getResponseHeader('Link');
72435               if (linkHeader) {
72436                   var pagination = parsePagination(xhr.getResponseHeader('Link'));
72437                   if (pagination.next) {
72438                       cache.nextURL[tile.id] = pagination.next;
72439                   }
72440               }
72441               return JSON.parse(xhr.responseText);
72442           })
72443           .get(function(err, data) {
72444               cache.loaded[id] = true;
72445               delete cache.inflight[id];
72446               if (err || !data.features || !data.features.length) return;
72447
72448               var features = data.features.map(function(feature) {
72449                   var loc = feature.geometry.coordinates;
72450                   var d;
72451
72452                   // An image (shown as a green dot on the map) is a single street photo with extra
72453                   // information such as location, camera angle (CA), camera model, and so on.
72454                   // Each image feature is a GeoJSON Point
72455                   if (which === 'images') {
72456                       d = {
72457                           loc: loc,
72458                           key: feature.properties.key,
72459                           ca: feature.properties.ca,
72460                           captured_at: feature.properties.captured_at,
72461                           captured_by: feature.properties.username,
72462                           pano: feature.properties.pano
72463                       };
72464
72465                       cache.forImageKey[d.key] = d;     // cache imageKey -> image
72466
72467                   // Mapillary organizes images as sequences. A sequence of images are continuously captured
72468                   // by a user at a give time. Sequences are shown on the map as green lines.
72469                   // Each sequence feature is a GeoJSON LineString
72470                   } else if (which === 'sequences') {
72471                       var sequenceKey = feature.properties.key;
72472                       cache.lineString[sequenceKey] = feature;           // cache sequenceKey -> lineString
72473                       feature.properties.coordinateProperties.image_keys.forEach(function(imageKey) {
72474                           cache.forImageKey[imageKey] = sequenceKey;     // cache imageKey -> sequenceKey
72475                       });
72476                       return false;    // because no `d` data worth loading into an rbush
72477
72478                   // An image detection is a semantic pixel area on an image. The area could indicate
72479                   // sky, trees, sidewalk in the image. A detection can be a polygon, a bounding box, or a point.
72480                   // Each image_detection feature is a GeoJSON Point (located where the image was taken)
72481                   } else if (which === 'image_detections') {
72482                       d = {
72483                           key: feature.properties.key,
72484                           image_key: feature.properties.image_key,
72485                           value: feature.properties.value,
72486                           package: feature.properties.package,
72487                           shape: feature.properties.shape
72488                       };
72489
72490                       // cache imageKey -> image_detections
72491                       if (!cache.forImageKey[d.image_key]) {
72492                           cache.forImageKey[d.image_key] = [];
72493                       }
72494                       cache.forImageKey[d.image_key].push(d);
72495                       return false;    // because no `d` data worth loading into an rbush
72496
72497
72498                   // A map feature is a real world object that can be shown on a map. It could be any object
72499                   // recognized from images, manually added in images, or added on the map.
72500                   // Each map feature is a GeoJSON Point (located where the feature is)
72501                   } else if (which === 'map_features') {
72502                       d = {
72503                           loc: loc,
72504                           key: feature.properties.key,
72505                           value: feature.properties.value,
72506                           package: feature.properties.package,
72507                           detections: feature.properties.detections
72508                       };
72509                   }
72510
72511                   return {
72512                       minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
72513                   };
72514
72515               }).filter(Boolean);
72516
72517               if (cache.rtree && features) {
72518                   cache.rtree.load(features);
72519               }
72520
72521               if (which === 'images' || which === 'sequences') {
72522                   dispatch$2.call('loadedImages');
72523               } else if (which === 'map_features') {
72524                   dispatch$2.call('loadedSigns');
72525               }
72526
72527               if (data.features.length === maxResults) {  // more pages to load
72528                   cache.nextPage[tile.id] = nextPage + 1;
72529                   loadNextTilePage(which, currZoom, url, tile);
72530               } else {
72531                   cache.nextPage[tile.id] = Infinity;     // no more pages to load
72532               }
72533           });
72534   }
72535
72536   // extract links to pages of API results
72537   function parsePagination(links) {
72538       return links.split(',').map(function(rel) {
72539           var elements = rel.split(';');
72540           if (elements.length === 2) {
72541               return [
72542                   /<(.+)>/.exec(elements[0])[1],
72543                   /rel="(.+)"/.exec(elements[1])[1]
72544               ];
72545           } else {
72546               return ['',''];
72547           }
72548       }).reduce(function(pagination, val) {
72549           pagination[val[1]] = val[0];
72550           return pagination;
72551       }, {});
72552   }
72553
72554
72555   // partition viewport into higher zoom tiles
72556   function partitionViewport(projection) {
72557       var z = geoScaleToZoom(projection.scale());
72558       var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
72559       var tiler = utilTiler().zoomExtent([z2, z2]);
72560
72561       return tiler.getTiles(projection)
72562           .map(function(tile) { return tile.extent; });
72563   }
72564
72565
72566   // no more than `limit` results per partition.
72567   function searchLimited(limit, projection, rtree) {
72568       limit = limit || 5;
72569
72570       return partitionViewport(projection)
72571           .reduce(function(result, extent) {
72572               var found = rtree.search(extent.bbox())
72573                   .slice(0, limit)
72574                   .map(function(d) { return d.data; });
72575
72576               return (found.length ? result.concat(found) : result);
72577           }, []);
72578   }
72579
72580
72581
72582   var serviceMapillary = {
72583
72584       init: function() {
72585           if (!_mlyCache) {
72586               this.reset();
72587           }
72588
72589           this.event = utilRebind(this, dispatch$2, 'on');
72590       },
72591
72592       reset: function() {
72593           var cache = _mlyCache;
72594
72595           if (cache) {
72596               if (cache.images && cache.images.inflight) {
72597                   forEach(cache.images.inflight, abortRequest$1);
72598               }
72599               if (cache.image_detections && cache.image_detections.inflight) {
72600                   forEach(cache.image_detections.inflight, abortRequest$1);
72601               }
72602               if (cache.map_features && cache.map_features.inflight) {
72603                   forEach(cache.map_features.inflight, abortRequest$1);
72604               }
72605               if (cache.sequences && cache.sequences.inflight) {
72606                   forEach(cache.sequences.inflight, abortRequest$1);
72607               }
72608           }
72609
72610           _mlyCache = {
72611               images: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {} },
72612               image_detections: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, forImageKey: {} },
72613               map_features: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1() },
72614               sequences: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {}, lineString: {} }
72615           };
72616
72617           _mlySelectedImage = null;
72618           _mlyClicks = [];
72619       },
72620
72621
72622       images: function(projection) {
72623           var limit = 5;
72624           return searchLimited(limit, projection, _mlyCache.images.rtree);
72625       },
72626
72627
72628       signs: function(projection) {
72629           var limit = 5;
72630           return searchLimited(limit, projection, _mlyCache.map_features.rtree);
72631       },
72632
72633
72634       sequences: function(projection) {
72635           var viewport = projection.clipExtent();
72636           var min = [viewport[0][0], viewport[1][1]];
72637           var max = [viewport[1][0], viewport[0][1]];
72638           var bbox = geoExtent$$1(projection.invert(min), projection.invert(max)).bbox();
72639           var sequenceKeys = {};
72640
72641           // all sequences for images in viewport
72642           _mlyCache.images.rtree.search(bbox)
72643               .forEach(function(d) {
72644                   var sequenceKey = _mlyCache.sequences.forImageKey[d.data.key];
72645                   if (sequenceKey) {
72646                       sequenceKeys[sequenceKey] = true;
72647                   }
72648               });
72649
72650           // Return lineStrings for the sequences
72651           return Object.keys(sequenceKeys).map(function(sequenceKey) {
72652               return _mlyCache.sequences.lineString[sequenceKey];
72653           });
72654       },
72655
72656
72657       signsSupported: function() {
72658           return true;
72659       },
72660
72661
72662       loadImages: function(projection) {
72663           loadTiles('images', apibase + 'images?', projection);
72664           loadTiles('sequences', apibase + 'sequences?', projection);
72665       },
72666
72667
72668       loadSigns: function(context, projection) {
72669           // if we are looking at signs, we'll actually need to fetch images too
72670           loadTiles('images', apibase + 'images?', projection);
72671           loadTiles('map_features', apibase + 'map_features?layers=trafficsigns&min_nbr_image_detections=1&', projection);
72672           loadTiles('image_detections', apibase + 'image_detections?layers=trafficsigns&', projection);
72673       },
72674
72675
72676       loadViewer: function(context) {
72677           // add mly-wrapper
72678           var wrap = select('#photoviewer').selectAll('.mly-wrapper')
72679               .data([0]);
72680
72681           wrap.enter()
72682               .append('div')
72683               .attr('id', 'mly')
72684               .attr('class', 'photo-wrapper mly-wrapper')
72685               .classed('hide', true);
72686
72687           // load mapillary-viewercss
72688           select('head').selectAll('#mapillary-viewercss')
72689               .data([0])
72690               .enter()
72691               .append('link')
72692               .attr('id', 'mapillary-viewercss')
72693               .attr('rel', 'stylesheet')
72694               .attr('href', context.asset(viewercss));
72695
72696           // load mapillary-viewerjs
72697           select('head').selectAll('#mapillary-viewerjs')
72698               .data([0])
72699               .enter()
72700               .append('script')
72701               .attr('id', 'mapillary-viewerjs')
72702               .attr('src', context.asset(viewerjs));
72703
72704           // load mapillary signs sprite
72705           var defs = context.container().select('defs');
72706           defs.call(svgDefs(context).addSprites, ['mapillary-sprite']);
72707
72708           // Register viewer resize handler
72709           context.ui().photoviewer.on('resize', function() {
72710               if (_mlyViewer) {
72711                   _mlyViewer.resize();
72712               }
72713           });
72714       },
72715
72716
72717       showViewer: function() {
72718           var wrap = select('#photoviewer')
72719               .classed('hide', false);
72720
72721           var isHidden = wrap.selectAll('.photo-wrapper.mly-wrapper.hide').size();
72722
72723           if (isHidden && _mlyViewer) {
72724               wrap
72725                   .selectAll('.photo-wrapper:not(.mly-wrapper)')
72726                   .classed('hide', true);
72727
72728               wrap
72729                   .selectAll('.photo-wrapper.mly-wrapper')
72730                   .classed('hide', false);
72731
72732               _mlyViewer.resize();
72733           }
72734
72735           return this;
72736       },
72737
72738
72739       hideViewer: function() {
72740           _mlySelectedImage = null;
72741
72742           if (!_mlyFallback && _mlyViewer) {
72743               _mlyViewer.getComponent('sequence').stop();
72744           }
72745
72746           var viewer = select('#photoviewer');
72747           if (!viewer.empty()) viewer.datum(null);
72748
72749           viewer
72750               .classed('hide', true)
72751               .selectAll('.photo-wrapper')
72752               .classed('hide', true);
72753
72754           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
72755               .classed('selected', false);
72756
72757           return this.setStyles(null, true);
72758       },
72759
72760
72761       parsePagination: parsePagination,
72762
72763
72764       updateViewer: function(imageKey, context) {
72765           if (!imageKey) return this;
72766
72767           if (!_mlyViewer) {
72768               this.initViewer(imageKey, context);
72769           } else {
72770               _mlyViewer.moveToKey(imageKey)
72771                   .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
72772           }
72773
72774           return this;
72775       },
72776
72777
72778       initViewer: function(imageKey, context) {
72779           var that = this;
72780           if (window.Mapillary && imageKey) {
72781               var opts = {
72782                   baseImageSize: 320,
72783                   component: {
72784                       cover: false,
72785                       keyboard: false,
72786                       tag: true
72787                   }
72788               };
72789
72790               // Disable components requiring WebGL support
72791               if (!Mapillary.isSupported() && Mapillary.isFallbackSupported()) {
72792                   _mlyFallback = true;
72793                   opts.component = {
72794                       cover: false,
72795                       direction: false,
72796                       imagePlane: false,
72797                       keyboard: false,
72798                       mouse: false,
72799                       sequence: false,
72800                       tag: false,
72801                       image: true,        // fallback
72802                       navigation: true    // fallback
72803                   };
72804               }
72805
72806               _mlyViewer = new Mapillary.Viewer('mly', clientId, null, opts);
72807               _mlyViewer.on('nodechanged', nodeChanged);
72808               _mlyViewer.on('bearingchanged', bearingChanged);
72809               _mlyViewer.moveToKey(imageKey)
72810                   .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
72811           }
72812
72813           // nodeChanged: called after the viewer has changed images and is ready.
72814           //
72815           // There is some logic here to batch up clicks into a _mlyClicks array
72816           // because the user might click on a lot of markers quickly and nodechanged
72817           // may be called out of order asychronously.
72818           //
72819           // Clicks are added to the array in `selectedImage` and removed here.
72820           //
72821           function nodeChanged(node) {
72822               if (!_mlyFallback) {
72823                   _mlyViewer.getComponent('tag').removeAll();  // remove previous detections
72824               }
72825
72826               var clicks = _mlyClicks;
72827               var index = clicks.indexOf(node.key);
72828               var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
72829
72830               if (index > -1) {              // `nodechanged` initiated from clicking on a marker..
72831                   clicks.splice(index, 1);   // remove the click
72832                   // If `node.key` matches the current _mlySelectedImage, call `selectImage()`
72833                   // one more time to update the detections and attribution..
72834                   if (node.key === selectedKey) {
72835                       that.selectImage(_mlySelectedImage, node.key, true);
72836                   }
72837               } else {             // `nodechanged` initiated from the Mapillary viewer controls..
72838                   var loc = node.computedLatLon ? [node.computedLatLon.lon, node.computedLatLon.lat] : [node.latLon.lon, node.latLon.lat];
72839                   context.map().centerEase(loc);
72840                   that.selectImage(undefined, node.key, true);
72841               }
72842           }
72843
72844           function bearingChanged(e) {
72845               dispatch$2.call('bearingChanged', undefined, e);
72846           }
72847       },
72848
72849
72850       // Pass the image datum itself in `d` or the `imageKey` string.
72851       // This allows images to be selected from places that dont have access
72852       // to the full image datum (like the street signs layer or the js viewer)
72853       selectImage: function(d, imageKey, fromViewer) {
72854           if (!d && imageKey) {
72855               // If the user clicked on something that's not an image marker, we
72856               // might get in here.. Cache lookup can fail, e.g. if the user
72857               // clicked a streetsign, but images are loading slowly asynchronously.
72858               // We'll try to carry on anyway if there is no datum.  There just
72859               // might be a delay before user sees detections, captured_at, etc.
72860               d = _mlyCache.images.forImageKey[imageKey];
72861           }
72862
72863           _mlySelectedImage = d;
72864           var viewer = select('#photoviewer');
72865           if (!viewer.empty()) viewer.datum(d);
72866
72867           imageKey = (d && d.key) || imageKey;
72868           if (!fromViewer && imageKey) {
72869               _mlyClicks.push(imageKey);
72870           }
72871
72872           this.setStyles(null, true);
72873
72874           // if signs signs are shown, highlight the ones that appear in this image
72875           d3_selectAll('.layer-mapillary-signs .icon-sign')
72876               .classed('selected', function(d) {
72877                   return some(d.detections, function(detection) {
72878                       return detection.image_key === imageKey;
72879                   });
72880               });
72881
72882           if (d) {
72883               this.updateDetections(d);
72884           }
72885
72886           return this;
72887       },
72888
72889
72890       getSelectedImage: function() {
72891           return _mlySelectedImage;
72892       },
72893
72894
72895       getSequenceKeyForImage: function(d) {
72896           var imageKey = d && d.key;
72897           return imageKey && _mlyCache.sequences.forImageKey[imageKey];
72898       },
72899
72900
72901       setStyles: function(hovered, reset) {
72902           if (reset) {  // reset all layers
72903               d3_selectAll('.viewfield-group')
72904                   .classed('highlighted', false)
72905                   .classed('hovered', false)
72906                   .classed('selected', false);
72907
72908               d3_selectAll('.sequence')
72909                   .classed('highlighted', false)
72910                   .classed('selected', false);
72911           }
72912
72913           var hoveredImageKey = hovered && hovered.key;
72914           var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
72915           var hoveredLineString = hoveredSequenceKey && _mlyCache.sequences.lineString[hoveredSequenceKey];
72916           var hoveredImageKeys = (hoveredLineString && hoveredLineString.properties.coordinateProperties.image_keys) || [];
72917
72918           var viewer = select('#photoviewer');
72919           var selected = viewer.empty() ? undefined : viewer.datum();
72920           var selectedImageKey = selected && selected.key;
72921           var selectedSequenceKey = this.getSequenceKeyForImage(selected);
72922           var selectedLineString = selectedSequenceKey && _mlyCache.sequences.lineString[selectedSequenceKey];
72923           var selectedImageKeys = (selectedLineString && selectedLineString.properties.coordinateProperties.image_keys) || [];
72924
72925           // highlight sibling viewfields on either the selected or the hovered sequences
72926           var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
72927
72928           d3_selectAll('.layer-mapillary-images .viewfield-group')
72929               .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
72930               .classed('hovered', function(d) { return d.key === hoveredImageKey; })
72931               .classed('selected', function(d) { return d.key === selectedImageKey; });
72932
72933           d3_selectAll('.layer-mapillary-images .sequence')
72934               .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
72935               .classed('selected', function(d) { return d.properties.key === selectedSequenceKey; });
72936
72937           // update viewfields if needed
72938           d3_selectAll('.viewfield-group .viewfield')
72939               .attr('d', viewfieldPath);
72940
72941           function viewfieldPath() {
72942               var d = this.parentNode.__data__;
72943               if (d.pano && d.key !== selectedImageKey) {
72944                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
72945               } else {
72946                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
72947               }
72948           }
72949
72950           return this;
72951       },
72952
72953
72954       updateDetections: function(d) {
72955           if (!_mlyViewer || _mlyFallback) return;
72956
72957           var imageKey = d && d.key;
72958           if (!imageKey) return;
72959
72960           var detections = _mlyCache.image_detections.forImageKey[imageKey] || [];
72961           detections.forEach(function(data) {
72962               var tag = makeTag(data);
72963               if (tag) {
72964                   var tagComponent = _mlyViewer.getComponent('tag');
72965                   tagComponent.add([tag]);
72966               }
72967           });
72968
72969           function makeTag(data) {
72970               var valueParts = data.value.split('--');
72971               if (valueParts.length !== 3) return;
72972
72973               var text = valueParts[1].replace(/-/g, ' ');
72974               var tag;
72975
72976               // Currently only two shapes <Polygon|Point>
72977               if (data.shape.type === 'Polygon') {
72978                   var polygonGeometry = new Mapillary
72979                       .TagComponent
72980                       .PolygonGeometry(data.shape.coordinates[0]);
72981
72982                   tag = new Mapillary.TagComponent.OutlineTag(
72983                       data.key,
72984                       polygonGeometry,
72985                       {
72986                           text: text,
72987                           textColor: 0xffff00,
72988                           lineColor: 0xffff00,
72989                           lineWidth: 2,
72990                           fillColor: 0xffff00,
72991                           fillOpacity: 0.3,
72992                       }
72993                   );
72994
72995               } else if (data.shape.type === 'Point') {
72996                   var pointGeometry = new Mapillary
72997                       .TagComponent
72998                       .PointGeometry(data.shape.coordinates[0]);
72999
73000                   tag = new Mapillary.TagComponent.SpotTag(
73001                       data.key,
73002                       pointGeometry,
73003                       {
73004                           text: text,
73005                           color: 0xffff00,
73006                           textColor: 0xffff00
73007                       }
73008                   );
73009               }
73010
73011               return tag;
73012           }
73013       },
73014
73015
73016       cache: function() {
73017           return _mlyCache;
73018       }
73019
73020   };
73021
73022   /**
73023    * Performs a partial deep comparison between `object` and `source` to
73024    * determine if `object` contains equivalent property values.
73025    *
73026    * **Note:** This method is equivalent to `_.matches` when `source` is
73027    * partially applied.
73028    *
73029    * Partial comparisons will match empty array and empty object `source`
73030    * values against any array or object value, respectively. See `_.isEqual`
73031    * for a list of supported value comparisons.
73032    *
73033    * @static
73034    * @memberOf _
73035    * @since 3.0.0
73036    * @category Lang
73037    * @param {Object} object The object to inspect.
73038    * @param {Object} source The object of property values to match.
73039    * @returns {boolean} Returns `true` if `object` is a match, else `false`.
73040    * @example
73041    *
73042    * var object = { 'a': 1, 'b': 2 };
73043    *
73044    * _.isMatch(object, { 'b': 2 });
73045    * // => true
73046    *
73047    * _.isMatch(object, { 'b': 1 });
73048    * // => false
73049    */
73050   function isMatch(object, source) {
73051     return object === source || baseIsMatch(object, source, getMatchData(source));
73052   }
73053
73054   var buildRuleChecks = function() {
73055       return {
73056           equals: function (equals) {
73057               return function(tags) {
73058                   return isMatch(tags, equals);
73059               };
73060           },
73061           notEquals: function (notEquals) {
73062               return function(tags) {
73063                   return !isMatch(tags, notEquals);
73064               };
73065           },
73066           absence: function(absence) {
73067               return function(tags) {
73068                   return Object.keys(tags).indexOf(absence) === -1;
73069               };
73070           },
73071           presence: function(presence) {
73072               return function(tags) {
73073                   return Object.keys(tags).indexOf(presence) > -1;
73074               };
73075           },
73076           greaterThan: function(greaterThan) {
73077               var key = Object.keys(greaterThan)[0];
73078               var value = greaterThan[key];
73079
73080               return function(tags) {
73081                   return tags[key] > value;
73082               };
73083           },
73084           greaterThanEqual: function(greaterThanEqual) {
73085               var key = Object.keys(greaterThanEqual)[0];
73086               var value = greaterThanEqual[key];
73087
73088               return function(tags) {
73089                   return tags[key] >= value;
73090               };
73091           },
73092           lessThan: function(lessThan) {
73093               var key = Object.keys(lessThan)[0];
73094               var value = lessThan[key];
73095
73096               return function(tags) {
73097                   return tags[key] < value;
73098               };
73099           },
73100           lessThanEqual: function(lessThanEqual) {
73101               var key = Object.keys(lessThanEqual)[0];
73102               var value = lessThanEqual[key];
73103
73104               return function(tags) {
73105                   return tags[key] <= value;
73106               };
73107           },
73108           positiveRegex: function(positiveRegex) {
73109               var tagKey = Object.keys(positiveRegex)[0];
73110               var expression = positiveRegex[tagKey].join('|');
73111               var regex = new RegExp(expression);
73112
73113               return function(tags) {
73114                   return regex.test(tags[tagKey]);
73115               };
73116           },
73117           negativeRegex: function(negativeRegex) {
73118               var tagKey = Object.keys(negativeRegex)[0];
73119               var expression = negativeRegex[tagKey].join('|');
73120               var regex = new RegExp(expression);
73121
73122               return function(tags) {
73123                   return !regex.test(tags[tagKey]);
73124               };
73125           }
73126       };
73127   };
73128
73129   var buildLineKeys = function() {
73130       return {
73131           highway: {
73132               rest_area: true,
73133               services: true
73134           },
73135           railway: {
73136               roundhouse: true,
73137               station: true,
73138               traverser: true,
73139               turntable: true,
73140               wash: true
73141           }
73142       };
73143   };
73144
73145   var serviceMapRules = {
73146       init: function(areaKeys) {
73147           this._ruleChecks  = buildRuleChecks();
73148           this._validationRules = [];
73149           this._areaKeys = areaKeys;
73150           this._lineKeys = buildLineKeys();
73151       },
73152       // list of rules only relevant to tag checks...
73153       filterRuleChecks: function(selector) {
73154           var _ruleChecks = this._ruleChecks;
73155           return reduce(Object.keys(selector), function(rules, key) {
73156               if (['geometry', 'error', 'warning'].indexOf(key) === -1) {
73157                   rules.push(_ruleChecks[key](selector[key]));
73158               }
73159               return rules;
73160           }, []);
73161       },
73162       // builds tagMap from mapcss-parse selector object...
73163       buildTagMap: function(selector) {
73164           var getRegexValues = function(regexes) {
73165               return regexes.map(function(regex) {
73166                   return regex.replace(/\$|\^/g, '');
73167               });
73168           };
73169
73170           var selectorKeys = Object.keys(selector);
73171           var tagMap = reduce(selectorKeys, function (expectedTags, key) {
73172               var values;
73173               var isRegex = /regex/gi.test(key);
73174               var isEqual = /equals/gi.test(key);
73175
73176               if (isRegex || isEqual) {
73177                   Object.keys(selector[key]).forEach(function(selectorKey) {
73178                       values = isEqual ? [selector[key][selectorKey]] : getRegexValues(selector[key][selectorKey]);
73179
73180                       if (expectedTags.hasOwnProperty(selectorKey)) {
73181                           values = values.concat(expectedTags[selectorKey]);
73182                       }
73183
73184                       expectedTags[selectorKey] = values;
73185                   });
73186
73187               } else if (/(greater|less)Than(Equal)?|presence/g.test(key)) {
73188                   var tagKey = /presence/.test(key) ? selector[key] : Object.keys(selector[key])[0];
73189
73190                   values = [selector[key][tagKey]];
73191
73192                   if (expectedTags.hasOwnProperty(tagKey)) {
73193                       values = values.concat(expectedTags[tagKey]);
73194                   }
73195
73196                   expectedTags[tagKey] = values;
73197               }
73198
73199               return expectedTags;
73200           }, {});
73201
73202           return tagMap;
73203       },
73204       // inspired by osmWay#isArea()
73205       inferGeometry: function(tagMap) {
73206           var _lineKeys = this._lineKeys;
73207           var _areaKeys = this._areaKeys;
73208
73209           var isAreaKeyBlackList = function(key) {
73210               return intersection(tagMap[key], Object.keys(_areaKeys[key])).length > 0;
73211           };
73212           var isLineKeysWhiteList = function(key) {
73213               return intersection(tagMap[key], Object.keys(_lineKeys[key])).length > 0;
73214           };
73215
73216           if (tagMap.hasOwnProperty('area')) {
73217               if (tagMap.area.indexOf('yes') > -1) {
73218                   return 'area';
73219               }
73220               if (tagMap.area.indexOf('no') > -1) {
73221                   return 'line';
73222               }
73223           }
73224
73225           for (var key in tagMap) {
73226               if (key in _areaKeys && !isAreaKeyBlackList(key)) {
73227                   return 'area';
73228               }
73229               if (key in _lineKeys && isLineKeysWhiteList(key)) {
73230                   return 'area';
73231               }
73232           }
73233
73234           return 'line';
73235       },
73236       // adds from mapcss-parse selector check...
73237       addRule: function(selector) {
73238           var rule = {
73239               // checks relevant to mapcss-selector
73240               checks: this.filterRuleChecks(selector),
73241               // true if all conditions for a tag error are true..
73242               matches: function(entity) {
73243                   return every(this.checks, function(check) {
73244                       return check(entity.tags);
73245                   });
73246               },
73247               // borrowed from Way#isArea()
73248               inferredGeometry: this.inferGeometry(this.buildTagMap(selector), this._areaKeys),
73249               geometryMatches: function(entity, graph) {
73250                   if (entity.type === 'node' || entity.type === 'relation') {
73251                       return selector.geometry === entity.type;
73252                   } else if (entity.type === 'way') {
73253                       return this.inferredGeometry === entity.geometry(graph);
73254                   }
73255               },
73256               // when geometries match and tag matches are present, return a warning...
73257               findWarnings: function (entity, graph, warnings) {
73258                   if (this.geometryMatches(entity, graph) && this.matches(entity)) {
73259                       var type = Object.keys(selector).indexOf('error') > -1 ? 'error' : 'warning';
73260                       warnings.push({
73261                           severity: type,
73262                           message: selector[type],
73263                           entity: entity
73264                       });
73265                   }
73266               }
73267           };
73268           this._validationRules.push(rule);
73269       },
73270       clearRules: function() { this._validationRules = []; },
73271       // returns validationRules...
73272       validationRules: function() { return this._validationRules; },
73273       // returns ruleChecks
73274       ruleChecks: function() { return this._ruleChecks; }
73275   };
73276
73277   var apibase$1 = 'https://nominatim.openstreetmap.org/',
73278       inflight = {},
73279       nominatimCache;
73280
73281
73282   var serviceNominatim = {
73283
73284       init: function() {
73285           inflight = {};
73286           nominatimCache = rbush_1();
73287       },
73288
73289       reset: function() {
73290           forEach(inflight, function(req) { req.abort(); });
73291           inflight = {};
73292           nominatimCache = rbush_1();
73293       },
73294
73295
73296       countryCode: function (location, callback) {
73297           this.reverse(location, function(err, result) {
73298               if (err) {
73299                   return callback(err);
73300               } else if (result.address) {
73301                   return callback(null, result.address.country_code);
73302               } else {
73303                   return callback('Unable to geocode', null);
73304               }
73305           });
73306       },
73307
73308
73309       reverse: function (location, callback) {
73310           var cached = nominatimCache.search(
73311               { minX: location[0], minY: location[1], maxX: location[0], maxY: location[1] }
73312           );
73313
73314           if (cached.length > 0) {
73315               return callback(null, cached[0].data);
73316           }
73317
73318           var params = { zoom: 13, format: 'json', addressdetails: 1, lat: location[1], lon: location[0] };
73319           var url = apibase$1 + 'reverse?' + utilQsString(params);
73320           if (inflight[url]) return;
73321
73322           inflight[url] = d3_json(url, function(err, result) {
73323               delete inflight[url];
73324
73325               if (err) {
73326                   return callback(err);
73327               } else if (result && result.error) {
73328                   return callback(result.error);
73329               }
73330
73331               var extent = geoExtent$$1(location).padByMeters(200);
73332               nominatimCache.insert(assign(extent.bbox(), {data: result}));
73333
73334               callback(null, result);
73335           });
73336       },
73337
73338
73339       search: function (val, callback) {
73340           var searchVal = encodeURIComponent(val);
73341           var url = apibase$1 + 'search/' + searchVal + '?limit=10&format=json';
73342           if (inflight[url]) return;
73343
73344           inflight[url] = d3_json(url, function(err, result) {
73345               delete inflight[url];
73346               callback(err, result);
73347           });
73348       }
73349
73350   };
73351
73352   var apibase$2 = 'https://openstreetcam.org';
73353   var maxResults$1 = 1000;
73354   var tileZoom$1 = 14;
73355   var tiler$2 = utilTiler().zoomExtent([tileZoom$1, tileZoom$1]).skipNullIsland(true);
73356   var dispatch$3 = dispatch('loadedImages');
73357   var imgZoom = d3_zoom()
73358       .extent([[0, 0], [320, 240]])
73359       .translateExtent([[0, 0], [320, 240]])
73360       .scaleExtent([1, 15])
73361       .on('zoom', zoomPan);
73362   var _oscCache;
73363   var _oscSelectedImage;
73364
73365
73366   function abortRequest$2(i) {
73367       i.abort();
73368   }
73369
73370
73371   function maxPageAtZoom$1(z) {
73372       if (z < 15)   return 2;
73373       if (z === 15) return 5;
73374       if (z === 16) return 10;
73375       if (z === 17) return 20;
73376       if (z === 18) return 40;
73377       if (z > 18)   return 80;
73378   }
73379
73380
73381   function loadTiles$1(which, url, projection) {
73382       var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
73383       var tiles = tiler$2.getTiles(projection);
73384
73385       // abort inflight requests that are no longer needed
73386       var cache = _oscCache[which];
73387       forEach(cache.inflight, function(v, k) {
73388           var wanted = find$1(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; });
73389
73390           if (!wanted) {
73391               abortRequest$2(v);
73392               delete cache.inflight[k];
73393           }
73394       });
73395
73396       tiles.forEach(function(tile) {
73397           loadNextTilePage$1(which, currZoom, url, tile);
73398       });
73399   }
73400
73401
73402   function loadNextTilePage$1(which, currZoom, url, tile) {
73403       var cache = _oscCache[which];
73404       var bbox = tile.extent.bbox();
73405       var maxPages = maxPageAtZoom$1(currZoom);
73406       var nextPage = cache.nextPage[tile.id] || 1;
73407       var params = utilQsString({
73408           ipp: maxResults$1,
73409           page: nextPage,
73410           // client_id: clientId,
73411           bbTopLeft: [bbox.maxY, bbox.minX].join(','),
73412           bbBottomRight: [bbox.minY, bbox.maxX].join(',')
73413       }, true);
73414
73415       if (nextPage > maxPages) return;
73416
73417       var id = tile.id + ',' + String(nextPage);
73418       if (cache.loaded[id] || cache.inflight[id]) return;
73419
73420       cache.inflight[id] = request(url)
73421           .mimeType('application/json')
73422           .header('Content-type', 'application/x-www-form-urlencoded')
73423           .response(function(xhr) { return JSON.parse(xhr.responseText); })
73424           .post(params, function(err, data) {
73425               cache.loaded[id] = true;
73426               delete cache.inflight[id];
73427               if (err || !data.currentPageItems || !data.currentPageItems.length) return;
73428
73429               function localeDateString(s) {
73430                   if (!s) return null;
73431                   var detected = utilDetect();
73432                   var options = { day: 'numeric', month: 'short', year: 'numeric' };
73433                   var d = new Date(s);
73434                   if (isNaN(d.getTime())) return null;
73435                   return d.toLocaleDateString(detected.locale, options);
73436               }
73437
73438               var features = data.currentPageItems.map(function(item) {
73439                   var loc = [+item.lng, +item.lat];
73440                   var d;
73441
73442                   if (which === 'images') {
73443                       d = {
73444                           loc: loc,
73445                           key: item.id,
73446                           ca: +item.heading,
73447                           captured_at: localeDateString(item.shot_date || item.date_added),
73448                           captured_by: item.username,
73449                           imagePath: item.lth_name,
73450                           sequence_id: item.sequence_id,
73451                           sequence_index: +item.sequence_index
73452                       };
73453
73454                       // cache sequence info
73455                       var seq = _oscCache.sequences[d.sequence_id];
73456                       if (!seq) {
73457                           seq = { rotation: 0, images: [] };
73458                           _oscCache.sequences[d.sequence_id] = seq;
73459                       }
73460                       seq.images[d.sequence_index] = d;
73461                   }
73462
73463                   return {
73464                       minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
73465                   };
73466               });
73467
73468               cache.rtree.load(features);
73469
73470               if (which === 'images') {
73471                   dispatch$3.call('loadedImages');
73472               }
73473
73474               if (data.currentPageItems.length === maxResults$1) {  // more pages to load
73475                   cache.nextPage[tile.id] = nextPage + 1;
73476                   loadNextTilePage$1(which, currZoom, url, tile);
73477               } else {
73478                   cache.nextPage[tile.id] = Infinity;     // no more pages to load
73479               }
73480           });
73481   }
73482
73483
73484   // partition viewport into higher zoom tiles
73485   function partitionViewport$1(projection) {
73486       var z = geoScaleToZoom(projection.scale());
73487       var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
73488       var tiler = utilTiler().zoomExtent([z2, z2]);
73489
73490       return tiler.getTiles(projection)
73491           .map(function(tile) { return tile.extent; });
73492   }
73493
73494
73495   // no more than `limit` results per partition.
73496   function searchLimited$1(limit, projection, rtree) {
73497       limit = limit || 5;
73498
73499       return partitionViewport$1(projection)
73500           .reduce(function(result, extent) {
73501               var found = rtree.search(extent.bbox())
73502                   .slice(0, limit)
73503                   .map(function(d) { return d.data; });
73504
73505               return (found.length ? result.concat(found) : result);
73506           }, []);
73507   }
73508
73509
73510   function zoomPan() {
73511       var t = event.transform;
73512       select('#photoviewer .osc-image-wrap')
73513           .call(utilSetTransform, t.x, t.y, t.k);
73514   }
73515
73516
73517   var serviceOpenstreetcam = {
73518
73519       init: function() {
73520           if (!_oscCache) {
73521               this.reset();
73522           }
73523
73524           this.event = utilRebind(this, dispatch$3, 'on');
73525       },
73526
73527       reset: function() {
73528           var cache = _oscCache;
73529
73530           if (cache) {
73531               if (cache.images && cache.images.inflight) {
73532                   forEach(cache.images.inflight, abortRequest$2);
73533               }
73534           }
73535
73536           _oscCache = {
73537               images: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1() },
73538               sequences: {}
73539           };
73540
73541           _oscSelectedImage = null;
73542       },
73543
73544
73545       images: function(projection) {
73546           var limit = 5;
73547           return searchLimited$1(limit, projection, _oscCache.images.rtree);
73548       },
73549
73550
73551       sequences: function(projection) {
73552           var viewport = projection.clipExtent();
73553           var min = [viewport[0][0], viewport[1][1]];
73554           var max = [viewport[1][0], viewport[0][1]];
73555           var bbox = geoExtent$$1(projection.invert(min), projection.invert(max)).bbox();
73556           var sequenceKeys = {};
73557
73558           // all sequences for images in viewport
73559           _oscCache.images.rtree.search(bbox)
73560               .forEach(function(d) { sequenceKeys[d.data.sequence_id] = true; });
73561
73562           // make linestrings from those sequences
73563           var lineStrings = [];
73564           Object.keys(sequenceKeys)
73565               .forEach(function(sequenceKey) {
73566                   var seq = _oscCache.sequences[sequenceKey];
73567                   var images = seq && seq.images;
73568                   if (images) {
73569                       lineStrings.push({
73570                           type: 'LineString',
73571                           coordinates: images.map(function (d) { return d.loc; }).filter(Boolean),
73572                           properties: { key: sequenceKey }
73573                       });
73574                   }
73575               });
73576           return lineStrings;
73577       },
73578
73579
73580       loadImages: function(projection) {
73581           var url = apibase$2 + '/1.0/list/nearby-photos/';
73582           loadTiles$1('images', url, projection);
73583       },
73584
73585
73586       loadViewer: function(context) {
73587           var that = this;
73588
73589           // add osc-wrapper
73590           var wrap = select('#photoviewer').selectAll('.osc-wrapper')
73591               .data([0]);
73592
73593           var wrapEnter = wrap.enter()
73594               .append('div')
73595               .attr('class', 'photo-wrapper osc-wrapper')
73596               .classed('hide', true)
73597               .call(imgZoom)
73598               .on('dblclick.zoom', null);
73599
73600           wrapEnter
73601               .append('div')
73602               .attr('class', 'photo-attribution fillD');
73603
73604           var controlsEnter = wrapEnter
73605               .append('div')
73606               .attr('class', 'photo-controls-wrap')
73607               .append('div')
73608               .attr('class', 'photo-controls');
73609
73610           controlsEnter
73611               .append('button')
73612               .on('click.back', step(-1))
73613               .text('◄');
73614
73615           controlsEnter
73616               .append('button')
73617               .on('click.rotate-ccw', rotate(-90))
73618               .text('⤿');
73619
73620           controlsEnter
73621               .append('button')
73622               .on('click.rotate-cw', rotate(90))
73623               .text('⤾');
73624
73625           controlsEnter
73626               .append('button')
73627               .on('click.forward', step(1))
73628               .text('►');
73629
73630           wrapEnter
73631               .append('div')
73632               .attr('class', 'osc-image-wrap');
73633
73634
73635           // Register viewer resize handler
73636           context.ui().photoviewer.on('resize', function(dimensions) {
73637               imgZoom = d3_zoom()
73638                   .extent([[0, 0], dimensions])
73639                   .translateExtent([[0, 0], dimensions])
73640                   .scaleExtent([1, 15])
73641                   .on('zoom', zoomPan);
73642           });
73643
73644
73645           function rotate(deg) {
73646               return function() {
73647                   if (!_oscSelectedImage) return;
73648                   var sequenceKey = _oscSelectedImage.sequence_id;
73649                   var sequence = _oscCache.sequences[sequenceKey];
73650                   if (!sequence) return;
73651
73652                   var r = sequence.rotation || 0;
73653                   r += deg;
73654
73655                   if (r > 180) r -= 360;
73656                   if (r < -180) r += 360;
73657                   sequence.rotation = r;
73658
73659                   var wrap = select('#photoviewer .osc-wrapper');
73660
73661                   wrap
73662                       .transition()
73663                       .duration(100)
73664                       .call(imgZoom.transform, identity$7);
73665
73666                   wrap.selectAll('.osc-image')
73667                       .transition()
73668                       .duration(100)
73669                       .style('transform', 'rotate(' + r + 'deg)');
73670               };
73671           }
73672
73673           function step(stepBy) {
73674               return function() {
73675                   if (!_oscSelectedImage) return;
73676                   var sequenceKey = _oscSelectedImage.sequence_id;
73677                   var sequence = _oscCache.sequences[sequenceKey];
73678                   if (!sequence) return;
73679
73680                   var nextIndex = _oscSelectedImage.sequence_index + stepBy;
73681                   var nextImage = sequence.images[nextIndex];
73682                   if (!nextImage) return;
73683
73684                   context.map().centerEase(nextImage.loc);
73685
73686                   that
73687                       .selectImage(nextImage)
73688                       .updateViewer(nextImage);
73689               };
73690           }
73691       },
73692
73693
73694       showViewer: function() {
73695           var viewer = select('#photoviewer')
73696               .classed('hide', false);
73697
73698           var isHidden = viewer.selectAll('.photo-wrapper.osc-wrapper.hide').size();
73699
73700           if (isHidden) {
73701               viewer
73702                   .selectAll('.photo-wrapper:not(.osc-wrapper)')
73703                   .classed('hide', true);
73704
73705               viewer
73706                   .selectAll('.photo-wrapper.osc-wrapper')
73707                   .classed('hide', false);
73708           }
73709
73710           return this;
73711       },
73712
73713
73714       hideViewer: function() {
73715           _oscSelectedImage = null;
73716
73717           var viewer = select('#photoviewer');
73718           if (!viewer.empty()) viewer.datum(null);
73719
73720           viewer
73721               .classed('hide', true)
73722               .selectAll('.photo-wrapper')
73723               .classed('hide', true);
73724
73725           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
73726               .classed('selected', false);
73727
73728           return this.setStyles(null, true);
73729       },
73730
73731
73732       updateViewer: function(d) {
73733           var wrap = select('#photoviewer .osc-wrapper');
73734           var imageWrap = wrap.selectAll('.osc-image-wrap');
73735           var attribution = wrap.selectAll('.photo-attribution').html('');
73736
73737           wrap
73738               .transition()
73739               .duration(100)
73740               .call(imgZoom.transform, identity$7);
73741
73742           imageWrap
73743               .selectAll('.osc-image')
73744               .remove();
73745
73746           if (d) {
73747               var sequence = _oscCache.sequences[d.sequence_id];
73748               var r = (sequence && sequence.rotation) || 0;
73749
73750               imageWrap
73751                   .append('img')
73752                   .attr('class', 'osc-image')
73753                   .attr('src', apibase$2 + '/' + d.imagePath)
73754                   .style('transform', 'rotate(' + r + 'deg)');
73755
73756               if (d.captured_by) {
73757                   attribution
73758                       .append('a')
73759                       .attr('class', 'captured_by')
73760                       .attr('target', '_blank')
73761                       .attr('href', 'https://openstreetcam.org/user/' + encodeURIComponent(d.captured_by))
73762                       .text('@' + d.captured_by);
73763
73764                   attribution
73765                       .append('span')
73766                       .text('|');
73767               }
73768
73769               if (d.captured_at) {
73770                   attribution
73771                       .append('span')
73772                       .attr('class', 'captured_at')
73773                       .text(d.captured_at);
73774
73775                   attribution
73776                       .append('span')
73777                       .text('|');
73778               }
73779
73780               attribution
73781                   .append('a')
73782                   .attr('class', 'image-link')
73783                   .attr('target', '_blank')
73784                   .attr('href', 'https://openstreetcam.org/details/' + d.sequence_id + '/' + d.sequence_index)
73785                   .text('openstreetcam.org');
73786           }
73787           return this;
73788       },
73789
73790
73791       selectImage: function(d) {
73792           _oscSelectedImage = d;
73793           var viewer = select('#photoviewer');
73794           if (!viewer.empty()) viewer.datum(d);
73795
73796           this.setStyles(null, true);
73797
73798           d3_selectAll('.icon-sign')
73799               .classed('selected', false);
73800
73801           return this;
73802       },
73803
73804
73805       getSelectedImage: function() {
73806           return _oscSelectedImage;
73807       },
73808
73809
73810       getSequenceKeyForImage: function(d) {
73811           return d && d.sequence_id;
73812       },
73813
73814
73815       setStyles: function(hovered, reset) {
73816           if (reset) {  // reset all layers
73817               d3_selectAll('.viewfield-group')
73818                   .classed('highlighted', false)
73819                   .classed('hovered', false)
73820                   .classed('selected', false);
73821
73822               d3_selectAll('.sequence')
73823                   .classed('highlighted', false)
73824                   .classed('selected', false);
73825           }
73826
73827           var hoveredImageKey = hovered && hovered.key;
73828           var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
73829           var hoveredSequence = hoveredSequenceKey && _oscCache.sequences[hoveredSequenceKey];
73830           var hoveredImageKeys = (hoveredSequence && hoveredSequence.images.map(function (d) { return d.key; })) || [];
73831
73832           var viewer = select('#photoviewer');
73833           var selected = viewer.empty() ? undefined : viewer.datum();
73834           var selectedImageKey = selected && selected.key;
73835           var selectedSequenceKey = this.getSequenceKeyForImage(selected);
73836           var selectedSequence = selectedSequenceKey && _oscCache.sequences[selectedSequenceKey];
73837           var selectedImageKeys = (selectedSequence && selectedSequence.images.map(function (d) { return d.key; })) || [];
73838
73839           // highlight sibling viewfields on either the selected or the hovered sequences
73840           var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
73841
73842           d3_selectAll('.layer-openstreetcam-images .viewfield-group')
73843               .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
73844               .classed('hovered', function(d) { return d.key === hoveredImageKey; })
73845               .classed('selected', function(d) { return d.key === selectedImageKey; });
73846
73847           d3_selectAll('.layer-openstreetcam-images .sequence')
73848               .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
73849               .classed('selected', function(d) { return d.properties.key === selectedSequenceKey; });
73850
73851           // update viewfields if needed
73852           d3_selectAll('.viewfield-group .viewfield')
73853               .attr('d', viewfieldPath);
73854
73855           function viewfieldPath() {
73856               var d = this.parentNode.__data__;
73857               if (d.pano && d.key !== selectedImageKey) {
73858                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
73859               } else {
73860                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
73861               }
73862           }
73863
73864           return this;
73865       },
73866
73867
73868       cache: function() {
73869           return _oscCache;
73870       }
73871
73872   };
73873
73874   /* Built-in method references for those with the same name as other `lodash` methods. */
73875   var nativeCeil = Math.ceil,
73876       nativeMax$4 = Math.max;
73877
73878   /**
73879    * Creates an array of elements split into groups the length of `size`.
73880    * If `array` can't be split evenly, the final chunk will be the remaining
73881    * elements.
73882    *
73883    * @static
73884    * @memberOf _
73885    * @since 3.0.0
73886    * @category Array
73887    * @param {Array} array The array to process.
73888    * @param {number} [size=1] The length of each chunk
73889    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
73890    * @returns {Array} Returns the new array of chunks.
73891    * @example
73892    *
73893    * _.chunk(['a', 'b', 'c', 'd'], 2);
73894    * // => [['a', 'b'], ['c', 'd']]
73895    *
73896    * _.chunk(['a', 'b', 'c', 'd'], 3);
73897    * // => [['a', 'b', 'c'], ['d']]
73898    */
73899   function chunk(array, size, guard) {
73900     if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
73901       size = 1;
73902     } else {
73903       size = nativeMax$4(toInteger(size), 0);
73904     }
73905     var length = array == null ? 0 : array.length;
73906     if (!length || size < 1) {
73907       return [];
73908     }
73909     var index = 0,
73910         resIndex = 0,
73911         result = Array(nativeCeil(length / size));
73912
73913     while (index < length) {
73914       result[resIndex++] = baseSlice(array, index, (index += size));
73915     }
73916     return result;
73917   }
73918
73919   var hashes = createCommonjsModule(function (module, exports) {
73920   /**
73921    * jshashes - https://github.com/h2non/jshashes
73922    * Released under the "New BSD" license
73923    *
73924    * Algorithms specification:
73925    *
73926    * MD5 - http://www.ietf.org/rfc/rfc1321.txt
73927    * RIPEMD-160 - http://homes.esat.kuleuven.be/~bosselae/ripemd160.html
73928    * SHA1   - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
73929    * SHA256 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
73930    * SHA512 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
73931    * HMAC - http://www.ietf.org/rfc/rfc2104.txt
73932    */
73933   (function() {
73934     var Hashes;
73935
73936     function utf8Encode(str) {
73937       var x, y, output = '',
73938         i = -1,
73939         l;
73940
73941       if (str && str.length) {
73942         l = str.length;
73943         while ((i += 1) < l) {
73944           /* Decode utf-16 surrogate pairs */
73945           x = str.charCodeAt(i);
73946           y = i + 1 < l ? str.charCodeAt(i + 1) : 0;
73947           if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {
73948             x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
73949             i += 1;
73950           }
73951           /* Encode output as utf-8 */
73952           if (x <= 0x7F) {
73953             output += String.fromCharCode(x);
73954           } else if (x <= 0x7FF) {
73955             output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F),
73956               0x80 | (x & 0x3F));
73957           } else if (x <= 0xFFFF) {
73958             output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
73959               0x80 | ((x >>> 6) & 0x3F),
73960               0x80 | (x & 0x3F));
73961           } else if (x <= 0x1FFFFF) {
73962             output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
73963               0x80 | ((x >>> 12) & 0x3F),
73964               0x80 | ((x >>> 6) & 0x3F),
73965               0x80 | (x & 0x3F));
73966           }
73967         }
73968       }
73969       return output;
73970     }
73971
73972     function utf8Decode(str) {
73973       var i, ac, c1, c2, c3, arr = [],
73974         l;
73975       i = ac = c1 = c2 = c3 = 0;
73976
73977       if (str && str.length) {
73978         l = str.length;
73979         str += '';
73980
73981         while (i < l) {
73982           c1 = str.charCodeAt(i);
73983           ac += 1;
73984           if (c1 < 128) {
73985             arr[ac] = String.fromCharCode(c1);
73986             i += 1;
73987           } else if (c1 > 191 && c1 < 224) {
73988             c2 = str.charCodeAt(i + 1);
73989             arr[ac] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
73990             i += 2;
73991           } else {
73992             c2 = str.charCodeAt(i + 1);
73993             c3 = str.charCodeAt(i + 2);
73994             arr[ac] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
73995             i += 3;
73996           }
73997         }
73998       }
73999       return arr.join('');
74000     }
74001
74002     /**
74003      * Add integers, wrapping at 2^32. This uses 16-bit operations internally
74004      * to work around bugs in some JS interpreters.
74005      */
74006
74007     function safe_add(x, y) {
74008       var lsw = (x & 0xFFFF) + (y & 0xFFFF),
74009         msw = (x >> 16) + (y >> 16) + (lsw >> 16);
74010       return (msw << 16) | (lsw & 0xFFFF);
74011     }
74012
74013     /**
74014      * Bitwise rotate a 32-bit number to the left.
74015      */
74016
74017     function bit_rol(num, cnt) {
74018       return (num << cnt) | (num >>> (32 - cnt));
74019     }
74020
74021     /**
74022      * Convert a raw string to a hex string
74023      */
74024
74025     function rstr2hex(input, hexcase) {
74026       var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef',
74027         output = '',
74028         x, i = 0,
74029         l = input.length;
74030       for (; i < l; i += 1) {
74031         x = input.charCodeAt(i);
74032         output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F);
74033       }
74034       return output;
74035     }
74036
74037     /**
74038      * Convert an array of big-endian words to a string
74039      */
74040
74041     function binb2rstr(input) {
74042       var i, l = input.length * 32,
74043         output = '';
74044       for (i = 0; i < l; i += 8) {
74045         output += String.fromCharCode((input[i >> 5] >>> (24 - i % 32)) & 0xFF);
74046       }
74047       return output;
74048     }
74049
74050     /**
74051      * Convert an array of little-endian words to a string
74052      */
74053
74054     function binl2rstr(input) {
74055       var i, l = input.length * 32,
74056         output = '';
74057       for (i = 0; i < l; i += 8) {
74058         output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
74059       }
74060       return output;
74061     }
74062
74063     /**
74064      * Convert a raw string to an array of little-endian words
74065      * Characters >255 have their high-byte silently ignored.
74066      */
74067
74068     function rstr2binl(input) {
74069       var i, l = input.length * 8,
74070         output = Array(input.length >> 2),
74071         lo = output.length;
74072       for (i = 0; i < lo; i += 1) {
74073         output[i] = 0;
74074       }
74075       for (i = 0; i < l; i += 8) {
74076         output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
74077       }
74078       return output;
74079     }
74080
74081     /**
74082      * Convert a raw string to an array of big-endian words
74083      * Characters >255 have their high-byte silently ignored.
74084      */
74085
74086     function rstr2binb(input) {
74087       var i, l = input.length * 8,
74088         output = Array(input.length >> 2),
74089         lo = output.length;
74090       for (i = 0; i < lo; i += 1) {
74091         output[i] = 0;
74092       }
74093       for (i = 0; i < l; i += 8) {
74094         output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
74095       }
74096       return output;
74097     }
74098
74099     /**
74100      * Convert a raw string to an arbitrary string encoding
74101      */
74102
74103     function rstr2any(input, encoding) {
74104       var divisor = encoding.length,
74105         remainders = Array(),
74106         i, q, x, ld, quotient, dividend, output, full_length;
74107
74108       /* Convert to an array of 16-bit big-endian values, forming the dividend */
74109       dividend = Array(Math.ceil(input.length / 2));
74110       ld = dividend.length;
74111       for (i = 0; i < ld; i += 1) {
74112         dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
74113       }
74114
74115       /**
74116        * Repeatedly perform a long division. The binary array forms the dividend,
74117        * the length of the encoding is the divisor. Once computed, the quotient
74118        * forms the dividend for the next step. We stop when the dividend is zerHashes.
74119        * All remainders are stored for later use.
74120        */
74121       while (dividend.length > 0) {
74122         quotient = Array();
74123         x = 0;
74124         for (i = 0; i < dividend.length; i += 1) {
74125           x = (x << 16) + dividend[i];
74126           q = Math.floor(x / divisor);
74127           x -= q * divisor;
74128           if (quotient.length > 0 || q > 0) {
74129             quotient[quotient.length] = q;
74130           }
74131         }
74132         remainders[remainders.length] = x;
74133         dividend = quotient;
74134       }
74135
74136       /* Convert the remainders to the output string */
74137       output = '';
74138       for (i = remainders.length - 1; i >= 0; i--) {
74139         output += encoding.charAt(remainders[i]);
74140       }
74141
74142       /* Append leading zero equivalents */
74143       full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));
74144       for (i = output.length; i < full_length; i += 1) {
74145         output = encoding[0] + output;
74146       }
74147       return output;
74148     }
74149
74150     /**
74151      * Convert a raw string to a base-64 string
74152      */
74153
74154     function rstr2b64(input, b64pad) {
74155       var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
74156         output = '',
74157         len = input.length,
74158         i, j, triplet;
74159       b64pad = b64pad || '=';
74160       for (i = 0; i < len; i += 3) {
74161         triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
74162         for (j = 0; j < 4; j += 1) {
74163           if (i * 8 + j * 6 > input.length * 8) {
74164             output += b64pad;
74165           } else {
74166             output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
74167           }
74168         }
74169       }
74170       return output;
74171     }
74172
74173     Hashes = {
74174       /**
74175        * @property {String} version
74176        * @readonly
74177        */
74178       VERSION: '1.0.6',
74179       /**
74180        * @member Hashes
74181        * @class Base64
74182        * @constructor
74183        */
74184       Base64: function() {
74185         // private properties
74186         var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
74187           pad = '=', // default pad according with the RFC standard
74188           utf8 = true; // by default enable UTF-8 support encoding
74189
74190         // public method for encoding
74191         this.encode = function(input) {
74192           var i, j, triplet,
74193             output = '',
74194             len = input.length;
74195
74196           pad = pad || '=';
74197           input = (utf8) ? utf8Encode(input) : input;
74198
74199           for (i = 0; i < len; i += 3) {
74200             triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
74201             for (j = 0; j < 4; j += 1) {
74202               if (i * 8 + j * 6 > len * 8) {
74203                 output += pad;
74204               } else {
74205                 output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
74206               }
74207             }
74208           }
74209           return output;
74210         };
74211
74212         // public method for decoding
74213         this.decode = function(input) {
74214           // var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
74215           var i, o1, o2, o3, h1, h2, h3, h4, bits, ac,
74216             dec = '',
74217             arr = [];
74218           if (!input) {
74219             return input;
74220           }
74221
74222           i = ac = 0;
74223           input = input.replace(new RegExp('\\' + pad, 'gi'), ''); // use '='
74224           //input += '';
74225
74226           do { // unpack four hexets into three octets using index points in b64
74227             h1 = tab.indexOf(input.charAt(i += 1));
74228             h2 = tab.indexOf(input.charAt(i += 1));
74229             h3 = tab.indexOf(input.charAt(i += 1));
74230             h4 = tab.indexOf(input.charAt(i += 1));
74231
74232             bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
74233
74234             o1 = bits >> 16 & 0xff;
74235             o2 = bits >> 8 & 0xff;
74236             o3 = bits & 0xff;
74237             ac += 1;
74238
74239             if (h3 === 64) {
74240               arr[ac] = String.fromCharCode(o1);
74241             } else if (h4 === 64) {
74242               arr[ac] = String.fromCharCode(o1, o2);
74243             } else {
74244               arr[ac] = String.fromCharCode(o1, o2, o3);
74245             }
74246           } while (i < input.length);
74247
74248           dec = arr.join('');
74249           dec = (utf8) ? utf8Decode(dec) : dec;
74250
74251           return dec;
74252         };
74253
74254         // set custom pad string
74255         this.setPad = function(str) {
74256           pad = str || pad;
74257           return this;
74258         };
74259         // set custom tab string characters
74260         this.setTab = function(str) {
74261           tab = str || tab;
74262           return this;
74263         };
74264         this.setUTF8 = function(bool) {
74265           if (typeof bool === 'boolean') {
74266             utf8 = bool;
74267           }
74268           return this;
74269         };
74270       },
74271
74272       /**
74273        * CRC-32 calculation
74274        * @member Hashes
74275        * @method CRC32
74276        * @static
74277        * @param {String} str Input String
74278        * @return {String}
74279        */
74280       CRC32: function(str) {
74281         var crc = 0,
74282           x = 0,
74283           y = 0,
74284           table, i, iTop;
74285         str = utf8Encode(str);
74286
74287         table = [
74288           '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ',
74289           '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ',
74290           '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ',
74291           '63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD ',
74292           'A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC ',
74293           '51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 ',
74294           'B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 ',
74295           '06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 ',
74296           'E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 ',
74297           '12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 ',
74298           'D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 ',
74299           '33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 ',
74300           'CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 ',
74301           '9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E ',
74302           '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ',
74303           '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ',
74304           '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ',
74305           'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ',
74306           '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ',
74307           'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ',
74308           '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ',
74309           'F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA ',
74310           '11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 ',
74311           'D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F ',
74312           '30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E ',
74313           'C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D'
74314         ].join('');
74315
74316         crc = crc ^ (-1);
74317         for (i = 0, iTop = str.length; i < iTop; i += 1) {
74318           y = (crc ^ str.charCodeAt(i)) & 0xFF;
74319           x = '0x' + table.substr(y * 9, 8);
74320           crc = (crc >>> 8) ^ x;
74321         }
74322         // always return a positive number (that's what >>> 0 does)
74323         return (crc ^ (-1)) >>> 0;
74324       },
74325       /**
74326        * @member Hashes
74327        * @class MD5
74328        * @constructor
74329        * @param {Object} [config]
74330        *
74331        * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
74332        * Digest Algorithm, as defined in RFC 1321.
74333        * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
74334        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
74335        * See <http://pajhome.org.uk/crypt/md5> for more infHashes.
74336        */
74337       MD5: function(options) {
74338         /**
74339          * Private config properties. You may need to tweak these to be compatible with
74340          * the server-side, but the defaults work in most cases.
74341          * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
74342          */
74343         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
74344           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
74345           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
74346
74347         // privileged (public) methods
74348         this.hex = function(s) {
74349           return rstr2hex(rstr(s, utf8), hexcase);
74350         };
74351         this.b64 = function(s) {
74352           return rstr2b64(rstr(s), b64pad);
74353         };
74354         this.any = function(s, e) {
74355           return rstr2any(rstr(s, utf8), e);
74356         };
74357         this.raw = function(s) {
74358           return rstr(s, utf8);
74359         };
74360         this.hex_hmac = function(k, d) {
74361           return rstr2hex(rstr_hmac(k, d), hexcase);
74362         };
74363         this.b64_hmac = function(k, d) {
74364           return rstr2b64(rstr_hmac(k, d), b64pad);
74365         };
74366         this.any_hmac = function(k, d, e) {
74367           return rstr2any(rstr_hmac(k, d), e);
74368         };
74369         /**
74370          * Perform a simple self-test to see if the VM is working
74371          * @return {String} Hexadecimal hash sample
74372          */
74373         this.vm_test = function() {
74374           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
74375         };
74376         /**
74377          * Enable/disable uppercase hexadecimal returned string
74378          * @param {Boolean}
74379          * @return {Object} this
74380          */
74381         this.setUpperCase = function(a) {
74382           if (typeof a === 'boolean') {
74383             hexcase = a;
74384           }
74385           return this;
74386         };
74387         /**
74388          * Defines a base64 pad string
74389          * @param {String} Pad
74390          * @return {Object} this
74391          */
74392         this.setPad = function(a) {
74393           b64pad = a || b64pad;
74394           return this;
74395         };
74396         /**
74397          * Defines a base64 pad string
74398          * @param {Boolean}
74399          * @return {Object} [this]
74400          */
74401         this.setUTF8 = function(a) {
74402           if (typeof a === 'boolean') {
74403             utf8 = a;
74404           }
74405           return this;
74406         };
74407
74408         // private methods
74409
74410         /**
74411          * Calculate the MD5 of a raw string
74412          */
74413
74414         function rstr(s) {
74415           s = (utf8) ? utf8Encode(s) : s;
74416           return binl2rstr(binl(rstr2binl(s), s.length * 8));
74417         }
74418
74419         /**
74420          * Calculate the HMAC-MD5, of a key and some data (raw strings)
74421          */
74422
74423         function rstr_hmac(key, data) {
74424           var bkey, ipad, opad, hash, i;
74425
74426           key = (utf8) ? utf8Encode(key) : key;
74427           data = (utf8) ? utf8Encode(data) : data;
74428           bkey = rstr2binl(key);
74429           if (bkey.length > 16) {
74430             bkey = binl(bkey, key.length * 8);
74431           }
74432
74433           ipad = Array(16), opad = Array(16);
74434           for (i = 0; i < 16; i += 1) {
74435             ipad[i] = bkey[i] ^ 0x36363636;
74436             opad[i] = bkey[i] ^ 0x5C5C5C5C;
74437           }
74438           hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
74439           return binl2rstr(binl(opad.concat(hash), 512 + 128));
74440         }
74441
74442         /**
74443          * Calculate the MD5 of an array of little-endian words, and a bit length.
74444          */
74445
74446         function binl(x, len) {
74447           var i, olda, oldb, oldc, oldd,
74448             a = 1732584193,
74449             b = -271733879,
74450             c = -1732584194,
74451             d = 271733878;
74452
74453           /* append padding */
74454           x[len >> 5] |= 0x80 << ((len) % 32);
74455           x[(((len + 64) >>> 9) << 4) + 14] = len;
74456
74457           for (i = 0; i < x.length; i += 16) {
74458             olda = a;
74459             oldb = b;
74460             oldc = c;
74461             oldd = d;
74462
74463             a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
74464             d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
74465             c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
74466             b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
74467             a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
74468             d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
74469             c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
74470             b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
74471             a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
74472             d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
74473             c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
74474             b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
74475             a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
74476             d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
74477             c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
74478             b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
74479
74480             a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
74481             d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
74482             c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
74483             b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
74484             a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
74485             d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
74486             c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
74487             b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
74488             a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
74489             d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
74490             c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
74491             b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
74492             a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
74493             d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
74494             c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
74495             b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
74496
74497             a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
74498             d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
74499             c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
74500             b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
74501             a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
74502             d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
74503             c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
74504             b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
74505             a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
74506             d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
74507             c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
74508             b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
74509             a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
74510             d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
74511             c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
74512             b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
74513
74514             a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
74515             d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
74516             c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
74517             b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
74518             a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
74519             d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
74520             c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
74521             b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
74522             a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
74523             d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
74524             c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
74525             b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
74526             a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
74527             d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
74528             c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
74529             b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
74530
74531             a = safe_add(a, olda);
74532             b = safe_add(b, oldb);
74533             c = safe_add(c, oldc);
74534             d = safe_add(d, oldd);
74535           }
74536           return Array(a, b, c, d);
74537         }
74538
74539         /**
74540          * These functions implement the four basic operations the algorithm uses.
74541          */
74542
74543         function md5_cmn(q, a, b, x, s, t) {
74544           return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
74545         }
74546
74547         function md5_ff(a, b, c, d, x, s, t) {
74548           return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
74549         }
74550
74551         function md5_gg(a, b, c, d, x, s, t) {
74552           return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
74553         }
74554
74555         function md5_hh(a, b, c, d, x, s, t) {
74556           return md5_cmn(b ^ c ^ d, a, b, x, s, t);
74557         }
74558
74559         function md5_ii(a, b, c, d, x, s, t) {
74560           return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
74561         }
74562       },
74563       /**
74564        * @member Hashes
74565        * @class Hashes.SHA1
74566        * @param {Object} [config]
74567        * @constructor
74568        *
74569        * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1
74570        * Version 2.2 Copyright Paul Johnston 2000 - 2009.
74571        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
74572        * See http://pajhome.org.uk/crypt/md5 for details.
74573        */
74574       SHA1: function(options) {
74575         /**
74576          * Private config properties. You may need to tweak these to be compatible with
74577          * the server-side, but the defaults work in most cases.
74578          * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
74579          */
74580         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
74581           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
74582           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
74583
74584         // public methods
74585         this.hex = function(s) {
74586           return rstr2hex(rstr(s, utf8), hexcase);
74587         };
74588         this.b64 = function(s) {
74589           return rstr2b64(rstr(s, utf8), b64pad);
74590         };
74591         this.any = function(s, e) {
74592           return rstr2any(rstr(s, utf8), e);
74593         };
74594         this.raw = function(s) {
74595           return rstr(s, utf8);
74596         };
74597         this.hex_hmac = function(k, d) {
74598           return rstr2hex(rstr_hmac(k, d));
74599         };
74600         this.b64_hmac = function(k, d) {
74601           return rstr2b64(rstr_hmac(k, d), b64pad);
74602         };
74603         this.any_hmac = function(k, d, e) {
74604           return rstr2any(rstr_hmac(k, d), e);
74605         };
74606         /**
74607          * Perform a simple self-test to see if the VM is working
74608          * @return {String} Hexadecimal hash sample
74609          * @public
74610          */
74611         this.vm_test = function() {
74612           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
74613         };
74614         /**
74615          * @description Enable/disable uppercase hexadecimal returned string
74616          * @param {boolean}
74617          * @return {Object} this
74618          * @public
74619          */
74620         this.setUpperCase = function(a) {
74621           if (typeof a === 'boolean') {
74622             hexcase = a;
74623           }
74624           return this;
74625         };
74626         /**
74627          * @description Defines a base64 pad string
74628          * @param {string} Pad
74629          * @return {Object} this
74630          * @public
74631          */
74632         this.setPad = function(a) {
74633           b64pad = a || b64pad;
74634           return this;
74635         };
74636         /**
74637          * @description Defines a base64 pad string
74638          * @param {boolean}
74639          * @return {Object} this
74640          * @public
74641          */
74642         this.setUTF8 = function(a) {
74643           if (typeof a === 'boolean') {
74644             utf8 = a;
74645           }
74646           return this;
74647         };
74648
74649         // private methods
74650
74651         /**
74652          * Calculate the SHA-512 of a raw string
74653          */
74654
74655         function rstr(s) {
74656           s = (utf8) ? utf8Encode(s) : s;
74657           return binb2rstr(binb(rstr2binb(s), s.length * 8));
74658         }
74659
74660         /**
74661          * Calculate the HMAC-SHA1 of a key and some data (raw strings)
74662          */
74663
74664         function rstr_hmac(key, data) {
74665           var bkey, ipad, opad, i, hash;
74666           key = (utf8) ? utf8Encode(key) : key;
74667           data = (utf8) ? utf8Encode(data) : data;
74668           bkey = rstr2binb(key);
74669
74670           if (bkey.length > 16) {
74671             bkey = binb(bkey, key.length * 8);
74672           }
74673           ipad = Array(16), opad = Array(16);
74674           for (i = 0; i < 16; i += 1) {
74675             ipad[i] = bkey[i] ^ 0x36363636;
74676             opad[i] = bkey[i] ^ 0x5C5C5C5C;
74677           }
74678           hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
74679           return binb2rstr(binb(opad.concat(hash), 512 + 160));
74680         }
74681
74682         /**
74683          * Calculate the SHA-1 of an array of big-endian words, and a bit length
74684          */
74685
74686         function binb(x, len) {
74687           var i, j, t, olda, oldb, oldc, oldd, olde,
74688             w = Array(80),
74689             a = 1732584193,
74690             b = -271733879,
74691             c = -1732584194,
74692             d = 271733878,
74693             e = -1009589776;
74694
74695           /* append padding */
74696           x[len >> 5] |= 0x80 << (24 - len % 32);
74697           x[((len + 64 >> 9) << 4) + 15] = len;
74698
74699           for (i = 0; i < x.length; i += 16) {
74700             olda = a;
74701             oldb = b;
74702             oldc = c;
74703             oldd = d;
74704             olde = e;
74705
74706             for (j = 0; j < 80; j += 1) {
74707               if (j < 16) {
74708                 w[j] = x[i + j];
74709               } else {
74710                 w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
74711               }
74712               t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),
74713                 safe_add(safe_add(e, w[j]), sha1_kt(j)));
74714               e = d;
74715               d = c;
74716               c = bit_rol(b, 30);
74717               b = a;
74718               a = t;
74719             }
74720
74721             a = safe_add(a, olda);
74722             b = safe_add(b, oldb);
74723             c = safe_add(c, oldc);
74724             d = safe_add(d, oldd);
74725             e = safe_add(e, olde);
74726           }
74727           return Array(a, b, c, d, e);
74728         }
74729
74730         /**
74731          * Perform the appropriate triplet combination function for the current
74732          * iteration
74733          */
74734
74735         function sha1_ft(t, b, c, d) {
74736           if (t < 20) {
74737             return (b & c) | ((~b) & d);
74738           }
74739           if (t < 40) {
74740             return b ^ c ^ d;
74741           }
74742           if (t < 60) {
74743             return (b & c) | (b & d) | (c & d);
74744           }
74745           return b ^ c ^ d;
74746         }
74747
74748         /**
74749          * Determine the appropriate additive constant for the current iteration
74750          */
74751
74752         function sha1_kt(t) {
74753           return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
74754             (t < 60) ? -1894007588 : -899497514;
74755         }
74756       },
74757       /**
74758        * @class Hashes.SHA256
74759        * @param {config}
74760        *
74761        * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2
74762        * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.
74763        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
74764        * See http://pajhome.org.uk/crypt/md5 for details.
74765        * Also http://anmar.eu.org/projects/jssha2/
74766        */
74767       SHA256: function(options) {
74768         /**
74769          * Private properties configuration variables. You may need to tweak these to be compatible with
74770          * the server-side, but the defaults work in most cases.
74771          * @see this.setUpperCase() method
74772          * @see this.setPad() method
74773          */
74774         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase  */
74775           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
74776           /* base-64 pad character. Default '=' for strict RFC compliance   */
74777           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
74778           /* enable/disable utf8 encoding */
74779           sha256_K;
74780
74781         /* privileged (public) methods */
74782         this.hex = function(s) {
74783           return rstr2hex(rstr(s, utf8));
74784         };
74785         this.b64 = function(s) {
74786           return rstr2b64(rstr(s, utf8), b64pad);
74787         };
74788         this.any = function(s, e) {
74789           return rstr2any(rstr(s, utf8), e);
74790         };
74791         this.raw = function(s) {
74792           return rstr(s, utf8);
74793         };
74794         this.hex_hmac = function(k, d) {
74795           return rstr2hex(rstr_hmac(k, d));
74796         };
74797         this.b64_hmac = function(k, d) {
74798           return rstr2b64(rstr_hmac(k, d), b64pad);
74799         };
74800         this.any_hmac = function(k, d, e) {
74801           return rstr2any(rstr_hmac(k, d), e);
74802         };
74803         /**
74804          * Perform a simple self-test to see if the VM is working
74805          * @return {String} Hexadecimal hash sample
74806          * @public
74807          */
74808         this.vm_test = function() {
74809           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
74810         };
74811         /**
74812          * Enable/disable uppercase hexadecimal returned string
74813          * @param {boolean}
74814          * @return {Object} this
74815          * @public
74816          */
74817         this.setUpperCase = function(a) {
74818           if (typeof a === 'boolean') {
74819             hexcase = a;
74820           }
74821           return this;
74822         };
74823         /**
74824          * @description Defines a base64 pad string
74825          * @param {string} Pad
74826          * @return {Object} this
74827          * @public
74828          */
74829         this.setPad = function(a) {
74830           b64pad = a || b64pad;
74831           return this;
74832         };
74833         /**
74834          * Defines a base64 pad string
74835          * @param {boolean}
74836          * @return {Object} this
74837          * @public
74838          */
74839         this.setUTF8 = function(a) {
74840           if (typeof a === 'boolean') {
74841             utf8 = a;
74842           }
74843           return this;
74844         };
74845
74846         // private methods
74847
74848         /**
74849          * Calculate the SHA-512 of a raw string
74850          */
74851
74852         function rstr(s, utf8) {
74853           s = (utf8) ? utf8Encode(s) : s;
74854           return binb2rstr(binb(rstr2binb(s), s.length * 8));
74855         }
74856
74857         /**
74858          * Calculate the HMAC-sha256 of a key and some data (raw strings)
74859          */
74860
74861         function rstr_hmac(key, data) {
74862           key = (utf8) ? utf8Encode(key) : key;
74863           data = (utf8) ? utf8Encode(data) : data;
74864           var hash, i = 0,
74865             bkey = rstr2binb(key),
74866             ipad = Array(16),
74867             opad = Array(16);
74868
74869           if (bkey.length > 16) {
74870             bkey = binb(bkey, key.length * 8);
74871           }
74872
74873           for (; i < 16; i += 1) {
74874             ipad[i] = bkey[i] ^ 0x36363636;
74875             opad[i] = bkey[i] ^ 0x5C5C5C5C;
74876           }
74877
74878           hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
74879           return binb2rstr(binb(opad.concat(hash), 512 + 256));
74880         }
74881
74882         /*
74883          * Main sha256 function, with its support functions
74884          */
74885
74886         function sha256_S(X, n) {
74887           return (X >>> n) | (X << (32 - n));
74888         }
74889
74890         function sha256_R(X, n) {
74891           return (X >>> n);
74892         }
74893
74894         function sha256_Ch(x, y, z) {
74895           return ((x & y) ^ ((~x) & z));
74896         }
74897
74898         function sha256_Maj(x, y, z) {
74899           return ((x & y) ^ (x & z) ^ (y & z));
74900         }
74901
74902         function sha256_Sigma0256(x) {
74903           return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));
74904         }
74905
74906         function sha256_Sigma1256(x) {
74907           return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));
74908         }
74909
74910         function sha256_Gamma0256(x) {
74911           return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));
74912         }
74913
74914         function sha256_Gamma1256(x) {
74915           return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));
74916         }
74917
74918         sha256_K = [
74919           1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987,
74920           1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522,
74921           264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585,
74922           113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291,
74923           1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344,
74924           430227734, 506948616, 659060556, 883997877, 958139571, 1322822218,
74925           1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998
74926         ];
74927
74928         function binb(m, l) {
74929           var HASH = [1779033703, -1150833019, 1013904242, -1521486534,
74930             1359893119, -1694144372, 528734635, 1541459225
74931           ];
74932           var W = new Array(64);
74933           var a, b, c, d, e, f, g, h;
74934           var i, j, T1, T2;
74935
74936           /* append padding */
74937           m[l >> 5] |= 0x80 << (24 - l % 32);
74938           m[((l + 64 >> 9) << 4) + 15] = l;
74939
74940           for (i = 0; i < m.length; i += 16) {
74941             a = HASH[0];
74942             b = HASH[1];
74943             c = HASH[2];
74944             d = HASH[3];
74945             e = HASH[4];
74946             f = HASH[5];
74947             g = HASH[6];
74948             h = HASH[7];
74949
74950             for (j = 0; j < 64; j += 1) {
74951               if (j < 16) {
74952                 W[j] = m[j + i];
74953               } else {
74954                 W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),
74955                   sha256_Gamma0256(W[j - 15])), W[j - 16]);
74956               }
74957
74958               T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),
74959                 sha256_K[j]), W[j]);
74960               T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
74961               h = g;
74962               g = f;
74963               f = e;
74964               e = safe_add(d, T1);
74965               d = c;
74966               c = b;
74967               b = a;
74968               a = safe_add(T1, T2);
74969             }
74970
74971             HASH[0] = safe_add(a, HASH[0]);
74972             HASH[1] = safe_add(b, HASH[1]);
74973             HASH[2] = safe_add(c, HASH[2]);
74974             HASH[3] = safe_add(d, HASH[3]);
74975             HASH[4] = safe_add(e, HASH[4]);
74976             HASH[5] = safe_add(f, HASH[5]);
74977             HASH[6] = safe_add(g, HASH[6]);
74978             HASH[7] = safe_add(h, HASH[7]);
74979           }
74980           return HASH;
74981         }
74982
74983       },
74984
74985       /**
74986        * @class Hashes.SHA512
74987        * @param {config}
74988        *
74989        * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2
74990        * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.
74991        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
74992        * See http://pajhome.org.uk/crypt/md5 for details.
74993        */
74994       SHA512: function(options) {
74995         /**
74996          * Private properties configuration variables. You may need to tweak these to be compatible with
74997          * the server-side, but the defaults work in most cases.
74998          * @see this.setUpperCase() method
74999          * @see this.setPad() method
75000          */
75001         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
75002           /* hexadecimal output case format. false - lowercase; true - uppercase  */
75003           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
75004           /* base-64 pad character. Default '=' for strict RFC compliance   */
75005           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
75006           /* enable/disable utf8 encoding */
75007           sha512_k;
75008
75009         /* privileged (public) methods */
75010         this.hex = function(s) {
75011           return rstr2hex(rstr(s));
75012         };
75013         this.b64 = function(s) {
75014           return rstr2b64(rstr(s), b64pad);
75015         };
75016         this.any = function(s, e) {
75017           return rstr2any(rstr(s), e);
75018         };
75019         this.raw = function(s) {
75020           return rstr(s, utf8);
75021         };
75022         this.hex_hmac = function(k, d) {
75023           return rstr2hex(rstr_hmac(k, d));
75024         };
75025         this.b64_hmac = function(k, d) {
75026           return rstr2b64(rstr_hmac(k, d), b64pad);
75027         };
75028         this.any_hmac = function(k, d, e) {
75029           return rstr2any(rstr_hmac(k, d), e);
75030         };
75031         /**
75032          * Perform a simple self-test to see if the VM is working
75033          * @return {String} Hexadecimal hash sample
75034          * @public
75035          */
75036         this.vm_test = function() {
75037           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
75038         };
75039         /**
75040          * @description Enable/disable uppercase hexadecimal returned string
75041          * @param {boolean}
75042          * @return {Object} this
75043          * @public
75044          */
75045         this.setUpperCase = function(a) {
75046           if (typeof a === 'boolean') {
75047             hexcase = a;
75048           }
75049           return this;
75050         };
75051         /**
75052          * @description Defines a base64 pad string
75053          * @param {string} Pad
75054          * @return {Object} this
75055          * @public
75056          */
75057         this.setPad = function(a) {
75058           b64pad = a || b64pad;
75059           return this;
75060         };
75061         /**
75062          * @description Defines a base64 pad string
75063          * @param {boolean}
75064          * @return {Object} this
75065          * @public
75066          */
75067         this.setUTF8 = function(a) {
75068           if (typeof a === 'boolean') {
75069             utf8 = a;
75070           }
75071           return this;
75072         };
75073
75074         /* private methods */
75075
75076         /**
75077          * Calculate the SHA-512 of a raw string
75078          */
75079
75080         function rstr(s) {
75081           s = (utf8) ? utf8Encode(s) : s;
75082           return binb2rstr(binb(rstr2binb(s), s.length * 8));
75083         }
75084         /*
75085          * Calculate the HMAC-SHA-512 of a key and some data (raw strings)
75086          */
75087
75088         function rstr_hmac(key, data) {
75089           key = (utf8) ? utf8Encode(key) : key;
75090           data = (utf8) ? utf8Encode(data) : data;
75091
75092           var hash, i = 0,
75093             bkey = rstr2binb(key),
75094             ipad = Array(32),
75095             opad = Array(32);
75096
75097           if (bkey.length > 32) {
75098             bkey = binb(bkey, key.length * 8);
75099           }
75100
75101           for (; i < 32; i += 1) {
75102             ipad[i] = bkey[i] ^ 0x36363636;
75103             opad[i] = bkey[i] ^ 0x5C5C5C5C;
75104           }
75105
75106           hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
75107           return binb2rstr(binb(opad.concat(hash), 1024 + 512));
75108         }
75109
75110         /**
75111          * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
75112          */
75113
75114         function binb(x, len) {
75115           var j, i, l,
75116             W = new Array(80),
75117             hash = new Array(16),
75118             //Initial hash values
75119             H = [
75120               new int64(0x6a09e667, -205731576),
75121               new int64(-1150833019, -2067093701),
75122               new int64(0x3c6ef372, -23791573),
75123               new int64(-1521486534, 0x5f1d36f1),
75124               new int64(0x510e527f, -1377402159),
75125               new int64(-1694144372, 0x2b3e6c1f),
75126               new int64(0x1f83d9ab, -79577749),
75127               new int64(0x5be0cd19, 0x137e2179)
75128             ],
75129             T1 = new int64(0, 0),
75130             T2 = new int64(0, 0),
75131             a = new int64(0, 0),
75132             b = new int64(0, 0),
75133             c = new int64(0, 0),
75134             d = new int64(0, 0),
75135             e = new int64(0, 0),
75136             f = new int64(0, 0),
75137             g = new int64(0, 0),
75138             h = new int64(0, 0),
75139             //Temporary variables not specified by the document
75140             s0 = new int64(0, 0),
75141             s1 = new int64(0, 0),
75142             Ch = new int64(0, 0),
75143             Maj = new int64(0, 0),
75144             r1 = new int64(0, 0),
75145             r2 = new int64(0, 0),
75146             r3 = new int64(0, 0);
75147
75148           if (sha512_k === undefined) {
75149             //SHA512 constants
75150             sha512_k = [
75151               new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd),
75152               new int64(-1245643825, -330482897), new int64(-373957723, -2121671748),
75153               new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031),
75154               new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736),
75155               new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe),
75156               new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302),
75157               new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1),
75158               new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428),
75159               new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3),
75160               new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65),
75161               new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),
75162               new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459),
75163               new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210),
75164               new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340),
75165               new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395),
75166               new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70),
75167               new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),
75168               new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473),
75169               new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8),
75170               new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b),
75171               new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023),
75172               new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30),
75173               new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910),
75174               new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),
75175               new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53),
75176               new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016),
75177               new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893),
75178               new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397),
75179               new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),
75180               new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec),
75181               new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047),
75182               new int64(-1090935817, -1295615723), new int64(-965641998, -479046869),
75183               new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207),
75184               new int64(-354779690, -840897762), new int64(-176337025, -294727304),
75185               new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026),
75186               new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b),
75187               new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),
75188               new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620),
75189               new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430),
75190               new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)
75191             ];
75192           }
75193
75194           for (i = 0; i < 80; i += 1) {
75195             W[i] = new int64(0, 0);
75196           }
75197
75198           // append padding to the source string. The format is described in the FIPS.
75199           x[len >> 5] |= 0x80 << (24 - (len & 0x1f));
75200           x[((len + 128 >> 10) << 5) + 31] = len;
75201           l = x.length;
75202           for (i = 0; i < l; i += 32) { //32 dwords is the block size
75203             int64copy(a, H[0]);
75204             int64copy(b, H[1]);
75205             int64copy(c, H[2]);
75206             int64copy(d, H[3]);
75207             int64copy(e, H[4]);
75208             int64copy(f, H[5]);
75209             int64copy(g, H[6]);
75210             int64copy(h, H[7]);
75211
75212             for (j = 0; j < 16; j += 1) {
75213               W[j].h = x[i + 2 * j];
75214               W[j].l = x[i + 2 * j + 1];
75215             }
75216
75217             for (j = 16; j < 80; j += 1) {
75218               //sigma1
75219               int64rrot(r1, W[j - 2], 19);
75220               int64revrrot(r2, W[j - 2], 29);
75221               int64shr(r3, W[j - 2], 6);
75222               s1.l = r1.l ^ r2.l ^ r3.l;
75223               s1.h = r1.h ^ r2.h ^ r3.h;
75224               //sigma0
75225               int64rrot(r1, W[j - 15], 1);
75226               int64rrot(r2, W[j - 15], 8);
75227               int64shr(r3, W[j - 15], 7);
75228               s0.l = r1.l ^ r2.l ^ r3.l;
75229               s0.h = r1.h ^ r2.h ^ r3.h;
75230
75231               int64add4(W[j], s1, W[j - 7], s0, W[j - 16]);
75232             }
75233
75234             for (j = 0; j < 80; j += 1) {
75235               //Ch
75236               Ch.l = (e.l & f.l) ^ (~e.l & g.l);
75237               Ch.h = (e.h & f.h) ^ (~e.h & g.h);
75238
75239               //Sigma1
75240               int64rrot(r1, e, 14);
75241               int64rrot(r2, e, 18);
75242               int64revrrot(r3, e, 9);
75243               s1.l = r1.l ^ r2.l ^ r3.l;
75244               s1.h = r1.h ^ r2.h ^ r3.h;
75245
75246               //Sigma0
75247               int64rrot(r1, a, 28);
75248               int64revrrot(r2, a, 2);
75249               int64revrrot(r3, a, 7);
75250               s0.l = r1.l ^ r2.l ^ r3.l;
75251               s0.h = r1.h ^ r2.h ^ r3.h;
75252
75253               //Maj
75254               Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l);
75255               Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h);
75256
75257               int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
75258               int64add(T2, s0, Maj);
75259
75260               int64copy(h, g);
75261               int64copy(g, f);
75262               int64copy(f, e);
75263               int64add(e, d, T1);
75264               int64copy(d, c);
75265               int64copy(c, b);
75266               int64copy(b, a);
75267               int64add(a, T1, T2);
75268             }
75269             int64add(H[0], H[0], a);
75270             int64add(H[1], H[1], b);
75271             int64add(H[2], H[2], c);
75272             int64add(H[3], H[3], d);
75273             int64add(H[4], H[4], e);
75274             int64add(H[5], H[5], f);
75275             int64add(H[6], H[6], g);
75276             int64add(H[7], H[7], h);
75277           }
75278
75279           //represent the hash as an array of 32-bit dwords
75280           for (i = 0; i < 8; i += 1) {
75281             hash[2 * i] = H[i].h;
75282             hash[2 * i + 1] = H[i].l;
75283           }
75284           return hash;
75285         }
75286
75287         //A constructor for 64-bit numbers
75288
75289         function int64(h, l) {
75290           this.h = h;
75291           this.l = l;
75292           //this.toString = int64toString;
75293         }
75294
75295         //Copies src into dst, assuming both are 64-bit numbers
75296
75297         function int64copy(dst, src) {
75298           dst.h = src.h;
75299           dst.l = src.l;
75300         }
75301
75302         //Right-rotates a 64-bit number by shift
75303         //Won't handle cases of shift>=32
75304         //The function revrrot() is for that
75305
75306         function int64rrot(dst, x, shift) {
75307           dst.l = (x.l >>> shift) | (x.h << (32 - shift));
75308           dst.h = (x.h >>> shift) | (x.l << (32 - shift));
75309         }
75310
75311         //Reverses the dwords of the source and then rotates right by shift.
75312         //This is equivalent to rotation by 32+shift
75313
75314         function int64revrrot(dst, x, shift) {
75315           dst.l = (x.h >>> shift) | (x.l << (32 - shift));
75316           dst.h = (x.l >>> shift) | (x.h << (32 - shift));
75317         }
75318
75319         //Bitwise-shifts right a 64-bit number by shift
75320         //Won't handle shift>=32, but it's never needed in SHA512
75321
75322         function int64shr(dst, x, shift) {
75323           dst.l = (x.l >>> shift) | (x.h << (32 - shift));
75324           dst.h = (x.h >>> shift);
75325         }
75326
75327         //Adds two 64-bit numbers
75328         //Like the original implementation, does not rely on 32-bit operations
75329
75330         function int64add(dst, x, y) {
75331           var w0 = (x.l & 0xffff) + (y.l & 0xffff);
75332           var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);
75333           var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);
75334           var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16);
75335           dst.l = (w0 & 0xffff) | (w1 << 16);
75336           dst.h = (w2 & 0xffff) | (w3 << 16);
75337         }
75338
75339         //Same, except with 4 addends. Works faster than adding them one by one.
75340
75341         function int64add4(dst, a, b, c, d) {
75342           var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);
75343           var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16);
75344           var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16);
75345           var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16);
75346           dst.l = (w0 & 0xffff) | (w1 << 16);
75347           dst.h = (w2 & 0xffff) | (w3 << 16);
75348         }
75349
75350         //Same, except with 5 addends
75351
75352         function int64add5(dst, a, b, c, d, e) {
75353           var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff),
75354             w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16),
75355             w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16),
75356             w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16);
75357           dst.l = (w0 & 0xffff) | (w1 << 16);
75358           dst.h = (w2 & 0xffff) | (w3 << 16);
75359         }
75360       },
75361       /**
75362        * @class Hashes.RMD160
75363        * @constructor
75364        * @param {Object} [config]
75365        *
75366        * A JavaScript implementation of the RIPEMD-160 Algorithm
75367        * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
75368        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
75369        * See http://pajhome.org.uk/crypt/md5 for details.
75370        * Also http://www.ocf.berkeley.edu/~jjlin/jsotp/
75371        */
75372       RMD160: function(options) {
75373         /**
75374          * Private properties configuration variables. You may need to tweak these to be compatible with
75375          * the server-side, but the defaults work in most cases.
75376          * @see this.setUpperCase() method
75377          * @see this.setPad() method
75378          */
75379         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
75380           /* hexadecimal output case format. false - lowercase; true - uppercase  */
75381           b64pad = (options && typeof options.pad === 'string') ? options.pa : '=',
75382           /* base-64 pad character. Default '=' for strict RFC compliance   */
75383           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
75384           /* enable/disable utf8 encoding */
75385           rmd160_r1 = [
75386             0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
75387             7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
75388             3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
75389             1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
75390             4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
75391           ],
75392           rmd160_r2 = [
75393             5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
75394             6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
75395             15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
75396             8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
75397             12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
75398           ],
75399           rmd160_s1 = [
75400             11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
75401             7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
75402             11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
75403             11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
75404             9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
75405           ],
75406           rmd160_s2 = [
75407             8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
75408             9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
75409             9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
75410             15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
75411             8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
75412           ];
75413
75414         /* privileged (public) methods */
75415         this.hex = function(s) {
75416           return rstr2hex(rstr(s, utf8));
75417         };
75418         this.b64 = function(s) {
75419           return rstr2b64(rstr(s, utf8), b64pad);
75420         };
75421         this.any = function(s, e) {
75422           return rstr2any(rstr(s, utf8), e);
75423         };
75424         this.raw = function(s) {
75425           return rstr(s, utf8);
75426         };
75427         this.hex_hmac = function(k, d) {
75428           return rstr2hex(rstr_hmac(k, d));
75429         };
75430         this.b64_hmac = function(k, d) {
75431           return rstr2b64(rstr_hmac(k, d), b64pad);
75432         };
75433         this.any_hmac = function(k, d, e) {
75434           return rstr2any(rstr_hmac(k, d), e);
75435         };
75436         /**
75437          * Perform a simple self-test to see if the VM is working
75438          * @return {String} Hexadecimal hash sample
75439          * @public
75440          */
75441         this.vm_test = function() {
75442           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
75443         };
75444         /**
75445          * @description Enable/disable uppercase hexadecimal returned string
75446          * @param {boolean}
75447          * @return {Object} this
75448          * @public
75449          */
75450         this.setUpperCase = function(a) {
75451           if (typeof a === 'boolean') {
75452             hexcase = a;
75453           }
75454           return this;
75455         };
75456         /**
75457          * @description Defines a base64 pad string
75458          * @param {string} Pad
75459          * @return {Object} this
75460          * @public
75461          */
75462         this.setPad = function(a) {
75463           if (typeof a !== 'undefined') {
75464             b64pad = a;
75465           }
75466           return this;
75467         };
75468         /**
75469          * @description Defines a base64 pad string
75470          * @param {boolean}
75471          * @return {Object} this
75472          * @public
75473          */
75474         this.setUTF8 = function(a) {
75475           if (typeof a === 'boolean') {
75476             utf8 = a;
75477           }
75478           return this;
75479         };
75480
75481         /* private methods */
75482
75483         /**
75484          * Calculate the rmd160 of a raw string
75485          */
75486
75487         function rstr(s) {
75488           s = (utf8) ? utf8Encode(s) : s;
75489           return binl2rstr(binl(rstr2binl(s), s.length * 8));
75490         }
75491
75492         /**
75493          * Calculate the HMAC-rmd160 of a key and some data (raw strings)
75494          */
75495
75496         function rstr_hmac(key, data) {
75497           key = (utf8) ? utf8Encode(key) : key;
75498           data = (utf8) ? utf8Encode(data) : data;
75499           var i, hash,
75500             bkey = rstr2binl(key),
75501             ipad = Array(16),
75502             opad = Array(16);
75503
75504           if (bkey.length > 16) {
75505             bkey = binl(bkey, key.length * 8);
75506           }
75507
75508           for (i = 0; i < 16; i += 1) {
75509             ipad[i] = bkey[i] ^ 0x36363636;
75510             opad[i] = bkey[i] ^ 0x5C5C5C5C;
75511           }
75512           hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
75513           return binl2rstr(binl(opad.concat(hash), 512 + 160));
75514         }
75515
75516         /**
75517          * Convert an array of little-endian words to a string
75518          */
75519
75520         function binl2rstr(input) {
75521           var i, output = '',
75522             l = input.length * 32;
75523           for (i = 0; i < l; i += 8) {
75524             output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
75525           }
75526           return output;
75527         }
75528
75529         /**
75530          * Calculate the RIPE-MD160 of an array of little-endian words, and a bit length.
75531          */
75532
75533         function binl(x, len) {
75534           var T, j, i, l,
75535             h0 = 0x67452301,
75536             h1 = 0xefcdab89,
75537             h2 = 0x98badcfe,
75538             h3 = 0x10325476,
75539             h4 = 0xc3d2e1f0,
75540             A1, B1, C1, D1, E1,
75541             A2, B2, C2, D2, E2;
75542
75543           /* append padding */
75544           x[len >> 5] |= 0x80 << (len % 32);
75545           x[(((len + 64) >>> 9) << 4) + 14] = len;
75546           l = x.length;
75547
75548           for (i = 0; i < l; i += 16) {
75549             A1 = A2 = h0;
75550             B1 = B2 = h1;
75551             C1 = C2 = h2;
75552             D1 = D2 = h3;
75553             E1 = E2 = h4;
75554             for (j = 0; j <= 79; j += 1) {
75555               T = safe_add(A1, rmd160_f(j, B1, C1, D1));
75556               T = safe_add(T, x[i + rmd160_r1[j]]);
75557               T = safe_add(T, rmd160_K1(j));
75558               T = safe_add(bit_rol(T, rmd160_s1[j]), E1);
75559               A1 = E1;
75560               E1 = D1;
75561               D1 = bit_rol(C1, 10);
75562               C1 = B1;
75563               B1 = T;
75564               T = safe_add(A2, rmd160_f(79 - j, B2, C2, D2));
75565               T = safe_add(T, x[i + rmd160_r2[j]]);
75566               T = safe_add(T, rmd160_K2(j));
75567               T = safe_add(bit_rol(T, rmd160_s2[j]), E2);
75568               A2 = E2;
75569               E2 = D2;
75570               D2 = bit_rol(C2, 10);
75571               C2 = B2;
75572               B2 = T;
75573             }
75574
75575             T = safe_add(h1, safe_add(C1, D2));
75576             h1 = safe_add(h2, safe_add(D1, E2));
75577             h2 = safe_add(h3, safe_add(E1, A2));
75578             h3 = safe_add(h4, safe_add(A1, B2));
75579             h4 = safe_add(h0, safe_add(B1, C2));
75580             h0 = T;
75581           }
75582           return [h0, h1, h2, h3, h4];
75583         }
75584
75585         // specific algorithm methods
75586
75587         function rmd160_f(j, x, y, z) {
75588           return (0 <= j && j <= 15) ? (x ^ y ^ z) :
75589             (16 <= j && j <= 31) ? (x & y) | (~x & z) :
75590             (32 <= j && j <= 47) ? (x | ~y) ^ z :
75591             (48 <= j && j <= 63) ? (x & z) | (y & ~z) :
75592             (64 <= j && j <= 79) ? x ^ (y | ~z) :
75593             'rmd160_f: j out of range';
75594         }
75595
75596         function rmd160_K1(j) {
75597           return (0 <= j && j <= 15) ? 0x00000000 :
75598             (16 <= j && j <= 31) ? 0x5a827999 :
75599             (32 <= j && j <= 47) ? 0x6ed9eba1 :
75600             (48 <= j && j <= 63) ? 0x8f1bbcdc :
75601             (64 <= j && j <= 79) ? 0xa953fd4e :
75602             'rmd160_K1: j out of range';
75603         }
75604
75605         function rmd160_K2(j) {
75606           return (0 <= j && j <= 15) ? 0x50a28be6 :
75607             (16 <= j && j <= 31) ? 0x5c4dd124 :
75608             (32 <= j && j <= 47) ? 0x6d703ef3 :
75609             (48 <= j && j <= 63) ? 0x7a6d76e9 :
75610             (64 <= j && j <= 79) ? 0x00000000 :
75611             'rmd160_K2: j out of range';
75612         }
75613       }
75614     };
75615
75616     // exposes Hashes
75617     (function(window, undefined) {
75618       var freeExports = false;
75619       {
75620         freeExports = exports;
75621         if (exports && typeof commonjsGlobal === 'object' && commonjsGlobal && commonjsGlobal === commonjsGlobal.global) {
75622           window = commonjsGlobal;
75623         }
75624       }
75625
75626       if (typeof undefined === 'function' && typeof undefined.amd === 'object' && undefined.amd) {
75627         // define as an anonymous module, so, through path mapping, it can be aliased
75628         undefined(function() {
75629           return Hashes;
75630         });
75631       } else if (freeExports) {
75632         // in Node.js or RingoJS v0.8.0+
75633         if (module && module.exports === freeExports) {
75634           module.exports = Hashes;
75635         }
75636         // in Narwhal or RingoJS v0.7.0-
75637         else {
75638           freeExports.Hashes = Hashes;
75639         }
75640       } else {
75641         // in a browser or Rhino
75642         window.Hashes = Hashes;
75643       }
75644     }(this));
75645   }()); // IIFE
75646   });
75647
75648   var immutable = extend$2;
75649
75650   var hasOwnProperty$g = Object.prototype.hasOwnProperty;
75651
75652   function extend$2() {
75653       var target = {};
75654
75655       for (var i = 0; i < arguments.length; i++) {
75656           var source = arguments[i];
75657
75658           for (var key in source) {
75659               if (hasOwnProperty$g.call(source, key)) {
75660                   target[key] = source[key];
75661               }
75662           }
75663       }
75664
75665       return target
75666   }
75667
75668   var sha1 = new hashes.SHA1();
75669
75670   var ohauth = {};
75671
75672   ohauth.qsString = function(obj) {
75673       return Object.keys(obj).sort().map(function(key) {
75674           return ohauth.percentEncode(key) + '=' +
75675               ohauth.percentEncode(obj[key]);
75676       }).join('&');
75677   };
75678
75679   ohauth.stringQs = function(str) {
75680       return str.split('&').filter(function (pair) {
75681           return pair !== '';
75682       }).reduce(function(obj, pair){
75683           var parts = pair.split('=');
75684           obj[decodeURIComponent(parts[0])] = (null === parts[1]) ?
75685               '' : decodeURIComponent(parts[1]);
75686           return obj;
75687       }, {});
75688   };
75689
75690   ohauth.rawxhr = function(method, url, data, headers, callback) {
75691       var xhr = new XMLHttpRequest(),
75692           twoHundred = /^20\d$/;
75693       xhr.onreadystatechange = function() {
75694           if (4 === xhr.readyState && 0 !== xhr.status) {
75695               if (twoHundred.test(xhr.status)) callback(null, xhr);
75696               else return callback(xhr, null);
75697           }
75698       };
75699       xhr.onerror = function(e) { return callback(e, null); };
75700       xhr.open(method, url, true);
75701       for (var h in headers) xhr.setRequestHeader(h, headers[h]);
75702       xhr.send(data);
75703       return xhr;
75704   };
75705
75706   ohauth.xhr = function(method, url, auth, data, options, callback) {
75707       var headers = (options && options.header) || {
75708           'Content-Type': 'application/x-www-form-urlencoded'
75709       };
75710       headers.Authorization = 'OAuth ' + ohauth.authHeader(auth);
75711       return ohauth.rawxhr(method, url, data, headers, callback);
75712   };
75713
75714   ohauth.nonce = function() {
75715       for (var o = ''; o.length < 6;) {
75716           o += '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'[Math.floor(Math.random() * 61)];
75717       }
75718       return o;
75719   };
75720
75721   ohauth.authHeader = function(obj) {
75722       return Object.keys(obj).sort().map(function(key) {
75723           return encodeURIComponent(key) + '="' + encodeURIComponent(obj[key]) + '"';
75724       }).join(', ');
75725   };
75726
75727   ohauth.timestamp = function() { return ~~((+new Date()) / 1000); };
75728
75729   ohauth.percentEncode = function(s) {
75730       return encodeURIComponent(s)
75731           .replace(/\!/g, '%21').replace(/\'/g, '%27')
75732           .replace(/\*/g, '%2A').replace(/\(/g, '%28').replace(/\)/g, '%29');
75733   };
75734
75735   ohauth.baseString = function(method, url, params) {
75736       if (params.oauth_signature) delete params.oauth_signature;
75737       return [
75738           method,
75739           ohauth.percentEncode(url),
75740           ohauth.percentEncode(ohauth.qsString(params))].join('&');
75741   };
75742
75743   ohauth.signature = function(oauth_secret, token_secret, baseString) {
75744       return sha1.b64_hmac(
75745           ohauth.percentEncode(oauth_secret) + '&' +
75746           ohauth.percentEncode(token_secret),
75747           baseString);
75748   };
75749
75750   /**
75751    * Takes an options object for configuration (consumer_key,
75752    * consumer_secret, version, signature_method, token, token_secret)
75753    * and returns a function that generates the Authorization header
75754    * for given data.
75755    *
75756    * The returned function takes these parameters:
75757    * - method: GET/POST/...
75758    * - uri: full URI with protocol, port, path and query string
75759    * - extra_params: any extra parameters (that are passed in the POST data),
75760    *   can be an object or a from-urlencoded string.
75761    *
75762    * Returned function returns full OAuth header with "OAuth" string in it.
75763    */
75764
75765   ohauth.headerGenerator = function(options) {
75766       options = options || {};
75767       var consumer_key = options.consumer_key || '',
75768           consumer_secret = options.consumer_secret || '',
75769           signature_method = options.signature_method || 'HMAC-SHA1',
75770           version = options.version || '1.0',
75771           token = options.token || '',
75772           token_secret = options.token_secret || '';
75773
75774       return function(method, uri, extra_params) {
75775           method = method.toUpperCase();
75776           if (typeof extra_params === 'string' && extra_params.length > 0) {
75777               extra_params = ohauth.stringQs(extra_params);
75778           }
75779
75780           var uri_parts = uri.split('?', 2),
75781           base_uri = uri_parts[0];
75782
75783           var query_params = uri_parts.length === 2 ?
75784               ohauth.stringQs(uri_parts[1]) : {};
75785
75786           var oauth_params = {
75787               oauth_consumer_key: consumer_key,
75788               oauth_signature_method: signature_method,
75789               oauth_version: version,
75790               oauth_timestamp: ohauth.timestamp(),
75791               oauth_nonce: ohauth.nonce()
75792           };
75793
75794           if (token) oauth_params.oauth_token = token;
75795
75796           var all_params = immutable({}, oauth_params, query_params, extra_params),
75797               base_str = ohauth.baseString(method, base_uri, all_params);
75798
75799           oauth_params.oauth_signature = ohauth.signature(consumer_secret, token_secret, base_str);
75800
75801           return 'OAuth ' + ohauth.authHeader(oauth_params);
75802       };
75803   };
75804
75805   var ohauth_1 = ohauth;
75806
75807   var resolveUrl = createCommonjsModule(function (module, exports) {
75808   // Copyright 2014 Simon Lydell
75809   // X11 (“MIT”) Licensed. (See LICENSE.)
75810
75811   void (function(root, factory) {
75812     {
75813       module.exports = factory();
75814     }
75815   }(commonjsGlobal, function() {
75816
75817     function resolveUrl(/* ...urls */) {
75818       var numUrls = arguments.length;
75819
75820       if (numUrls === 0) {
75821         throw new Error("resolveUrl requires at least one argument; got none.")
75822       }
75823
75824       var base = document.createElement("base");
75825       base.href = arguments[0];
75826
75827       if (numUrls === 1) {
75828         return base.href
75829       }
75830
75831       var head = document.getElementsByTagName("head")[0];
75832       head.insertBefore(base, head.firstChild);
75833
75834       var a = document.createElement("a");
75835       var resolved;
75836
75837       for (var index = 1; index < numUrls; index++) {
75838         a.href = arguments[index];
75839         resolved = a.href;
75840         base.href = resolved;
75841       }
75842
75843       head.removeChild(base);
75844
75845       return resolved
75846     }
75847
75848     return resolveUrl
75849
75850   }));
75851   });
75852
75853   var assign$1 = make_assign();
75854   var create$2 = make_create();
75855   var trim = make_trim();
75856   var Global = (typeof window !== 'undefined' ? window : commonjsGlobal);
75857
75858   var util = {
75859         assign: assign$1,
75860         create: create$2,
75861         trim: trim,
75862         bind: bind,
75863         slice: slice$7,
75864         each: each,
75865         map: map$4,
75866         pluck: pluck,
75867         isList: isList,
75868         isFunction: isFunction$1,
75869         isObject: isObject$1,
75870         Global: Global
75871   };
75872
75873   function make_assign() {
75874         if (Object.assign) {
75875                 return Object.assign
75876         } else {
75877                 return function shimAssign(obj, props1, props2, etc) {
75878                         for (var i = 1; i < arguments.length; i++) {
75879                                 each(Object(arguments[i]), function(val, key) {
75880                                         obj[key] = val;
75881                                 });
75882                         }                       
75883                         return obj
75884                 }
75885         }
75886   }
75887
75888   function make_create() {
75889         if (Object.create) {
75890                 return function create(obj, assignProps1, assignProps2, etc) {
75891                         var assignArgsList = slice$7(arguments, 1);
75892                         return assign$1.apply(this, [Object.create(obj)].concat(assignArgsList))
75893                 }
75894         } else {
75895                 function F() {} // eslint-disable-line no-inner-declarations
75896                 return function create(obj, assignProps1, assignProps2, etc) {
75897                         var assignArgsList = slice$7(arguments, 1);
75898                         F.prototype = obj;
75899                         return assign$1.apply(this, [new F()].concat(assignArgsList))
75900                 }
75901         }
75902   }
75903
75904   function make_trim() {
75905         if (String.prototype.trim) {
75906                 return function trim(str) {
75907                         return String.prototype.trim.call(str)
75908                 }
75909         } else {
75910                 return function trim(str) {
75911                         return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '')
75912                 }
75913         }
75914   }
75915
75916   function bind(obj, fn) {
75917         return function() {
75918                 return fn.apply(obj, Array.prototype.slice.call(arguments, 0))
75919         }
75920   }
75921
75922   function slice$7(arr, index) {
75923         return Array.prototype.slice.call(arr, index || 0)
75924   }
75925
75926   function each(obj, fn) {
75927         pluck(obj, function(val, key) {
75928                 fn(val, key);
75929                 return false
75930         });
75931   }
75932
75933   function map$4(obj, fn) {
75934         var res = (isList(obj) ? [] : {});
75935         pluck(obj, function(v, k) {
75936                 res[k] = fn(v, k);
75937                 return false
75938         });
75939         return res
75940   }
75941
75942   function pluck(obj, fn) {
75943         if (isList(obj)) {
75944                 for (var i=0; i<obj.length; i++) {
75945                         if (fn(obj[i], i)) {
75946                                 return obj[i]
75947                         }
75948                 }
75949         } else {
75950                 for (var key in obj) {
75951                         if (obj.hasOwnProperty(key)) {
75952                                 if (fn(obj[key], key)) {
75953                                         return obj[key]
75954                                 }
75955                         }
75956                 }
75957         }
75958   }
75959
75960   function isList(val) {
75961         return (val != null && typeof val != 'function' && typeof val.length == 'number')
75962   }
75963
75964   function isFunction$1(val) {
75965         return val && {}.toString.call(val) === '[object Function]'
75966   }
75967
75968   function isObject$1(val) {
75969         return val && {}.toString.call(val) === '[object Object]'
75970   }
75971
75972   var slice$8 = util.slice;
75973   var pluck$1 = util.pluck;
75974   var each$1 = util.each;
75975   var bind$1 = util.bind;
75976   var create$3 = util.create;
75977   var isList$1 = util.isList;
75978   var isFunction$2 = util.isFunction;
75979   var isObject$2 = util.isObject;
75980
75981   var storeEngine = {
75982         createStore: createStore
75983   };
75984
75985   var storeAPI = {
75986         version: '2.0.12',
75987         enabled: false,
75988         
75989         // get returns the value of the given key. If that value
75990         // is undefined, it returns optionalDefaultValue instead.
75991         get: function(key, optionalDefaultValue) {
75992                 var data = this.storage.read(this._namespacePrefix + key);
75993                 return this._deserialize(data, optionalDefaultValue)
75994         },
75995
75996         // set will store the given value at key and returns value.
75997         // Calling set with value === undefined is equivalent to calling remove.
75998         set: function(key, value) {
75999                 if (value === undefined) {
76000                         return this.remove(key)
76001                 }
76002                 this.storage.write(this._namespacePrefix + key, this._serialize(value));
76003                 return value
76004         },
76005
76006         // remove deletes the key and value stored at the given key.
76007         remove: function(key) {
76008                 this.storage.remove(this._namespacePrefix + key);
76009         },
76010
76011         // each will call the given callback once for each key-value pair
76012         // in this store.
76013         each: function(callback) {
76014                 var self = this;
76015                 this.storage.each(function(val, namespacedKey) {
76016                         callback.call(self, self._deserialize(val), (namespacedKey || '').replace(self._namespaceRegexp, ''));
76017                 });
76018         },
76019
76020         // clearAll will remove all the stored key-value pairs in this store.
76021         clearAll: function() {
76022                 this.storage.clearAll();
76023         },
76024
76025         // additional functionality that can't live in plugins
76026         // ---------------------------------------------------
76027
76028         // hasNamespace returns true if this store instance has the given namespace.
76029         hasNamespace: function(namespace) {
76030                 return (this._namespacePrefix == '__storejs_'+namespace+'_')
76031         },
76032
76033         // createStore creates a store.js instance with the first
76034         // functioning storage in the list of storage candidates,
76035         // and applies the the given mixins to the instance.
76036         createStore: function() {
76037                 return createStore.apply(this, arguments)
76038         },
76039         
76040         addPlugin: function(plugin) {
76041                 this._addPlugin(plugin);
76042         },
76043         
76044         namespace: function(namespace) {
76045                 return createStore(this.storage, this.plugins, namespace)
76046         }
76047   };
76048
76049   function _warn() {
76050         var _console = (typeof console == 'undefined' ? null : console);
76051         if (!_console) { return }
76052         var fn = (_console.warn ? _console.warn : _console.log);
76053         fn.apply(_console, arguments);
76054   }
76055
76056   function createStore(storages, plugins, namespace) {
76057         if (!namespace) {
76058                 namespace = '';
76059         }
76060         if (storages && !isList$1(storages)) {
76061                 storages = [storages];
76062         }
76063         if (plugins && !isList$1(plugins)) {
76064                 plugins = [plugins];
76065         }
76066
76067         var namespacePrefix = (namespace ? '__storejs_'+namespace+'_' : '');
76068         var namespaceRegexp = (namespace ? new RegExp('^'+namespacePrefix) : null);
76069         var legalNamespaces = /^[a-zA-Z0-9_\-]*$/; // alpha-numeric + underscore and dash
76070         if (!legalNamespaces.test(namespace)) {
76071                 throw new Error('store.js namespaces can only have alphanumerics + underscores and dashes')
76072         }
76073         
76074         var _privateStoreProps = {
76075                 _namespacePrefix: namespacePrefix,
76076                 _namespaceRegexp: namespaceRegexp,
76077
76078                 _testStorage: function(storage) {
76079                         try {
76080                                 var testStr = '__storejs__test__';
76081                                 storage.write(testStr, testStr);
76082                                 var ok = (storage.read(testStr) === testStr);
76083                                 storage.remove(testStr);
76084                                 return ok
76085                         } catch(e) {
76086                                 return false
76087                         }
76088                 },
76089
76090                 _assignPluginFnProp: function(pluginFnProp, propName) {
76091                         var oldFn = this[propName];
76092                         this[propName] = function pluginFn() {
76093                                 var args = slice$8(arguments, 0);
76094                                 var self = this;
76095
76096                                 // super_fn calls the old function which was overwritten by
76097                                 // this mixin.
76098                                 function super_fn() {
76099                                         if (!oldFn) { return }
76100                                         each$1(arguments, function(arg, i) {
76101                                                 args[i] = arg;
76102                                         });
76103                                         return oldFn.apply(self, args)
76104                                 }
76105
76106                                 // Give mixing function access to super_fn by prefixing all mixin function
76107                                 // arguments with super_fn.
76108                                 var newFnArgs = [super_fn].concat(args);
76109
76110                                 return pluginFnProp.apply(self, newFnArgs)
76111                         };
76112                 },
76113
76114                 _serialize: function(obj) {
76115                         return JSON.stringify(obj)
76116                 },
76117
76118                 _deserialize: function(strVal, defaultVal) {
76119                         if (!strVal) { return defaultVal }
76120                         // It is possible that a raw string value has been previously stored
76121                         // in a storage without using store.js, meaning it will be a raw
76122                         // string value instead of a JSON serialized string. By defaulting
76123                         // to the raw string value in case of a JSON parse error, we allow
76124                         // for past stored values to be forwards-compatible with store.js
76125                         var val = '';
76126                         try { val = JSON.parse(strVal); }
76127                         catch(e) { val = strVal; }
76128
76129                         return (val !== undefined ? val : defaultVal)
76130                 },
76131                 
76132                 _addStorage: function(storage) {
76133                         if (this.enabled) { return }
76134                         if (this._testStorage(storage)) {
76135                                 this.storage = storage;
76136                                 this.enabled = true;
76137                         }
76138                 },
76139
76140                 _addPlugin: function(plugin) {
76141                         var self = this;
76142
76143                         // If the plugin is an array, then add all plugins in the array.
76144                         // This allows for a plugin to depend on other plugins.
76145                         if (isList$1(plugin)) {
76146                                 each$1(plugin, function(plugin) {
76147                                         self._addPlugin(plugin);
76148                                 });
76149                                 return
76150                         }
76151
76152                         // Keep track of all plugins we've seen so far, so that we
76153                         // don't add any of them twice.
76154                         var seenPlugin = pluck$1(this.plugins, function(seenPlugin) {
76155                                 return (plugin === seenPlugin)
76156                         });
76157                         if (seenPlugin) {
76158                                 return
76159                         }
76160                         this.plugins.push(plugin);
76161
76162                         // Check that the plugin is properly formed
76163                         if (!isFunction$2(plugin)) {
76164                                 throw new Error('Plugins must be function values that return objects')
76165                         }
76166
76167                         var pluginProperties = plugin.call(this);
76168                         if (!isObject$2(pluginProperties)) {
76169                                 throw new Error('Plugins must return an object of function properties')
76170                         }
76171
76172                         // Add the plugin function properties to this store instance.
76173                         each$1(pluginProperties, function(pluginFnProp, propName) {
76174                                 if (!isFunction$2(pluginFnProp)) {
76175                                         throw new Error('Bad plugin property: '+propName+' from plugin '+plugin.name+'. Plugins should only return functions.')
76176                                 }
76177                                 self._assignPluginFnProp(pluginFnProp, propName);
76178                         });
76179                 },
76180                 
76181                 // Put deprecated properties in the private API, so as to not expose it to accidential
76182                 // discovery through inspection of the store object.
76183                 
76184                 // Deprecated: addStorage
76185                 addStorage: function(storage) {
76186                         _warn('store.addStorage(storage) is deprecated. Use createStore([storages])');
76187                         this._addStorage(storage);
76188                 }
76189         };
76190
76191         var store = create$3(_privateStoreProps, storeAPI, {
76192                 plugins: []
76193         });
76194         store.raw = {};
76195         each$1(store, function(prop, propName) {
76196                 if (isFunction$2(prop)) {
76197                         store.raw[propName] = bind$1(store, prop);                      
76198                 }
76199         });
76200         each$1(storages, function(storage) {
76201                 store._addStorage(storage);
76202         });
76203         each$1(plugins, function(plugin) {
76204                 store._addPlugin(plugin);
76205         });
76206         return store
76207   }
76208
76209   var Global$1 = util.Global;
76210
76211   var localStorage_1 = {
76212         name: 'localStorage',
76213         read: read,
76214         write: write,
76215         each: each$2,
76216         remove: remove$3,
76217         clearAll: clearAll,
76218   };
76219
76220   function localStorage$1() {
76221         return Global$1.localStorage
76222   }
76223
76224   function read(key) {
76225         return localStorage$1().getItem(key)
76226   }
76227
76228   function write(key, data) {
76229         return localStorage$1().setItem(key, data)
76230   }
76231
76232   function each$2(fn) {
76233         for (var i = localStorage$1().length - 1; i >= 0; i--) {
76234                 var key = localStorage$1().key(i);
76235                 fn(read(key), key);
76236         }
76237   }
76238
76239   function remove$3(key) {
76240         return localStorage$1().removeItem(key)
76241   }
76242
76243   function clearAll() {
76244         return localStorage$1().clear()
76245   }
76246
76247   // oldFF-globalStorage provides storage for Firefox
76248   // versions 6 and 7, where no localStorage, etc
76249   // is available.
76250
76251
76252   var Global$2 = util.Global;
76253
76254   var oldFFGlobalStorage = {
76255         name: 'oldFF-globalStorage',
76256         read: read$1,
76257         write: write$1,
76258         each: each$3,
76259         remove: remove$4,
76260         clearAll: clearAll$1,
76261   };
76262
76263   var globalStorage = Global$2.globalStorage;
76264
76265   function read$1(key) {
76266         return globalStorage[key]
76267   }
76268
76269   function write$1(key, data) {
76270         globalStorage[key] = data;
76271   }
76272
76273   function each$3(fn) {
76274         for (var i = globalStorage.length - 1; i >= 0; i--) {
76275                 var key = globalStorage.key(i);
76276                 fn(globalStorage[key], key);
76277         }
76278   }
76279
76280   function remove$4(key) {
76281         return globalStorage.removeItem(key)
76282   }
76283
76284   function clearAll$1() {
76285         each$3(function(key, _) {
76286                 delete globalStorage[key];
76287         });
76288   }
76289
76290   // oldIE-userDataStorage provides storage for Internet Explorer
76291   // versions 6 and 7, where no localStorage, sessionStorage, etc
76292   // is available.
76293
76294
76295   var Global$3 = util.Global;
76296
76297   var oldIEUserDataStorage = {
76298         name: 'oldIE-userDataStorage',
76299         write: write$2,
76300         read: read$2,
76301         each: each$4,
76302         remove: remove$5,
76303         clearAll: clearAll$2,
76304   };
76305
76306   var storageName = 'storejs';
76307   var doc = Global$3.document;
76308   var _withStorageEl = _makeIEStorageElFunction();
76309   var disable = (Global$3.navigator ? Global$3.navigator.userAgent : '').match(/ (MSIE 8|MSIE 9|MSIE 10)\./); // MSIE 9.x, MSIE 10.x
76310
76311   function write$2(unfixedKey, data) {
76312         if (disable) { return }
76313         var fixedKey = fixKey(unfixedKey);
76314         _withStorageEl(function(storageEl) {
76315                 storageEl.setAttribute(fixedKey, data);
76316                 storageEl.save(storageName);
76317         });
76318   }
76319
76320   function read$2(unfixedKey) {
76321         if (disable) { return }
76322         var fixedKey = fixKey(unfixedKey);
76323         var res = null;
76324         _withStorageEl(function(storageEl) {
76325                 res = storageEl.getAttribute(fixedKey);
76326         });
76327         return res
76328   }
76329
76330   function each$4(callback) {
76331         _withStorageEl(function(storageEl) {
76332                 var attributes = storageEl.XMLDocument.documentElement.attributes;
76333                 for (var i=attributes.length-1; i>=0; i--) {
76334                         var attr = attributes[i];
76335                         callback(storageEl.getAttribute(attr.name), attr.name);
76336                 }
76337         });
76338   }
76339
76340   function remove$5(unfixedKey) {
76341         var fixedKey = fixKey(unfixedKey);
76342         _withStorageEl(function(storageEl) {
76343                 storageEl.removeAttribute(fixedKey);
76344                 storageEl.save(storageName);
76345         });
76346   }
76347
76348   function clearAll$2() {
76349         _withStorageEl(function(storageEl) {
76350                 var attributes = storageEl.XMLDocument.documentElement.attributes;
76351                 storageEl.load(storageName);
76352                 for (var i=attributes.length-1; i>=0; i--) {
76353                         storageEl.removeAttribute(attributes[i].name);
76354                 }
76355                 storageEl.save(storageName);
76356         });
76357   }
76358
76359   // Helpers
76360   //////////
76361
76362   // In IE7, keys cannot start with a digit or contain certain chars.
76363   // See https://github.com/marcuswestin/store.js/issues/40
76364   // See https://github.com/marcuswestin/store.js/issues/83
76365   var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g");
76366   function fixKey(key) {
76367         return key.replace(/^\d/, '___$&').replace(forbiddenCharsRegex, '___')
76368   }
76369
76370   function _makeIEStorageElFunction() {
76371         if (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {
76372                 return null
76373         }
76374         var scriptTag = 'script',
76375                 storageOwner,
76376                 storageContainer,
76377                 storageEl;
76378
76379         // Since #userData storage applies only to specific paths, we need to
76380         // somehow link our data to a specific path.  We choose /favicon.ico
76381         // as a pretty safe option, since all browsers already make a request to
76382         // this URL anyway and being a 404 will not hurt us here.  We wrap an
76383         // iframe pointing to the favicon in an ActiveXObject(htmlfile) object
76384         // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)
76385         // since the iframe access rules appear to allow direct access and
76386         // manipulation of the document element, even for a 404 page.  This
76387         // document can be used instead of the current document (which would
76388         // have been limited to the current path) to perform #userData storage.
76389         try {
76390                 /* global ActiveXObject */
76391                 storageContainer = new ActiveXObject('htmlfile');
76392                 storageContainer.open();
76393                 storageContainer.write('<'+scriptTag+'>document.w=window</'+scriptTag+'><iframe src="/favicon.ico"></iframe>');
76394                 storageContainer.close();
76395                 storageOwner = storageContainer.w.frames[0].document;
76396                 storageEl = storageOwner.createElement('div');
76397         } catch(e) {
76398                 // somehow ActiveXObject instantiation failed (perhaps some special
76399                 // security settings or otherwse), fall back to per-path storage
76400                 storageEl = doc.createElement('div');
76401                 storageOwner = doc.body;
76402         }
76403
76404         return function(storeFunction) {
76405                 var args = [].slice.call(arguments, 0);
76406                 args.unshift(storageEl);
76407                 // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx
76408                 // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx
76409                 storageOwner.appendChild(storageEl);
76410                 storageEl.addBehavior('#default#userData');
76411                 storageEl.load(storageName);
76412                 storeFunction.apply(this, args);
76413                 storageOwner.removeChild(storageEl);
76414                 return
76415         }
76416   }
76417
76418   // cookieStorage is useful Safari private browser mode, where localStorage
76419   // doesn't work but cookies do. This implementation is adopted from
76420   // https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage
76421
76422
76423   var Global$4 = util.Global;
76424   var trim$1 = util.trim;
76425
76426   var cookieStorage = {
76427         name: 'cookieStorage',
76428         read: read$3,
76429         write: write$3,
76430         each: each$5,
76431         remove: remove$6,
76432         clearAll: clearAll$3,
76433   };
76434
76435   var doc$1 = Global$4.document;
76436
76437   function read$3(key) {
76438         if (!key || !_has(key)) { return null }
76439         var regexpStr = "(?:^|.*;\\s*)" +
76440                 escape(key).replace(/[\-\.\+\*]/g, "\\$&") +
76441                 "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*";
76442         return unescape(doc$1.cookie.replace(new RegExp(regexpStr), "$1"))
76443   }
76444
76445   function each$5(callback) {
76446         var cookies = doc$1.cookie.split(/; ?/g);
76447         for (var i = cookies.length - 1; i >= 0; i--) {
76448                 if (!trim$1(cookies[i])) {
76449                         continue
76450                 }
76451                 var kvp = cookies[i].split('=');
76452                 var key = unescape(kvp[0]);
76453                 var val = unescape(kvp[1]);
76454                 callback(val, key);
76455         }
76456   }
76457
76458   function write$3(key, data) {
76459         if(!key) { return }
76460         doc$1.cookie = escape(key) + "=" + escape(data) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
76461   }
76462
76463   function remove$6(key) {
76464         if (!key || !_has(key)) {
76465                 return
76466         }
76467         doc$1.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
76468   }
76469
76470   function clearAll$3() {
76471         each$5(function(_, key) {
76472                 remove$6(key);
76473         });
76474   }
76475
76476   function _has(key) {
76477         return (new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(doc$1.cookie)
76478   }
76479
76480   var Global$5 = util.Global;
76481
76482   var sessionStorage_1 = {
76483         name: 'sessionStorage',
76484         read: read$4,
76485         write: write$4,
76486         each: each$6,
76487         remove: remove$7,
76488         clearAll: clearAll$4
76489   };
76490
76491   function sessionStorage() {
76492         return Global$5.sessionStorage
76493   }
76494
76495   function read$4(key) {
76496         return sessionStorage().getItem(key)
76497   }
76498
76499   function write$4(key, data) {
76500         return sessionStorage().setItem(key, data)
76501   }
76502
76503   function each$6(fn) {
76504         for (var i = sessionStorage().length - 1; i >= 0; i--) {
76505                 var key = sessionStorage().key(i);
76506                 fn(read$4(key), key);
76507         }
76508   }
76509
76510   function remove$7(key) {
76511         return sessionStorage().removeItem(key)
76512   }
76513
76514   function clearAll$4() {
76515         return sessionStorage().clear()
76516   }
76517
76518   // memoryStorage is a useful last fallback to ensure that the store
76519   // is functions (meaning store.get(), store.set(), etc will all function).
76520   // However, stored values will not persist when the browser navigates to
76521   // a new page or reloads the current page.
76522
76523   var memoryStorage_1 = {
76524         name: 'memoryStorage',
76525         read: read$5,
76526         write: write$5,
76527         each: each$7,
76528         remove: remove$8,
76529         clearAll: clearAll$5,
76530   };
76531
76532   var memoryStorage = {};
76533
76534   function read$5(key) {
76535         return memoryStorage[key]
76536   }
76537
76538   function write$5(key, data) {
76539         memoryStorage[key] = data;
76540   }
76541
76542   function each$7(callback) {
76543         for (var key in memoryStorage) {
76544                 if (memoryStorage.hasOwnProperty(key)) {
76545                         callback(memoryStorage[key], key);
76546                 }
76547         }
76548   }
76549
76550   function remove$8(key) {
76551         delete memoryStorage[key];
76552   }
76553
76554   function clearAll$5(key) {
76555         memoryStorage = {};
76556   }
76557
76558   var all = [
76559         // Listed in order of usage preference
76560         localStorage_1,
76561         oldFFGlobalStorage,
76562         oldIEUserDataStorage,
76563         cookieStorage,
76564         sessionStorage_1,
76565         memoryStorage_1
76566   ];
76567
76568   /* eslint-disable */
76569
76570   //  json2.js
76571   //  2016-10-28
76572   //  Public Domain.
76573   //  NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
76574   //  See http://www.JSON.org/js.html
76575   //  This code should be minified before deployment.
76576   //  See http://javascript.crockford.com/jsmin.html
76577
76578   //  USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
76579   //  NOT CONTROL.
76580
76581   //  This file creates a global JSON object containing two methods: stringify
76582   //  and parse. This file provides the ES5 JSON capability to ES3 systems.
76583   //  If a project might run on IE8 or earlier, then this file should be included.
76584   //  This file does nothing on ES5 systems.
76585
76586   //      JSON.stringify(value, replacer, space)
76587   //          value       any JavaScript value, usually an object or array.
76588   //          replacer    an optional parameter that determines how object
76589   //                      values are stringified for objects. It can be a
76590   //                      function or an array of strings.
76591   //          space       an optional parameter that specifies the indentation
76592   //                      of nested structures. If it is omitted, the text will
76593   //                      be packed without extra whitespace. If it is a number,
76594   //                      it will specify the number of spaces to indent at each
76595   //                      level. If it is a string (such as "\t" or "&nbsp;"),
76596   //                      it contains the characters used to indent at each level.
76597   //          This method produces a JSON text from a JavaScript value.
76598   //          When an object value is found, if the object contains a toJSON
76599   //          method, its toJSON method will be called and the result will be
76600   //          stringified. A toJSON method does not serialize: it returns the
76601   //          value represented by the name/value pair that should be serialized,
76602   //          or undefined if nothing should be serialized. The toJSON method
76603   //          will be passed the key associated with the value, and this will be
76604   //          bound to the value.
76605
76606   //          For example, this would serialize Dates as ISO strings.
76607
76608   //              Date.prototype.toJSON = function (key) {
76609   //                  function f(n) {
76610   //                      // Format integers to have at least two digits.
76611   //                      return (n < 10)
76612   //                          ? "0" + n
76613   //                          : n;
76614   //                  }
76615   //                  return this.getUTCFullYear()   + "-" +
76616   //                       f(this.getUTCMonth() + 1) + "-" +
76617   //                       f(this.getUTCDate())      + "T" +
76618   //                       f(this.getUTCHours())     + ":" +
76619   //                       f(this.getUTCMinutes())   + ":" +
76620   //                       f(this.getUTCSeconds())   + "Z";
76621   //              };
76622
76623   //          You can provide an optional replacer method. It will be passed the
76624   //          key and value of each member, with this bound to the containing
76625   //          object. The value that is returned from your method will be
76626   //          serialized. If your method returns undefined, then the member will
76627   //          be excluded from the serialization.
76628
76629   //          If the replacer parameter is an array of strings, then it will be
76630   //          used to select the members to be serialized. It filters the results
76631   //          such that only members with keys listed in the replacer array are
76632   //          stringified.
76633
76634   //          Values that do not have JSON representations, such as undefined or
76635   //          functions, will not be serialized. Such values in objects will be
76636   //          dropped; in arrays they will be replaced with null. You can use
76637   //          a replacer function to replace those with JSON values.
76638
76639   //          JSON.stringify(undefined) returns undefined.
76640
76641   //          The optional space parameter produces a stringification of the
76642   //          value that is filled with line breaks and indentation to make it
76643   //          easier to read.
76644
76645   //          If the space parameter is a non-empty string, then that string will
76646   //          be used for indentation. If the space parameter is a number, then
76647   //          the indentation will be that many spaces.
76648
76649   //          Example:
76650
76651   //          text = JSON.stringify(["e", {pluribus: "unum"}]);
76652   //          // text is '["e",{"pluribus":"unum"}]'
76653
76654   //          text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
76655   //          // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
76656
76657   //          text = JSON.stringify([new Date()], function (key, value) {
76658   //              return this[key] instanceof Date
76659   //                  ? "Date(" + this[key] + ")"
76660   //                  : value;
76661   //          });
76662   //          // text is '["Date(---current time---)"]'
76663
76664   //      JSON.parse(text, reviver)
76665   //          This method parses a JSON text to produce an object or array.
76666   //          It can throw a SyntaxError exception.
76667
76668   //          The optional reviver parameter is a function that can filter and
76669   //          transform the results. It receives each of the keys and values,
76670   //          and its return value is used instead of the original value.
76671   //          If it returns what it received, then the structure is not modified.
76672   //          If it returns undefined then the member is deleted.
76673
76674   //          Example:
76675
76676   //          // Parse the text. Values that look like ISO date strings will
76677   //          // be converted to Date objects.
76678
76679   //          myData = JSON.parse(text, function (key, value) {
76680   //              var a;
76681   //              if (typeof value === "string") {
76682   //                  a =
76683   //   /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
76684   //                  if (a) {
76685   //                      return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
76686   //                          +a[5], +a[6]));
76687   //                  }
76688   //              }
76689   //              return value;
76690   //          });
76691
76692   //          myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
76693   //              var d;
76694   //              if (typeof value === "string" &&
76695   //                      value.slice(0, 5) === "Date(" &&
76696   //                      value.slice(-1) === ")") {
76697   //                  d = new Date(value.slice(5, -1));
76698   //                  if (d) {
76699   //                      return d;
76700   //                  }
76701   //              }
76702   //              return value;
76703   //          });
76704
76705   //  This is a reference implementation. You are free to copy, modify, or
76706   //  redistribute.
76707
76708   /*jslint
76709       eval, for, this
76710   */
76711
76712   /*property
76713       JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
76714       getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
76715       lastIndex, length, parse, prototype, push, replace, slice, stringify,
76716       test, toJSON, toString, valueOf
76717   */
76718
76719
76720   // Create a JSON object only if one does not already exist. We create the
76721   // methods in a closure to avoid creating global variables.
76722
76723   if (typeof JSON !== "object") {
76724       JSON = {};
76725   }
76726
76727   (function () {
76728
76729       var rx_one = /^[\],:{}\s]*$/;
76730       var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
76731       var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
76732       var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
76733       var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
76734       var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
76735
76736       function f(n) {
76737           // Format integers to have at least two digits.
76738           return n < 10
76739               ? "0" + n
76740               : n;
76741       }
76742
76743       function this_value() {
76744           return this.valueOf();
76745       }
76746
76747       if (typeof Date.prototype.toJSON !== "function") {
76748
76749           Date.prototype.toJSON = function () {
76750
76751               return isFinite(this.valueOf())
76752                   ? this.getUTCFullYear() + "-" +
76753                           f(this.getUTCMonth() + 1) + "-" +
76754                           f(this.getUTCDate()) + "T" +
76755                           f(this.getUTCHours()) + ":" +
76756                           f(this.getUTCMinutes()) + ":" +
76757                           f(this.getUTCSeconds()) + "Z"
76758                   : null;
76759           };
76760
76761           Boolean.prototype.toJSON = this_value;
76762           Number.prototype.toJSON = this_value;
76763           String.prototype.toJSON = this_value;
76764       }
76765
76766       var gap;
76767       var indent;
76768       var meta;
76769       var rep;
76770
76771
76772       function quote(string) {
76773
76774   // If the string contains no control characters, no quote characters, and no
76775   // backslash characters, then we can safely slap some quotes around it.
76776   // Otherwise we must also replace the offending characters with safe escape
76777   // sequences.
76778
76779           rx_escapable.lastIndex = 0;
76780           return rx_escapable.test(string)
76781               ? "\"" + string.replace(rx_escapable, function (a) {
76782                   var c = meta[a];
76783                   return typeof c === "string"
76784                       ? c
76785                       : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
76786               }) + "\""
76787               : "\"" + string + "\"";
76788       }
76789
76790
76791       function str(key, holder) {
76792
76793   // Produce a string from holder[key].
76794
76795           var i;          // The loop counter.
76796           var k;          // The member key.
76797           var v;          // The member value.
76798           var length;
76799           var mind = gap;
76800           var partial;
76801           var value = holder[key];
76802
76803   // If the value has a toJSON method, call it to obtain a replacement value.
76804
76805           if (value && typeof value === "object" &&
76806                   typeof value.toJSON === "function") {
76807               value = value.toJSON(key);
76808           }
76809
76810   // If we were called with a replacer function, then call the replacer to
76811   // obtain a replacement value.
76812
76813           if (typeof rep === "function") {
76814               value = rep.call(holder, key, value);
76815           }
76816
76817   // What happens next depends on the value's type.
76818
76819           switch (typeof value) {
76820           case "string":
76821               return quote(value);
76822
76823           case "number":
76824
76825   // JSON numbers must be finite. Encode non-finite numbers as null.
76826
76827               return isFinite(value)
76828                   ? String(value)
76829                   : "null";
76830
76831           case "boolean":
76832           case "null":
76833
76834   // If the value is a boolean or null, convert it to a string. Note:
76835   // typeof null does not produce "null". The case is included here in
76836   // the remote chance that this gets fixed someday.
76837
76838               return String(value);
76839
76840   // If the type is "object", we might be dealing with an object or an array or
76841   // null.
76842
76843           case "object":
76844
76845   // Due to a specification blunder in ECMAScript, typeof null is "object",
76846   // so watch out for that case.
76847
76848               if (!value) {
76849                   return "null";
76850               }
76851
76852   // Make an array to hold the partial results of stringifying this object value.
76853
76854               gap += indent;
76855               partial = [];
76856
76857   // Is the value an array?
76858
76859               if (Object.prototype.toString.apply(value) === "[object Array]") {
76860
76861   // The value is an array. Stringify every element. Use null as a placeholder
76862   // for non-JSON values.
76863
76864                   length = value.length;
76865                   for (i = 0; i < length; i += 1) {
76866                       partial[i] = str(i, value) || "null";
76867                   }
76868
76869   // Join all of the elements together, separated with commas, and wrap them in
76870   // brackets.
76871
76872                   v = partial.length === 0
76873                       ? "[]"
76874                       : gap
76875                           ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]"
76876                           : "[" + partial.join(",") + "]";
76877                   gap = mind;
76878                   return v;
76879               }
76880
76881   // If the replacer is an array, use it to select the members to be stringified.
76882
76883               if (rep && typeof rep === "object") {
76884                   length = rep.length;
76885                   for (i = 0; i < length; i += 1) {
76886                       if (typeof rep[i] === "string") {
76887                           k = rep[i];
76888                           v = str(k, value);
76889                           if (v) {
76890                               partial.push(quote(k) + (
76891                                   gap
76892                                       ? ": "
76893                                       : ":"
76894                               ) + v);
76895                           }
76896                       }
76897                   }
76898               } else {
76899
76900   // Otherwise, iterate through all of the keys in the object.
76901
76902                   for (k in value) {
76903                       if (Object.prototype.hasOwnProperty.call(value, k)) {
76904                           v = str(k, value);
76905                           if (v) {
76906                               partial.push(quote(k) + (
76907                                   gap
76908                                       ? ": "
76909                                       : ":"
76910                               ) + v);
76911                           }
76912                       }
76913                   }
76914               }
76915
76916   // Join all of the member texts together, separated with commas,
76917   // and wrap them in braces.
76918
76919               v = partial.length === 0
76920                   ? "{}"
76921                   : gap
76922                       ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
76923                       : "{" + partial.join(",") + "}";
76924               gap = mind;
76925               return v;
76926           }
76927       }
76928
76929   // If the JSON object does not yet have a stringify method, give it one.
76930
76931       if (typeof JSON.stringify !== "function") {
76932           meta = {    // table of character substitutions
76933               "\b": "\\b",
76934               "\t": "\\t",
76935               "\n": "\\n",
76936               "\f": "\\f",
76937               "\r": "\\r",
76938               "\"": "\\\"",
76939               "\\": "\\\\"
76940           };
76941           JSON.stringify = function (value, replacer, space) {
76942
76943   // The stringify method takes a value and an optional replacer, and an optional
76944   // space parameter, and returns a JSON text. The replacer can be a function
76945   // that can replace values, or an array of strings that will select the keys.
76946   // A default replacer method can be provided. Use of the space parameter can
76947   // produce text that is more easily readable.
76948
76949               var i;
76950               gap = "";
76951               indent = "";
76952
76953   // If the space parameter is a number, make an indent string containing that
76954   // many spaces.
76955
76956               if (typeof space === "number") {
76957                   for (i = 0; i < space; i += 1) {
76958                       indent += " ";
76959                   }
76960
76961   // If the space parameter is a string, it will be used as the indent string.
76962
76963               } else if (typeof space === "string") {
76964                   indent = space;
76965               }
76966
76967   // If there is a replacer, it must be a function or an array.
76968   // Otherwise, throw an error.
76969
76970               rep = replacer;
76971               if (replacer && typeof replacer !== "function" &&
76972                       (typeof replacer !== "object" ||
76973                       typeof replacer.length !== "number")) {
76974                   throw new Error("JSON.stringify");
76975               }
76976
76977   // Make a fake root object containing our value under the key of "".
76978   // Return the result of stringifying the value.
76979
76980               return str("", {"": value});
76981           };
76982       }
76983
76984
76985   // If the JSON object does not yet have a parse method, give it one.
76986
76987       if (typeof JSON.parse !== "function") {
76988           JSON.parse = function (text, reviver) {
76989
76990   // The parse method takes a text and an optional reviver function, and returns
76991   // a JavaScript value if the text is a valid JSON text.
76992
76993               var j;
76994
76995               function walk(holder, key) {
76996
76997   // The walk method is used to recursively walk the resulting structure so
76998   // that modifications can be made.
76999
77000                   var k;
77001                   var v;
77002                   var value = holder[key];
77003                   if (value && typeof value === "object") {
77004                       for (k in value) {
77005                           if (Object.prototype.hasOwnProperty.call(value, k)) {
77006                               v = walk(value, k);
77007                               if (v !== undefined) {
77008                                   value[k] = v;
77009                               } else {
77010                                   delete value[k];
77011                               }
77012                           }
77013                       }
77014                   }
77015                   return reviver.call(holder, key, value);
77016               }
77017
77018
77019   // Parsing happens in four stages. In the first stage, we replace certain
77020   // Unicode characters with escape sequences. JavaScript handles many characters
77021   // incorrectly, either silently deleting them, or treating them as line endings.
77022
77023               text = String(text);
77024               rx_dangerous.lastIndex = 0;
77025               if (rx_dangerous.test(text)) {
77026                   text = text.replace(rx_dangerous, function (a) {
77027                       return "\\u" +
77028                               ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
77029                   });
77030               }
77031
77032   // In the second stage, we run the text against regular expressions that look
77033   // for non-JSON patterns. We are especially concerned with "()" and "new"
77034   // because they can cause invocation, and "=" because it can cause mutation.
77035   // But just to be safe, we want to reject all unexpected forms.
77036
77037   // We split the second stage into 4 regexp operations in order to work around
77038   // crippling inefficiencies in IE's and Safari's regexp engines. First we
77039   // replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
77040   // replace all simple value tokens with "]" characters. Third, we delete all
77041   // open brackets that follow a colon or comma or that begin the text. Finally,
77042   // we look to see that the remaining characters are only whitespace or "]" or
77043   // "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
77044
77045               if (
77046                   rx_one.test(
77047                       text
77048                           .replace(rx_two, "@")
77049                           .replace(rx_three, "]")
77050                           .replace(rx_four, "")
77051                   )
77052               ) {
77053
77054   // In the third stage we use the eval function to compile the text into a
77055   // JavaScript structure. The "{" operator is subject to a syntactic ambiguity
77056   // in JavaScript: it can begin a block or an object literal. We wrap the text
77057   // in parens to eliminate the ambiguity.
77058
77059                   j = eval("(" + text + ")");
77060
77061   // In the optional fourth stage, we recursively walk the new structure, passing
77062   // each name/value pair to a reviver function for possible transformation.
77063
77064                   return (typeof reviver === "function")
77065                       ? walk({"": j}, "")
77066                       : j;
77067               }
77068
77069   // If the text is not JSON parseable, then a SyntaxError is thrown.
77070
77071               throw new SyntaxError("JSON.parse");
77072           };
77073       }
77074   }());
77075
77076   var json2 = json2Plugin;
77077
77078   function json2Plugin() {
77079         
77080         return {}
77081   }
77082
77083   var plugins = [json2];
77084
77085   var store_legacy = storeEngine.createStore(all, plugins);
77086
77087   // # osm-auth
77088   //
77089   // This code is only compatible with IE10+ because the [XDomainRequest](http://bit.ly/LfO7xo)
77090   // object, IE<10's idea of [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing),
77091   // does not support custom headers, which this uses everywhere.
77092   var osmAuth = function(o) {
77093
77094       var oauth = {};
77095
77096       // authenticated users will also have a request token secret, but it's
77097       // not used in transactions with the server
77098       oauth.authenticated = function() {
77099           return !!(token('oauth_token') && token('oauth_token_secret'));
77100       };
77101
77102       oauth.logout = function() {
77103           token('oauth_token', '');
77104           token('oauth_token_secret', '');
77105           token('oauth_request_token_secret', '');
77106           return oauth;
77107       };
77108
77109       // TODO: detect lack of click event
77110       oauth.authenticate = function(callback) {
77111           if (oauth.authenticated()) return callback();
77112
77113           oauth.logout();
77114
77115           // ## Getting a request token
77116           var params = timenonce(getAuth(o)),
77117               url = o.url + '/oauth/request_token';
77118
77119           params.oauth_signature = ohauth_1.signature(
77120               o.oauth_secret, '',
77121               ohauth_1.baseString('POST', url, params));
77122
77123           if (!o.singlepage) {
77124               // Create a 600x550 popup window in the center of the screen
77125               var w = 600, h = 550,
77126                   settings = [
77127                       ['width', w], ['height', h],
77128                       ['left', screen.width / 2 - w / 2],
77129                       ['top', screen.height / 2 - h / 2]].map(function(x) {
77130                           return x.join('=');
77131                       }).join(','),
77132                   popup = window.open('about:blank', 'oauth_window', settings);
77133           }
77134
77135           // Request a request token. When this is complete, the popup
77136           // window is redirected to OSM's authorization page.
77137           ohauth_1.xhr('POST', url, params, null, {}, reqTokenDone);
77138           o.loading();
77139
77140           function reqTokenDone(err, xhr) {
77141               o.done();
77142               if (err) return callback(err);
77143               var resp = ohauth_1.stringQs(xhr.response);
77144               token('oauth_request_token_secret', resp.oauth_token_secret);
77145               var authorize_url = o.url + '/oauth/authorize?' + ohauth_1.qsString({
77146                   oauth_token: resp.oauth_token,
77147                   oauth_callback: resolveUrl(o.landing)
77148               });
77149
77150               if (o.singlepage) {
77151                   location.href = authorize_url;
77152               } else {
77153                   popup.location = authorize_url;
77154               }
77155           }
77156
77157           // Called by a function in a landing page, in the popup window. The
77158           // window closes itself.
77159           window.authComplete = function(token) {
77160               var oauth_token = ohauth_1.stringQs(token.split('?')[1]);
77161               get_access_token(oauth_token.oauth_token);
77162               delete window.authComplete;
77163           };
77164
77165           // ## Getting an request token
77166           //
77167           // At this point we have an `oauth_token`, brought in from a function
77168           // call on a landing page popup.
77169           function get_access_token(oauth_token) {
77170               var url = o.url + '/oauth/access_token',
77171                   params = timenonce(getAuth(o)),
77172                   request_token_secret = token('oauth_request_token_secret');
77173               params.oauth_token = oauth_token;
77174               params.oauth_signature = ohauth_1.signature(
77175                   o.oauth_secret,
77176                   request_token_secret,
77177                   ohauth_1.baseString('POST', url, params));
77178
77179               // ## Getting an access token
77180               //
77181               // The final token required for authentication. At this point
77182               // we have a `request token secret`
77183               ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
77184               o.loading();
77185           }
77186
77187           function accessTokenDone(err, xhr) {
77188               o.done();
77189               if (err) return callback(err);
77190               var access_token = ohauth_1.stringQs(xhr.response);
77191               token('oauth_token', access_token.oauth_token);
77192               token('oauth_token_secret', access_token.oauth_token_secret);
77193               callback(null, oauth);
77194           }
77195       };
77196
77197       oauth.bootstrapToken = function(oauth_token, callback) {
77198           // ## Getting an request token
77199           // At this point we have an `oauth_token`, brought in from a function
77200           // call on a landing page popup.
77201           function get_access_token(oauth_token) {
77202               var url = o.url + '/oauth/access_token',
77203                   params = timenonce(getAuth(o)),
77204                   request_token_secret = token('oauth_request_token_secret');
77205               params.oauth_token = oauth_token;
77206               params.oauth_signature = ohauth_1.signature(
77207                   o.oauth_secret,
77208                   request_token_secret,
77209                   ohauth_1.baseString('POST', url, params));
77210
77211               // ## Getting an access token
77212               // The final token required for authentication. At this point
77213               // we have a `request token secret`
77214               ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
77215               o.loading();
77216           }
77217
77218           function accessTokenDone(err, xhr) {
77219               o.done();
77220               if (err) return callback(err);
77221               var access_token = ohauth_1.stringQs(xhr.response);
77222               token('oauth_token', access_token.oauth_token);
77223               token('oauth_token_secret', access_token.oauth_token_secret);
77224               callback(null, oauth);
77225           }
77226
77227           get_access_token(oauth_token);
77228       };
77229
77230       // # xhr
77231       //
77232       // A single XMLHttpRequest wrapper that does authenticated calls if the
77233       // user has logged in.
77234       oauth.xhr = function(options, callback) {
77235           if (!oauth.authenticated()) {
77236               if (o.auto) {
77237                   return oauth.authenticate(run);
77238               } else {
77239                   callback('not authenticated', null);
77240                   return;
77241               }
77242           } else {
77243               return run();
77244           }
77245
77246           function run() {
77247               var params = timenonce(getAuth(o)),
77248                   oauth_token_secret = token('oauth_token_secret'),
77249                   url = (options.prefix !== false) ? o.url + options.path : options.path,
77250                   url_parts = url.replace(/#.*$/, '').split('?', 2),
77251                   base_url = url_parts[0],
77252                   query = (url_parts.length === 2) ? url_parts[1] : '';
77253
77254               // https://tools.ietf.org/html/rfc5849#section-3.4.1.3.1
77255               if ((!options.options || !options.options.header ||
77256                   options.options.header['Content-Type'] === 'application/x-www-form-urlencoded') &&
77257                   options.content) {
77258                   params = immutable(params, ohauth_1.stringQs(options.content));
77259               }
77260
77261               params.oauth_token = token('oauth_token');
77262               params.oauth_signature = ohauth_1.signature(
77263                   o.oauth_secret,
77264                   oauth_token_secret,
77265                   ohauth_1.baseString(options.method, base_url, immutable(params, ohauth_1.stringQs(query)))
77266               );
77267
77268               return ohauth_1.xhr(options.method, url, params, options.content, options.options, done);
77269           }
77270
77271           function done(err, xhr) {
77272               if (err) return callback(err);
77273               else if (xhr.responseXML) return callback(err, xhr.responseXML);
77274               else return callback(err, xhr.response);
77275           }
77276       };
77277
77278       // pre-authorize this object, if we can just get a token and token_secret
77279       // from the start
77280       oauth.preauth = function(c) {
77281           if (!c) return;
77282           if (c.oauth_token) token('oauth_token', c.oauth_token);
77283           if (c.oauth_token_secret) token('oauth_token_secret', c.oauth_token_secret);
77284           return oauth;
77285       };
77286
77287       oauth.options = function(_) {
77288           if (!arguments.length) return o;
77289
77290           o = _;
77291           o.url = o.url || 'https://www.openstreetmap.org';
77292           o.landing = o.landing || 'land.html';
77293           o.singlepage = o.singlepage || false;
77294
77295           // Optional loading and loading-done functions for nice UI feedback.
77296           // by default, no-ops
77297           o.loading = o.loading || function() {};
77298           o.done = o.done || function() {};
77299
77300           return oauth.preauth(o);
77301       };
77302
77303       // 'stamp' an authentication object from `getAuth()`
77304       // with a [nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)
77305       // and timestamp
77306       function timenonce(o) {
77307           o.oauth_timestamp = ohauth_1.timestamp();
77308           o.oauth_nonce = ohauth_1.nonce();
77309           return o;
77310       }
77311
77312       // get/set tokens. These are prefixed with the base URL so that `osm-auth`
77313       // can be used with multiple APIs and the keys in `localStorage`
77314       // will not clash
77315       var token;
77316
77317       if (store_legacy.enabled) {
77318           token = function (x, y) {
77319               if (arguments.length === 1) return store_legacy.get(o.url + x);
77320               else if (arguments.length === 2) return store_legacy.set(o.url + x, y);
77321           };
77322       } else {
77323           var storage = {};
77324           token = function (x, y) {
77325               if (arguments.length === 1) return storage[o.url + x];
77326               else if (arguments.length === 2) return storage[o.url + x] = y;
77327           };
77328       }
77329
77330       // Get an authentication object. If you just add and remove properties
77331       // from a single object, you'll need to use `delete` to make sure that
77332       // it doesn't contain undesired properties for authentication
77333       function getAuth(o) {
77334           return {
77335               oauth_consumer_key: o.oauth_consumer_key,
77336               oauth_signature_method: 'HMAC-SHA1'
77337           };
77338       }
77339
77340       // potentially pre-authorize
77341       oauth.options(o);
77342
77343       return oauth;
77344   };
77345
77346   var tiler$3 = utilTiler();
77347   var dispatch$4 = dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded', 'loadedNotes');
77348   var urlroot = 'https://www.openstreetmap.org';
77349   var oauth = osmAuth({
77350       url: urlroot,
77351       oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT',
77352       oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL',
77353       loading: authLoading,
77354       done: authDone
77355   });
77356
77357   var _blacklists = ['.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*'];
77358   var _tileCache = { loaded: {}, inflight: {}, seen: {} };
77359   var _noteCache = { loaded: {}, inflight: {}, inflightPost: {}, note: {}, closed: {}, rtree: rbush_1() };
77360   var _userCache = { toLoad: {}, user: {} };
77361   var _changeset$1 = {};
77362
77363   var _connectionID = 1;
77364   var _tileZoom = 16;
77365   var _noteZoom = 12;
77366   var _rateLimitError;
77367   var _userChangesets;
77368   var _userDetails;
77369   var _off;
77370
77371
77372   function authLoading() {
77373       dispatch$4.call('authLoading');
77374   }
77375
77376
77377   function authDone() {
77378       dispatch$4.call('authDone');
77379   }
77380
77381
77382   function abortRequest$3(i) {
77383       if (i) {
77384           i.abort();
77385       }
77386   }
77387
77388
77389   function abortUnwantedRequests$1(cache, tiles) {
77390       forEach(cache.inflight, function(v, k) {
77391           var wanted = find$1(tiles, function(tile) { return k === tile.id; });
77392           if (!wanted) {
77393               abortRequest$3(v);
77394               delete cache.inflight[k];
77395           }
77396       });
77397   }
77398
77399
77400   function getLoc(attrs) {
77401       var lon = attrs.lon && attrs.lon.value;
77402       var lat = attrs.lat && attrs.lat.value;
77403       return [parseFloat(lon), parseFloat(lat)];
77404   }
77405
77406
77407   function getNodes(obj) {
77408       var elems = obj.getElementsByTagName('nd');
77409       var nodes = new Array(elems.length);
77410       for (var i = 0, l = elems.length; i < l; i++) {
77411           nodes[i] = 'n' + elems[i].attributes.ref.value;
77412       }
77413       return nodes;
77414   }
77415
77416
77417   function getTags(obj) {
77418       var elems = obj.getElementsByTagName('tag');
77419       var tags = {};
77420       for (var i = 0, l = elems.length; i < l; i++) {
77421           var attrs = elems[i].attributes;
77422           tags[attrs.k.value] = attrs.v.value;
77423       }
77424
77425       return tags;
77426   }
77427
77428
77429   function getMembers(obj) {
77430       var elems = obj.getElementsByTagName('member');
77431       var members = new Array(elems.length);
77432       for (var i = 0, l = elems.length; i < l; i++) {
77433           var attrs = elems[i].attributes;
77434           members[i] = {
77435               id: attrs.type.value[0] + attrs.ref.value,
77436               type: attrs.type.value,
77437               role: attrs.role.value
77438           };
77439       }
77440       return members;
77441   }
77442
77443
77444   function getVisible(attrs) {
77445       return (!attrs.visible || attrs.visible.value !== 'false');
77446   }
77447
77448
77449   function parseComments(comments) {
77450       var parsedComments = [];
77451
77452       // for each comment
77453       for (var i = 0; i < comments.length; i++) {
77454           var comment = comments[i];
77455           if (comment.nodeName === 'comment') {
77456               var childNodes = comment.childNodes;
77457               var parsedComment = {};
77458
77459               for (var j = 0; j < childNodes.length; j++) {
77460                   var node = childNodes[j];
77461                   var nodeName = node.nodeName;
77462                   if (nodeName === '#text') continue;
77463                   parsedComment[nodeName] = node.textContent;
77464
77465                   if (nodeName === 'uid') {
77466                       var uid = node.textContent;
77467                       if (uid && !_userCache.user[uid]) {
77468                           _userCache.toLoad[uid] = true;
77469                       }
77470                   }
77471               }
77472
77473               if (parsedComment) {
77474                   parsedComments.push(parsedComment);
77475               }
77476           }
77477       }
77478       return parsedComments;
77479   }
77480
77481
77482   function encodeNoteRtree(note) {
77483       return {
77484           minX: note.loc[0],
77485           minY: note.loc[1],
77486           maxX: note.loc[0],
77487           maxY: note.loc[1],
77488           data: note
77489       };
77490   }
77491
77492
77493   var parsers = {
77494       node: function nodeData(obj, uid) {
77495           var attrs = obj.attributes;
77496           return new osmNode({
77497               id: uid,
77498               visible: getVisible(attrs),
77499               version: attrs.version.value,
77500               changeset: attrs.changeset && attrs.changeset.value,
77501               timestamp: attrs.timestamp && attrs.timestamp.value,
77502               user: attrs.user && attrs.user.value,
77503               uid: attrs.uid && attrs.uid.value,
77504               loc: getLoc(attrs),
77505               tags: getTags(obj)
77506           });
77507       },
77508
77509       way: function wayData(obj, uid) {
77510           var attrs = obj.attributes;
77511           return new osmWay({
77512               id: uid,
77513               visible: getVisible(attrs),
77514               version: attrs.version.value,
77515               changeset: attrs.changeset && attrs.changeset.value,
77516               timestamp: attrs.timestamp && attrs.timestamp.value,
77517               user: attrs.user && attrs.user.value,
77518               uid: attrs.uid && attrs.uid.value,
77519               tags: getTags(obj),
77520               nodes: getNodes(obj),
77521           });
77522       },
77523
77524       relation: function relationData(obj, uid) {
77525           var attrs = obj.attributes;
77526           return new osmRelation({
77527               id: uid,
77528               visible: getVisible(attrs),
77529               version: attrs.version.value,
77530               changeset: attrs.changeset && attrs.changeset.value,
77531               timestamp: attrs.timestamp && attrs.timestamp.value,
77532               user: attrs.user && attrs.user.value,
77533               uid: attrs.uid && attrs.uid.value,
77534               tags: getTags(obj),
77535               members: getMembers(obj)
77536           });
77537       },
77538
77539       note: function parseNote(obj, uid) {
77540           var attrs = obj.attributes;
77541           var childNodes = obj.childNodes;
77542           var props = {};
77543
77544           props.id = uid;
77545           props.loc = getLoc(attrs);
77546
77547           // if notes are coincident, move them apart slightly
77548           var coincident = false;
77549           var epsilon = 0.00001;
77550           do {
77551               if (coincident) {
77552                   props.loc = geoVecAdd(props.loc, [epsilon, epsilon]);
77553               }
77554               var bbox = geoExtent$$1(props.loc).bbox();
77555               coincident = _noteCache.rtree.search(bbox).length;
77556           } while (coincident);
77557
77558           // parse note contents
77559           for (var i = 0; i < childNodes.length; i++) {
77560               var node = childNodes[i];
77561               var nodeName = node.nodeName;
77562               if (nodeName === '#text') continue;
77563
77564               // if the element is comments, parse the comments
77565               if (nodeName === 'comments') {
77566                   props[nodeName] = parseComments(node.childNodes);
77567               } else {
77568                   props[nodeName] = node.textContent;
77569               }
77570           }
77571
77572           var note = new osmNote(props);
77573           var item = encodeNoteRtree(note);
77574           _noteCache.note[note.id] = note;
77575           _noteCache.rtree.insert(item);
77576
77577           return note;
77578       },
77579
77580       user: function parseUser(obj, uid) {
77581           var attrs = obj.attributes;
77582           var user = {
77583               id: uid,
77584               display_name: attrs.display_name && attrs.display_name.value,
77585               account_created: attrs.account_created && attrs.account_created.value,
77586               changesets_count: 0
77587           };
77588
77589           var img = obj.getElementsByTagName('img');
77590           if (img && img[0] && img[0].getAttribute('href')) {
77591               user.image_url = img[0].getAttribute('href');
77592           }
77593
77594           var changesets = obj.getElementsByTagName('changesets');
77595           if (changesets && changesets[0] && changesets[0].getAttribute('count')) {
77596               user.changesets_count = changesets[0].getAttribute('count');
77597           }
77598
77599           _userCache.user[uid] = user;
77600           delete _userCache.toLoad[uid];
77601           return user;
77602       }
77603   };
77604
77605
77606   function parseXML(xml$$1, callback, options) {
77607       options = assignIn({ skipSeen: true }, options);
77608       if (!xml$$1 || !xml$$1.childNodes) {
77609           return callback({ message: 'No XML', status: -1 });
77610       }
77611
77612       var root = xml$$1.childNodes[0];
77613       var children = root.childNodes;
77614       utilIdleWorker(children, parseChild, done);
77615
77616
77617       function done(results) {
77618           callback(null, results);
77619       }
77620
77621       function parseChild(child) {
77622           var parser = parsers[child.nodeName];
77623           if (!parser) return null;
77624
77625           var uid;
77626           if (child.nodeName === 'user') {
77627               uid = child.attributes.id.value;
77628               if (options.skipSeen && _userCache.user[uid]) {
77629                   delete _userCache.toLoad[uid];
77630                   return null;
77631               }
77632
77633           } else if (child.nodeName === 'note') {
77634               uid = child.getElementsByTagName('id')[0].textContent;
77635
77636           } else {
77637               uid = osmEntity$$1.id.fromOSM(child.nodeName, child.attributes.id.value);
77638               if (options.skipSeen) {
77639                   if (_tileCache.seen[uid]) return null;  // avoid reparsing a "seen" entity
77640                   _tileCache.seen[uid] = true;
77641               }
77642           }
77643
77644           return parser(child, uid);
77645       }
77646   }
77647
77648
77649   // replace or remove note from rtree
77650   function updateRtree$1(item, replace) {
77651       _noteCache.rtree.remove(item, function isEql(a, b) { return a.data.id === b.data.id; });
77652
77653       if (replace) {
77654           _noteCache.rtree.insert(item);
77655       }
77656   }
77657
77658
77659   function wrapcb(thisArg, callback, cid) {
77660       return function(err, result) {
77661           if (err) {
77662               // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
77663               if (err.status === 400 || err.status === 401 || err.status === 403) {
77664                   thisArg.logout();
77665               }
77666               return callback.call(thisArg, err);
77667
77668           } else if (thisArg.getConnectionId() !== cid) {
77669               return callback.call(thisArg, { message: 'Connection Switched', status: -1 });
77670
77671           } else {
77672               return callback.call(thisArg, err, result);
77673           }
77674       };
77675   }
77676
77677
77678   var serviceOsm = {
77679
77680       init: function() {
77681           utilRebind(this, dispatch$4, 'on');
77682       },
77683
77684
77685       reset: function() {
77686           _connectionID++;
77687           _userChangesets = undefined;
77688           _userDetails = undefined;
77689           _rateLimitError = undefined;
77690
77691           forEach(_tileCache.inflight, abortRequest$3);
77692           forEach(_noteCache.inflight, abortRequest$3);
77693           forEach(_noteCache.inflightPost, abortRequest$3);
77694           if (_changeset$1.inflight) abortRequest$3(_changeset$1.inflight);
77695
77696           _tileCache = { loaded: {}, inflight: {}, seen: {} };
77697           _noteCache = { loaded: {}, inflight: {}, inflightPost: {}, note: {}, closed: {}, rtree: rbush_1() };
77698           _userCache = { toLoad: {}, user: {} };
77699           _changeset$1 = {};
77700
77701           return this;
77702       },
77703
77704
77705       getConnectionId: function() {
77706           return _connectionID;
77707       },
77708
77709
77710       changesetURL: function(changesetID) {
77711           return urlroot + '/changeset/' + changesetID;
77712       },
77713
77714
77715       changesetsURL: function(center, zoom) {
77716           var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
77717           return urlroot + '/history#map=' +
77718               Math.floor(zoom) + '/' +
77719               center[1].toFixed(precision) + '/' +
77720               center[0].toFixed(precision);
77721       },
77722
77723
77724       entityURL: function(entity) {
77725           return urlroot + '/' + entity.type + '/' + entity.osmId();
77726       },
77727
77728
77729       historyURL: function(entity) {
77730           return urlroot + '/' + entity.type + '/' + entity.osmId() + '/history';
77731       },
77732
77733
77734       userURL: function(username) {
77735           return urlroot + '/user/' + username;
77736       },
77737
77738
77739       noteURL: function(note) {
77740           return urlroot + '/note/' + note.id;
77741       },
77742
77743
77744       noteReportURL: function(note) {
77745           return urlroot + '/reports/new?reportable_type=Note&reportable_id=' + note.id;
77746       },
77747
77748
77749       // Generic method to load data from the OSM API
77750       // Can handle either auth or unauth calls.
77751       loadFromAPI: function(path, callback, options) {
77752           options = assignIn({ skipSeen: true }, options);
77753           var that = this;
77754           var cid = _connectionID;
77755
77756           function done(err, xml$$1) {
77757               if (that.getConnectionId() !== cid) {
77758                   if (callback) callback({ message: 'Connection Switched', status: -1 });
77759                   return;
77760               }
77761
77762               var isAuthenticated = that.authenticated();
77763
77764               // 400 Bad Request, 401 Unauthorized, 403 Forbidden
77765               // Logout and retry the request..
77766               if (isAuthenticated && err && (err.status === 400 || err.status === 401 || err.status === 403)) {
77767                   that.logout();
77768                   that.loadFromAPI(path, callback, options);
77769
77770               // else, no retry..
77771               } else {
77772                   // 509 Bandwidth Limit Exceeded, 429 Too Many Requests
77773                   // Set the rateLimitError flag and trigger a warning..
77774                   if (!isAuthenticated && !_rateLimitError && err &&
77775                           (err.status === 509 || err.status === 429)) {
77776                       _rateLimitError = err;
77777                       dispatch$4.call('change');
77778                   }
77779
77780                   if (callback) {
77781                       if (err) {
77782                           return callback(err);
77783                       } else {
77784                           return parseXML(xml$$1, callback, options);
77785                       }
77786                   }
77787               }
77788           }
77789
77790           if (this.authenticated()) {
77791               return oauth.xhr({ method: 'GET', path: path }, done);
77792           } else {
77793               var url = urlroot + path;
77794               return d3_xml(url).get(done);
77795           }
77796       },
77797
77798
77799       // Load a single entity by id (ways and relations use the `/full` call)
77800       // GET /api/0.6/node/#id
77801       // GET /api/0.6/[way|relation]/#id/full
77802       loadEntity: function(id, callback) {
77803           var type = osmEntity$$1.id.type(id);
77804           var osmID = osmEntity$$1.id.toOSM(id);
77805           var options = { skipSeen: false };
77806
77807           this.loadFromAPI(
77808               '/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : ''),
77809               function(err, entities) {
77810                   if (callback) callback(err, { data: entities });
77811               },
77812               options
77813           );
77814       },
77815
77816
77817       // Load a single entity with a specific version
77818       // GET /api/0.6/[node|way|relation]/#id/#version
77819       loadEntityVersion: function(id, version, callback) {
77820           var type = osmEntity$$1.id.type(id);
77821           var osmID = osmEntity$$1.id.toOSM(id);
77822           var options = { skipSeen: false };
77823
77824           this.loadFromAPI(
77825               '/api/0.6/' + type + '/' + osmID + '/' + version,
77826               function(err, entities) {
77827                   if (callback) callback(err, { data: entities });
77828               },
77829               options
77830           );
77831       },
77832
77833
77834       // Load multiple entities in chunks
77835       // (note: callback may be called multiple times)
77836       // GET /api/0.6/[nodes|ways|relations]?#parameters
77837       loadMultiple: function(ids, callback) {
77838           var that = this;
77839
77840           forEach(groupBy(uniq(ids), osmEntity$$1.id.type), function(v, k) {
77841               var type = k + 's';
77842               var osmIDs = map$3(v, osmEntity$$1.id.toOSM);
77843               var options = { skipSeen: false };
77844
77845               forEach(chunk(osmIDs, 150), function(arr) {
77846                   that.loadFromAPI(
77847                       '/api/0.6/' + type + '?' + type + '=' + arr.join(),
77848                       function(err, entities) {
77849                           if (callback) callback(err, { data: entities });
77850                       },
77851                       options
77852                   );
77853               });
77854           });
77855       },
77856
77857
77858       // Create, upload, and close a changeset
77859       // PUT /api/0.6/changeset/create
77860       // POST /api/0.6/changeset/#id/upload
77861       // PUT /api/0.6/changeset/#id/close
77862       putChangeset: function(changeset, changes, callback) {
77863           var cid = _connectionID;
77864
77865           if (_changeset$1.inflight) {
77866               return callback({ message: 'Changeset already inflight', status: -2 }, changeset);
77867
77868           } else if (_changeset$1.open) {   // reuse existing open changeset..
77869               return createdChangeset.call(this, null, _changeset$1.open);
77870
77871           } else {   // Open a new changeset..
77872               var options = {
77873                   method: 'PUT',
77874                   path: '/api/0.6/changeset/create',
77875                   options: { header: { 'Content-Type': 'text/xml' } },
77876                   content: JXON.stringify(changeset.asJXON())
77877               };
77878               _changeset$1.inflight = oauth.xhr(
77879                   options,
77880                   wrapcb(this, createdChangeset, cid)
77881               );
77882           }
77883
77884
77885           function createdChangeset(err, changesetID) {
77886               _changeset$1.inflight = null;
77887               if (err) { return callback(err, changeset); }
77888
77889               _changeset$1.open = changesetID;
77890               changeset = changeset.update({ id: changesetID });
77891
77892               // Upload the changeset..
77893               var options = {
77894                   method: 'POST',
77895                   path: '/api/0.6/changeset/' + changesetID + '/upload',
77896                   options: { header: { 'Content-Type': 'text/xml' } },
77897                   content: JXON.stringify(changeset.osmChangeJXON(changes))
77898               };
77899               _changeset$1.inflight = oauth.xhr(
77900                   options,
77901                   wrapcb(this, uploadedChangeset, cid)
77902               );
77903           }
77904
77905
77906           function uploadedChangeset(err) {
77907               _changeset$1.inflight = null;
77908               if (err) return callback(err, changeset);
77909
77910               // Upload was successful, safe to call the callback.
77911               // Add delay to allow for postgres replication #1646 #2678
77912               window.setTimeout(function() { callback(null, changeset); }, 2500);
77913               _changeset$1.open = null;
77914
77915               // At this point, we don't really care if the connection was switched..
77916               // Only try to close the changeset if we're still talking to the same server.
77917               if (this.getConnectionId() === cid) {
77918                   // Still attempt to close changeset, but ignore response because #2667
77919                   oauth.xhr({
77920                       method: 'PUT',
77921                       path: '/api/0.6/changeset/' + changeset.id + '/close',
77922                       options: { header: { 'Content-Type': 'text/xml' } }
77923                   }, function() { return true; });
77924               }
77925           }
77926       },
77927
77928
77929       // Load multiple users in chunks
77930       // (note: callback may be called multiple times)
77931       // GET /api/0.6/users?users=#id1,#id2,...,#idn
77932       loadUsers: function(uids, callback) {
77933           var toLoad = [];
77934           var cached = [];
77935
77936           uniq(uids).forEach(function(uid) {
77937               if (_userCache.user[uid]) {
77938                   delete _userCache.toLoad[uid];
77939                   cached.push(_userCache.user[uid]);
77940               } else {
77941                   toLoad.push(uid);
77942               }
77943           });
77944
77945           if (cached.length || !this.authenticated()) {
77946               callback(undefined, cached);
77947               if (!this.authenticated()) return;  // require auth
77948           }
77949
77950           chunk(toLoad, 150).forEach(function(arr) {
77951               oauth.xhr(
77952                   { method: 'GET', path: '/api/0.6/users?users=' + arr.join() },
77953                   wrapcb(this, done, _connectionID)
77954               );
77955           }.bind(this));
77956
77957           function done(err, xml$$1) {
77958               if (err) { return callback(err); }
77959
77960               var options = { skipSeen: true };
77961               return parseXML(xml$$1, function(err, results) {
77962                   if (err) {
77963                       return callback(err);
77964                   } else {
77965                       return callback(undefined, results);
77966                   }
77967               }, options);
77968           }
77969       },
77970
77971
77972       // Load a given user by id
77973       // GET /api/0.6/user/#id
77974       loadUser: function(uid, callback) {
77975           if (_userCache.user[uid] || !this.authenticated()) {   // require auth
77976               delete _userCache.toLoad[uid];
77977               return callback(undefined, _userCache.user[uid]);
77978           }
77979
77980           oauth.xhr(
77981               { method: 'GET', path: '/api/0.6/user/' + uid },
77982               wrapcb(this, done, _connectionID)
77983           );
77984
77985           function done(err, xml$$1) {
77986               if (err) { return callback(err); }
77987
77988               var options = { skipSeen: true };
77989               return parseXML(xml$$1, function(err, results) {
77990                   if (err) {
77991                       return callback(err);
77992                   } else {
77993                       return callback(undefined, results[0]);
77994                   }
77995               }, options);
77996           }
77997       },
77998
77999
78000       // Load the details of the logged-in user
78001       // GET /api/0.6/user/details
78002       userDetails: function(callback) {
78003           if (_userDetails) {    // retrieve cached
78004               return callback(undefined, _userDetails);
78005           }
78006
78007           oauth.xhr(
78008               { method: 'GET', path: '/api/0.6/user/details' },
78009               wrapcb(this, done, _connectionID)
78010           );
78011
78012           function done(err, xml$$1) {
78013               if (err) { return callback(err); }
78014
78015               var options = { skipSeen: false };
78016               return parseXML(xml$$1, function(err, results) {
78017                   if (err) {
78018                       return callback(err);
78019                   } else {
78020                       _userDetails = results[0];
78021                       return callback(undefined, _userDetails);
78022                   }
78023               }, options);
78024           }
78025       },
78026
78027
78028       // Load previous changesets for the logged in user
78029       // GET /api/0.6/changesets?user=#id
78030       userChangesets: function(callback) {
78031           if (_userChangesets) {    // retrieve cached
78032               return callback(undefined, _userChangesets);
78033           }
78034
78035           this.userDetails(
78036               wrapcb(this, gotDetails, _connectionID)
78037           );
78038
78039
78040           function gotDetails(err, user) {
78041               if (err) { return callback(err); }
78042
78043               oauth.xhr(
78044                   { method: 'GET', path: '/api/0.6/changesets?user=' + user.id },
78045                   wrapcb(this, done, _connectionID)
78046               );
78047           }
78048
78049           function done(err, xml$$1) {
78050               if (err) { return callback(err); }
78051
78052               _userChangesets = Array.prototype.map.call(
78053                   xml$$1.getElementsByTagName('changeset'),
78054                   function (changeset) { return { tags: getTags(changeset) }; }
78055               ).filter(function (changeset) {
78056                   var comment = changeset.tags.comment;
78057                   return comment && comment !== '';
78058               });
78059
78060               return callback(undefined, _userChangesets);
78061           }
78062       },
78063
78064
78065       // Fetch the status of the OSM API
78066       // GET /api/capabilities
78067       status: function(callback) {
78068           d3_xml(urlroot + '/api/capabilities').get(
78069               wrapcb(this, done, _connectionID)
78070           );
78071
78072           function done(err, xml$$1) {
78073               if (err) { return callback(err); }
78074
78075               // update blacklists
78076               var elements = xml$$1.getElementsByTagName('blacklist');
78077               var regexes = [];
78078               for (var i = 0; i < elements.length; i++) {
78079                   var regex = elements[i].getAttribute('regex');  // needs unencode?
78080                   if (regex) {
78081                       regexes.push(regex);
78082                   }
78083               }
78084               if (regexes.length) {
78085                   _blacklists = regexes;
78086               }
78087
78088               if (_rateLimitError) {
78089                   return callback(_rateLimitError, 'rateLimited');
78090               } else {
78091                   var apiStatus = xml$$1.getElementsByTagName('status');
78092                   var val = apiStatus[0].getAttribute('api');
78093                   return callback(undefined, val);
78094               }
78095           }
78096       },
78097
78098
78099       // Load data (entities) from the API in tiles
78100       // GET /api/0.6/map?bbox=
78101       loadTiles: function(projection, callback) {
78102           if (_off) return;
78103
78104           var that = this;
78105           var path = '/api/0.6/map?bbox=';
78106
78107           // determine the needed tiles to cover the view
78108           var tiles = tiler$3.zoomExtent([_tileZoom, _tileZoom]).getTiles(projection);
78109
78110           // abort inflight requests that are no longer needed
78111           var hadRequests = !isEmpty(_tileCache.inflight);
78112           abortUnwantedRequests$1(_tileCache, tiles);
78113           if (hadRequests && isEmpty(_tileCache.inflight)) {
78114               dispatch$4.call('loaded');    // stop the spinner
78115           }
78116
78117           // issue new requests..
78118           tiles.forEach(function(tile) {
78119               if (_tileCache.loaded[tile.id] || _tileCache.inflight[tile.id]) return;
78120               if (isEmpty(_tileCache.inflight)) {
78121                   dispatch$4.call('loading');   // start the spinner
78122               }
78123
78124               var options = { skipSeen: true };
78125               _tileCache.inflight[tile.id] = that.loadFromAPI(
78126                   path + tile.extent.toParam(),
78127                   function(err, parsed) {
78128                       delete _tileCache.inflight[tile.id];
78129                       if (!err) {
78130                           _tileCache.loaded[tile.id] = true;
78131                       }
78132                       if (callback) {
78133                           callback(err, assignIn({ data: parsed }, tile));
78134                       }
78135                       if (isEmpty(_tileCache.inflight)) {
78136                           dispatch$4.call('loaded');     // stop the spinner
78137                       }
78138                   },
78139                   options
78140               );
78141           });
78142       },
78143
78144
78145       // Load notes from the API in tiles
78146       // GET /api/0.6/notes?bbox=
78147       loadNotes: function(projection, noteOptions) {
78148           noteOptions = assignIn({ limit: 10000, closed: 7 }, noteOptions);
78149           if (_off) return;
78150
78151           var that = this;
78152           var path = '/api/0.6/notes?limit=' + noteOptions.limit + '&closed=' + noteOptions.closed + '&bbox=';
78153           var throttleLoadUsers = throttle(function() {
78154               var uids = Object.keys(_userCache.toLoad);
78155               if (!uids.length) return;
78156               that.loadUsers(uids, function() {});  // eagerly load user details
78157           }, 750);
78158
78159           // determine the needed tiles to cover the view
78160           var tiles = tiler$3.zoomExtent([_noteZoom, _noteZoom]).getTiles(projection);
78161
78162           // abort inflight requests that are no longer needed
78163           abortUnwantedRequests$1(_noteCache, tiles);
78164
78165           // issue new requests..
78166           tiles.forEach(function(tile) {
78167               if (_noteCache.loaded[tile.id] || _noteCache.inflight[tile.id]) return;
78168
78169               var options = { skipSeen: false };
78170               _noteCache.inflight[tile.id] = that.loadFromAPI(
78171                   path + tile.extent.toParam(),
78172                   function(err) {
78173                       delete _noteCache.inflight[tile.id];
78174                       if (!err) {
78175                           _noteCache.loaded[tile.id] = true;
78176                       }
78177                       throttleLoadUsers();
78178                       dispatch$4.call('loadedNotes');
78179                   },
78180                   options
78181               );
78182           });
78183       },
78184
78185
78186       // Create a note
78187       // POST /api/0.6/notes?params
78188       postNoteCreate: function(note, callback) {
78189           if (!this.authenticated()) {
78190               return callback({ message: 'Not Authenticated', status: -3 }, note);
78191           }
78192           if (_noteCache.inflightPost[note.id]) {
78193               return callback({ message: 'Note update already inflight', status: -2 }, note);
78194           }
78195
78196           if (!note.loc[0] || !note.loc[1] || !note.newComment) return; // location & description required
78197
78198           var comment = note.newComment;
78199           if (note.newCategory && note.newCategory !== 'None') { comment += ' #' + note.newCategory; }
78200
78201           var path = '/api/0.6/notes?' + utilQsString({ lon: note.loc[0], lat: note.loc[1], text: comment });
78202
78203           _noteCache.inflightPost[note.id] = oauth.xhr(
78204               { method: 'POST', path: path },
78205               wrapcb(this, done, _connectionID)
78206           );
78207
78208
78209           function done(err, xml$$1) {
78210               delete _noteCache.inflightPost[note.id];
78211               if (err) { return callback(err); }
78212
78213               // we get the updated note back, remove from caches and reparse..
78214               this.removeNote(note);
78215
78216               var options = { skipSeen: false };
78217               return parseXML(xml$$1, function(err, results) {
78218                   if (err) {
78219                       return callback(err);
78220                   } else {
78221                       return callback(undefined, results[0]);
78222                   }
78223               }, options);
78224           }
78225       },
78226
78227
78228       // Update a note
78229       // POST /api/0.6/notes/#id/comment?text=comment
78230       // POST /api/0.6/notes/#id/close?text=comment
78231       // POST /api/0.6/notes/#id/reopen?text=comment
78232       postNoteUpdate: function(note, newStatus, callback) {
78233           if (!this.authenticated()) {
78234               return callback({ message: 'Not Authenticated', status: -3 }, note);
78235           }
78236           if (_noteCache.inflightPost[note.id]) {
78237               return callback({ message: 'Note update already inflight', status: -2 }, note);
78238           }
78239
78240           var action;
78241           if (note.status !== 'closed' && newStatus === 'closed') {
78242               action = 'close';
78243           } else if (note.status !== 'open' && newStatus === 'open') {
78244               action = 'reopen';
78245           } else {
78246               action = 'comment';
78247               if (!note.newComment) return; // when commenting, comment required
78248           }
78249
78250           var path = '/api/0.6/notes/' + note.id + '/' + action;
78251           if (note.newComment) {
78252               path += '?' + utilQsString({ text: note.newComment });
78253           }
78254
78255           _noteCache.inflightPost[note.id] = oauth.xhr(
78256               { method: 'POST', path: path },
78257               wrapcb(this, done, _connectionID)
78258           );
78259
78260
78261           function done(err, xml$$1) {
78262               delete _noteCache.inflightPost[note.id];
78263               if (err) { return callback(err); }
78264
78265               // we get the updated note back, remove from caches and reparse..
78266               this.removeNote(note);
78267
78268               // update closed note cache - used to populate `closed:note` changeset tag
78269               if (action === 'close') {
78270                   _noteCache.closed[note.id] = true;
78271               } else if (action === 'reopen') {
78272                   delete _noteCache.closed[note.id];
78273               }
78274
78275               var options = { skipSeen: false };
78276               return parseXML(xml$$1, function(err, results) {
78277                   if (err) {
78278                       return callback(err);
78279                   } else {
78280                       return callback(undefined, results[0]);
78281                   }
78282               }, options);
78283           }
78284       },
78285
78286
78287       switch: function(options) {
78288           urlroot = options.urlroot;
78289
78290           oauth.options(assignIn({
78291               url: urlroot,
78292               loading: authLoading,
78293               done: authDone
78294           }, options));
78295
78296           this.reset();
78297           this.userChangesets(function() {});  // eagerly load user details/changesets
78298           dispatch$4.call('change');
78299           return this;
78300       },
78301
78302
78303       toggle: function(_) {
78304           _off = !_;
78305           return this;
78306       },
78307
78308
78309       isChangesetInflight: function() {
78310           return !!_changeset$1.inflight;
78311       },
78312
78313
78314       // get/set cached data
78315       // This is used to save/restore the state when entering/exiting the walkthrough
78316       // Also used for testing purposes.
78317       caches: function(obj) {
78318           if (!arguments.length) {
78319               return {
78320                   tile: cloneDeep(_tileCache),
78321                   note: cloneDeep(_noteCache),
78322                   user: cloneDeep(_userCache)
78323               };
78324           }
78325
78326           // access caches directly for testing (e.g., loading notes rtree)
78327           if (obj === 'get') {
78328               return {
78329                   tile: _tileCache,
78330                   note: _noteCache,
78331                   user: _userCache
78332               };
78333           }
78334
78335           if (obj.tile) {
78336               _tileCache = obj.tile;
78337               _tileCache.inflight = {};
78338           }
78339           if (obj.note) {
78340               _noteCache = obj.note;
78341               _noteCache.inflight = {};
78342               _noteCache.inflightPost = {};
78343           }
78344           if (obj.user) {
78345               _userCache = obj.user;
78346           }
78347
78348           return this;
78349       },
78350
78351
78352       logout: function() {
78353           _userChangesets = undefined;
78354           _userDetails = undefined;
78355           oauth.logout();
78356           dispatch$4.call('change');
78357           return this;
78358       },
78359
78360
78361       authenticated: function() {
78362           return oauth.authenticated();
78363       },
78364
78365
78366       authenticate: function(callback) {
78367           var that = this;
78368           var cid = _connectionID;
78369           _userChangesets = undefined;
78370           _userDetails = undefined;
78371
78372           function done(err, res) {
78373               if (err) {
78374                   if (callback) callback(err);
78375                   return;
78376               }
78377               if (that.getConnectionId() !== cid) {
78378                   if (callback) callback({ message: 'Connection Switched', status: -1 });
78379                   return;
78380               }
78381               _rateLimitError = undefined;
78382               dispatch$4.call('change');
78383               if (callback) callback(err, res);
78384               that.userChangesets(function() {});  // eagerly load user details/changesets
78385           }
78386
78387           return oauth.authenticate(done);
78388       },
78389
78390
78391       imageryBlacklists: function() {
78392           return _blacklists;
78393       },
78394
78395
78396       tileZoom: function(_) {
78397           if (!arguments.length) return _tileZoom;
78398           _tileZoom = _;
78399           return this;
78400       },
78401
78402
78403       // get all cached notes covering the viewport
78404       notes: function(projection) {
78405           var viewport = projection.clipExtent();
78406           var min = [viewport[0][0], viewport[1][1]];
78407           var max = [viewport[1][0], viewport[0][1]];
78408           var bbox = geoExtent$$1(projection.invert(min), projection.invert(max)).bbox();
78409
78410           return _noteCache.rtree.search(bbox)
78411               .map(function(d) { return d.data; });
78412       },
78413
78414
78415       // get a single note from the cache
78416       getNote: function(id) {
78417           return _noteCache.note[id];
78418       },
78419
78420
78421       // remove a single note from the cache
78422       removeNote: function(note) {
78423           if (!(note instanceof osmNote) || !note.id) return;
78424
78425           delete _noteCache.note[note.id];
78426           updateRtree$1(encodeNoteRtree(note), false);  // false = remove
78427       },
78428
78429
78430       // replace a single note in the cache
78431       replaceNote: function(note) {
78432           if (!(note instanceof osmNote) || !note.id) return;
78433
78434           _noteCache.note[note.id] = note;
78435           updateRtree$1(encodeNoteRtree(note), true);  // true = replace
78436           return note;
78437       },
78438
78439
78440       // Get an array of note IDs closed during this session.
78441       // Used to populate `closed:note` changeset tag
78442       getClosedIDs: function() {
78443           return Object.keys(_noteCache.closed).sort();
78444       }
78445
78446   };
78447
78448   var apibase$3 = 'https://wiki.openstreetmap.org/w/api.php';
78449   var _inflight = {};
78450   var _wikibaseCache = {};
78451   var _localeIDs = { en: false };
78452
78453
78454   var debouncedRequest = debounce(request$1, 500, { leading: false });
78455
78456   function request$1(url, callback) {
78457       if (_inflight[url]) return;
78458
78459       _inflight[url] = d3_json(url, function (err, data) {
78460           delete _inflight[url];
78461           callback(err, data);
78462       });
78463   }
78464
78465
78466   /**
78467    * Get the best string value from the descriptions/labels result
78468    * Note that if mediawiki doesn't recognize language code, it will return all values.
78469    * In that case, fallback to use English.
78470    * @param values object - either descriptions or labels
78471    * @param langCode String
78472    * @returns localized string
78473    */
78474   function localizedToString(values, langCode) {
78475       if (values) {
78476           values = values[langCode] || values.en;
78477       }
78478       return values ? values.value : '';
78479   }
78480
78481
78482   var serviceOsmWikibase = {
78483
78484       init: function() {
78485           _inflight = {};
78486           _wikibaseCache = {};
78487           _localeIDs = {};
78488       },
78489
78490
78491       reset: function() {
78492           forEach(_inflight, function(req) { req.abort(); });
78493           _inflight = {};
78494       },
78495
78496
78497       /**
78498        * Get the best value for the property, or undefined if not found
78499        * @param entity object from wikibase
78500        * @param property string e.g. 'P4' for image
78501        * @param langCode string e.g. 'fr' for French
78502        */
78503       claimToValue: function(entity, property, langCode) {
78504           if (!entity.claims[property]) return undefined;
78505           var locale = _localeIDs[langCode];
78506           var preferredPick, localePick;
78507           forEach(entity.claims[property], function(stmt) {
78508               // If exists, use value limited to the needed language (has a qualifier P26 = locale)
78509               // Or if not found, use the first value with the "preferred" rank
78510               if (!preferredPick && stmt.rank === 'preferred') {
78511                   preferredPick = stmt;
78512               }
78513               if (locale && stmt.qualifiers && stmt.qualifiers.P26 &&
78514                   stmt.qualifiers.P26[0].datavalue.value.id === locale
78515               ) {
78516                   localePick = stmt;
78517               }
78518           });
78519           var result = localePick || preferredPick;
78520
78521           if (result) {
78522               var datavalue = result.mainsnak.datavalue;
78523               return datavalue.type === 'wikibase-entityid' ? datavalue.value.id : datavalue.value;
78524           } else {
78525               return undefined;
78526           }
78527       },
78528
78529
78530       /**
78531        * Convert monolingual property into a key-value object (language -> value)
78532        * @param entity object from wikibase
78533        * @param property string e.g. 'P31' for monolingual wiki page title
78534        */
78535       monolingualClaimToValueObj: function(entity, property) {
78536           if (!entity || !entity.claims[property]) return undefined;
78537           return entity.claims[property].reduce(function(acc, obj) {
78538               var value = obj.mainsnak.datavalue.value;
78539               acc[value.language] = value.text;
78540               return acc;
78541           }, {});
78542       },
78543
78544
78545       toSitelink: function(key, value) {
78546           var result = value ? 'Tag:' + key + '=' + value : 'Key:' + key;
78547           return result.replace(/_/g, ' ').trim();
78548       },
78549
78550
78551       getEntity: function(params, callback) {
78552           var doRequest = params.debounce ? debouncedRequest : request$1;
78553           var self = this;
78554           var titles = [];
78555           var result = {};
78556           var keySitelink = this.toSitelink(params.key);
78557           var tagSitelink = params.value ? this.toSitelink(params.key, params.value) : false;
78558           var localeSitelink;
78559
78560           if (params.langCode && _localeIDs[params.langCode] === undefined) {
78561               // If this is the first time we are asking about this locale,
78562               // fetch corresponding entity (if it exists), and cache it.
78563               // If there is no such entry, cache `false` value to avoid re-requesting it.
78564               localeSitelink = ('Locale:' + params.langCode).replace(/_/g, ' ').trim();
78565               titles.push(localeSitelink);
78566           }
78567
78568           if (_wikibaseCache[keySitelink]) {
78569               result.key = _wikibaseCache[keySitelink];
78570           } else {
78571               titles.push(keySitelink);
78572           }
78573
78574           if (tagSitelink) {
78575               if (_wikibaseCache[tagSitelink]) {
78576                   result.tag = _wikibaseCache[tagSitelink];
78577               } else {
78578                   titles.push(tagSitelink);
78579               }
78580           }
78581
78582           if (!titles.length) {
78583               // Nothing to do, we already had everything in the cache
78584               return callback(null, result);
78585           }
78586
78587           // Requesting just the user language code
78588           // If backend recognizes the code, it will perform proper fallbacks,
78589           // and the result will contain the requested code. If not, all values are returned:
78590           // {"zh-tw":{"value":"...","language":"zh-tw","source-language":"zh-hant"}
78591           // {"pt-br":{"value":"...","language":"pt","for-language":"pt-br"}}
78592           var obj = {
78593               action: 'wbgetentities',
78594               sites: 'wiki',
78595               titles: titles.join('|'),
78596               languages: params.langCode,
78597               languagefallback: 1,
78598               origin: '*',
78599               format: 'json',
78600               // There is an MW Wikibase API bug https://phabricator.wikimedia.org/T212069
78601               // We shouldn't use v1 until it gets fixed, but should switch to it afterwards
78602               // formatversion: 2,
78603           };
78604
78605           var url = apibase$3 + '?' + utilQsString(obj);
78606           doRequest(url, function(err, d) {
78607               if (err) {
78608                   callback(err);
78609               } else if (!d.success || d.error) {
78610                   callback(d.error.messages.map(function(v) { return v.html['*']; }).join('<br>'));
78611               } else {
78612                   var localeID = false;
78613                   forEach(d.entities, function(res) {
78614                       if (res.missing !== '') {
78615                           var title = res.sitelinks.wiki.title;
78616                           // Simplify access to the localized values
78617                           res.description = localizedToString(res.descriptions, params.langCode);
78618                           res.label = localizedToString(res.labels, params.langCode);
78619                           if (title === keySitelink) {
78620                               _wikibaseCache[keySitelink] = res;
78621                               result.key = res;
78622                           } else if (title === tagSitelink) {
78623                               _wikibaseCache[tagSitelink] = res;
78624                               result.tag = res;
78625                           } else if (title === localeSitelink) {
78626                               localeID = res.id;
78627                           } else {
78628                               console.log('Unexpected title ' + title);  // eslint-disable-line no-console
78629                           }
78630                       }
78631                   });
78632
78633                   if (localeSitelink) {
78634                       // If locale ID is not found, store false to prevent repeated queries
78635                       self.addLocale(params.langCode, localeID);
78636                   }
78637
78638                   callback(null, result);
78639               }
78640           });
78641       },
78642
78643
78644       addLocale: function(langCode, qid) {
78645           // Makes it easier to unit test
78646           _localeIDs[langCode] = qid;
78647       },
78648
78649       apibase: function(val) {
78650           if (!arguments.length) return apibase$3;
78651           apibase$3 = val;
78652           return this;
78653       }
78654
78655   };
78656
78657   var jsonpCache = {};
78658   window.jsonpCache = jsonpCache;
78659
78660   function jsonpRequest(url, callback) {
78661       var request = {
78662           abort: function() {}
78663       };
78664
78665       if (window.JSONP_FIX) {
78666           if (window.JSONP_DELAY === 0) {
78667               callback(window.JSONP_FIX);
78668           } else {
78669               var t = window.setTimeout(function() {
78670                   callback(window.JSONP_FIX);
78671               }, window.JSONP_DELAY || 0);
78672
78673               request.abort = function() { window.clearTimeout(t); };
78674           }
78675
78676           return request;
78677       }
78678
78679       function rand() {
78680           var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
78681           var c = '';
78682           var i = -1;
78683           while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
78684           return c;
78685       }
78686
78687       function create$$1(url) {
78688           var e = url.match(/callback=(\w+)/);
78689           var c = e ? e[1] : rand();
78690
78691           jsonpCache[c] = function(data) {
78692               if (jsonpCache[c]) {
78693                   callback(data);
78694               }
78695               finalize();
78696           };
78697
78698           function finalize() {
78699               delete jsonpCache[c];
78700               script.remove();
78701           }
78702
78703           request.abort = finalize;
78704           return 'jsonpCache.' + c;
78705       }
78706
78707       var cb = create$$1(url);
78708
78709       var script = select('head')
78710           .append('script')
78711           .attr('type', 'text/javascript')
78712           .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
78713
78714       return request;
78715   }
78716
78717   var q = createCommonjsModule(function (module, exports) {
78718   // vim:ts=4:sts=4:sw=4:
78719   /*!
78720    *
78721    * Copyright 2009-2017 Kris Kowal under the terms of the MIT
78722    * license found at https://github.com/kriskowal/q/blob/v1/LICENSE
78723    *
78724    * With parts by Tyler Close
78725    * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found
78726    * at http://www.opensource.org/licenses/mit-license.html
78727    * Forked at ref_send.js version: 2009-05-11
78728    *
78729    * With parts by Mark Miller
78730    * Copyright (C) 2011 Google Inc.
78731    *
78732    * Licensed under the Apache License, Version 2.0 (the "License");
78733    * you may not use this file except in compliance with the License.
78734    * You may obtain a copy of the License at
78735    *
78736    * http://www.apache.org/licenses/LICENSE-2.0
78737    *
78738    * Unless required by applicable law or agreed to in writing, software
78739    * distributed under the License is distributed on an "AS IS" BASIS,
78740    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
78741    * See the License for the specific language governing permissions and
78742    * limitations under the License.
78743    *
78744    */
78745
78746   (function (definition) {
78747
78748       // This file will function properly as a <script> tag, or a module
78749       // using CommonJS and NodeJS or RequireJS module formats.  In
78750       // Common/Node/RequireJS, the module exports the Q API and when
78751       // executed as a simple <script>, it creates a Q global instead.
78752
78753       // Montage Require
78754       if (typeof bootstrap === "function") {
78755           bootstrap("promise", definition);
78756
78757       // CommonJS
78758       } else {
78759           module.exports = definition();
78760
78761       // RequireJS
78762       }
78763
78764   })(function () {
78765
78766   var hasStacks = false;
78767   try {
78768       throw new Error();
78769   } catch (e) {
78770       hasStacks = !!e.stack;
78771   }
78772
78773   // All code after this point will be filtered from stack traces reported
78774   // by Q.
78775   var qStartingLine = captureLine();
78776   var qFileName;
78777
78778   // shims
78779
78780   // used for fallback in "allResolved"
78781   var noop = function () {};
78782
78783   // Use the fastest possible means to execute a task in a future turn
78784   // of the event loop.
78785   var nextTick =(function () {
78786       // linked list of tasks (single, with head node)
78787       var head = {task: void 0, next: null};
78788       var tail = head;
78789       var flushing = false;
78790       var requestTick = void 0;
78791       var isNodeJS = false;
78792       // queue for late tasks, used by unhandled rejection tracking
78793       var laterQueue = [];
78794
78795       function flush() {
78796           /* jshint loopfunc: true */
78797           var task, domain;
78798
78799           while (head.next) {
78800               head = head.next;
78801               task = head.task;
78802               head.task = void 0;
78803               domain = head.domain;
78804
78805               if (domain) {
78806                   head.domain = void 0;
78807                   domain.enter();
78808               }
78809               runSingle(task, domain);
78810
78811           }
78812           while (laterQueue.length) {
78813               task = laterQueue.pop();
78814               runSingle(task);
78815           }
78816           flushing = false;
78817       }
78818       // runs a single function in the async queue
78819       function runSingle(task, domain) {
78820           try {
78821               task();
78822
78823           } catch (e) {
78824               if (isNodeJS) {
78825                   // In node, uncaught exceptions are considered fatal errors.
78826                   // Re-throw them synchronously to interrupt flushing!
78827
78828                   // Ensure continuation if the uncaught exception is suppressed
78829                   // listening "uncaughtException" events (as domains does).
78830                   // Continue in next event to avoid tick recursion.
78831                   if (domain) {
78832                       domain.exit();
78833                   }
78834                   setTimeout(flush, 0);
78835                   if (domain) {
78836                       domain.enter();
78837                   }
78838
78839                   throw e;
78840
78841               } else {
78842                   // In browsers, uncaught exceptions are not fatal.
78843                   // Re-throw them asynchronously to avoid slow-downs.
78844                   setTimeout(function () {
78845                       throw e;
78846                   }, 0);
78847               }
78848           }
78849
78850           if (domain) {
78851               domain.exit();
78852           }
78853       }
78854
78855       nextTick = function (task) {
78856           tail = tail.next = {
78857               task: task,
78858               domain: isNodeJS && process.domain,
78859               next: null
78860           };
78861
78862           if (!flushing) {
78863               flushing = true;
78864               requestTick();
78865           }
78866       };
78867
78868       if (typeof process === "object" &&
78869           process.toString() === "[object process]" && process.nextTick) {
78870           // Ensure Q is in a real Node environment, with a `process.nextTick`.
78871           // To see through fake Node environments:
78872           // * Mocha test runner - exposes a `process` global without a `nextTick`
78873           // * Browserify - exposes a `process.nexTick` function that uses
78874           //   `setTimeout`. In this case `setImmediate` is preferred because
78875           //    it is faster. Browserify's `process.toString()` yields
78876           //   "[object Object]", while in a real Node environment
78877           //   `process.toString()` yields "[object process]".
78878           isNodeJS = true;
78879
78880           requestTick = function () {
78881               process.nextTick(flush);
78882           };
78883
78884       } else if (typeof setImmediate === "function") {
78885           // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate
78886           if (typeof window !== "undefined") {
78887               requestTick = setImmediate.bind(window, flush);
78888           } else {
78889               requestTick = function () {
78890                   setImmediate(flush);
78891               };
78892           }
78893
78894       } else if (typeof MessageChannel !== "undefined") {
78895           // modern browsers
78896           // http://www.nonblocking.io/2011/06/windownexttick.html
78897           var channel = new MessageChannel();
78898           // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create
78899           // working message ports the first time a page loads.
78900           channel.port1.onmessage = function () {
78901               requestTick = requestPortTick;
78902               channel.port1.onmessage = flush;
78903               flush();
78904           };
78905           var requestPortTick = function () {
78906               // Opera requires us to provide a message payload, regardless of
78907               // whether we use it.
78908               channel.port2.postMessage(0);
78909           };
78910           requestTick = function () {
78911               setTimeout(flush, 0);
78912               requestPortTick();
78913           };
78914
78915       } else {
78916           // old browsers
78917           requestTick = function () {
78918               setTimeout(flush, 0);
78919           };
78920       }
78921       // runs a task after all other tasks have been run
78922       // this is useful for unhandled rejection tracking that needs to happen
78923       // after all `then`d tasks have been run.
78924       nextTick.runAfter = function (task) {
78925           laterQueue.push(task);
78926           if (!flushing) {
78927               flushing = true;
78928               requestTick();
78929           }
78930       };
78931       return nextTick;
78932   })();
78933
78934   // Attempt to make generics safe in the face of downstream
78935   // modifications.
78936   // There is no situation where this is necessary.
78937   // If you need a security guarantee, these primordials need to be
78938   // deeply frozen anyway, and if you don’t need a security guarantee,
78939   // this is just plain paranoid.
78940   // However, this **might** have the nice side-effect of reducing the size of
78941   // the minified code by reducing x.call() to merely x()
78942   // See Mark Miller’s explanation of what this does.
78943   // http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming
78944   var call = Function.call;
78945   function uncurryThis(f) {
78946       return function () {
78947           return call.apply(f, arguments);
78948       };
78949   }
78950   // This is equivalent, but slower:
78951   // uncurryThis = Function_bind.bind(Function_bind.call);
78952   // http://jsperf.com/uncurrythis
78953
78954   var array_slice = uncurryThis(Array.prototype.slice);
78955
78956   var array_reduce = uncurryThis(
78957       Array.prototype.reduce || function (callback, basis) {
78958           var index = 0,
78959               length = this.length;
78960           // concerning the initial value, if one is not provided
78961           if (arguments.length === 1) {
78962               // seek to the first value in the array, accounting
78963               // for the possibility that is is a sparse array
78964               do {
78965                   if (index in this) {
78966                       basis = this[index++];
78967                       break;
78968                   }
78969                   if (++index >= length) {
78970                       throw new TypeError();
78971                   }
78972               } while (1);
78973           }
78974           // reduce
78975           for (; index < length; index++) {
78976               // account for the possibility that the array is sparse
78977               if (index in this) {
78978                   basis = callback(basis, this[index], index);
78979               }
78980           }
78981           return basis;
78982       }
78983   );
78984
78985   var array_indexOf = uncurryThis(
78986       Array.prototype.indexOf || function (value) {
78987           // not a very good shim, but good enough for our one use of it
78988           for (var i = 0; i < this.length; i++) {
78989               if (this[i] === value) {
78990                   return i;
78991               }
78992           }
78993           return -1;
78994       }
78995   );
78996
78997   var array_map = uncurryThis(
78998       Array.prototype.map || function (callback, thisp) {
78999           var self = this;
79000           var collect = [];
79001           array_reduce(self, function (undefined, value, index) {
79002               collect.push(callback.call(thisp, value, index, self));
79003           }, void 0);
79004           return collect;
79005       }
79006   );
79007
79008   var object_create = Object.create || function (prototype) {
79009       function Type() { }
79010       Type.prototype = prototype;
79011       return new Type();
79012   };
79013
79014   var object_defineProperty = Object.defineProperty || function (obj, prop, descriptor) {
79015       obj[prop] = descriptor.value;
79016       return obj;
79017   };
79018
79019   var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);
79020
79021   var object_keys = Object.keys || function (object) {
79022       var keys = [];
79023       for (var key in object) {
79024           if (object_hasOwnProperty(object, key)) {
79025               keys.push(key);
79026           }
79027       }
79028       return keys;
79029   };
79030
79031   var object_toString = uncurryThis(Object.prototype.toString);
79032
79033   function isObject(value) {
79034       return value === Object(value);
79035   }
79036
79037   // generator related shims
79038
79039   // FIXME: Remove this function once ES6 generators are in SpiderMonkey.
79040   function isStopIteration(exception) {
79041       return (
79042           object_toString(exception) === "[object StopIteration]" ||
79043           exception instanceof QReturnValue
79044       );
79045   }
79046
79047   // FIXME: Remove this helper and Q.return once ES6 generators are in
79048   // SpiderMonkey.
79049   var QReturnValue;
79050   if (typeof ReturnValue !== "undefined") {
79051       QReturnValue = ReturnValue;
79052   } else {
79053       QReturnValue = function (value) {
79054           this.value = value;
79055       };
79056   }
79057
79058   // long stack traces
79059
79060   var STACK_JUMP_SEPARATOR = "From previous event:";
79061
79062   function makeStackTraceLong(error, promise) {
79063       // If possible, transform the error stack trace by removing Node and Q
79064       // cruft, then concatenating with the stack trace of `promise`. See #57.
79065       if (hasStacks &&
79066           promise.stack &&
79067           typeof error === "object" &&
79068           error !== null &&
79069           error.stack
79070       ) {
79071           var stacks = [];
79072           for (var p = promise; !!p; p = p.source) {
79073               if (p.stack && (!error.__minimumStackCounter__ || error.__minimumStackCounter__ > p.stackCounter)) {
79074                   object_defineProperty(error, "__minimumStackCounter__", {value: p.stackCounter, configurable: true});
79075                   stacks.unshift(p.stack);
79076               }
79077           }
79078           stacks.unshift(error.stack);
79079
79080           var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
79081           var stack = filterStackString(concatedStacks);
79082           object_defineProperty(error, "stack", {value: stack, configurable: true});
79083       }
79084   }
79085
79086   function filterStackString(stackString) {
79087       var lines = stackString.split("\n");
79088       var desiredLines = [];
79089       for (var i = 0; i < lines.length; ++i) {
79090           var line = lines[i];
79091
79092           if (!isInternalFrame(line) && !isNodeFrame(line) && line) {
79093               desiredLines.push(line);
79094           }
79095       }
79096       return desiredLines.join("\n");
79097   }
79098
79099   function isNodeFrame(stackLine) {
79100       return stackLine.indexOf("(module.js:") !== -1 ||
79101              stackLine.indexOf("(node.js:") !== -1;
79102   }
79103
79104   function getFileNameAndLineNumber(stackLine) {
79105       // Named functions: "at functionName (filename:lineNumber:columnNumber)"
79106       // In IE10 function name can have spaces ("Anonymous function") O_o
79107       var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine);
79108       if (attempt1) {
79109           return [attempt1[1], Number(attempt1[2])];
79110       }
79111
79112       // Anonymous functions: "at filename:lineNumber:columnNumber"
79113       var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);
79114       if (attempt2) {
79115           return [attempt2[1], Number(attempt2[2])];
79116       }
79117
79118       // Firefox style: "function@filename:lineNumber or @filename:lineNumber"
79119       var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);
79120       if (attempt3) {
79121           return [attempt3[1], Number(attempt3[2])];
79122       }
79123   }
79124
79125   function isInternalFrame(stackLine) {
79126       var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);
79127
79128       if (!fileNameAndLineNumber) {
79129           return false;
79130       }
79131
79132       var fileName = fileNameAndLineNumber[0];
79133       var lineNumber = fileNameAndLineNumber[1];
79134
79135       return fileName === qFileName &&
79136           lineNumber >= qStartingLine &&
79137           lineNumber <= qEndingLine;
79138   }
79139
79140   // discover own file name and line number range for filtering stack
79141   // traces
79142   function captureLine() {
79143       if (!hasStacks) {
79144           return;
79145       }
79146
79147       try {
79148           throw new Error();
79149       } catch (e) {
79150           var lines = e.stack.split("\n");
79151           var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
79152           var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
79153           if (!fileNameAndLineNumber) {
79154               return;
79155           }
79156
79157           qFileName = fileNameAndLineNumber[0];
79158           return fileNameAndLineNumber[1];
79159       }
79160   }
79161
79162   function deprecate(callback, name, alternative) {
79163       return function () {
79164           if (typeof console !== "undefined" &&
79165               typeof console.warn === "function") {
79166               console.warn(name + " is deprecated, use " + alternative +
79167                            " instead.", new Error("").stack);
79168           }
79169           return callback.apply(callback, arguments);
79170       };
79171   }
79172
79173   // end of shims
79174   // beginning of real work
79175
79176   /**
79177    * Constructs a promise for an immediate reference, passes promises through, or
79178    * coerces promises from different systems.
79179    * @param value immediate reference or promise
79180    */
79181   function Q(value) {
79182       // If the object is already a Promise, return it directly.  This enables
79183       // the resolve function to both be used to created references from objects,
79184       // but to tolerably coerce non-promises to promises.
79185       if (value instanceof Promise) {
79186           return value;
79187       }
79188
79189       // assimilate thenables
79190       if (isPromiseAlike(value)) {
79191           return coerce(value);
79192       } else {
79193           return fulfill(value);
79194       }
79195   }
79196   Q.resolve = Q;
79197
79198   /**
79199    * Performs a task in a future turn of the event loop.
79200    * @param {Function} task
79201    */
79202   Q.nextTick = nextTick;
79203
79204   /**
79205    * Controls whether or not long stack traces will be on
79206    */
79207   Q.longStackSupport = false;
79208
79209   /**
79210    * The counter is used to determine the stopping point for building
79211    * long stack traces. In makeStackTraceLong we walk backwards through
79212    * the linked list of promises, only stacks which were created before
79213    * the rejection are concatenated.
79214    */
79215   var longStackCounter = 1;
79216
79217   // enable long stacks if Q_DEBUG is set
79218   if (typeof process === "object" && process && process.env && process.env.Q_DEBUG) {
79219       Q.longStackSupport = true;
79220   }
79221
79222   /**
79223    * Constructs a {promise, resolve, reject} object.
79224    *
79225    * `resolve` is a callback to invoke with a more resolved value for the
79226    * promise. To fulfill the promise, invoke `resolve` with any value that is
79227    * not a thenable. To reject the promise, invoke `resolve` with a rejected
79228    * thenable, or invoke `reject` with the reason directly. To resolve the
79229    * promise to another thenable, thus putting it in the same state, invoke
79230    * `resolve` with that other thenable.
79231    */
79232   Q.defer = defer;
79233   function defer() {
79234       // if "messages" is an "Array", that indicates that the promise has not yet
79235       // been resolved.  If it is "undefined", it has been resolved.  Each
79236       // element of the messages array is itself an array of complete arguments to
79237       // forward to the resolved promise.  We coerce the resolution value to a
79238       // promise using the `resolve` function because it handles both fully
79239       // non-thenable values and other thenables gracefully.
79240       var messages = [], progressListeners = [], resolvedPromise;
79241
79242       var deferred = object_create(defer.prototype);
79243       var promise = object_create(Promise.prototype);
79244
79245       promise.promiseDispatch = function (resolve, op, operands) {
79246           var args = array_slice(arguments);
79247           if (messages) {
79248               messages.push(args);
79249               if (op === "when" && operands[1]) { // progress operand
79250                   progressListeners.push(operands[1]);
79251               }
79252           } else {
79253               Q.nextTick(function () {
79254                   resolvedPromise.promiseDispatch.apply(resolvedPromise, args);
79255               });
79256           }
79257       };
79258
79259       // XXX deprecated
79260       promise.valueOf = function () {
79261           if (messages) {
79262               return promise;
79263           }
79264           var nearerValue = nearer(resolvedPromise);
79265           if (isPromise(nearerValue)) {
79266               resolvedPromise = nearerValue; // shorten chain
79267           }
79268           return nearerValue;
79269       };
79270
79271       promise.inspect = function () {
79272           if (!resolvedPromise) {
79273               return { state: "pending" };
79274           }
79275           return resolvedPromise.inspect();
79276       };
79277
79278       if (Q.longStackSupport && hasStacks) {
79279           try {
79280               throw new Error();
79281           } catch (e) {
79282               // NOTE: don't try to use `Error.captureStackTrace` or transfer the
79283               // accessor around; that causes memory leaks as per GH-111. Just
79284               // reify the stack trace as a string ASAP.
79285               //
79286               // At the same time, cut off the first line; it's always just
79287               // "[object Promise]\n", as per the `toString`.
79288               promise.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
79289               promise.stackCounter = longStackCounter++;
79290           }
79291       }
79292
79293       // NOTE: we do the checks for `resolvedPromise` in each method, instead of
79294       // consolidating them into `become`, since otherwise we'd create new
79295       // promises with the lines `become(whatever(value))`. See e.g. GH-252.
79296
79297       function become(newPromise) {
79298           resolvedPromise = newPromise;
79299
79300           if (Q.longStackSupport && hasStacks) {
79301               // Only hold a reference to the new promise if long stacks
79302               // are enabled to reduce memory usage
79303               promise.source = newPromise;
79304           }
79305
79306           array_reduce(messages, function (undefined, message) {
79307               Q.nextTick(function () {
79308                   newPromise.promiseDispatch.apply(newPromise, message);
79309               });
79310           }, void 0);
79311
79312           messages = void 0;
79313           progressListeners = void 0;
79314       }
79315
79316       deferred.promise = promise;
79317       deferred.resolve = function (value) {
79318           if (resolvedPromise) {
79319               return;
79320           }
79321
79322           become(Q(value));
79323       };
79324
79325       deferred.fulfill = function (value) {
79326           if (resolvedPromise) {
79327               return;
79328           }
79329
79330           become(fulfill(value));
79331       };
79332       deferred.reject = function (reason) {
79333           if (resolvedPromise) {
79334               return;
79335           }
79336
79337           become(reject(reason));
79338       };
79339       deferred.notify = function (progress) {
79340           if (resolvedPromise) {
79341               return;
79342           }
79343
79344           array_reduce(progressListeners, function (undefined, progressListener) {
79345               Q.nextTick(function () {
79346                   progressListener(progress);
79347               });
79348           }, void 0);
79349       };
79350
79351       return deferred;
79352   }
79353
79354   /**
79355    * Creates a Node-style callback that will resolve or reject the deferred
79356    * promise.
79357    * @returns a nodeback
79358    */
79359   defer.prototype.makeNodeResolver = function () {
79360       var self = this;
79361       return function (error, value) {
79362           if (error) {
79363               self.reject(error);
79364           } else if (arguments.length > 2) {
79365               self.resolve(array_slice(arguments, 1));
79366           } else {
79367               self.resolve(value);
79368           }
79369       };
79370   };
79371
79372   /**
79373    * @param resolver {Function} a function that returns nothing and accepts
79374    * the resolve, reject, and notify functions for a deferred.
79375    * @returns a promise that may be resolved with the given resolve and reject
79376    * functions, or rejected by a thrown exception in resolver
79377    */
79378   Q.Promise = promise; // ES6
79379   Q.promise = promise;
79380   function promise(resolver) {
79381       if (typeof resolver !== "function") {
79382           throw new TypeError("resolver must be a function.");
79383       }
79384       var deferred = defer();
79385       try {
79386           resolver(deferred.resolve, deferred.reject, deferred.notify);
79387       } catch (reason) {
79388           deferred.reject(reason);
79389       }
79390       return deferred.promise;
79391   }
79392
79393   promise.race = race; // ES6
79394   promise.all = all; // ES6
79395   promise.reject = reject; // ES6
79396   promise.resolve = Q; // ES6
79397
79398   // XXX experimental.  This method is a way to denote that a local value is
79399   // serializable and should be immediately dispatched to a remote upon request,
79400   // instead of passing a reference.
79401   Q.passByCopy = function (object) {
79402       //freeze(object);
79403       //passByCopies.set(object, true);
79404       return object;
79405   };
79406
79407   Promise.prototype.passByCopy = function () {
79408       //freeze(object);
79409       //passByCopies.set(object, true);
79410       return this;
79411   };
79412
79413   /**
79414    * If two promises eventually fulfill to the same value, promises that value,
79415    * but otherwise rejects.
79416    * @param x {Any*}
79417    * @param y {Any*}
79418    * @returns {Any*} a promise for x and y if they are the same, but a rejection
79419    * otherwise.
79420    *
79421    */
79422   Q.join = function (x, y) {
79423       return Q(x).join(y);
79424   };
79425
79426   Promise.prototype.join = function (that) {
79427       return Q([this, that]).spread(function (x, y) {
79428           if (x === y) {
79429               // TODO: "===" should be Object.is or equiv
79430               return x;
79431           } else {
79432               throw new Error("Q can't join: not the same: " + x + " " + y);
79433           }
79434       });
79435   };
79436
79437   /**
79438    * Returns a promise for the first of an array of promises to become settled.
79439    * @param answers {Array[Any*]} promises to race
79440    * @returns {Any*} the first promise to be settled
79441    */
79442   Q.race = race;
79443   function race(answerPs) {
79444       return promise(function (resolve, reject) {
79445           // Switch to this once we can assume at least ES5
79446           // answerPs.forEach(function (answerP) {
79447           //     Q(answerP).then(resolve, reject);
79448           // });
79449           // Use this in the meantime
79450           for (var i = 0, len = answerPs.length; i < len; i++) {
79451               Q(answerPs[i]).then(resolve, reject);
79452           }
79453       });
79454   }
79455
79456   Promise.prototype.race = function () {
79457       return this.then(Q.race);
79458   };
79459
79460   /**
79461    * Constructs a Promise with a promise descriptor object and optional fallback
79462    * function.  The descriptor contains methods like when(rejected), get(name),
79463    * set(name, value), post(name, args), and delete(name), which all
79464    * return either a value, a promise for a value, or a rejection.  The fallback
79465    * accepts the operation name, a resolver, and any further arguments that would
79466    * have been forwarded to the appropriate method above had a method been
79467    * provided with the proper name.  The API makes no guarantees about the nature
79468    * of the returned object, apart from that it is usable whereever promises are
79469    * bought and sold.
79470    */
79471   Q.makePromise = Promise;
79472   function Promise(descriptor, fallback, inspect) {
79473       if (fallback === void 0) {
79474           fallback = function (op) {
79475               return reject(new Error(
79476                   "Promise does not support operation: " + op
79477               ));
79478           };
79479       }
79480       if (inspect === void 0) {
79481           inspect = function () {
79482               return {state: "unknown"};
79483           };
79484       }
79485
79486       var promise = object_create(Promise.prototype);
79487
79488       promise.promiseDispatch = function (resolve, op, args) {
79489           var result;
79490           try {
79491               if (descriptor[op]) {
79492                   result = descriptor[op].apply(promise, args);
79493               } else {
79494                   result = fallback.call(promise, op, args);
79495               }
79496           } catch (exception) {
79497               result = reject(exception);
79498           }
79499           if (resolve) {
79500               resolve(result);
79501           }
79502       };
79503
79504       promise.inspect = inspect;
79505
79506       // XXX deprecated `valueOf` and `exception` support
79507       if (inspect) {
79508           var inspected = inspect();
79509           if (inspected.state === "rejected") {
79510               promise.exception = inspected.reason;
79511           }
79512
79513           promise.valueOf = function () {
79514               var inspected = inspect();
79515               if (inspected.state === "pending" ||
79516                   inspected.state === "rejected") {
79517                   return promise;
79518               }
79519               return inspected.value;
79520           };
79521       }
79522
79523       return promise;
79524   }
79525
79526   Promise.prototype.toString = function () {
79527       return "[object Promise]";
79528   };
79529
79530   Promise.prototype.then = function (fulfilled, rejected, progressed) {
79531       var self = this;
79532       var deferred = defer();
79533       var done = false;   // ensure the untrusted promise makes at most a
79534                           // single call to one of the callbacks
79535
79536       function _fulfilled(value) {
79537           try {
79538               return typeof fulfilled === "function" ? fulfilled(value) : value;
79539           } catch (exception) {
79540               return reject(exception);
79541           }
79542       }
79543
79544       function _rejected(exception) {
79545           if (typeof rejected === "function") {
79546               makeStackTraceLong(exception, self);
79547               try {
79548                   return rejected(exception);
79549               } catch (newException) {
79550                   return reject(newException);
79551               }
79552           }
79553           return reject(exception);
79554       }
79555
79556       function _progressed(value) {
79557           return typeof progressed === "function" ? progressed(value) : value;
79558       }
79559
79560       Q.nextTick(function () {
79561           self.promiseDispatch(function (value) {
79562               if (done) {
79563                   return;
79564               }
79565               done = true;
79566
79567               deferred.resolve(_fulfilled(value));
79568           }, "when", [function (exception) {
79569               if (done) {
79570                   return;
79571               }
79572               done = true;
79573
79574               deferred.resolve(_rejected(exception));
79575           }]);
79576       });
79577
79578       // Progress propagator need to be attached in the current tick.
79579       self.promiseDispatch(void 0, "when", [void 0, function (value) {
79580           var newValue;
79581           var threw = false;
79582           try {
79583               newValue = _progressed(value);
79584           } catch (e) {
79585               threw = true;
79586               if (Q.onerror) {
79587                   Q.onerror(e);
79588               } else {
79589                   throw e;
79590               }
79591           }
79592
79593           if (!threw) {
79594               deferred.notify(newValue);
79595           }
79596       }]);
79597
79598       return deferred.promise;
79599   };
79600
79601   Q.tap = function (promise, callback) {
79602       return Q(promise).tap(callback);
79603   };
79604
79605   /**
79606    * Works almost like "finally", but not called for rejections.
79607    * Original resolution value is passed through callback unaffected.
79608    * Callback may return a promise that will be awaited for.
79609    * @param {Function} callback
79610    * @returns {Q.Promise}
79611    * @example
79612    * doSomething()
79613    *   .then(...)
79614    *   .tap(console.log)
79615    *   .then(...);
79616    */
79617   Promise.prototype.tap = function (callback) {
79618       callback = Q(callback);
79619
79620       return this.then(function (value) {
79621           return callback.fcall(value).thenResolve(value);
79622       });
79623   };
79624
79625   /**
79626    * Registers an observer on a promise.
79627    *
79628    * Guarantees:
79629    *
79630    * 1. that fulfilled and rejected will be called only once.
79631    * 2. that either the fulfilled callback or the rejected callback will be
79632    *    called, but not both.
79633    * 3. that fulfilled and rejected will not be called in this turn.
79634    *
79635    * @param value      promise or immediate reference to observe
79636    * @param fulfilled  function to be called with the fulfilled value
79637    * @param rejected   function to be called with the rejection exception
79638    * @param progressed function to be called on any progress notifications
79639    * @return promise for the return value from the invoked callback
79640    */
79641   Q.when = when;
79642   function when(value, fulfilled, rejected, progressed) {
79643       return Q(value).then(fulfilled, rejected, progressed);
79644   }
79645
79646   Promise.prototype.thenResolve = function (value) {
79647       return this.then(function () { return value; });
79648   };
79649
79650   Q.thenResolve = function (promise, value) {
79651       return Q(promise).thenResolve(value);
79652   };
79653
79654   Promise.prototype.thenReject = function (reason) {
79655       return this.then(function () { throw reason; });
79656   };
79657
79658   Q.thenReject = function (promise, reason) {
79659       return Q(promise).thenReject(reason);
79660   };
79661
79662   /**
79663    * If an object is not a promise, it is as "near" as possible.
79664    * If a promise is rejected, it is as "near" as possible too.
79665    * If it’s a fulfilled promise, the fulfillment value is nearer.
79666    * If it’s a deferred promise and the deferred has been resolved, the
79667    * resolution is "nearer".
79668    * @param object
79669    * @returns most resolved (nearest) form of the object
79670    */
79671
79672   // XXX should we re-do this?
79673   Q.nearer = nearer;
79674   function nearer(value) {
79675       if (isPromise(value)) {
79676           var inspected = value.inspect();
79677           if (inspected.state === "fulfilled") {
79678               return inspected.value;
79679           }
79680       }
79681       return value;
79682   }
79683
79684   /**
79685    * @returns whether the given object is a promise.
79686    * Otherwise it is a fulfilled value.
79687    */
79688   Q.isPromise = isPromise;
79689   function isPromise(object) {
79690       return object instanceof Promise;
79691   }
79692
79693   Q.isPromiseAlike = isPromiseAlike;
79694   function isPromiseAlike(object) {
79695       return isObject(object) && typeof object.then === "function";
79696   }
79697
79698   /**
79699    * @returns whether the given object is a pending promise, meaning not
79700    * fulfilled or rejected.
79701    */
79702   Q.isPending = isPending;
79703   function isPending(object) {
79704       return isPromise(object) && object.inspect().state === "pending";
79705   }
79706
79707   Promise.prototype.isPending = function () {
79708       return this.inspect().state === "pending";
79709   };
79710
79711   /**
79712    * @returns whether the given object is a value or fulfilled
79713    * promise.
79714    */
79715   Q.isFulfilled = isFulfilled;
79716   function isFulfilled(object) {
79717       return !isPromise(object) || object.inspect().state === "fulfilled";
79718   }
79719
79720   Promise.prototype.isFulfilled = function () {
79721       return this.inspect().state === "fulfilled";
79722   };
79723
79724   /**
79725    * @returns whether the given object is a rejected promise.
79726    */
79727   Q.isRejected = isRejected;
79728   function isRejected(object) {
79729       return isPromise(object) && object.inspect().state === "rejected";
79730   }
79731
79732   Promise.prototype.isRejected = function () {
79733       return this.inspect().state === "rejected";
79734   };
79735
79736   //// BEGIN UNHANDLED REJECTION TRACKING
79737
79738   // This promise library consumes exceptions thrown in handlers so they can be
79739   // handled by a subsequent promise.  The exceptions get added to this array when
79740   // they are created, and removed when they are handled.  Note that in ES6 or
79741   // shimmed environments, this would naturally be a `Set`.
79742   var unhandledReasons = [];
79743   var unhandledRejections = [];
79744   var reportedUnhandledRejections = [];
79745   var trackUnhandledRejections = true;
79746
79747   function resetUnhandledRejections() {
79748       unhandledReasons.length = 0;
79749       unhandledRejections.length = 0;
79750
79751       if (!trackUnhandledRejections) {
79752           trackUnhandledRejections = true;
79753       }
79754   }
79755
79756   function trackRejection(promise, reason) {
79757       if (!trackUnhandledRejections) {
79758           return;
79759       }
79760       if (typeof process === "object" && typeof process.emit === "function") {
79761           Q.nextTick.runAfter(function () {
79762               if (array_indexOf(unhandledRejections, promise) !== -1) {
79763                   process.emit("unhandledRejection", reason, promise);
79764                   reportedUnhandledRejections.push(promise);
79765               }
79766           });
79767       }
79768
79769       unhandledRejections.push(promise);
79770       if (reason && typeof reason.stack !== "undefined") {
79771           unhandledReasons.push(reason.stack);
79772       } else {
79773           unhandledReasons.push("(no stack) " + reason);
79774       }
79775   }
79776
79777   function untrackRejection(promise) {
79778       if (!trackUnhandledRejections) {
79779           return;
79780       }
79781
79782       var at = array_indexOf(unhandledRejections, promise);
79783       if (at !== -1) {
79784           if (typeof process === "object" && typeof process.emit === "function") {
79785               Q.nextTick.runAfter(function () {
79786                   var atReport = array_indexOf(reportedUnhandledRejections, promise);
79787                   if (atReport !== -1) {
79788                       process.emit("rejectionHandled", unhandledReasons[at], promise);
79789                       reportedUnhandledRejections.splice(atReport, 1);
79790                   }
79791               });
79792           }
79793           unhandledRejections.splice(at, 1);
79794           unhandledReasons.splice(at, 1);
79795       }
79796   }
79797
79798   Q.resetUnhandledRejections = resetUnhandledRejections;
79799
79800   Q.getUnhandledReasons = function () {
79801       // Make a copy so that consumers can't interfere with our internal state.
79802       return unhandledReasons.slice();
79803   };
79804
79805   Q.stopUnhandledRejectionTracking = function () {
79806       resetUnhandledRejections();
79807       trackUnhandledRejections = false;
79808   };
79809
79810   resetUnhandledRejections();
79811
79812   //// END UNHANDLED REJECTION TRACKING
79813
79814   /**
79815    * Constructs a rejected promise.
79816    * @param reason value describing the failure
79817    */
79818   Q.reject = reject;
79819   function reject(reason) {
79820       var rejection = Promise({
79821           "when": function (rejected) {
79822               // note that the error has been handled
79823               if (rejected) {
79824                   untrackRejection(this);
79825               }
79826               return rejected ? rejected(reason) : this;
79827           }
79828       }, function fallback() {
79829           return this;
79830       }, function inspect() {
79831           return { state: "rejected", reason: reason };
79832       });
79833
79834       // Note that the reason has not been handled.
79835       trackRejection(rejection, reason);
79836
79837       return rejection;
79838   }
79839
79840   /**
79841    * Constructs a fulfilled promise for an immediate reference.
79842    * @param value immediate reference
79843    */
79844   Q.fulfill = fulfill;
79845   function fulfill(value) {
79846       return Promise({
79847           "when": function () {
79848               return value;
79849           },
79850           "get": function (name) {
79851               return value[name];
79852           },
79853           "set": function (name, rhs) {
79854               value[name] = rhs;
79855           },
79856           "delete": function (name) {
79857               delete value[name];
79858           },
79859           "post": function (name, args) {
79860               // Mark Miller proposes that post with no name should apply a
79861               // promised function.
79862               if (name === null || name === void 0) {
79863                   return value.apply(void 0, args);
79864               } else {
79865                   return value[name].apply(value, args);
79866               }
79867           },
79868           "apply": function (thisp, args) {
79869               return value.apply(thisp, args);
79870           },
79871           "keys": function () {
79872               return object_keys(value);
79873           }
79874       }, void 0, function inspect() {
79875           return { state: "fulfilled", value: value };
79876       });
79877   }
79878
79879   /**
79880    * Converts thenables to Q promises.
79881    * @param promise thenable promise
79882    * @returns a Q promise
79883    */
79884   function coerce(promise) {
79885       var deferred = defer();
79886       Q.nextTick(function () {
79887           try {
79888               promise.then(deferred.resolve, deferred.reject, deferred.notify);
79889           } catch (exception) {
79890               deferred.reject(exception);
79891           }
79892       });
79893       return deferred.promise;
79894   }
79895
79896   /**
79897    * Annotates an object such that it will never be
79898    * transferred away from this process over any promise
79899    * communication channel.
79900    * @param object
79901    * @returns promise a wrapping of that object that
79902    * additionally responds to the "isDef" message
79903    * without a rejection.
79904    */
79905   Q.master = master;
79906   function master(object) {
79907       return Promise({
79908           "isDef": function () {}
79909       }, function fallback(op, args) {
79910           return dispatch(object, op, args);
79911       }, function () {
79912           return Q(object).inspect();
79913       });
79914   }
79915
79916   /**
79917    * Spreads the values of a promised array of arguments into the
79918    * fulfillment callback.
79919    * @param fulfilled callback that receives variadic arguments from the
79920    * promised array
79921    * @param rejected callback that receives the exception if the promise
79922    * is rejected.
79923    * @returns a promise for the return value or thrown exception of
79924    * either callback.
79925    */
79926   Q.spread = spread;
79927   function spread(value, fulfilled, rejected) {
79928       return Q(value).spread(fulfilled, rejected);
79929   }
79930
79931   Promise.prototype.spread = function (fulfilled, rejected) {
79932       return this.all().then(function (array) {
79933           return fulfilled.apply(void 0, array);
79934       }, rejected);
79935   };
79936
79937   /**
79938    * The async function is a decorator for generator functions, turning
79939    * them into asynchronous generators.  Although generators are only part
79940    * of the newest ECMAScript 6 drafts, this code does not cause syntax
79941    * errors in older engines.  This code should continue to work and will
79942    * in fact improve over time as the language improves.
79943    *
79944    * ES6 generators are currently part of V8 version 3.19 with the
79945    * --harmony-generators runtime flag enabled.  SpiderMonkey has had them
79946    * for longer, but under an older Python-inspired form.  This function
79947    * works on both kinds of generators.
79948    *
79949    * Decorates a generator function such that:
79950    *  - it may yield promises
79951    *  - execution will continue when that promise is fulfilled
79952    *  - the value of the yield expression will be the fulfilled value
79953    *  - it returns a promise for the return value (when the generator
79954    *    stops iterating)
79955    *  - the decorated function returns a promise for the return value
79956    *    of the generator or the first rejected promise among those
79957    *    yielded.
79958    *  - if an error is thrown in the generator, it propagates through
79959    *    every following yield until it is caught, or until it escapes
79960    *    the generator function altogether, and is translated into a
79961    *    rejection for the promise returned by the decorated generator.
79962    */
79963   Q.async = async;
79964   function async(makeGenerator) {
79965       return function () {
79966           // when verb is "send", arg is a value
79967           // when verb is "throw", arg is an exception
79968           function continuer(verb, arg) {
79969               var result;
79970
79971               // Until V8 3.19 / Chromium 29 is released, SpiderMonkey is the only
79972               // engine that has a deployed base of browsers that support generators.
79973               // However, SM's generators use the Python-inspired semantics of
79974               // outdated ES6 drafts.  We would like to support ES6, but we'd also
79975               // like to make it possible to use generators in deployed browsers, so
79976               // we also support Python-style generators.  At some point we can remove
79977               // this block.
79978
79979               if (typeof StopIteration === "undefined") {
79980                   // ES6 Generators
79981                   try {
79982                       result = generator[verb](arg);
79983                   } catch (exception) {
79984                       return reject(exception);
79985                   }
79986                   if (result.done) {
79987                       return Q(result.value);
79988                   } else {
79989                       return when(result.value, callback, errback);
79990                   }
79991               } else {
79992                   // SpiderMonkey Generators
79993                   // FIXME: Remove this case when SM does ES6 generators.
79994                   try {
79995                       result = generator[verb](arg);
79996                   } catch (exception) {
79997                       if (isStopIteration(exception)) {
79998                           return Q(exception.value);
79999                       } else {
80000                           return reject(exception);
80001                       }
80002                   }
80003                   return when(result, callback, errback);
80004               }
80005           }
80006           var generator = makeGenerator.apply(this, arguments);
80007           var callback = continuer.bind(continuer, "next");
80008           var errback = continuer.bind(continuer, "throw");
80009           return callback();
80010       };
80011   }
80012
80013   /**
80014    * The spawn function is a small wrapper around async that immediately
80015    * calls the generator and also ends the promise chain, so that any
80016    * unhandled errors are thrown instead of forwarded to the error
80017    * handler. This is useful because it's extremely common to run
80018    * generators at the top-level to work with libraries.
80019    */
80020   Q.spawn = spawn;
80021   function spawn(makeGenerator) {
80022       Q.done(Q.async(makeGenerator)());
80023   }
80024
80025   // FIXME: Remove this interface once ES6 generators are in SpiderMonkey.
80026   /**
80027    * Throws a ReturnValue exception to stop an asynchronous generator.
80028    *
80029    * This interface is a stop-gap measure to support generator return
80030    * values in older Firefox/SpiderMonkey.  In browsers that support ES6
80031    * generators like Chromium 29, just use "return" in your generator
80032    * functions.
80033    *
80034    * @param value the return value for the surrounding generator
80035    * @throws ReturnValue exception with the value.
80036    * @example
80037    * // ES6 style
80038    * Q.async(function* () {
80039    *      var foo = yield getFooPromise();
80040    *      var bar = yield getBarPromise();
80041    *      return foo + bar;
80042    * })
80043    * // Older SpiderMonkey style
80044    * Q.async(function () {
80045    *      var foo = yield getFooPromise();
80046    *      var bar = yield getBarPromise();
80047    *      Q.return(foo + bar);
80048    * })
80049    */
80050   Q["return"] = _return;
80051   function _return(value) {
80052       throw new QReturnValue(value);
80053   }
80054
80055   /**
80056    * The promised function decorator ensures that any promise arguments
80057    * are settled and passed as values (`this` is also settled and passed
80058    * as a value).  It will also ensure that the result of a function is
80059    * always a promise.
80060    *
80061    * @example
80062    * var add = Q.promised(function (a, b) {
80063    *     return a + b;
80064    * });
80065    * add(Q(a), Q(B));
80066    *
80067    * @param {function} callback The function to decorate
80068    * @returns {function} a function that has been decorated.
80069    */
80070   Q.promised = promised;
80071   function promised(callback) {
80072       return function () {
80073           return spread([this, all(arguments)], function (self, args) {
80074               return callback.apply(self, args);
80075           });
80076       };
80077   }
80078
80079   /**
80080    * sends a message to a value in a future turn
80081    * @param object* the recipient
80082    * @param op the name of the message operation, e.g., "when",
80083    * @param args further arguments to be forwarded to the operation
80084    * @returns result {Promise} a promise for the result of the operation
80085    */
80086   Q.dispatch = dispatch;
80087   function dispatch(object, op, args) {
80088       return Q(object).dispatch(op, args);
80089   }
80090
80091   Promise.prototype.dispatch = function (op, args) {
80092       var self = this;
80093       var deferred = defer();
80094       Q.nextTick(function () {
80095           self.promiseDispatch(deferred.resolve, op, args);
80096       });
80097       return deferred.promise;
80098   };
80099
80100   /**
80101    * Gets the value of a property in a future turn.
80102    * @param object    promise or immediate reference for target object
80103    * @param name      name of property to get
80104    * @return promise for the property value
80105    */
80106   Q.get = function (object, key) {
80107       return Q(object).dispatch("get", [key]);
80108   };
80109
80110   Promise.prototype.get = function (key) {
80111       return this.dispatch("get", [key]);
80112   };
80113
80114   /**
80115    * Sets the value of a property in a future turn.
80116    * @param object    promise or immediate reference for object object
80117    * @param name      name of property to set
80118    * @param value     new value of property
80119    * @return promise for the return value
80120    */
80121   Q.set = function (object, key, value) {
80122       return Q(object).dispatch("set", [key, value]);
80123   };
80124
80125   Promise.prototype.set = function (key, value) {
80126       return this.dispatch("set", [key, value]);
80127   };
80128
80129   /**
80130    * Deletes a property in a future turn.
80131    * @param object    promise or immediate reference for target object
80132    * @param name      name of property to delete
80133    * @return promise for the return value
80134    */
80135   Q.del = // XXX legacy
80136   Q["delete"] = function (object, key) {
80137       return Q(object).dispatch("delete", [key]);
80138   };
80139
80140   Promise.prototype.del = // XXX legacy
80141   Promise.prototype["delete"] = function (key) {
80142       return this.dispatch("delete", [key]);
80143   };
80144
80145   /**
80146    * Invokes a method in a future turn.
80147    * @param object    promise or immediate reference for target object
80148    * @param name      name of method to invoke
80149    * @param value     a value to post, typically an array of
80150    *                  invocation arguments for promises that
80151    *                  are ultimately backed with `resolve` values,
80152    *                  as opposed to those backed with URLs
80153    *                  wherein the posted value can be any
80154    *                  JSON serializable object.
80155    * @return promise for the return value
80156    */
80157   // bound locally because it is used by other methods
80158   Q.mapply = // XXX As proposed by "Redsandro"
80159   Q.post = function (object, name, args) {
80160       return Q(object).dispatch("post", [name, args]);
80161   };
80162
80163   Promise.prototype.mapply = // XXX As proposed by "Redsandro"
80164   Promise.prototype.post = function (name, args) {
80165       return this.dispatch("post", [name, args]);
80166   };
80167
80168   /**
80169    * Invokes a method in a future turn.
80170    * @param object    promise or immediate reference for target object
80171    * @param name      name of method to invoke
80172    * @param ...args   array of invocation arguments
80173    * @return promise for the return value
80174    */
80175   Q.send = // XXX Mark Miller's proposed parlance
80176   Q.mcall = // XXX As proposed by "Redsandro"
80177   Q.invoke = function (object, name /*...args*/) {
80178       return Q(object).dispatch("post", [name, array_slice(arguments, 2)]);
80179   };
80180
80181   Promise.prototype.send = // XXX Mark Miller's proposed parlance
80182   Promise.prototype.mcall = // XXX As proposed by "Redsandro"
80183   Promise.prototype.invoke = function (name /*...args*/) {
80184       return this.dispatch("post", [name, array_slice(arguments, 1)]);
80185   };
80186
80187   /**
80188    * Applies the promised function in a future turn.
80189    * @param object    promise or immediate reference for target function
80190    * @param args      array of application arguments
80191    */
80192   Q.fapply = function (object, args) {
80193       return Q(object).dispatch("apply", [void 0, args]);
80194   };
80195
80196   Promise.prototype.fapply = function (args) {
80197       return this.dispatch("apply", [void 0, args]);
80198   };
80199
80200   /**
80201    * Calls the promised function in a future turn.
80202    * @param object    promise or immediate reference for target function
80203    * @param ...args   array of application arguments
80204    */
80205   Q["try"] =
80206   Q.fcall = function (object /* ...args*/) {
80207       return Q(object).dispatch("apply", [void 0, array_slice(arguments, 1)]);
80208   };
80209
80210   Promise.prototype.fcall = function (/*...args*/) {
80211       return this.dispatch("apply", [void 0, array_slice(arguments)]);
80212   };
80213
80214   /**
80215    * Binds the promised function, transforming return values into a fulfilled
80216    * promise and thrown errors into a rejected one.
80217    * @param object    promise or immediate reference for target function
80218    * @param ...args   array of application arguments
80219    */
80220   Q.fbind = function (object /*...args*/) {
80221       var promise = Q(object);
80222       var args = array_slice(arguments, 1);
80223       return function fbound() {
80224           return promise.dispatch("apply", [
80225               this,
80226               args.concat(array_slice(arguments))
80227           ]);
80228       };
80229   };
80230   Promise.prototype.fbind = function (/*...args*/) {
80231       var promise = this;
80232       var args = array_slice(arguments);
80233       return function fbound() {
80234           return promise.dispatch("apply", [
80235               this,
80236               args.concat(array_slice(arguments))
80237           ]);
80238       };
80239   };
80240
80241   /**
80242    * Requests the names of the owned properties of a promised
80243    * object in a future turn.
80244    * @param object    promise or immediate reference for target object
80245    * @return promise for the keys of the eventually settled object
80246    */
80247   Q.keys = function (object) {
80248       return Q(object).dispatch("keys", []);
80249   };
80250
80251   Promise.prototype.keys = function () {
80252       return this.dispatch("keys", []);
80253   };
80254
80255   /**
80256    * Turns an array of promises into a promise for an array.  If any of
80257    * the promises gets rejected, the whole array is rejected immediately.
80258    * @param {Array*} an array (or promise for an array) of values (or
80259    * promises for values)
80260    * @returns a promise for an array of the corresponding values
80261    */
80262   // By Mark Miller
80263   // http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled
80264   Q.all = all;
80265   function all(promises) {
80266       return when(promises, function (promises) {
80267           var pendingCount = 0;
80268           var deferred = defer();
80269           array_reduce(promises, function (undefined, promise, index) {
80270               var snapshot;
80271               if (
80272                   isPromise(promise) &&
80273                   (snapshot = promise.inspect()).state === "fulfilled"
80274               ) {
80275                   promises[index] = snapshot.value;
80276               } else {
80277                   ++pendingCount;
80278                   when(
80279                       promise,
80280                       function (value) {
80281                           promises[index] = value;
80282                           if (--pendingCount === 0) {
80283                               deferred.resolve(promises);
80284                           }
80285                       },
80286                       deferred.reject,
80287                       function (progress) {
80288                           deferred.notify({ index: index, value: progress });
80289                       }
80290                   );
80291               }
80292           }, void 0);
80293           if (pendingCount === 0) {
80294               deferred.resolve(promises);
80295           }
80296           return deferred.promise;
80297       });
80298   }
80299
80300   Promise.prototype.all = function () {
80301       return all(this);
80302   };
80303
80304   /**
80305    * Returns the first resolved promise of an array. Prior rejected promises are
80306    * ignored.  Rejects only if all promises are rejected.
80307    * @param {Array*} an array containing values or promises for values
80308    * @returns a promise fulfilled with the value of the first resolved promise,
80309    * or a rejected promise if all promises are rejected.
80310    */
80311   Q.any = any;
80312
80313   function any(promises) {
80314       if (promises.length === 0) {
80315           return Q.resolve();
80316       }
80317
80318       var deferred = Q.defer();
80319       var pendingCount = 0;
80320       array_reduce(promises, function (prev, current, index) {
80321           var promise = promises[index];
80322
80323           pendingCount++;
80324
80325           when(promise, onFulfilled, onRejected, onProgress);
80326           function onFulfilled(result) {
80327               deferred.resolve(result);
80328           }
80329           function onRejected(err) {
80330               pendingCount--;
80331               if (pendingCount === 0) {
80332                   var rejection = err || new Error("" + err);
80333
80334                   rejection.message = ("Q can't get fulfillment value from any promise, all " +
80335                       "promises were rejected. Last error message: " + rejection.message);
80336
80337                   deferred.reject(rejection);
80338               }
80339           }
80340           function onProgress(progress) {
80341               deferred.notify({
80342                   index: index,
80343                   value: progress
80344               });
80345           }
80346       }, undefined);
80347
80348       return deferred.promise;
80349   }
80350
80351   Promise.prototype.any = function () {
80352       return any(this);
80353   };
80354
80355   /**
80356    * Waits for all promises to be settled, either fulfilled or
80357    * rejected.  This is distinct from `all` since that would stop
80358    * waiting at the first rejection.  The promise returned by
80359    * `allResolved` will never be rejected.
80360    * @param promises a promise for an array (or an array) of promises
80361    * (or values)
80362    * @return a promise for an array of promises
80363    */
80364   Q.allResolved = deprecate(allResolved, "allResolved", "allSettled");
80365   function allResolved(promises) {
80366       return when(promises, function (promises) {
80367           promises = array_map(promises, Q);
80368           return when(all(array_map(promises, function (promise) {
80369               return when(promise, noop, noop);
80370           })), function () {
80371               return promises;
80372           });
80373       });
80374   }
80375
80376   Promise.prototype.allResolved = function () {
80377       return allResolved(this);
80378   };
80379
80380   /**
80381    * @see Promise#allSettled
80382    */
80383   Q.allSettled = allSettled;
80384   function allSettled(promises) {
80385       return Q(promises).allSettled();
80386   }
80387
80388   /**
80389    * Turns an array of promises into a promise for an array of their states (as
80390    * returned by `inspect`) when they have all settled.
80391    * @param {Array[Any*]} values an array (or promise for an array) of values (or
80392    * promises for values)
80393    * @returns {Array[State]} an array of states for the respective values.
80394    */
80395   Promise.prototype.allSettled = function () {
80396       return this.then(function (promises) {
80397           return all(array_map(promises, function (promise) {
80398               promise = Q(promise);
80399               function regardless() {
80400                   return promise.inspect();
80401               }
80402               return promise.then(regardless, regardless);
80403           }));
80404       });
80405   };
80406
80407   /**
80408    * Captures the failure of a promise, giving an oportunity to recover
80409    * with a callback.  If the given promise is fulfilled, the returned
80410    * promise is fulfilled.
80411    * @param {Any*} promise for something
80412    * @param {Function} callback to fulfill the returned promise if the
80413    * given promise is rejected
80414    * @returns a promise for the return value of the callback
80415    */
80416   Q.fail = // XXX legacy
80417   Q["catch"] = function (object, rejected) {
80418       return Q(object).then(void 0, rejected);
80419   };
80420
80421   Promise.prototype.fail = // XXX legacy
80422   Promise.prototype["catch"] = function (rejected) {
80423       return this.then(void 0, rejected);
80424   };
80425
80426   /**
80427    * Attaches a listener that can respond to progress notifications from a
80428    * promise's originating deferred. This listener receives the exact arguments
80429    * passed to ``deferred.notify``.
80430    * @param {Any*} promise for something
80431    * @param {Function} callback to receive any progress notifications
80432    * @returns the given promise, unchanged
80433    */
80434   Q.progress = progress;
80435   function progress(object, progressed) {
80436       return Q(object).then(void 0, void 0, progressed);
80437   }
80438
80439   Promise.prototype.progress = function (progressed) {
80440       return this.then(void 0, void 0, progressed);
80441   };
80442
80443   /**
80444    * Provides an opportunity to observe the settling of a promise,
80445    * regardless of whether the promise is fulfilled or rejected.  Forwards
80446    * the resolution to the returned promise when the callback is done.
80447    * The callback can return a promise to defer completion.
80448    * @param {Any*} promise
80449    * @param {Function} callback to observe the resolution of the given
80450    * promise, takes no arguments.
80451    * @returns a promise for the resolution of the given promise when
80452    * ``fin`` is done.
80453    */
80454   Q.fin = // XXX legacy
80455   Q["finally"] = function (object, callback) {
80456       return Q(object)["finally"](callback);
80457   };
80458
80459   Promise.prototype.fin = // XXX legacy
80460   Promise.prototype["finally"] = function (callback) {
80461       if (!callback || typeof callback.apply !== "function") {
80462           throw new Error("Q can't apply finally callback");
80463       }
80464       callback = Q(callback);
80465       return this.then(function (value) {
80466           return callback.fcall().then(function () {
80467               return value;
80468           });
80469       }, function (reason) {
80470           // TODO attempt to recycle the rejection with "this".
80471           return callback.fcall().then(function () {
80472               throw reason;
80473           });
80474       });
80475   };
80476
80477   /**
80478    * Terminates a chain of promises, forcing rejections to be
80479    * thrown as exceptions.
80480    * @param {Any*} promise at the end of a chain of promises
80481    * @returns nothing
80482    */
80483   Q.done = function (object, fulfilled, rejected, progress) {
80484       return Q(object).done(fulfilled, rejected, progress);
80485   };
80486
80487   Promise.prototype.done = function (fulfilled, rejected, progress) {
80488       var onUnhandledError = function (error) {
80489           // forward to a future turn so that ``when``
80490           // does not catch it and turn it into a rejection.
80491           Q.nextTick(function () {
80492               makeStackTraceLong(error, promise);
80493               if (Q.onerror) {
80494                   Q.onerror(error);
80495               } else {
80496                   throw error;
80497               }
80498           });
80499       };
80500
80501       // Avoid unnecessary `nextTick`ing via an unnecessary `when`.
80502       var promise = fulfilled || rejected || progress ?
80503           this.then(fulfilled, rejected, progress) :
80504           this;
80505
80506       if (typeof process === "object" && process && process.domain) {
80507           onUnhandledError = process.domain.bind(onUnhandledError);
80508       }
80509
80510       promise.then(void 0, onUnhandledError);
80511   };
80512
80513   /**
80514    * Causes a promise to be rejected if it does not get fulfilled before
80515    * some milliseconds time out.
80516    * @param {Any*} promise
80517    * @param {Number} milliseconds timeout
80518    * @param {Any*} custom error message or Error object (optional)
80519    * @returns a promise for the resolution of the given promise if it is
80520    * fulfilled before the timeout, otherwise rejected.
80521    */
80522   Q.timeout = function (object, ms, error) {
80523       return Q(object).timeout(ms, error);
80524   };
80525
80526   Promise.prototype.timeout = function (ms, error) {
80527       var deferred = defer();
80528       var timeoutId = setTimeout(function () {
80529           if (!error || "string" === typeof error) {
80530               error = new Error(error || "Timed out after " + ms + " ms");
80531               error.code = "ETIMEDOUT";
80532           }
80533           deferred.reject(error);
80534       }, ms);
80535
80536       this.then(function (value) {
80537           clearTimeout(timeoutId);
80538           deferred.resolve(value);
80539       }, function (exception) {
80540           clearTimeout(timeoutId);
80541           deferred.reject(exception);
80542       }, deferred.notify);
80543
80544       return deferred.promise;
80545   };
80546
80547   /**
80548    * Returns a promise for the given value (or promised value), some
80549    * milliseconds after it resolved. Passes rejections immediately.
80550    * @param {Any*} promise
80551    * @param {Number} milliseconds
80552    * @returns a promise for the resolution of the given promise after milliseconds
80553    * time has elapsed since the resolution of the given promise.
80554    * If the given promise rejects, that is passed immediately.
80555    */
80556   Q.delay = function (object, timeout) {
80557       if (timeout === void 0) {
80558           timeout = object;
80559           object = void 0;
80560       }
80561       return Q(object).delay(timeout);
80562   };
80563
80564   Promise.prototype.delay = function (timeout) {
80565       return this.then(function (value) {
80566           var deferred = defer();
80567           setTimeout(function () {
80568               deferred.resolve(value);
80569           }, timeout);
80570           return deferred.promise;
80571       });
80572   };
80573
80574   /**
80575    * Passes a continuation to a Node function, which is called with the given
80576    * arguments provided as an array, and returns a promise.
80577    *
80578    *      Q.nfapply(FS.readFile, [__filename])
80579    *      .then(function (content) {
80580    *      })
80581    *
80582    */
80583   Q.nfapply = function (callback, args) {
80584       return Q(callback).nfapply(args);
80585   };
80586
80587   Promise.prototype.nfapply = function (args) {
80588       var deferred = defer();
80589       var nodeArgs = array_slice(args);
80590       nodeArgs.push(deferred.makeNodeResolver());
80591       this.fapply(nodeArgs).fail(deferred.reject);
80592       return deferred.promise;
80593   };
80594
80595   /**
80596    * Passes a continuation to a Node function, which is called with the given
80597    * arguments provided individually, and returns a promise.
80598    * @example
80599    * Q.nfcall(FS.readFile, __filename)
80600    * .then(function (content) {
80601    * })
80602    *
80603    */
80604   Q.nfcall = function (callback /*...args*/) {
80605       var args = array_slice(arguments, 1);
80606       return Q(callback).nfapply(args);
80607   };
80608
80609   Promise.prototype.nfcall = function (/*...args*/) {
80610       var nodeArgs = array_slice(arguments);
80611       var deferred = defer();
80612       nodeArgs.push(deferred.makeNodeResolver());
80613       this.fapply(nodeArgs).fail(deferred.reject);
80614       return deferred.promise;
80615   };
80616
80617   /**
80618    * Wraps a NodeJS continuation passing function and returns an equivalent
80619    * version that returns a promise.
80620    * @example
80621    * Q.nfbind(FS.readFile, __filename)("utf-8")
80622    * .then(console.log)
80623    * .done()
80624    */
80625   Q.nfbind =
80626   Q.denodeify = function (callback /*...args*/) {
80627       if (callback === undefined) {
80628           throw new Error("Q can't wrap an undefined function");
80629       }
80630       var baseArgs = array_slice(arguments, 1);
80631       return function () {
80632           var nodeArgs = baseArgs.concat(array_slice(arguments));
80633           var deferred = defer();
80634           nodeArgs.push(deferred.makeNodeResolver());
80635           Q(callback).fapply(nodeArgs).fail(deferred.reject);
80636           return deferred.promise;
80637       };
80638   };
80639
80640   Promise.prototype.nfbind =
80641   Promise.prototype.denodeify = function (/*...args*/) {
80642       var args = array_slice(arguments);
80643       args.unshift(this);
80644       return Q.denodeify.apply(void 0, args);
80645   };
80646
80647   Q.nbind = function (callback, thisp /*...args*/) {
80648       var baseArgs = array_slice(arguments, 2);
80649       return function () {
80650           var nodeArgs = baseArgs.concat(array_slice(arguments));
80651           var deferred = defer();
80652           nodeArgs.push(deferred.makeNodeResolver());
80653           function bound() {
80654               return callback.apply(thisp, arguments);
80655           }
80656           Q(bound).fapply(nodeArgs).fail(deferred.reject);
80657           return deferred.promise;
80658       };
80659   };
80660
80661   Promise.prototype.nbind = function (/*thisp, ...args*/) {
80662       var args = array_slice(arguments, 0);
80663       args.unshift(this);
80664       return Q.nbind.apply(void 0, args);
80665   };
80666
80667   /**
80668    * Calls a method of a Node-style object that accepts a Node-style
80669    * callback with a given array of arguments, plus a provided callback.
80670    * @param object an object that has the named method
80671    * @param {String} name name of the method of object
80672    * @param {Array} args arguments to pass to the method; the callback
80673    * will be provided by Q and appended to these arguments.
80674    * @returns a promise for the value or error
80675    */
80676   Q.nmapply = // XXX As proposed by "Redsandro"
80677   Q.npost = function (object, name, args) {
80678       return Q(object).npost(name, args);
80679   };
80680
80681   Promise.prototype.nmapply = // XXX As proposed by "Redsandro"
80682   Promise.prototype.npost = function (name, args) {
80683       var nodeArgs = array_slice(args || []);
80684       var deferred = defer();
80685       nodeArgs.push(deferred.makeNodeResolver());
80686       this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
80687       return deferred.promise;
80688   };
80689
80690   /**
80691    * Calls a method of a Node-style object that accepts a Node-style
80692    * callback, forwarding the given variadic arguments, plus a provided
80693    * callback argument.
80694    * @param object an object that has the named method
80695    * @param {String} name name of the method of object
80696    * @param ...args arguments to pass to the method; the callback will
80697    * be provided by Q and appended to these arguments.
80698    * @returns a promise for the value or error
80699    */
80700   Q.nsend = // XXX Based on Mark Miller's proposed "send"
80701   Q.nmcall = // XXX Based on "Redsandro's" proposal
80702   Q.ninvoke = function (object, name /*...args*/) {
80703       var nodeArgs = array_slice(arguments, 2);
80704       var deferred = defer();
80705       nodeArgs.push(deferred.makeNodeResolver());
80706       Q(object).dispatch("post", [name, nodeArgs]).fail(deferred.reject);
80707       return deferred.promise;
80708   };
80709
80710   Promise.prototype.nsend = // XXX Based on Mark Miller's proposed "send"
80711   Promise.prototype.nmcall = // XXX Based on "Redsandro's" proposal
80712   Promise.prototype.ninvoke = function (name /*...args*/) {
80713       var nodeArgs = array_slice(arguments, 1);
80714       var deferred = defer();
80715       nodeArgs.push(deferred.makeNodeResolver());
80716       this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
80717       return deferred.promise;
80718   };
80719
80720   /**
80721    * If a function would like to support both Node continuation-passing-style and
80722    * promise-returning-style, it can end its internal promise chain with
80723    * `nodeify(nodeback)`, forwarding the optional nodeback argument.  If the user
80724    * elects to use a nodeback, the result will be sent there.  If they do not
80725    * pass a nodeback, they will receive the result promise.
80726    * @param object a result (or a promise for a result)
80727    * @param {Function} nodeback a Node.js-style callback
80728    * @returns either the promise or nothing
80729    */
80730   Q.nodeify = nodeify;
80731   function nodeify(object, nodeback) {
80732       return Q(object).nodeify(nodeback);
80733   }
80734
80735   Promise.prototype.nodeify = function (nodeback) {
80736       if (nodeback) {
80737           this.then(function (value) {
80738               Q.nextTick(function () {
80739                   nodeback(null, value);
80740               });
80741           }, function (error) {
80742               Q.nextTick(function () {
80743                   nodeback(error);
80744               });
80745           });
80746       } else {
80747           return this;
80748       }
80749   };
80750
80751   Q.noConflict = function() {
80752       throw new Error("Q.noConflict only works when Q is used as a global");
80753   };
80754
80755   // All code before this point will be filtered from stack traces.
80756   var qEndingLine = captureLine();
80757
80758   return Q;
80759
80760   });
80761   });
80762
80763   var bubbleApi = 'https://dev.virtualearth.net/mapcontrol/HumanScaleServices/GetBubbles.ashx?';
80764   var streetsideImagesApi = 'https://t.ssl.ak.tiles.virtualearth.net/tiles/';
80765   var bubbleAppKey = 'AuftgJsO0Xs8Ts4M1xZUQJQXJNsvmh3IV8DkNieCiy3tCwCUMq76-WpkrBtNAuEm';
80766   var pannellumViewerCSS = 'pannellum-streetside/pannellum.css';
80767   var pannellumViewerJS = 'pannellum-streetside/pannellum.js';
80768   var maxResults$2 = 2000;
80769   var tileZoom$2 = 16.5;
80770   var tiler$4 = utilTiler().zoomExtent([tileZoom$2, tileZoom$2]).skipNullIsland(true);
80771   var dispatch$5 = dispatch('loadedBubbles', 'viewerChanged');
80772   var minHfov = 10;         // zoom in degrees:  20, 10, 5
80773   var maxHfov = 90;         // zoom out degrees
80774   var defaultHfov = 45;
80775
80776   var _hires = false;
80777   var _resolution = 512;    // higher numbers are slower - 512, 1024, 2048, 4096
80778   var _currScene = 0;
80779   var _ssCache;
80780   var _pannellumViewer;
80781   var _sceneOptions;
80782   var _dataUrlArray = [];
80783
80784
80785   /**
80786    * abortRequest().
80787    */
80788   function abortRequest$4(i) {
80789       i.abort();
80790   }
80791
80792
80793   /**
80794    * localeTimeStamp().
80795    */
80796   function localeTimestamp(s) {
80797       if (!s) return null;
80798       var detected = utilDetect();
80799       var options = { day: 'numeric', month: 'short', year: 'numeric' };
80800       var d = new Date(s);
80801       if (isNaN(d.getTime())) return null;
80802       return d.toLocaleString(detected.locale, options);
80803   }
80804
80805
80806   /**
80807    * loadTiles() wraps the process of generating tiles and then fetching image points for each tile.
80808    */
80809   function loadTiles$2(which, url, projection, margin) {
80810       var tiles = tiler$4.margin(margin).getTiles(projection);
80811
80812       // abort inflight requests that are no longer needed
80813       var cache = _ssCache[which];
80814       forEach(cache.inflight, function(v, k) {
80815           var wanted = find$1(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; });
80816
80817           if (!wanted) {
80818               abortRequest$4(v);
80819               delete cache.inflight[k];
80820           }
80821       });
80822
80823       tiles.forEach(function (tile) {
80824          loadNextTilePage$2(which, url, tile);
80825       });
80826   }
80827
80828   /**
80829    * loadNextTilePage() load data for the next tile page in line.
80830    */
80831   function loadNextTilePage$2(which, url, tile) {
80832       var cache = _ssCache[which];
80833       var nextPage = cache.nextPage[tile.id] || 0;
80834       var id = tile.id + ',' + String(nextPage);
80835       if (cache.loaded[id] || cache.inflight[id]) return;
80836
80837       cache.inflight[id] = getBubbles(url, tile, function(bubbles) {
80838           cache.loaded[id] = true;
80839           delete cache.inflight[id];
80840           if (!bubbles) return;
80841
80842           // [].shift() removes the first element, some statistics info, not a bubble point
80843           bubbles.shift();
80844
80845           var features = bubbles.map(function(bubble) {
80846               if (cache.points[bubble.id]) return null;  // skip duplicates
80847
80848               var loc = [bubble.lo, bubble.la];
80849               var d = {
80850                   loc: loc,
80851                   key: bubble.id,
80852                   ca: bubble.he,
80853                   captured_at: bubble.cd,
80854                   captured_by: 'microsoft',
80855                   // nbn: bubble.nbn,
80856                   // pbn: bubble.pbn,
80857                   // ad: bubble.ad,
80858                   // rn: bubble.rn,
80859                   pr: bubble.pr,  // previous
80860                   ne: bubble.ne,  // next
80861                   pano: true,
80862                   sequenceKey: null
80863               };
80864
80865               cache.points[bubble.id] = d;
80866
80867               // a sequence starts here
80868               if (bubble.pr === undefined) {
80869                   cache.leaders.push(bubble.id);
80870               }
80871
80872               return {
80873                   minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
80874               };
80875
80876           }).filter(Boolean);
80877
80878           cache.rtree.load(features);
80879
80880           connectSequences();
80881
80882           if (which === 'bubbles') {
80883               dispatch$5.call('loadedBubbles');
80884           }
80885       });
80886   }
80887
80888
80889   // call this sometimes to connect the bubbles into sequences
80890   function connectSequences() {
80891       var cache = _ssCache.bubbles;
80892       var keepLeaders = [];
80893
80894       for (var i = 0; i < cache.leaders.length; i++) {
80895           var bubble = cache.points[cache.leaders[i]];
80896           var seen = {};
80897
80898           // try to make a sequence.. use the key of the leader bubble.
80899           var sequence = { key: bubble.key, bubbles: [] };
80900           var complete = false;
80901
80902           do {
80903               sequence.bubbles.push(bubble);
80904               seen[bubble.key] = true;
80905
80906               if (bubble.ne === undefined) {
80907                   complete = true;
80908               } else {
80909                   bubble = cache.points[bubble.ne];  // advance to next
80910               }
80911           } while (bubble && !seen[bubble.key] && !complete);
80912
80913
80914           if (complete) {
80915               _ssCache.sequences[sequence.key] = sequence;
80916
80917               // assign bubbles to the sequence
80918               for (var j = 0; j < sequence.bubbles.length; j++) {
80919                   sequence.bubbles[j].sequenceKey = sequence.key;
80920               }
80921
80922               // create a GeoJSON LineString
80923               sequence.geojson = {
80924                   type: 'LineString',
80925                   properties: { key: sequence.key },
80926                   coordinates: sequence.bubbles.map(function (d) { return d.loc; })
80927               };
80928
80929           } else {
80930               keepLeaders.push(cache.leaders[i]);
80931           }
80932       }
80933
80934       // couldn't complete these, save for later
80935       cache.leaders = keepLeaders;
80936   }
80937
80938   /**
80939    * getBubbles() handles the request to the server for a tile extent of 'bubbles' (streetside image locations).
80940    */
80941   function getBubbles(url, tile, callback) {
80942       var rect = tile.extent.rectangle();
80943       var urlForRequest = url + utilQsString({
80944           n: rect[3],
80945           s: rect[1],
80946           e: rect[2],
80947           w: rect[0],
80948           c: maxResults$2,
80949           appkey: bubbleAppKey,
80950           jsCallback: '{callback}'
80951       });
80952
80953       return jsonpRequest(urlForRequest, function (data) {
80954           if (!data || data.error) {
80955               callback(null);
80956           } else {
80957               callback(data);
80958           }
80959       });
80960   }
80961
80962
80963   // partition viewport into higher zoom tiles
80964   function partitionViewport$2(projection) {
80965       var z = geoScaleToZoom(projection.scale());
80966       var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
80967       var tiler = utilTiler().zoomExtent([z2, z2]);
80968
80969       return tiler.getTiles(projection)
80970           .map(function(tile) { return tile.extent; });
80971   }
80972
80973
80974   // no more than `limit` results per partition.
80975   function searchLimited$2(limit, projection, rtree) {
80976       limit = limit || 5;
80977
80978       return partitionViewport$2(projection)
80979           .reduce(function(result, extent) {
80980               var found = rtree.search(extent.bbox())
80981                   .slice(0, limit)
80982                   .map(function(d) { return d.data; });
80983
80984               return (found.length ? result.concat(found) : result);
80985           }, []);
80986   }
80987
80988
80989   /**
80990    * getImage()
80991    */
80992   function getImage(imgInfo) {
80993       var response = q.defer();
80994       var img = new Image();
80995
80996       img.onload = function() {
80997           var canvas = document.getElementById('canvas' + imgInfo.face);
80998           var ctx = canvas.getContext('2d');
80999           ctx.drawImage(img, imgInfo.x, imgInfo.y);
81000           response.resolve({imgInfo:imgInfo, status: 'ok'});
81001       };
81002       img.onerror = function() {
81003           response.resolve({data: imgInfo, status: 'error'});
81004       };
81005       img.setAttribute('crossorigin', '');
81006       img.src = imgInfo.url;
81007
81008       return response.promise;
81009   }
81010
81011
81012   /**
81013    * loadCanvas()
81014    */
81015   function loadCanvas(imgInfoGroup) {
81016       var response = q.defer();
81017       var getImagePromises = imgInfoGroup.map(function(imgInfo) {
81018           return getImage(imgInfo);
81019       });
81020
81021       q.all(getImagePromises).then(function(data) {
81022           var canvas = document.getElementById('canvas' + data[0].imgInfo.face);
81023           switch (data[0].imgInfo.face) {
81024               case '01':
81025                   _dataUrlArray[0] = canvas.toDataURL('image/jpeg', 1.0);
81026                   break;
81027               case '02':
81028                   _dataUrlArray[1] = canvas.toDataURL('image/jpeg', 1.0);
81029                   break;
81030               case '03':
81031                   _dataUrlArray[2] = canvas.toDataURL('image/jpeg', 1.0);
81032                   break;
81033               case '10':
81034                   _dataUrlArray[3] = canvas.toDataURL('image/jpeg', 1.0);
81035                   break;
81036               case '11':
81037                   _dataUrlArray[4] = canvas.toDataURL('image/jpeg', 1.0);
81038                   break;
81039               case '12':
81040                   _dataUrlArray[5] = canvas.toDataURL('image/jpeg', 1.0);
81041                   break;
81042           }
81043           response.resolve({status:'loadCanvas for face ' + data[0].imgInfo.face + 'ok'});
81044       });
81045
81046       return response.promise;
81047   }
81048
81049
81050   function setupCanvas(selection$$1, reset) {
81051       if (reset) {
81052           selection$$1.selectAll('#divForCanvasWork')
81053               .remove();
81054       }
81055
81056       // Add the Streetside working canvases. These are used for 'stitching', or combining,
81057       // multiple images for each of the six faces, before passing to the Pannellum control as DataUrls
81058       selection$$1.selectAll('#divForCanvasWork')
81059           .data([0])
81060           .enter()
81061           .append('div')
81062           .attr('id', 'divForCanvasWork')
81063           .attr('display', 'none')
81064           .selectAll('canvas')
81065           .data(['canvas01', 'canvas02', 'canvas03', 'canvas10', 'canvas11', 'canvas12'])
81066           .enter()
81067           .append('canvas')
81068           .attr('id', function(d) { return d; })
81069           .attr('width', _resolution)
81070           .attr('height', _resolution);
81071   }
81072
81073
81074   /**
81075    * processFaces()
81076    */
81077   function processFaces(imgFaceInfoGroups) {
81078       var response = q.defer();
81079       var loadCanvasPromises = imgFaceInfoGroups.map(function(faceImgGroup) {
81080           return loadCanvas(faceImgGroup);
81081       });
81082
81083       q.all(loadCanvasPromises).then(function() {
81084           response.resolve({status: 'processFaces done'});
81085       });
81086
81087       return response.promise;
81088   }
81089
81090
81091
81092   function qkToXY(qk) {
81093       var x = 0;
81094       var y = 0;
81095       var scale = 256;
81096       for (var i = qk.length; i > 0; i--) {
81097           var key = qk[i-1];
81098           x += (+(key === '1' || key === '3')) * scale;
81099           y += (+(key === '2' || key === '3')) * scale;
81100           scale *= 2;
81101       }
81102       return [x, y];
81103   }
81104
81105
81106   function getQuadKeys() {
81107       var dim = _resolution / 256;
81108       var quadKeys;
81109
81110       if (dim === 16) {
81111           quadKeys = [
81112               '0000','0001','0010','0011','0100','0101','0110','0111',  '1000','1001','1010','1011','1100','1101','1110','1111',
81113               '0002','0003','0012','0013','0102','0103','0112','0113',  '1002','1003','1012','1013','1102','1103','1112','1113',
81114               '0020','0021','0030','0031','0120','0121','0130','0131',  '1020','1021','1030','1031','1120','1121','1130','1131',
81115               '0022','0023','0032','0033','0122','0123','0132','0133',  '1022','1023','1032','1033','1122','1123','1132','1133',
81116               '0200','0201','0210','0211','0300','0301','0310','0311',  '1200','1201','1210','1211','1300','1301','1310','1311',
81117               '0202','0203','0212','0213','0302','0303','0312','0313',  '1202','1203','1212','1213','1302','1303','1312','1313',
81118               '0220','0221','0230','0231','0320','0321','0330','0331',  '1220','1221','1230','1231','1320','1321','1330','1331',
81119               '0222','0223','0232','0233','0322','0323','0332','0333',  '1222','1223','1232','1233','1322','1323','1332','1333',
81120
81121               '2000','2001','2010','2011','2100','2101','2110','2111',  '3000','3001','3010','3011','3100','3101','3110','3111',
81122               '2002','2003','2012','2013','2102','2103','2112','2113',  '3002','3003','3012','3013','3102','3103','3112','3113',
81123               '2020','2021','2030','2031','2120','2121','2130','2131',  '3020','3021','3030','3031','3120','3121','3130','3131',
81124               '2022','2023','2032','2033','2122','2123','2132','2133',  '3022','3023','3032','3033','3122','3123','3132','3133',
81125               '2200','2201','2210','2211','2300','2301','2310','2311',  '3200','3201','3210','3211','3300','3301','3310','3311',
81126               '2202','2203','2212','2213','2302','2303','2312','2313',  '3202','3203','3212','3213','3302','3303','3312','3313',
81127               '2220','2221','2230','2231','2320','2321','2330','2331',  '3220','3221','3230','3231','3320','3321','3330','3331',
81128               '2222','2223','2232','2233','2322','2323','2332','2333',  '3222','3223','3232','3233','3322','3323','3332','3333'
81129           ];
81130
81131       } else if (dim === 8) {
81132           quadKeys = [
81133               '000','001','010','011',  '100','101','110','111',
81134               '002','003','012','013',  '102','103','112','113',
81135               '020','021','030','031',  '120','121','130','131',
81136               '022','023','032','033',  '122','123','132','133',
81137
81138               '200','201','210','211',  '300','301','310','311',
81139               '202','203','212','213',  '302','303','312','313',
81140               '220','221','230','231',  '320','321','330','331',
81141               '222','223','232','233',  '322','323','332','333'
81142           ];
81143
81144       } else if (dim === 4) {
81145           quadKeys = [
81146               '00','01',  '10','11',
81147               '02','03',  '12','13',
81148
81149               '20','21',  '30','31',
81150               '22','23',  '32','33'
81151           ];
81152
81153       } else {  // dim === 2
81154           quadKeys = [
81155               '0', '1',
81156               '2', '3'
81157           ];
81158       }
81159
81160       return quadKeys;
81161   }
81162
81163
81164
81165   var serviceStreetside = {
81166       /**
81167        * init() initialize streetside.
81168        */
81169       init: function () {
81170           if (!_ssCache) {
81171               this.reset();
81172           }
81173
81174           this.event = utilRebind(this, dispatch$5, 'on');
81175       },
81176
81177       /**
81178        * reset() reset the cache.
81179        */
81180       reset: function () {
81181           var cache = _ssCache;
81182
81183           if (cache) {
81184               if (cache.bubbles && cache.bubbles.inflight) {
81185                   forEach(cache.bubbles.inflight, abortRequest$4);
81186               }
81187           }
81188
81189           _ssCache = {
81190               bubbles: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1(), points: {}, leaders: [] },
81191               sequences: {}
81192           };
81193       },
81194
81195       /**
81196        * bubbles()
81197        */
81198       bubbles: function (projection) {
81199           var limit = 5;
81200           return searchLimited$2(limit, projection, _ssCache.bubbles.rtree);
81201       },
81202
81203
81204       sequences: function(projection) {
81205           var viewport = projection.clipExtent();
81206           var min = [viewport[0][0], viewport[1][1]];
81207           var max = [viewport[1][0], viewport[0][1]];
81208           var bbox = geoExtent$$1(projection.invert(min), projection.invert(max)).bbox();
81209           var seen = {};
81210           var results = [];
81211
81212           // all sequences for bubbles in viewport
81213           _ssCache.bubbles.rtree.search(bbox)
81214               .forEach(function(d) {
81215                   var key = d.data.sequenceKey;
81216                   if (key && !seen[key]) {
81217                       seen[key] = true;
81218                       results.push(_ssCache.sequences[key].geojson);
81219                   }
81220               });
81221
81222           return results;
81223       },
81224
81225
81226       /**
81227        * loadBubbles()
81228        */
81229       loadBubbles: function (projection, margin) {
81230           // by default: request 2 nearby tiles so we can connect sequences.
81231           if (margin === undefined) margin = 2;
81232
81233           loadTiles$2('bubbles', bubbleApi, projection, margin);
81234       },
81235
81236
81237       viewer: function() {
81238           return _pannellumViewer;
81239       },
81240
81241
81242       initViewer: function () {
81243           if (!window.pannellum) return;
81244           if (_pannellumViewer) return;
81245
81246           var sceneID = ++_currScene + '';
81247           var options = {
81248               'default': { firstScene: sceneID },
81249               scenes: {}
81250           };
81251           options.scenes[sceneID] = _sceneOptions;
81252
81253           _pannellumViewer = window.pannellum.viewer('viewer-streetside', options);
81254
81255           _pannellumViewer
81256               .on('mousedown', function() {
81257                   select(window).on('mousemove.pannellum', function() {
81258                       dispatch$5.call('viewerChanged');
81259                   });
81260               })
81261               .on('mouseup', function() {
81262                   select(window).on('mousemove.pannellum', null);
81263                   // continue dispatching events for a few seconds, in case viewer has inertia.
81264                   var t$$1 = timer(function(elapsed) {
81265                       dispatch$5.call('viewerChanged');
81266                       if (elapsed > 2000) {
81267                           t$$1.stop();
81268                       }
81269                   });
81270               });
81271       },
81272
81273
81274       /**
81275        * loadViewer() create the streeside viewer.
81276        */
81277       loadViewer: function (context) {
81278           var that = this;
81279
81280           // create ms-wrapper, a photo wrapper class
81281           var wrap = select('#photoviewer').selectAll('.ms-wrapper')
81282               .data([0]);
81283
81284           // inject ms-wrapper into the photoviewer div
81285           // (used by all to house each custom photo viewer)
81286           var wrapEnter = wrap.enter()
81287               .append('div')
81288               .attr('id', 'ms')
81289               .attr('class', 'photo-wrapper ms-wrapper')
81290               .classed('hide', true);
81291
81292           // inject div to support streetside viewer (pannellum) and attribution line
81293           wrapEnter
81294               .append('div')
81295               .attr('id', 'viewer-streetside')
81296               .append('div')
81297               .attr('class', 'photo-attribution fillD');
81298
81299           var controlsEnter = wrapEnter
81300               .append('div')
81301               .attr('class', 'photo-controls-wrap')
81302               .append('div')
81303               .attr('class', 'photo-controls');
81304
81305           controlsEnter
81306               .append('button')
81307               .on('click.back', step(-1))
81308               .text('◄');
81309
81310           controlsEnter
81311               .append('button')
81312               .on('click.forward', step(1))
81313               .text('►');
81314
81315
81316           // create working canvas for stitching together images
81317           wrap = wrap
81318               .merge(wrapEnter)
81319               .call(setupCanvas, true);
81320
81321           // load streetside pannellum viewer css
81322           select('head').selectAll('#streetside-viewercss')
81323               .data([0])
81324               .enter()
81325               .append('link')
81326               .attr('id', 'streetside-viewercss')
81327               .attr('rel', 'stylesheet')
81328               .attr('href', context.asset(pannellumViewerCSS));
81329
81330           // load streetside pannellum viewer js
81331           select('head').selectAll('#streetside-viewerjs')
81332               .data([0])
81333               .enter()
81334               .append('script')
81335               .attr('id', 'streetside-viewerjs')
81336               .attr('src', context.asset(pannellumViewerJS));
81337
81338
81339           // Register viewer resize handler
81340           context.ui().photoviewer.on('resize', function() {
81341               if (_pannellumViewer) {
81342                   _pannellumViewer.resize();
81343               }
81344           });
81345
81346
81347           function step(stepBy) {
81348               return function() {
81349                   var viewer = select('#photoviewer');
81350                   var selected = viewer.empty() ? undefined : viewer.datum();
81351                   if (!selected) return;
81352
81353                   var nextID = (stepBy === 1 ? selected.ne : selected.pr);
81354                   var yaw = _pannellumViewer.getYaw();
81355                   var ca = selected.ca + yaw;
81356                   var origin = selected.loc;
81357
81358                   // construct a search trapezoid pointing out from current bubble
81359                   var meters = 35;
81360                   var p1 = [
81361                       origin[0] + geoMetersToLon(meters / 5, origin[1]),
81362                       origin[1]
81363                   ];
81364                   var p2 = [
81365                       origin[0] + geoMetersToLon(meters / 2, origin[1]),
81366                       origin[1] + geoMetersToLat(meters)
81367                   ];
81368                   var p3 = [
81369                       origin[0] - geoMetersToLon(meters / 2, origin[1]),
81370                       origin[1] + geoMetersToLat(meters)
81371                   ];
81372                   var p4 = [
81373                       origin[0] - geoMetersToLon(meters / 5, origin[1]),
81374                       origin[1]
81375                   ];
81376
81377                   var poly = [p1, p2, p3, p4, p1];
81378
81379                   // rotate it to face forward/backward
81380                   var angle = (stepBy === 1 ? ca : ca + 180) * (Math.PI / 180);
81381                   poly = geoRotate(poly, -angle, origin);
81382
81383                   var extent = poly.reduce(function(extent, point$$1) {
81384                       return extent.extend(geoExtent$$1(point$$1));
81385                   }, geoExtent$$1());
81386
81387                   // find nearest other bubble in the search polygon
81388                   var minDist = Infinity;
81389                   _ssCache.bubbles.rtree.search(extent.bbox())
81390                       .forEach(function(d) {
81391                           if (d.data.key === selected.key) return;
81392                           if (!geoPointInPolygon(d.data.loc, poly)) return;
81393
81394                           var dist = geoVecLength(d.data.loc, selected.loc);
81395                           var theta = selected.ca - d.data.ca;
81396                           var minTheta = Math.min(Math.abs(theta), 360 - Math.abs(theta));
81397                           if (minTheta > 20) {
81398                               dist += 5;  // penalize distance if camera angles don't match
81399                           }
81400
81401                           if (dist < minDist) {
81402                               nextID = d.data.key;
81403                               minDist = dist;
81404                           }
81405                       });
81406
81407                   var nextBubble = nextID && _ssCache.bubbles.points[nextID];
81408                   if (!nextBubble) return;
81409
81410                   context.map().centerEase(nextBubble.loc);
81411
81412                   that.selectImage(nextBubble)
81413                       .then(function(r) {
81414                           if (r.status === 'ok') {
81415                               _sceneOptions.yaw = yaw;
81416                               that.showViewer();
81417                           }
81418                       });
81419               };
81420           }
81421       },
81422
81423       /**
81424        * showViewer()
81425        */
81426       showViewer: function (yaw) {
81427           if (!_sceneOptions) return;
81428
81429           if (yaw !== undefined) {
81430               _sceneOptions.yaw = yaw;
81431           }
81432
81433           if (!_pannellumViewer) {
81434               this.initViewer();
81435           } else {
81436               // make a new scene
81437               var sceneID = ++_currScene + '';
81438               _pannellumViewer
81439                   .addScene(sceneID, _sceneOptions)
81440                   .loadScene(sceneID);
81441
81442               // remove previous scene
81443               if (_currScene > 2) {
81444                   sceneID = (_currScene - 1) + '';
81445                   _pannellumViewer
81446                       .removeScene(sceneID);
81447               }
81448           }
81449
81450           var wrap = select('#photoviewer')
81451               .classed('hide', false);
81452
81453           var isHidden = wrap.selectAll('.photo-wrapper.ms-wrapper.hide').size();
81454
81455           if (isHidden) {
81456               wrap
81457                   .selectAll('.photo-wrapper:not(.ms-wrapper)')
81458                   .classed('hide', true);
81459
81460               wrap
81461                   .selectAll('.photo-wrapper.ms-wrapper')
81462                   .classed('hide', false);
81463           }
81464
81465           return this;
81466       },
81467
81468       /**
81469        * hideViewer()
81470        */
81471       hideViewer: function () {
81472           var viewer = select('#photoviewer');
81473           if (!viewer.empty()) viewer.datum(null);
81474
81475           viewer
81476               .classed('hide', true)
81477               .selectAll('.photo-wrapper')
81478               .classed('hide', true);
81479
81480           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
81481               .classed('selected', false);
81482
81483           return this.setStyles(null, true);
81484       },
81485
81486       /**
81487        * selectImage().
81488        */
81489       selectImage: function (d) {
81490           var response = q.defer();
81491           var that = this;
81492
81493           var viewer = select('#photoviewer');
81494           if (!viewer.empty()) viewer.datum(d);
81495
81496           this.setStyles(null, true);
81497
81498           var wrap = select('#photoviewer .ms-wrapper');
81499           var attribution = wrap.selectAll('.photo-attribution').html('');
81500
81501           wrap.selectAll('.pnlm-load-box')   // display "loading.."
81502               .style('display', 'block');
81503
81504           if (!d) {
81505               response.resolve({status: 'ok'});
81506               return response.promise;
81507           }
81508
81509           var line1 = attribution
81510               .append('div')
81511               .attr('class', 'attribution-row');
81512
81513           // Add hires checkbox
81514           var label = line1
81515               .append('label')
81516               .attr('class', 'streetside-hires');
81517
81518           label
81519               .append('input')
81520               .attr('type', 'checkbox')
81521               .attr('id', 'streetside-hires-input')
81522               .property('checked', _hires)
81523               .on('click', function() {
81524                   event.stopPropagation();
81525
81526                   _hires = !_hires;
81527                   _resolution = _hires ? 1024 : 512;
81528                   wrap.call(setupCanvas, true);
81529
81530                   var viewstate = {
81531                       yaw: _pannellumViewer.getYaw(),
81532                       pitch: _pannellumViewer.getPitch(),
81533                       hfov: _pannellumViewer.getHfov()
81534                   };
81535
81536                   that.selectImage(d)
81537                       .then(function(r) {
81538                           if (r.status === 'ok') {
81539                               _sceneOptions = assignIn(_sceneOptions, viewstate);
81540                               that.showViewer();
81541                           }
81542                       });
81543               });
81544
81545           label
81546               .append('span')
81547               .text(t('streetside.hires'));
81548
81549
81550           var captureInfo = line1
81551               .append('div')
81552               .attr('class', 'attribution-capture-info');
81553
81554           // Add capture date
81555           if (d.captured_by) {
81556               var yyyy = (new Date()).getFullYear();
81557
81558               captureInfo
81559                   .append('a')
81560                   .attr('class', 'captured_by')
81561                   .attr('target', '_blank')
81562                   .attr('href', 'https://www.microsoft.com/en-us/maps/streetside')
81563                   .text('©' + yyyy + ' Microsoft');
81564
81565               captureInfo
81566                   .append('span')
81567                   .text('|');
81568           }
81569
81570           if (d.captured_at) {
81571               captureInfo
81572                   .append('span')
81573                   .attr('class', 'captured_at')
81574                   .text(localeTimestamp(d.captured_at));
81575           }
81576
81577           // Add image links
81578           var line2 = attribution
81579               .append('div')
81580               .attr('class', 'attribution-row');
81581
81582           line2
81583               .append('a')
81584               .attr('class', 'image-view-link')
81585               .attr('target', '_blank')
81586               .attr('href', 'https://www.bing.com/maps?cp=' + d.loc[1] + '~' + d.loc[0] +
81587                   '&lvl=17&dir=' + d.ca + '&style=x&v=2&sV=1')
81588               .text(t('streetside.view_on_bing'));
81589
81590           line2
81591               .append('a')
81592               .attr('class', 'image-report-link')
81593               .attr('target', '_blank')
81594               .attr('href', 'https://www.bing.com/maps/privacyreport/streetsideprivacyreport?bubbleid=' + encodeURIComponent(d.key) +
81595                   '&focus=photo&lat=' + d.loc[1] + '&lng=' + d.loc[0] + '&z=17')
81596               .text(t('streetside.report'));
81597
81598
81599           var bubbleIdQuadKey = d.key.toString(4);
81600           var paddingNeeded = 16 - bubbleIdQuadKey.length;
81601           for (var i = 0; i < paddingNeeded; i++) {
81602               bubbleIdQuadKey = '0' + bubbleIdQuadKey;
81603           }
81604           var imgUrlPrefix = streetsideImagesApi + 'hs' + bubbleIdQuadKey;
81605           var imgUrlSuffix = '.jpg?g=6338&n=z';
81606
81607           // Cubemap face code order matters here: front=01, right=02, back=03, left=10, up=11, down=12
81608           var faceKeys = ['01','02','03','10','11','12'];
81609
81610           // Map images to cube faces
81611           var quadKeys = getQuadKeys();
81612           var faces = faceKeys.map(function(faceKey) {
81613               return quadKeys.map(function(quadKey) {
81614                   var xy = qkToXY(quadKey);
81615                   return {
81616                       face: faceKey,
81617                       url: imgUrlPrefix + faceKey + quadKey + imgUrlSuffix,
81618                       x: xy[0],
81619                       y: xy[1]
81620                   };
81621               });
81622           });
81623
81624           processFaces(faces).then(function() {
81625               _sceneOptions = {
81626                   showFullscreenCtrl: false,
81627                   autoLoad: true,
81628                   compass: true,
81629                   northOffset: d.ca,
81630                   yaw: 0,
81631                   minHfov: minHfov,
81632                   maxHfov: maxHfov,
81633                   hfov: defaultHfov,
81634                   type: 'cubemap',
81635                   cubeMap: [
81636                       _dataUrlArray[0],
81637                       _dataUrlArray[1],
81638                       _dataUrlArray[2],
81639                       _dataUrlArray[3],
81640                       _dataUrlArray[4],
81641                       _dataUrlArray[5]
81642                   ]
81643               };
81644               response.resolve({status: 'ok'});
81645           });
81646
81647           return response.promise;
81648       },
81649
81650
81651       getSequenceKeyForBubble: function(d) {
81652           return d && d.sequenceKey;
81653       },
81654
81655
81656       /**
81657        * setStyles().
81658        */
81659       setStyles: function (hovered, reset) {
81660           if (reset) {  // reset all layers
81661               d3_selectAll('.viewfield-group')
81662                   .classed('highlighted', false)
81663                   .classed('hovered', false)
81664                   .classed('selected', false);
81665
81666               d3_selectAll('.sequence')
81667                   .classed('highlighted', false)
81668                   .classed('selected', false);
81669           }
81670
81671           var hoveredBubbleKey = hovered && hovered.key;
81672           var hoveredSequenceKey = this.getSequenceKeyForBubble(hovered);
81673           var hoveredSequence = hoveredSequenceKey && _ssCache.sequences[hoveredSequenceKey];
81674           var hoveredBubbleKeys =  (hoveredSequence && hoveredSequence.bubbles.map(function (d) { return d.key; })) || [];
81675
81676           var viewer = select('#photoviewer');
81677           var selected = viewer.empty() ? undefined : viewer.datum();
81678           var selectedBubbleKey = selected && selected.key;
81679           var selectedSequenceKey = this.getSequenceKeyForBubble(selected);
81680           var selectedSequence = selectedSequenceKey && _ssCache.sequences[selectedSequenceKey];
81681           var selectedBubbleKeys = (selectedSequence && selectedSequence.bubbles.map(function (d) { return d.key; })) || [];
81682
81683           // highlight sibling viewfields on either the selected or the hovered sequences
81684           var highlightedBubbleKeys = union(hoveredBubbleKeys, selectedBubbleKeys);
81685
81686           d3_selectAll('.layer-streetside-images .viewfield-group')
81687               .classed('highlighted', function (d) { return highlightedBubbleKeys.indexOf(d.key) !== -1; })
81688               .classed('hovered', function (d) { return d.key === hoveredBubbleKey; })
81689               .classed('selected', function (d) { return d.key === selectedBubbleKey; });
81690
81691           d3_selectAll('.layer-streetside-images .sequence')
81692               .classed('highlighted', function (d) { return d.properties.key === hoveredSequenceKey; })
81693               .classed('selected', function (d) { return d.properties.key === selectedSequenceKey; });
81694
81695           // update viewfields if needed
81696           d3_selectAll('.viewfield-group .viewfield')
81697               .attr('d', viewfieldPath);
81698
81699           function viewfieldPath() {
81700               var d = this.parentNode.__data__;
81701               if (d.pano && d.key !== selectedBubbleKey) {
81702                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
81703               } else {
81704                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
81705               }
81706           }
81707
81708           return this;
81709       },
81710
81711       /**
81712        * cache().
81713        */
81714       cache: function () {
81715           return _ssCache;
81716       }
81717   };
81718
81719   var apibase$4 = 'https://taginfo.openstreetmap.org/api/4/';
81720   var _inflight$1 = {};
81721   var _popularKeys = {};
81722   var _taginfoCache = {};
81723
81724   var tag_sorts = {
81725       point: 'count_nodes',
81726       vertex: 'count_nodes',
81727       area: 'count_ways',
81728       line: 'count_ways'
81729   };
81730   var tag_sort_members = {
81731       point: 'count_node_members',
81732       vertex: 'count_node_members',
81733       area: 'count_way_members',
81734       line: 'count_way_members',
81735       relation: 'count_relation_members'
81736   };
81737   var tag_filters = {
81738       point: 'nodes',
81739       vertex: 'nodes',
81740       area: 'ways',
81741       line: 'ways'
81742   };
81743   var tag_members_fractions = {
81744       point: 'count_node_members_fraction',
81745       vertex: 'count_node_members_fraction',
81746       area: 'count_way_members_fraction',
81747       line: 'count_way_members_fraction',
81748       relation: 'count_relation_members_fraction'
81749   };
81750
81751
81752   function sets(params, n, o) {
81753       if (params.geometry && o[params.geometry]) {
81754           params[n] = o[params.geometry];
81755       }
81756       return params;
81757   }
81758
81759
81760   function setFilter(params) {
81761       return sets(params, 'filter', tag_filters);
81762   }
81763
81764
81765   function setSort(params) {
81766       return sets(params, 'sortname', tag_sorts);
81767   }
81768
81769
81770   function setSortMembers(params) {
81771       return sets(params, 'sortname', tag_sort_members);
81772   }
81773
81774
81775   function clean(params) {
81776       return omit(params, ['geometry', 'debounce']);
81777   }
81778
81779
81780   function filterKeys(type) {
81781       var count_type = type ? 'count_' + type : 'count_all';
81782       return function(d) {
81783           return parseFloat(d[count_type]) > 2500 || d.in_wiki;
81784       };
81785   }
81786
81787
81788   function filterMultikeys(prefix) {
81789       return function(d) {
81790           // d.key begins with prefix, and d.key contains no additional ':'s
81791           var re = new RegExp('^' + prefix + '(.*)$');
81792           var matches = d.key.match(re) || [];
81793           return (matches.length === 2 && matches[1].indexOf(':') === -1);
81794       };
81795   }
81796
81797
81798   function filterValues(allowUpperCase) {
81799       return function(d) {
81800           if (d.value.match(/[;,]/) !== null) return false;  // exclude some punctuation
81801           if (!allowUpperCase && d.value.match(/[A-Z*]/) !== null) return false;  // exclude uppercase letters
81802           return parseFloat(d.fraction) > 0.0;
81803       };
81804   }
81805
81806
81807   function filterRoles(geometry) {
81808       return function(d) {
81809           if (d.role === '') return false; // exclude empty role
81810           if (d.role.match(/[A-Z*;,]/) !== null) return false;  // exclude uppercase letters and some punctuation
81811           return parseFloat(d[tag_members_fractions[geometry]]) > 0.0;
81812       };
81813   }
81814
81815
81816   function valKey(d) {
81817       return {
81818           value: d.key,
81819           title: d.key
81820       };
81821   }
81822
81823
81824   function valKeyDescription(d) {
81825       return {
81826           value: d.value,
81827           title: d.description || d.value
81828       };
81829   }
81830
81831
81832   function roleKey(d) {
81833       return {
81834           value: d.role,
81835           title: d.role
81836       };
81837   }
81838
81839
81840   // sort keys with ':' lower than keys without ':'
81841   function sortKeys(a, b) {
81842       return (a.key.indexOf(':') === -1 && b.key.indexOf(':') !== -1) ? -1
81843           : (a.key.indexOf(':') !== -1 && b.key.indexOf(':') === -1) ? 1
81844           : 0;
81845   }
81846
81847
81848   var debouncedRequest$1 = debounce(request$2, 300, { leading: false });
81849
81850   function request$2(url, params, exactMatch, callback, loaded) {
81851       if (_inflight$1[url]) return;
81852
81853       if (checkCache(url, params, exactMatch, callback)) return;
81854
81855       _inflight$1[url] = d3_json(url, function (err, data) {
81856           delete _inflight$1[url];
81857           loaded(err, data);
81858       });
81859   }
81860
81861
81862   function checkCache(url, params, exactMatch, callback) {
81863       var rp = params.rp || 25;
81864       var testQuery = params.query || '';
81865       var testUrl = url;
81866
81867       do {
81868           var hit = _taginfoCache[testUrl];
81869
81870           // exact match, or shorter match yielding fewer than max results (rp)
81871           if (hit && (url === testUrl || hit.length < rp)) {
81872               callback(null, hit);
81873               return true;
81874           }
81875
81876           // don't try to shorten the query
81877           if (exactMatch || !testQuery.length) return false;
81878
81879           // do shorten the query to see if we already have a cached result
81880           // that has returned fewer than max results (rp)
81881           testQuery = testQuery.slice(0, -1);
81882           testUrl = url.replace(/&query=(.*?)&/, '&query=' + testQuery + '&');
81883       } while (testQuery.length >= 0);
81884
81885       return false;
81886   }
81887
81888
81889   var serviceTaginfo = {
81890
81891       init: function() {
81892           _inflight$1 = {};
81893           _taginfoCache = {};
81894           _popularKeys = {
81895               postal_code: true   // #5377
81896           };
81897
81898           // Fetch popular keys.  We'll exclude these from `values`
81899           // lookups because they stress taginfo, and they aren't likely
81900           // to yield meaningful autocomplete results.. see #3955
81901           var params = {
81902               rp: 100,
81903               sortname: 'values_all',
81904               sortorder: 'desc',
81905               page: 1,
81906               debounce: false,
81907               lang: currentLocale
81908           };
81909           this.keys(params, function(err, data) {
81910               if (err) return;
81911               data.forEach(function(d) {
81912                   if (d.value === 'opening_hours') return;  // exception
81913                   _popularKeys[d.value] = true;
81914               });
81915           });
81916       },
81917
81918
81919       reset: function() {
81920           forEach(_inflight$1, function(req) { req.abort(); });
81921           _inflight$1 = {};
81922       },
81923
81924
81925       keys: function(params, callback) {
81926           var doRequest = params.debounce ? debouncedRequest$1 : request$2;
81927           params = clean(setSort(params));
81928           params = assignIn({
81929               rp: 10,
81930               sortname: 'count_all',
81931               sortorder: 'desc',
81932               page: 1,
81933               lang: currentLocale
81934           }, params);
81935
81936           var url = apibase$4 + 'keys/all?' + utilQsString(params);
81937           doRequest(url, params, false, callback, function(err, d) {
81938               if (err) {
81939                   callback(err);
81940               } else {
81941                   var f = filterKeys(params.filter);
81942                   var result = d.data.filter(f).sort(sortKeys).map(valKey);
81943                   _taginfoCache[url] = result;
81944                   callback(null, result);
81945               }
81946           });
81947       },
81948
81949
81950       multikeys: function(params, callback) {
81951           var doRequest = params.debounce ? debouncedRequest$1 : request$2;
81952           params = clean(setSort(params));
81953           params = assignIn({
81954               rp: 25,
81955               sortname: 'count_all',
81956               sortorder: 'desc',
81957               page: 1,
81958               lang: currentLocale
81959           }, params);
81960
81961           var prefix = params.query;
81962           var url = apibase$4 + 'keys/all?' + utilQsString(params);
81963           doRequest(url, params, true, callback, function(err, d) {
81964               if (err) {
81965                   callback(err);
81966               } else {
81967                   var f = filterMultikeys(prefix);
81968                   var result = d.data.filter(f).map(valKey);
81969                   _taginfoCache[url] = result;
81970                   callback(null, result);
81971               }
81972           });
81973       },
81974
81975
81976       values: function(params, callback) {
81977           // Exclude popular keys from values lookups.. see #3955
81978           var key = params.key;
81979           if (key && _popularKeys[key]) {
81980               callback(null, []);
81981               return;
81982           }
81983
81984           var doRequest = params.debounce ? debouncedRequest$1 : request$2;
81985           params = clean(setSort(setFilter(params)));
81986           params = assignIn({
81987               rp: 25,
81988               sortname: 'count_all',
81989               sortorder: 'desc',
81990               page: 1,
81991               lang: currentLocale
81992           }, params);
81993
81994           var url = apibase$4 + 'key/values?' + utilQsString(params);
81995           doRequest(url, params, false, callback, function(err, d) {
81996               if (err) {
81997                   callback(err);
81998               } else {
81999                   // In most cases we prefer taginfo value results with lowercase letters.
82000                   // A few OSM keys expect values to contain uppercase values (see #3377).
82001                   // This is not an exhaustive list (e.g. `name` also has uppercase values)
82002                   // but these are the fields where taginfo value lookup is most useful.
82003                   var re = /network|taxon|genus|species|brand|grape_variety|royal_cypher|listed_status|booth|rating|stars|:output|_hours|_times/;
82004                   var allowUpperCase = (params.key.match(re) !== null);
82005                   var f = filterValues(allowUpperCase);
82006
82007                   var result = d.data.filter(f).map(valKeyDescription);
82008                   _taginfoCache[url] = result;
82009                   callback(null, result);
82010               }
82011           });
82012       },
82013
82014
82015       roles: function(params, callback) {
82016           var doRequest = params.debounce ? debouncedRequest$1 : request$2;
82017           var geometry = params.geometry;
82018           params = clean(setSortMembers(params));
82019           params = assignIn({
82020               rp: 25,
82021               sortname: 'count_all_members',
82022               sortorder: 'desc',
82023               page: 1,
82024               lang: currentLocale
82025           }, params);
82026
82027           var url = apibase$4 + 'relation/roles?' + utilQsString(params);
82028           doRequest(url, params, true, callback, function(err, d) {
82029               if (err) {
82030                   callback(err);
82031               } else {
82032                   var f = filterRoles(geometry);
82033                   var result = d.data.filter(f).map(roleKey);
82034                   _taginfoCache[url] = result;
82035                   callback(null, result);
82036               }
82037           });
82038       },
82039
82040
82041       docs: function(params, callback) {
82042           var doRequest = params.debounce ? debouncedRequest$1 : request$2;
82043           params = clean(setSort(params));
82044
82045           var path = 'key/wiki_pages?';
82046           if (params.value) {
82047               path = 'tag/wiki_pages?';
82048           } else if (params.rtype) {
82049               path = 'relation/wiki_pages?';
82050           }
82051
82052           var url = apibase$4 + path + utilQsString(params);
82053           doRequest(url, params, true, callback, function(err, d) {
82054               if (err) {
82055                   callback(err);
82056               } else {
82057                   _taginfoCache[url] = d.data;
82058                   callback(null, d.data);
82059               }
82060           });
82061       },
82062
82063
82064       apibase: function(_) {
82065           if (!arguments.length) return apibase$4;
82066           apibase$4 = _;
82067           return this;
82068       }
82069
82070   };
82071
82072   var helpers = createCommonjsModule(function (module, exports) {
82073   Object.defineProperty(exports, "__esModule", { value: true });
82074   /**
82075    * @module helpers
82076    */
82077   /**
82078    * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
82079    *
82080    * @memberof helpers
82081    * @type {number}
82082    */
82083   exports.earthRadius = 6371008.8;
82084   /**
82085    * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
82086    *
82087    * @memberof helpers
82088    * @type {Object}
82089    */
82090   exports.factors = {
82091       centimeters: exports.earthRadius * 100,
82092       centimetres: exports.earthRadius * 100,
82093       degrees: exports.earthRadius / 111325,
82094       feet: exports.earthRadius * 3.28084,
82095       inches: exports.earthRadius * 39.370,
82096       kilometers: exports.earthRadius / 1000,
82097       kilometres: exports.earthRadius / 1000,
82098       meters: exports.earthRadius,
82099       metres: exports.earthRadius,
82100       miles: exports.earthRadius / 1609.344,
82101       millimeters: exports.earthRadius * 1000,
82102       millimetres: exports.earthRadius * 1000,
82103       nauticalmiles: exports.earthRadius / 1852,
82104       radians: 1,
82105       yards: exports.earthRadius / 1.0936,
82106   };
82107   /**
82108    * Units of measurement factors based on 1 meter.
82109    *
82110    * @memberof helpers
82111    * @type {Object}
82112    */
82113   exports.unitsFactors = {
82114       centimeters: 100,
82115       centimetres: 100,
82116       degrees: 1 / 111325,
82117       feet: 3.28084,
82118       inches: 39.370,
82119       kilometers: 1 / 1000,
82120       kilometres: 1 / 1000,
82121       meters: 1,
82122       metres: 1,
82123       miles: 1 / 1609.344,
82124       millimeters: 1000,
82125       millimetres: 1000,
82126       nauticalmiles: 1 / 1852,
82127       radians: 1 / exports.earthRadius,
82128       yards: 1 / 1.0936,
82129   };
82130   /**
82131    * Area of measurement factors based on 1 square meter.
82132    *
82133    * @memberof helpers
82134    * @type {Object}
82135    */
82136   exports.areaFactors = {
82137       acres: 0.000247105,
82138       centimeters: 10000,
82139       centimetres: 10000,
82140       feet: 10.763910417,
82141       inches: 1550.003100006,
82142       kilometers: 0.000001,
82143       kilometres: 0.000001,
82144       meters: 1,
82145       metres: 1,
82146       miles: 3.86e-7,
82147       millimeters: 1000000,
82148       millimetres: 1000000,
82149       yards: 1.195990046,
82150   };
82151   /**
82152    * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
82153    *
82154    * @name feature
82155    * @param {Geometry} geometry input geometry
82156    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
82157    * @param {Object} [options={}] Optional Parameters
82158    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
82159    * @param {string|number} [options.id] Identifier associated with the Feature
82160    * @returns {Feature} a GeoJSON Feature
82161    * @example
82162    * var geometry = {
82163    *   "type": "Point",
82164    *   "coordinates": [110, 50]
82165    * };
82166    *
82167    * var feature = turf.feature(geometry);
82168    *
82169    * //=feature
82170    */
82171   function feature(geom, properties, options) {
82172       if (options === void 0) { options = {}; }
82173       var feat = { type: "Feature" };
82174       if (options.id === 0 || options.id) {
82175           feat.id = options.id;
82176       }
82177       if (options.bbox) {
82178           feat.bbox = options.bbox;
82179       }
82180       feat.properties = properties || {};
82181       feat.geometry = geom;
82182       return feat;
82183   }
82184   exports.feature = feature;
82185   /**
82186    * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
82187    * For GeometryCollection type use `helpers.geometryCollection`
82188    *
82189    * @name geometry
82190    * @param {string} type Geometry Type
82191    * @param {Array<any>} coordinates Coordinates
82192    * @param {Object} [options={}] Optional Parameters
82193    * @returns {Geometry} a GeoJSON Geometry
82194    * @example
82195    * var type = "Point";
82196    * var coordinates = [110, 50];
82197    * var geometry = turf.geometry(type, coordinates);
82198    * // => geometry
82199    */
82200   function geometry(type, coordinates, options) {
82201       if (options === void 0) { options = {}; }
82202       switch (type) {
82203           case "Point": return point(coordinates).geometry;
82204           case "LineString": return lineString(coordinates).geometry;
82205           case "Polygon": return polygon(coordinates).geometry;
82206           case "MultiPoint": return multiPoint(coordinates).geometry;
82207           case "MultiLineString": return multiLineString(coordinates).geometry;
82208           case "MultiPolygon": return multiPolygon(coordinates).geometry;
82209           default: throw new Error(type + " is invalid");
82210       }
82211   }
82212   exports.geometry = geometry;
82213   /**
82214    * Creates a {@link Point} {@link Feature} from a Position.
82215    *
82216    * @name point
82217    * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
82218    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
82219    * @param {Object} [options={}] Optional Parameters
82220    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
82221    * @param {string|number} [options.id] Identifier associated with the Feature
82222    * @returns {Feature<Point>} a Point feature
82223    * @example
82224    * var point = turf.point([-75.343, 39.984]);
82225    *
82226    * //=point
82227    */
82228   function point(coordinates, properties, options) {
82229       if (options === void 0) { options = {}; }
82230       var geom = {
82231           type: "Point",
82232           coordinates: coordinates,
82233       };
82234       return feature(geom, properties, options);
82235   }
82236   exports.point = point;
82237   /**
82238    * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
82239    *
82240    * @name points
82241    * @param {Array<Array<number>>} coordinates an array of Points
82242    * @param {Object} [properties={}] Translate these properties to each Feature
82243    * @param {Object} [options={}] Optional Parameters
82244    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
82245    * associated with the FeatureCollection
82246    * @param {string|number} [options.id] Identifier associated with the FeatureCollection
82247    * @returns {FeatureCollection<Point>} Point Feature
82248    * @example
82249    * var points = turf.points([
82250    *   [-75, 39],
82251    *   [-80, 45],
82252    *   [-78, 50]
82253    * ]);
82254    *
82255    * //=points
82256    */
82257   function points(coordinates, properties, options) {
82258       if (options === void 0) { options = {}; }
82259       return featureCollection(coordinates.map(function (coords) {
82260           return point(coords, properties);
82261       }), options);
82262   }
82263   exports.points = points;
82264   /**
82265    * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
82266    *
82267    * @name polygon
82268    * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
82269    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
82270    * @param {Object} [options={}] Optional Parameters
82271    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
82272    * @param {string|number} [options.id] Identifier associated with the Feature
82273    * @returns {Feature<Polygon>} Polygon Feature
82274    * @example
82275    * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
82276    *
82277    * //=polygon
82278    */
82279   function polygon(coordinates, properties, options) {
82280       if (options === void 0) { options = {}; }
82281       for (var _i = 0, coordinates_1 = coordinates; _i < coordinates_1.length; _i++) {
82282           var ring = coordinates_1[_i];
82283           if (ring.length < 4) {
82284               throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");
82285           }
82286           for (var j = 0; j < ring[ring.length - 1].length; j++) {
82287               // Check if first point of Polygon contains two numbers
82288               if (ring[ring.length - 1][j] !== ring[0][j]) {
82289                   throw new Error("First and last Position are not equivalent.");
82290               }
82291           }
82292       }
82293       var geom = {
82294           type: "Polygon",
82295           coordinates: coordinates,
82296       };
82297       return feature(geom, properties, options);
82298   }
82299   exports.polygon = polygon;
82300   /**
82301    * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
82302    *
82303    * @name polygons
82304    * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
82305    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
82306    * @param {Object} [options={}] Optional Parameters
82307    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
82308    * @param {string|number} [options.id] Identifier associated with the FeatureCollection
82309    * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
82310    * @example
82311    * var polygons = turf.polygons([
82312    *   [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
82313    *   [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
82314    * ]);
82315    *
82316    * //=polygons
82317    */
82318   function polygons(coordinates, properties, options) {
82319       if (options === void 0) { options = {}; }
82320       return featureCollection(coordinates.map(function (coords) {
82321           return polygon(coords, properties);
82322       }), options);
82323   }
82324   exports.polygons = polygons;
82325   /**
82326    * Creates a {@link LineString} {@link Feature} from an Array of Positions.
82327    *
82328    * @name lineString
82329    * @param {Array<Array<number>>} coordinates an array of Positions
82330    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
82331    * @param {Object} [options={}] Optional Parameters
82332    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
82333    * @param {string|number} [options.id] Identifier associated with the Feature
82334    * @returns {Feature<LineString>} LineString Feature
82335    * @example
82336    * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
82337    * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
82338    *
82339    * //=linestring1
82340    * //=linestring2
82341    */
82342   function lineString(coordinates, properties, options) {
82343       if (options === void 0) { options = {}; }
82344       if (coordinates.length < 2) {
82345           throw new Error("coordinates must be an array of two or more positions");
82346       }
82347       var geom = {
82348           type: "LineString",
82349           coordinates: coordinates,
82350       };
82351       return feature(geom, properties, options);
82352   }
82353   exports.lineString = lineString;
82354   /**
82355    * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
82356    *
82357    * @name lineStrings
82358    * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
82359    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
82360    * @param {Object} [options={}] Optional Parameters
82361    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
82362    * associated with the FeatureCollection
82363    * @param {string|number} [options.id] Identifier associated with the FeatureCollection
82364    * @returns {FeatureCollection<LineString>} LineString FeatureCollection
82365    * @example
82366    * var linestrings = turf.lineStrings([
82367    *   [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
82368    *   [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
82369    * ]);
82370    *
82371    * //=linestrings
82372    */
82373   function lineStrings(coordinates, properties, options) {
82374       if (options === void 0) { options = {}; }
82375       return featureCollection(coordinates.map(function (coords) {
82376           return lineString(coords, properties);
82377       }), options);
82378   }
82379   exports.lineStrings = lineStrings;
82380   /**
82381    * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
82382    *
82383    * @name featureCollection
82384    * @param {Feature[]} features input features
82385    * @param {Object} [options={}] Optional Parameters
82386    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
82387    * @param {string|number} [options.id] Identifier associated with the Feature
82388    * @returns {FeatureCollection} FeatureCollection of Features
82389    * @example
82390    * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
82391    * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
82392    * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
82393    *
82394    * var collection = turf.featureCollection([
82395    *   locationA,
82396    *   locationB,
82397    *   locationC
82398    * ]);
82399    *
82400    * //=collection
82401    */
82402   function featureCollection(features, options) {
82403       if (options === void 0) { options = {}; }
82404       var fc = { type: "FeatureCollection" };
82405       if (options.id) {
82406           fc.id = options.id;
82407       }
82408       if (options.bbox) {
82409           fc.bbox = options.bbox;
82410       }
82411       fc.features = features;
82412       return fc;
82413   }
82414   exports.featureCollection = featureCollection;
82415   /**
82416    * Creates a {@link Feature<MultiLineString>} based on a
82417    * coordinate array. Properties can be added optionally.
82418    *
82419    * @name multiLineString
82420    * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
82421    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
82422    * @param {Object} [options={}] Optional Parameters
82423    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
82424    * @param {string|number} [options.id] Identifier associated with the Feature
82425    * @returns {Feature<MultiLineString>} a MultiLineString feature
82426    * @throws {Error} if no coordinates are passed
82427    * @example
82428    * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
82429    *
82430    * //=multiLine
82431    */
82432   function multiLineString(coordinates, properties, options) {
82433       if (options === void 0) { options = {}; }
82434       var geom = {
82435           type: "MultiLineString",
82436           coordinates: coordinates,
82437       };
82438       return feature(geom, properties, options);
82439   }
82440   exports.multiLineString = multiLineString;
82441   /**
82442    * Creates a {@link Feature<MultiPoint>} based on a
82443    * coordinate array. Properties can be added optionally.
82444    *
82445    * @name multiPoint
82446    * @param {Array<Array<number>>} coordinates an array of Positions
82447    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
82448    * @param {Object} [options={}] Optional Parameters
82449    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
82450    * @param {string|number} [options.id] Identifier associated with the Feature
82451    * @returns {Feature<MultiPoint>} a MultiPoint feature
82452    * @throws {Error} if no coordinates are passed
82453    * @example
82454    * var multiPt = turf.multiPoint([[0,0],[10,10]]);
82455    *
82456    * //=multiPt
82457    */
82458   function multiPoint(coordinates, properties, options) {
82459       if (options === void 0) { options = {}; }
82460       var geom = {
82461           type: "MultiPoint",
82462           coordinates: coordinates,
82463       };
82464       return feature(geom, properties, options);
82465   }
82466   exports.multiPoint = multiPoint;
82467   /**
82468    * Creates a {@link Feature<MultiPolygon>} based on a
82469    * coordinate array. Properties can be added optionally.
82470    *
82471    * @name multiPolygon
82472    * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
82473    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
82474    * @param {Object} [options={}] Optional Parameters
82475    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
82476    * @param {string|number} [options.id] Identifier associated with the Feature
82477    * @returns {Feature<MultiPolygon>} a multipolygon feature
82478    * @throws {Error} if no coordinates are passed
82479    * @example
82480    * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
82481    *
82482    * //=multiPoly
82483    *
82484    */
82485   function multiPolygon(coordinates, properties, options) {
82486       if (options === void 0) { options = {}; }
82487       var geom = {
82488           type: "MultiPolygon",
82489           coordinates: coordinates,
82490       };
82491       return feature(geom, properties, options);
82492   }
82493   exports.multiPolygon = multiPolygon;
82494   /**
82495    * Creates a {@link Feature<GeometryCollection>} based on a
82496    * coordinate array. Properties can be added optionally.
82497    *
82498    * @name geometryCollection
82499    * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
82500    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
82501    * @param {Object} [options={}] Optional Parameters
82502    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
82503    * @param {string|number} [options.id] Identifier associated with the Feature
82504    * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
82505    * @example
82506    * var pt = turf.geometry("Point", [100, 0]);
82507    * var line = turf.geometry("LineString", [[101, 0], [102, 1]]);
82508    * var collection = turf.geometryCollection([pt, line]);
82509    *
82510    * // => collection
82511    */
82512   function geometryCollection(geometries, properties, options) {
82513       if (options === void 0) { options = {}; }
82514       var geom = {
82515           type: "GeometryCollection",
82516           geometries: geometries,
82517       };
82518       return feature(geom, properties, options);
82519   }
82520   exports.geometryCollection = geometryCollection;
82521   /**
82522    * Round number to precision
82523    *
82524    * @param {number} num Number
82525    * @param {number} [precision=0] Precision
82526    * @returns {number} rounded number
82527    * @example
82528    * turf.round(120.4321)
82529    * //=120
82530    *
82531    * turf.round(120.4321, 2)
82532    * //=120.43
82533    */
82534   function round(num, precision) {
82535       if (precision === void 0) { precision = 0; }
82536       if (precision && !(precision >= 0)) {
82537           throw new Error("precision must be a positive number");
82538       }
82539       var multiplier = Math.pow(10, precision || 0);
82540       return Math.round(num * multiplier) / multiplier;
82541   }
82542   exports.round = round;
82543   /**
82544    * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
82545    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
82546    *
82547    * @name radiansToLength
82548    * @param {number} radians in radians across the sphere
82549    * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
82550    * meters, kilometres, kilometers.
82551    * @returns {number} distance
82552    */
82553   function radiansToLength(radians, units) {
82554       if (units === void 0) { units = "kilometers"; }
82555       var factor = exports.factors[units];
82556       if (!factor) {
82557           throw new Error(units + " units is invalid");
82558       }
82559       return radians * factor;
82560   }
82561   exports.radiansToLength = radiansToLength;
82562   /**
82563    * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
82564    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
82565    *
82566    * @name lengthToRadians
82567    * @param {number} distance in real units
82568    * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
82569    * meters, kilometres, kilometers.
82570    * @returns {number} radians
82571    */
82572   function lengthToRadians(distance, units) {
82573       if (units === void 0) { units = "kilometers"; }
82574       var factor = exports.factors[units];
82575       if (!factor) {
82576           throw new Error(units + " units is invalid");
82577       }
82578       return distance / factor;
82579   }
82580   exports.lengthToRadians = lengthToRadians;
82581   /**
82582    * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
82583    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
82584    *
82585    * @name lengthToDegrees
82586    * @param {number} distance in real units
82587    * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
82588    * meters, kilometres, kilometers.
82589    * @returns {number} degrees
82590    */
82591   function lengthToDegrees(distance, units) {
82592       return radiansToDegrees(lengthToRadians(distance, units));
82593   }
82594   exports.lengthToDegrees = lengthToDegrees;
82595   /**
82596    * Converts any bearing angle from the north line direction (positive clockwise)
82597    * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
82598    *
82599    * @name bearingToAzimuth
82600    * @param {number} bearing angle, between -180 and +180 degrees
82601    * @returns {number} angle between 0 and 360 degrees
82602    */
82603   function bearingToAzimuth(bearing) {
82604       var angle = bearing % 360;
82605       if (angle < 0) {
82606           angle += 360;
82607       }
82608       return angle;
82609   }
82610   exports.bearingToAzimuth = bearingToAzimuth;
82611   /**
82612    * Converts an angle in radians to degrees
82613    *
82614    * @name radiansToDegrees
82615    * @param {number} radians angle in radians
82616    * @returns {number} degrees between 0 and 360 degrees
82617    */
82618   function radiansToDegrees(radians) {
82619       var degrees = radians % (2 * Math.PI);
82620       return degrees * 180 / Math.PI;
82621   }
82622   exports.radiansToDegrees = radiansToDegrees;
82623   /**
82624    * Converts an angle in degrees to radians
82625    *
82626    * @name degreesToRadians
82627    * @param {number} degrees angle between 0 and 360 degrees
82628    * @returns {number} angle in radians
82629    */
82630   function degreesToRadians(degrees) {
82631       var radians = degrees % 360;
82632       return radians * Math.PI / 180;
82633   }
82634   exports.degreesToRadians = degreesToRadians;
82635   /**
82636    * Converts a length to the requested unit.
82637    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
82638    *
82639    * @param {number} length to be converted
82640    * @param {Units} [originalUnit="kilometers"] of the length
82641    * @param {Units} [finalUnit="kilometers"] returned unit
82642    * @returns {number} the converted length
82643    */
82644   function convertLength(length, originalUnit, finalUnit) {
82645       if (originalUnit === void 0) { originalUnit = "kilometers"; }
82646       if (finalUnit === void 0) { finalUnit = "kilometers"; }
82647       if (!(length >= 0)) {
82648           throw new Error("length must be a positive number");
82649       }
82650       return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);
82651   }
82652   exports.convertLength = convertLength;
82653   /**
82654    * Converts a area to the requested unit.
82655    * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
82656    * @param {number} area to be converted
82657    * @param {Units} [originalUnit="meters"] of the distance
82658    * @param {Units} [finalUnit="kilometers"] returned unit
82659    * @returns {number} the converted distance
82660    */
82661   function convertArea(area, originalUnit, finalUnit) {
82662       if (originalUnit === void 0) { originalUnit = "meters"; }
82663       if (finalUnit === void 0) { finalUnit = "kilometers"; }
82664       if (!(area >= 0)) {
82665           throw new Error("area must be a positive number");
82666       }
82667       var startFactor = exports.areaFactors[originalUnit];
82668       if (!startFactor) {
82669           throw new Error("invalid original units");
82670       }
82671       var finalFactor = exports.areaFactors[finalUnit];
82672       if (!finalFactor) {
82673           throw new Error("invalid final units");
82674       }
82675       return (area / startFactor) * finalFactor;
82676   }
82677   exports.convertArea = convertArea;
82678   /**
82679    * isNumber
82680    *
82681    * @param {*} num Number to validate
82682    * @returns {boolean} true/false
82683    * @example
82684    * turf.isNumber(123)
82685    * //=true
82686    * turf.isNumber('foo')
82687    * //=false
82688    */
82689   function isNumber(num) {
82690       return !isNaN(num) && num !== null && !Array.isArray(num) && !/^\s*$/.test(num);
82691   }
82692   exports.isNumber = isNumber;
82693   /**
82694    * isObject
82695    *
82696    * @param {*} input variable to validate
82697    * @returns {boolean} true/false
82698    * @example
82699    * turf.isObject({elevation: 10})
82700    * //=true
82701    * turf.isObject('foo')
82702    * //=false
82703    */
82704   function isObject(input) {
82705       return (!!input) && (input.constructor === Object);
82706   }
82707   exports.isObject = isObject;
82708   /**
82709    * Validate BBox
82710    *
82711    * @private
82712    * @param {Array<number>} bbox BBox to validate
82713    * @returns {void}
82714    * @throws Error if BBox is not valid
82715    * @example
82716    * validateBBox([-180, -40, 110, 50])
82717    * //=OK
82718    * validateBBox([-180, -40])
82719    * //=Error
82720    * validateBBox('Foo')
82721    * //=Error
82722    * validateBBox(5)
82723    * //=Error
82724    * validateBBox(null)
82725    * //=Error
82726    * validateBBox(undefined)
82727    * //=Error
82728    */
82729   function validateBBox(bbox) {
82730       if (!bbox) {
82731           throw new Error("bbox is required");
82732       }
82733       if (!Array.isArray(bbox)) {
82734           throw new Error("bbox must be an Array");
82735       }
82736       if (bbox.length !== 4 && bbox.length !== 6) {
82737           throw new Error("bbox must be an Array of 4 or 6 numbers");
82738       }
82739       bbox.forEach(function (num) {
82740           if (!isNumber(num)) {
82741               throw new Error("bbox must only contain numbers");
82742           }
82743       });
82744   }
82745   exports.validateBBox = validateBBox;
82746   /**
82747    * Validate Id
82748    *
82749    * @private
82750    * @param {string|number} id Id to validate
82751    * @returns {void}
82752    * @throws Error if Id is not valid
82753    * @example
82754    * validateId([-180, -40, 110, 50])
82755    * //=Error
82756    * validateId([-180, -40])
82757    * //=Error
82758    * validateId('Foo')
82759    * //=OK
82760    * validateId(5)
82761    * //=OK
82762    * validateId(null)
82763    * //=Error
82764    * validateId(undefined)
82765    * //=Error
82766    */
82767   function validateId(id) {
82768       if (!id) {
82769           throw new Error("id is required");
82770       }
82771       if (["string", "number"].indexOf(typeof id) === -1) {
82772           throw new Error("id must be a number or a string");
82773       }
82774   }
82775   exports.validateId = validateId;
82776   // Deprecated methods
82777   function radians2degrees() {
82778       throw new Error("method has been renamed to `radiansToDegrees`");
82779   }
82780   exports.radians2degrees = radians2degrees;
82781   function degrees2radians() {
82782       throw new Error("method has been renamed to `degreesToRadians`");
82783   }
82784   exports.degrees2radians = degrees2radians;
82785   function distanceToDegrees() {
82786       throw new Error("method has been renamed to `lengthToDegrees`");
82787   }
82788   exports.distanceToDegrees = distanceToDegrees;
82789   function distanceToRadians() {
82790       throw new Error("method has been renamed to `lengthToRadians`");
82791   }
82792   exports.distanceToRadians = distanceToRadians;
82793   function radiansToDistance() {
82794       throw new Error("method has been renamed to `radiansToLength`");
82795   }
82796   exports.radiansToDistance = radiansToDistance;
82797   function bearingToAngle() {
82798       throw new Error("method has been renamed to `bearingToAzimuth`");
82799   }
82800   exports.bearingToAngle = bearingToAngle;
82801   function convertDistance() {
82802       throw new Error("method has been renamed to `convertLength`");
82803   }
82804   exports.convertDistance = convertDistance;
82805   });
82806
82807   unwrapExports(helpers);
82808   var helpers_1 = helpers.earthRadius;
82809   var helpers_2 = helpers.factors;
82810   var helpers_3 = helpers.unitsFactors;
82811   var helpers_4 = helpers.areaFactors;
82812   var helpers_5 = helpers.feature;
82813   var helpers_6 = helpers.geometry;
82814   var helpers_7 = helpers.point;
82815   var helpers_8 = helpers.points;
82816   var helpers_9 = helpers.polygon;
82817   var helpers_10 = helpers.polygons;
82818   var helpers_11 = helpers.lineString;
82819   var helpers_12 = helpers.lineStrings;
82820   var helpers_13 = helpers.featureCollection;
82821   var helpers_14 = helpers.multiLineString;
82822   var helpers_15 = helpers.multiPoint;
82823   var helpers_16 = helpers.multiPolygon;
82824   var helpers_17 = helpers.geometryCollection;
82825   var helpers_18 = helpers.round;
82826   var helpers_19 = helpers.radiansToLength;
82827   var helpers_20 = helpers.lengthToRadians;
82828   var helpers_21 = helpers.lengthToDegrees;
82829   var helpers_22 = helpers.bearingToAzimuth;
82830   var helpers_23 = helpers.radiansToDegrees;
82831   var helpers_24 = helpers.degreesToRadians;
82832   var helpers_25 = helpers.convertLength;
82833   var helpers_26 = helpers.convertArea;
82834   var helpers_27 = helpers.isNumber;
82835   var helpers_28 = helpers.isObject;
82836   var helpers_29 = helpers.validateBBox;
82837   var helpers_30 = helpers.validateId;
82838   var helpers_31 = helpers.radians2degrees;
82839   var helpers_32 = helpers.degrees2radians;
82840   var helpers_33 = helpers.distanceToDegrees;
82841   var helpers_34 = helpers.distanceToRadians;
82842   var helpers_35 = helpers.radiansToDistance;
82843   var helpers_36 = helpers.bearingToAngle;
82844   var helpers_37 = helpers.convertDistance;
82845
82846   var invariant = createCommonjsModule(function (module, exports) {
82847   Object.defineProperty(exports, "__esModule", { value: true });
82848
82849   /**
82850    * Unwrap a coordinate from a Point Feature, Geometry or a single coordinate.
82851    *
82852    * @name getCoord
82853    * @param {Array<number>|Geometry<Point>|Feature<Point>} coord GeoJSON Point or an Array of numbers
82854    * @returns {Array<number>} coordinates
82855    * @example
82856    * var pt = turf.point([10, 10]);
82857    *
82858    * var coord = turf.getCoord(pt);
82859    * //= [10, 10]
82860    */
82861   function getCoord(coord) {
82862       if (!coord) {
82863           throw new Error("coord is required");
82864       }
82865       if (!Array.isArray(coord)) {
82866           if (coord.type === "Feature" && coord.geometry !== null && coord.geometry.type === "Point") {
82867               return coord.geometry.coordinates;
82868           }
82869           if (coord.type === "Point") {
82870               return coord.coordinates;
82871           }
82872       }
82873       if (Array.isArray(coord) && coord.length >= 2 && !Array.isArray(coord[0]) && !Array.isArray(coord[1])) {
82874           return coord;
82875       }
82876       throw new Error("coord must be GeoJSON Point or an Array of numbers");
82877   }
82878   exports.getCoord = getCoord;
82879   /**
82880    * Unwrap coordinates from a Feature, Geometry Object or an Array
82881    *
82882    * @name getCoords
82883    * @param {Array<any>|Geometry|Feature} coords Feature, Geometry Object or an Array
82884    * @returns {Array<any>} coordinates
82885    * @example
82886    * var poly = turf.polygon([[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]);
82887    *
82888    * var coords = turf.getCoords(poly);
82889    * //= [[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]
82890    */
82891   function getCoords(coords) {
82892       if (Array.isArray(coords)) {
82893           return coords;
82894       }
82895       // Feature
82896       if (coords.type === "Feature") {
82897           if (coords.geometry !== null) {
82898               return coords.geometry.coordinates;
82899           }
82900       }
82901       else {
82902           // Geometry
82903           if (coords.coordinates) {
82904               return coords.coordinates;
82905           }
82906       }
82907       throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array");
82908   }
82909   exports.getCoords = getCoords;
82910   /**
82911    * Checks if coordinates contains a number
82912    *
82913    * @name containsNumber
82914    * @param {Array<any>} coordinates GeoJSON Coordinates
82915    * @returns {boolean} true if Array contains a number
82916    */
82917   function containsNumber(coordinates) {
82918       if (coordinates.length > 1 && helpers.isNumber(coordinates[0]) && helpers.isNumber(coordinates[1])) {
82919           return true;
82920       }
82921       if (Array.isArray(coordinates[0]) && coordinates[0].length) {
82922           return containsNumber(coordinates[0]);
82923       }
82924       throw new Error("coordinates must only contain numbers");
82925   }
82926   exports.containsNumber = containsNumber;
82927   /**
82928    * Enforce expectations about types of GeoJSON objects for Turf.
82929    *
82930    * @name geojsonType
82931    * @param {GeoJSON} value any GeoJSON object
82932    * @param {string} type expected GeoJSON type
82933    * @param {string} name name of calling function
82934    * @throws {Error} if value is not the expected type.
82935    */
82936   function geojsonType(value, type, name) {
82937       if (!type || !name) {
82938           throw new Error("type and name required");
82939       }
82940       if (!value || value.type !== type) {
82941           throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + value.type);
82942       }
82943   }
82944   exports.geojsonType = geojsonType;
82945   /**
82946    * Enforce expectations about types of {@link Feature} inputs for Turf.
82947    * Internally this uses {@link geojsonType} to judge geometry types.
82948    *
82949    * @name featureOf
82950    * @param {Feature} feature a feature with an expected geometry type
82951    * @param {string} type expected GeoJSON type
82952    * @param {string} name name of calling function
82953    * @throws {Error} error if value is not the expected type.
82954    */
82955   function featureOf(feature, type, name) {
82956       if (!feature) {
82957           throw new Error("No feature passed");
82958       }
82959       if (!name) {
82960           throw new Error(".featureOf() requires a name");
82961       }
82962       if (!feature || feature.type !== "Feature" || !feature.geometry) {
82963           throw new Error("Invalid input to " + name + ", Feature with geometry required");
82964       }
82965       if (!feature.geometry || feature.geometry.type !== type) {
82966           throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type);
82967       }
82968   }
82969   exports.featureOf = featureOf;
82970   /**
82971    * Enforce expectations about types of {@link FeatureCollection} inputs for Turf.
82972    * Internally this uses {@link geojsonType} to judge geometry types.
82973    *
82974    * @name collectionOf
82975    * @param {FeatureCollection} featureCollection a FeatureCollection for which features will be judged
82976    * @param {string} type expected GeoJSON type
82977    * @param {string} name name of calling function
82978    * @throws {Error} if value is not the expected type.
82979    */
82980   function collectionOf(featureCollection, type, name) {
82981       if (!featureCollection) {
82982           throw new Error("No featureCollection passed");
82983       }
82984       if (!name) {
82985           throw new Error(".collectionOf() requires a name");
82986       }
82987       if (!featureCollection || featureCollection.type !== "FeatureCollection") {
82988           throw new Error("Invalid input to " + name + ", FeatureCollection required");
82989       }
82990       for (var _i = 0, _a = featureCollection.features; _i < _a.length; _i++) {
82991           var feature = _a[_i];
82992           if (!feature || feature.type !== "Feature" || !feature.geometry) {
82993               throw new Error("Invalid input to " + name + ", Feature with geometry required");
82994           }
82995           if (!feature.geometry || feature.geometry.type !== type) {
82996               throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type);
82997           }
82998       }
82999   }
83000   exports.collectionOf = collectionOf;
83001   /**
83002    * Get Geometry from Feature or Geometry Object
83003    *
83004    * @param {Feature|Geometry} geojson GeoJSON Feature or Geometry Object
83005    * @returns {Geometry|null} GeoJSON Geometry Object
83006    * @throws {Error} if geojson is not a Feature or Geometry Object
83007    * @example
83008    * var point = {
83009    *   "type": "Feature",
83010    *   "properties": {},
83011    *   "geometry": {
83012    *     "type": "Point",
83013    *     "coordinates": [110, 40]
83014    *   }
83015    * }
83016    * var geom = turf.getGeom(point)
83017    * //={"type": "Point", "coordinates": [110, 40]}
83018    */
83019   function getGeom(geojson) {
83020       if (geojson.type === "Feature") {
83021           return geojson.geometry;
83022       }
83023       return geojson;
83024   }
83025   exports.getGeom = getGeom;
83026   /**
83027    * Get GeoJSON object's type, Geometry type is prioritize.
83028    *
83029    * @param {GeoJSON} geojson GeoJSON object
83030    * @param {string} [name="geojson"] name of the variable to display in error message
83031    * @returns {string} GeoJSON type
83032    * @example
83033    * var point = {
83034    *   "type": "Feature",
83035    *   "properties": {},
83036    *   "geometry": {
83037    *     "type": "Point",
83038    *     "coordinates": [110, 40]
83039    *   }
83040    * }
83041    * var geom = turf.getType(point)
83042    * //="Point"
83043    */
83044   function getType(geojson, name) {
83045       if (geojson.type === "FeatureCollection") {
83046           return "FeatureCollection";
83047       }
83048       if (geojson.type === "GeometryCollection") {
83049           return "GeometryCollection";
83050       }
83051       if (geojson.type === "Feature" && geojson.geometry !== null) {
83052           return geojson.geometry.type;
83053       }
83054       return geojson.type;
83055   }
83056   exports.getType = getType;
83057   });
83058
83059   unwrapExports(invariant);
83060   var invariant_1 = invariant.getCoord;
83061   var invariant_2 = invariant.getCoords;
83062   var invariant_3 = invariant.containsNumber;
83063   var invariant_4 = invariant.geojsonType;
83064   var invariant_5 = invariant.featureOf;
83065   var invariant_6 = invariant.collectionOf;
83066   var invariant_7 = invariant.getGeom;
83067   var invariant_8 = invariant.getType;
83068
83069   var lineclip_1$1 = lineclip$1;
83070   var default_1$1 = lineclip$1;
83071
83072   lineclip$1.polyline = lineclip$1;
83073   lineclip$1.polygon = polygonclip$1;
83074
83075
83076   // Cohen-Sutherland line clippign algorithm, adapted to efficiently
83077   // handle polylines rather than just segments
83078
83079   function lineclip$1(points, bbox, result) {
83080
83081       var len = points.length,
83082           codeA = bitCode$1(points[0], bbox),
83083           part = [],
83084           i, a, b, codeB, lastCode;
83085
83086       if (!result) result = [];
83087
83088       for (i = 1; i < len; i++) {
83089           a = points[i - 1];
83090           b = points[i];
83091           codeB = lastCode = bitCode$1(b, bbox);
83092
83093           while (true) {
83094
83095               if (!(codeA | codeB)) { // accept
83096                   part.push(a);
83097
83098                   if (codeB !== lastCode) { // segment went outside
83099                       part.push(b);
83100
83101                       if (i < len - 1) { // start a new line
83102                           result.push(part);
83103                           part = [];
83104                       }
83105                   } else if (i === len - 1) {
83106                       part.push(b);
83107                   }
83108                   break;
83109
83110               } else if (codeA & codeB) { // trivial reject
83111                   break;
83112
83113               } else if (codeA) { // a outside, intersect with clip edge
83114                   a = intersect$2(a, b, codeA, bbox);
83115                   codeA = bitCode$1(a, bbox);
83116
83117               } else { // b outside
83118                   b = intersect$2(a, b, codeB, bbox);
83119                   codeB = bitCode$1(b, bbox);
83120               }
83121           }
83122
83123           codeA = lastCode;
83124       }
83125
83126       if (part.length) result.push(part);
83127
83128       return result;
83129   }
83130
83131   // Sutherland-Hodgeman polygon clipping algorithm
83132
83133   function polygonclip$1(points, bbox) {
83134
83135       var result, edge, prev, prevInside, i, p, inside;
83136
83137       // clip against each side of the clip rectangle
83138       for (edge = 1; edge <= 8; edge *= 2) {
83139           result = [];
83140           prev = points[points.length - 1];
83141           prevInside = !(bitCode$1(prev, bbox) & edge);
83142
83143           for (i = 0; i < points.length; i++) {
83144               p = points[i];
83145               inside = !(bitCode$1(p, bbox) & edge);
83146
83147               // if segment goes through the clip window, add an intersection
83148               if (inside !== prevInside) result.push(intersect$2(prev, p, edge, bbox));
83149
83150               if (inside) result.push(p); // add a point if it's inside
83151
83152               prev = p;
83153               prevInside = inside;
83154           }
83155
83156           points = result;
83157
83158           if (!points.length) break;
83159       }
83160
83161       return result;
83162   }
83163
83164   // intersect a segment against one of the 4 lines that make up the bbox
83165
83166   function intersect$2(a, b, edge, bbox) {
83167       return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
83168              edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
83169              edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
83170              edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
83171              null;
83172   }
83173
83174   // bit code reflects the point position relative to the bbox:
83175
83176   //         left  mid  right
83177   //    top  1001  1000  1010
83178   //    mid  0001  0000  0010
83179   // bottom  0101  0100  0110
83180
83181   function bitCode$1(p, bbox) {
83182       var code = 0;
83183
83184       if (p[0] < bbox[0]) code |= 1; // left
83185       else if (p[0] > bbox[2]) code |= 2; // right
83186
83187       if (p[1] < bbox[1]) code |= 4; // bottom
83188       else if (p[1] > bbox[3]) code |= 8; // top
83189
83190       return code;
83191   }
83192   lineclip_1$1.default = default_1$1;
83193
83194   var bboxClip_1 = createCommonjsModule(function (module, exports) {
83195   var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) {
83196       if (mod && mod.__esModule) return mod;
83197       var result = {};
83198       if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
83199       result["default"] = mod;
83200       return result;
83201   };
83202   Object.defineProperty(exports, "__esModule", { value: true });
83203
83204
83205   var lineclip = __importStar(lineclip_1$1);
83206   /**
83207    * Takes a {@link Feature} and a bbox and clips the feature to the bbox using
83208    * [lineclip](https://github.com/mapbox/lineclip).
83209    * May result in degenerate edges when clipping Polygons.
83210    *
83211    * @name bboxClip
83212    * @param {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} feature feature to clip to the bbox
83213    * @param {BBox} bbox extent in [minX, minY, maxX, maxY] order
83214    * @returns {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} clipped Feature
83215    * @example
83216    * var bbox = [0, 0, 10, 10];
83217    * var poly = turf.polygon([[[2, 2], [8, 4], [12, 8], [3, 7], [2, 2]]]);
83218    *
83219    * var clipped = turf.bboxClip(poly, bbox);
83220    *
83221    * //addToMap
83222    * var addToMap = [bbox, poly, clipped]
83223    */
83224   function bboxClip(feature, bbox) {
83225       var geom = invariant.getGeom(feature);
83226       var type = geom.type;
83227       var properties = feature.type === "Feature" ? feature.properties : {};
83228       var coords = geom.coordinates;
83229       switch (type) {
83230           case "LineString":
83231           case "MultiLineString":
83232               var lines_1 = [];
83233               if (type === "LineString") {
83234                   coords = [coords];
83235               }
83236               coords.forEach(function (line) {
83237                   lineclip.polyline(line, bbox, lines_1);
83238               });
83239               if (lines_1.length === 1) {
83240                   return helpers.lineString(lines_1[0], properties);
83241               }
83242               return helpers.multiLineString(lines_1, properties);
83243           case "Polygon":
83244               return helpers.polygon(clipPolygon(coords, bbox), properties);
83245           case "MultiPolygon":
83246               return helpers.multiPolygon(coords.map(function (poly) {
83247                   return clipPolygon(poly, bbox);
83248               }), properties);
83249           default:
83250               throw new Error("geometry " + type + " not supported");
83251       }
83252   }
83253   exports.default = bboxClip;
83254   function clipPolygon(rings, bbox) {
83255       var outRings = [];
83256       for (var _i = 0, rings_1 = rings; _i < rings_1.length; _i++) {
83257           var ring = rings_1[_i];
83258           var clipped = lineclip.polygon(ring, bbox);
83259           if (clipped.length > 0) {
83260               if (clipped[0][0] !== clipped[clipped.length - 1][0] || clipped[0][1] !== clipped[clipped.length - 1][1]) {
83261                   clipped.push(clipped[0]);
83262               }
83263               if (clipped.length >= 4) {
83264                   outRings.push(clipped);
83265               }
83266           }
83267       }
83268       return outRings;
83269   }
83270   });
83271
83272   var turf_bboxClip = unwrapExports(bboxClip_1);
83273
83274   var martinez_umd = createCommonjsModule(function (module, exports) {
83275   /**
83276    * martinez v0.5.0
83277    * Martinez polygon clipping algorithm, does boolean operation on polygons (multipolygons, polygons with holes etc): intersection, union, difference, xor
83278    *
83279    * @author Alex Milevski <info@w8r.name>
83280    * @license MIT
83281    * @preserve
83282    */
83283
83284   (function (global, factory) {
83285     factory(exports);
83286   }(commonjsGlobal, (function (exports) {
83287     function DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }
83288
83289     var SplayTree = function SplayTree(compare, noDuplicates) {
83290       if ( compare === void 0 ) compare = DEFAULT_COMPARE;
83291       if ( noDuplicates === void 0 ) noDuplicates = false;
83292
83293       this._compare = compare;
83294       this._root = null;
83295       this._size = 0;
83296       this._noDuplicates = !!noDuplicates;
83297     };
83298
83299     var prototypeAccessors = { size: { configurable: true } };
83300
83301
83302     SplayTree.prototype.rotateLeft = function rotateLeft (x) {
83303       var y = x.right;
83304       if (y) {
83305         x.right = y.left;
83306         if (y.left) { y.left.parent = x; }
83307         y.parent = x.parent;
83308       }
83309
83310       if (!x.parent)              { this._root = y; }
83311       else if (x === x.parent.left) { x.parent.left = y; }
83312       else                        { x.parent.right = y; }
83313       if (y) { y.left = x; }
83314       x.parent = y;
83315     };
83316
83317
83318     SplayTree.prototype.rotateRight = function rotateRight (x) {
83319       var y = x.left;
83320       if (y) {
83321         x.left = y.right;
83322         if (y.right) { y.right.parent = x; }
83323         y.parent = x.parent;
83324       }
83325
83326       if (!x.parent)             { this._root = y; }
83327       else if(x === x.parent.left) { x.parent.left = y; }
83328       else                       { x.parent.right = y; }
83329       if (y) { y.right = x; }
83330       x.parent = y;
83331     };
83332
83333
83334     SplayTree.prototype._splay = function _splay (x) {
83335         var this$1 = this;
83336
83337       while (x.parent) {
83338         var p = x.parent;
83339         if (!p.parent) {
83340           if (p.left === x) { this$1.rotateRight(p); }
83341           else            { this$1.rotateLeft(p); }
83342         } else if (p.left === x && p.parent.left === p) {
83343           this$1.rotateRight(p.parent);
83344           this$1.rotateRight(p);
83345         } else if (p.right === x && p.parent.right === p) {
83346           this$1.rotateLeft(p.parent);
83347           this$1.rotateLeft(p);
83348         } else if (p.left === x && p.parent.right === p) {
83349           this$1.rotateRight(p);
83350           this$1.rotateLeft(p);
83351         } else {
83352           this$1.rotateLeft(p);
83353           this$1.rotateRight(p);
83354         }
83355       }
83356     };
83357
83358
83359     SplayTree.prototype.splay = function splay (x) {
83360         var this$1 = this;
83361
83362       var p, gp, ggp, l, r;
83363
83364       while (x.parent) {
83365         p = x.parent;
83366         gp = p.parent;
83367
83368         if (gp && gp.parent) {
83369           ggp = gp.parent;
83370           if (ggp.left === gp) { ggp.left= x; }
83371           else               { ggp.right = x; }
83372           x.parent = ggp;
83373         } else {
83374           x.parent = null;
83375           this$1._root = x;
83376         }
83377
83378         l = x.left; r = x.right;
83379
83380         if (x === p.left) { // left
83381           if (gp) {
83382             if (gp.left === p) {
83383               /* zig-zig */
83384               if (p.right) {
83385                 gp.left = p.right;
83386                 gp.left.parent = gp;
83387               } else { gp.left = null; }
83388
83389               p.right = gp;
83390               gp.parent = p;
83391             } else {
83392               /* zig-zag */
83393               if (l) {
83394                 gp.right = l;
83395                 l.parent = gp;
83396               } else { gp.right = null; }
83397
83398               x.left  = gp;
83399               gp.parent = x;
83400             }
83401           }
83402           if (r) {
83403             p.left = r;
83404             r.parent = p;
83405           } else { p.left = null; }
83406
83407           x.right= p;
83408           p.parent = x;
83409         } else { // right
83410           if (gp) {
83411             if (gp.right === p) {
83412               /* zig-zig */
83413               if (p.left) {
83414                 gp.right = p.left;
83415                 gp.right.parent = gp;
83416               } else { gp.right = null; }
83417
83418               p.left = gp;
83419               gp.parent = p;
83420             } else {
83421               /* zig-zag */
83422               if (r) {
83423                 gp.left = r;
83424                 r.parent = gp;
83425               } else { gp.left = null; }
83426
83427               x.right = gp;
83428               gp.parent = x;
83429             }
83430           }
83431           if (l) {
83432             p.right = l;
83433             l.parent = p;
83434           } else { p.right = null; }
83435
83436           x.left = p;
83437           p.parent = x;
83438         }
83439       }
83440     };
83441
83442
83443     SplayTree.prototype.replace = function replace (u, v) {
83444       if (!u.parent) { this._root = v; }
83445       else if (u === u.parent.left) { u.parent.left = v; }
83446       else { u.parent.right = v; }
83447       if (v) { v.parent = u.parent; }
83448     };
83449
83450
83451     SplayTree.prototype.minNode = function minNode (u) {
83452         if ( u === void 0 ) u = this._root;
83453
83454       if (u) { while (u.left) { u = u.left; } }
83455       return u;
83456     };
83457
83458
83459     SplayTree.prototype.maxNode = function maxNode (u) {
83460         if ( u === void 0 ) u = this._root;
83461
83462       if (u) { while (u.right) { u = u.right; } }
83463       return u;
83464     };
83465
83466
83467     SplayTree.prototype.insert = function insert (key, data) {
83468       var z = this._root;
83469       var p = null;
83470       var comp = this._compare;
83471       var cmp;
83472
83473       if (this._noDuplicates) {
83474         while (z) {
83475           p = z;
83476           cmp = comp(z.key, key);
83477           if (cmp === 0) { return; }
83478           else if (comp(z.key, key) < 0) { z = z.right; }
83479           else { z = z.left; }
83480         }
83481       } else {
83482         while (z) {
83483           p = z;
83484           if (comp(z.key, key) < 0) { z = z.right; }
83485           else { z = z.left; }
83486         }
83487       }
83488
83489       z = { key: key, data: data, left: null, right: null, parent: p };
83490
83491       if (!p)                        { this._root = z; }
83492       else if (comp(p.key, z.key) < 0) { p.right = z; }
83493       else                           { p.left= z; }
83494
83495       this.splay(z);
83496       this._size++;
83497       return z;
83498     };
83499
83500
83501     SplayTree.prototype.find = function find (key) {
83502       var z  = this._root;
83503       var comp = this._compare;
83504       while (z) {
83505         var cmp = comp(z.key, key);
83506         if    (cmp < 0) { z = z.right; }
83507         else if (cmp > 0) { z = z.left; }
83508         else            { return z; }
83509       }
83510       return null;
83511     };
83512
83513     /**
83514      * Whether the tree contains a node with the given key
83515      * @param{Key} key
83516      * @return {boolean} true/false
83517      */
83518     SplayTree.prototype.contains = function contains (key) {
83519       var node     = this._root;
83520       var comparator = this._compare;
83521       while (node){
83522         var cmp = comparator(key, node.key);
83523         if    (cmp === 0) { return true; }
83524         else if (cmp < 0) { node = node.left; }
83525         else              { node = node.right; }
83526       }
83527
83528       return false;
83529     };
83530
83531
83532     SplayTree.prototype.remove = function remove (key) {
83533       var z = this.find(key);
83534
83535       if (!z) { return false; }
83536
83537       this.splay(z);
83538
83539       if (!z.left) { this.replace(z, z.right); }
83540       else if (!z.right) { this.replace(z, z.left); }
83541       else {
83542         var y = this.minNode(z.right);
83543         if (y.parent !== z) {
83544           this.replace(y, y.right);
83545           y.right = z.right;
83546           y.right.parent = y;
83547         }
83548         this.replace(z, y);
83549         y.left = z.left;
83550         y.left.parent = y;
83551       }
83552
83553       this._size--;
83554       return true;
83555     };
83556
83557
83558     SplayTree.prototype.removeNode = function removeNode (z) {
83559       if (!z) { return false; }
83560
83561       this.splay(z);
83562
83563       if (!z.left) { this.replace(z, z.right); }
83564       else if (!z.right) { this.replace(z, z.left); }
83565       else {
83566         var y = this.minNode(z.right);
83567         if (y.parent !== z) {
83568           this.replace(y, y.right);
83569           y.right = z.right;
83570           y.right.parent = y;
83571         }
83572         this.replace(z, y);
83573         y.left = z.left;
83574         y.left.parent = y;
83575       }
83576
83577       this._size--;
83578       return true;
83579     };
83580
83581
83582     SplayTree.prototype.erase = function erase (key) {
83583       var z = this.find(key);
83584       if (!z) { return; }
83585
83586       this.splay(z);
83587
83588       var s = z.left;
83589       var t = z.right;
83590
83591       var sMax = null;
83592       if (s) {
83593         s.parent = null;
83594         sMax = this.maxNode(s);
83595         this.splay(sMax);
83596         this._root = sMax;
83597       }
83598       if (t) {
83599         if (s) { sMax.right = t; }
83600         else { this._root = t; }
83601         t.parent = sMax;
83602       }
83603
83604       this._size--;
83605     };
83606
83607     /**
83608      * Removes and returns the node with smallest key
83609      * @return {?Node}
83610      */
83611     SplayTree.prototype.pop = function pop () {
83612       var node = this._root, returnValue = null;
83613       if (node) {
83614         while (node.left) { node = node.left; }
83615         returnValue = { key: node.key, data: node.data };
83616         this.remove(node.key);
83617       }
83618       return returnValue;
83619     };
83620
83621
83622     /* eslint-disable class-methods-use-this */
83623
83624     /**
83625      * Successor node
83626      * @param{Node} node
83627      * @return {?Node}
83628      */
83629     SplayTree.prototype.next = function next (node) {
83630       var successor = node;
83631       if (successor) {
83632         if (successor.right) {
83633           successor = successor.right;
83634           while (successor && successor.left) { successor = successor.left; }
83635         } else {
83636           successor = node.parent;
83637           while (successor && successor.right === node) {
83638             node = successor; successor = successor.parent;
83639           }
83640         }
83641       }
83642       return successor;
83643     };
83644
83645
83646     /**
83647      * Predecessor node
83648      * @param{Node} node
83649      * @return {?Node}
83650      */
83651     SplayTree.prototype.prev = function prev (node) {
83652       var predecessor = node;
83653       if (predecessor) {
83654         if (predecessor.left) {
83655           predecessor = predecessor.left;
83656           while (predecessor && predecessor.right) { predecessor = predecessor.right; }
83657         } else {
83658           predecessor = node.parent;
83659           while (predecessor && predecessor.left === node) {
83660             node = predecessor;
83661             predecessor = predecessor.parent;
83662           }
83663         }
83664       }
83665       return predecessor;
83666     };
83667     /* eslint-enable class-methods-use-this */
83668
83669
83670     /**
83671      * @param{forEachCallback} callback
83672      * @return {SplayTree}
83673      */
83674     SplayTree.prototype.forEach = function forEach (callback) {
83675       var current = this._root;
83676       var s = [], done = false, i = 0;
83677
83678       while (!done) {
83679         // Reach the left most Node of the current Node
83680         if (current) {
83681           // Place pointer to a tree node on the stack
83682           // before traversing the node's left subtree
83683           s.push(current);
83684           current = current.left;
83685         } else {
83686           // BackTrack from the empty subtree and visit the Node
83687           // at the top of the stack; however, if the stack is
83688           // empty you are done
83689           if (s.length > 0) {
83690             current = s.pop();
83691             callback(current, i++);
83692
83693             // We have visited the node and its left
83694             // subtree. Now, it's right subtree's turn
83695             current = current.right;
83696           } else { done = true; }
83697         }
83698       }
83699       return this;
83700     };
83701
83702
83703     /**
83704      * Walk key range from `low` to `high`. Stops if `fn` returns a value.
83705      * @param{Key}    low
83706      * @param{Key}    high
83707      * @param{Function} fn
83708      * @param{*?}     ctx
83709      * @return {SplayTree}
83710      */
83711     SplayTree.prototype.range = function range (low, high, fn, ctx) {
83712         var this$1 = this;
83713
83714       var Q = [];
83715       var compare = this._compare;
83716       var node = this._root, cmp;
83717
83718       while (Q.length !== 0 || node) {
83719         if (node) {
83720           Q.push(node);
83721           node = node.left;
83722         } else {
83723           node = Q.pop();
83724           cmp = compare(node.key, high);
83725           if (cmp > 0) {
83726             break;
83727           } else if (compare(node.key, low) >= 0) {
83728             if (fn.call(ctx, node)) { return this$1; } // stop if smth is returned
83729           }
83730           node = node.right;
83731         }
83732       }
83733       return this;
83734     };
83735
83736     /**
83737      * Returns all keys in order
83738      * @return {Array<Key>}
83739      */
83740     SplayTree.prototype.keys = function keys () {
83741       var current = this._root;
83742       var s = [], r = [], done = false;
83743
83744       while (!done) {
83745         if (current) {
83746           s.push(current);
83747           current = current.left;
83748         } else {
83749           if (s.length > 0) {
83750             current = s.pop();
83751             r.push(current.key);
83752             current = current.right;
83753           } else { done = true; }
83754         }
83755       }
83756       return r;
83757     };
83758
83759
83760     /**
83761      * Returns `data` fields of all nodes in order.
83762      * @return {Array<Value>}
83763      */
83764     SplayTree.prototype.values = function values () {
83765       var current = this._root;
83766       var s = [], r = [], done = false;
83767
83768       while (!done) {
83769         if (current) {
83770           s.push(current);
83771           current = current.left;
83772         } else {
83773           if (s.length > 0) {
83774             current = s.pop();
83775             r.push(current.data);
83776             current = current.right;
83777           } else { done = true; }
83778         }
83779       }
83780       return r;
83781     };
83782
83783
83784     /**
83785      * Returns node at given index
83786      * @param{number} index
83787      * @return {?Node}
83788      */
83789     SplayTree.prototype.at = function at (index) {
83790       // removed after a consideration, more misleading than useful
83791       // index = index % this.size;
83792       // if (index < 0) index = this.size - index;
83793
83794       var current = this._root;
83795       var s = [], done = false, i = 0;
83796
83797       while (!done) {
83798         if (current) {
83799           s.push(current);
83800           current = current.left;
83801         } else {
83802           if (s.length > 0) {
83803             current = s.pop();
83804             if (i === index) { return current; }
83805             i++;
83806             current = current.right;
83807           } else { done = true; }
83808         }
83809       }
83810       return null;
83811     };
83812
83813     /**
83814      * Bulk-load items. Both array have to be same size
83815      * @param{Array<Key>}  keys
83816      * @param{Array<Value>}[values]
83817      * @param{Boolean}     [presort=false] Pre-sort keys and values, using
83818      *                                       tree's comparator. Sorting is done
83819      *                                       in-place
83820      * @return {AVLTree}
83821      */
83822     SplayTree.prototype.load = function load (keys, values, presort) {
83823         if ( keys === void 0 ) keys = [];
83824         if ( values === void 0 ) values = [];
83825         if ( presort === void 0 ) presort = false;
83826
83827       if (this._size !== 0) { throw new Error('bulk-load: tree is not empty'); }
83828       var size = keys.length;
83829       if (presort) { sort(keys, values, 0, size - 1, this._compare); }
83830       this._root = loadRecursive(null, keys, values, 0, size);
83831       this._size = size;
83832       return this;
83833     };
83834
83835
83836     SplayTree.prototype.min = function min () {
83837       var node = this.minNode(this._root);
83838       if (node) { return node.key; }
83839       else    { return null; }
83840     };
83841
83842
83843     SplayTree.prototype.max = function max () {
83844       var node = this.maxNode(this._root);
83845       if (node) { return node.key; }
83846       else    { return null; }
83847     };
83848
83849     SplayTree.prototype.isEmpty = function isEmpty () { return this._root === null; };
83850     prototypeAccessors.size.get = function () { return this._size; };
83851
83852
83853     /**
83854      * Create a tree and load it with items
83855      * @param{Array<Key>}        keys
83856      * @param{Array<Value>?}      [values]
83857
83858      * @param{Function?}          [comparator]
83859      * @param{Boolean?}           [presort=false] Pre-sort keys and values, using
83860      *                                             tree's comparator. Sorting is done
83861      *                                             in-place
83862      * @param{Boolean?}           [noDuplicates=false] Allow duplicates
83863      * @return {SplayTree}
83864      */
83865     SplayTree.createTree = function createTree (keys, values, comparator, presort, noDuplicates) {
83866       return new SplayTree(comparator, noDuplicates).load(keys, values, presort);
83867     };
83868
83869     Object.defineProperties( SplayTree.prototype, prototypeAccessors );
83870
83871
83872     function loadRecursive (parent, keys, values, start, end) {
83873       var size = end - start;
83874       if (size > 0) {
83875         var middle = start + Math.floor(size / 2);
83876         var key    = keys[middle];
83877         var data   = values[middle];
83878         var node   = { key: key, data: data, parent: parent };
83879         node.left    = loadRecursive(node, keys, values, start, middle);
83880         node.right   = loadRecursive(node, keys, values, middle + 1, end);
83881         return node;
83882       }
83883       return null;
83884     }
83885
83886
83887     function sort(keys, values, left, right, compare) {
83888       if (left >= right) { return; }
83889
83890       var pivot = keys[(left + right) >> 1];
83891       var i = left - 1;
83892       var j = right + 1;
83893
83894       while (true) {
83895         do { i++; } while (compare(keys[i], pivot) < 0);
83896         do { j--; } while (compare(keys[j], pivot) > 0);
83897         if (i >= j) { break; }
83898
83899         var tmp = keys[i];
83900         keys[i] = keys[j];
83901         keys[j] = tmp;
83902
83903         tmp = values[i];
83904         values[i] = values[j];
83905         values[j] = tmp;
83906       }
83907
83908       sort(keys, values,  left,     j, compare);
83909       sort(keys, values, j + 1, right, compare);
83910     }
83911
83912     var NORMAL               = 0;
83913     var NON_CONTRIBUTING     = 1;
83914     var SAME_TRANSITION      = 2;
83915     var DIFFERENT_TRANSITION = 3;
83916
83917     var INTERSECTION = 0;
83918     var UNION        = 1;
83919     var DIFFERENCE   = 2;
83920     var XOR          = 3;
83921
83922     /**
83923      * @param  {SweepEvent} event
83924      * @param  {SweepEvent} prev
83925      * @param  {Operation} operation
83926      */
83927     function computeFields (event, prev, operation) {
83928       // compute inOut and otherInOut fields
83929       if (prev === null) {
83930         event.inOut      = false;
83931         event.otherInOut = true;
83932
83933       // previous line segment in sweepline belongs to the same polygon
83934       } else {
83935         if (event.isSubject === prev.isSubject) {
83936           event.inOut      = !prev.inOut;
83937           event.otherInOut = prev.otherInOut;
83938
83939         // previous line segment in sweepline belongs to the clipping polygon
83940         } else {
83941           event.inOut      = !prev.otherInOut;
83942           event.otherInOut = prev.isVertical() ? !prev.inOut : prev.inOut;
83943         }
83944
83945         // compute prevInResult field
83946         if (prev) {
83947           event.prevInResult = (!inResult(prev, operation) || prev.isVertical())
83948             ? prev.prevInResult : prev;
83949         }
83950       }
83951
83952       // check if the line segment belongs to the Boolean operation
83953       event.inResult = inResult(event, operation);
83954     }
83955
83956
83957     /* eslint-disable indent */
83958     function inResult(event, operation) {
83959       switch (event.type) {
83960         case NORMAL:
83961           switch (operation) {
83962             case INTERSECTION:
83963               return !event.otherInOut;
83964             case UNION:
83965               return event.otherInOut;
83966             case DIFFERENCE:
83967               // return (event.isSubject && !event.otherInOut) ||
83968               //         (!event.isSubject && event.otherInOut);
83969               return (event.isSubject && event.otherInOut) ||
83970                       (!event.isSubject && !event.otherInOut);
83971             case XOR:
83972               return true;
83973           }
83974           break;
83975         case SAME_TRANSITION:
83976           return operation === INTERSECTION || operation === UNION;
83977         case DIFFERENT_TRANSITION:
83978           return operation === DIFFERENCE;
83979         case NON_CONTRIBUTING:
83980           return false;
83981       }
83982       return false;
83983     }
83984     /* eslint-enable indent */
83985
83986     var SweepEvent = function SweepEvent (point, left, otherEvent, isSubject, edgeType) {
83987
83988       /**
83989        * Is left endpoint?
83990        * @type {Boolean}
83991        */
83992       this.left = left;
83993
83994       /**
83995        * @type {Array.<Number>}
83996        */
83997       this.point = point;
83998
83999       /**
84000        * Other edge reference
84001        * @type {SweepEvent}
84002        */
84003       this.otherEvent = otherEvent;
84004
84005       /**
84006        * Belongs to source or clipping polygon
84007        * @type {Boolean}
84008        */
84009       this.isSubject = isSubject;
84010
84011       /**
84012        * Edge contribution type
84013        * @type {Number}
84014        */
84015       this.type = edgeType || NORMAL;
84016
84017
84018       /**
84019        * In-out transition for the sweepline crossing polygon
84020        * @type {Boolean}
84021        */
84022       this.inOut = false;
84023
84024
84025       /**
84026        * @type {Boolean}
84027        */
84028       this.otherInOut = false;
84029
84030       /**
84031        * Previous event in result?
84032        * @type {SweepEvent}
84033        */
84034       this.prevInResult = null;
84035
84036       /**
84037        * Does event belong to result?
84038        * @type {Boolean}
84039        */
84040       this.inResult = false;
84041
84042
84043       // connection step
84044
84045       /**
84046        * @type {Boolean}
84047        */
84048       this.resultInOut = false;
84049
84050       this.isExteriorRing = true;
84051     };
84052
84053
84054     /**
84055      * @param{Array.<Number>}p
84056      * @return {Boolean}
84057      */
84058     SweepEvent.prototype.isBelow = function isBelow (p) {
84059       var p0 = this.point, p1 = this.otherEvent.point;
84060       return this.left
84061         ? (p0[0] - p[0]) * (p1[1] - p[1]) - (p1[0] - p[0]) * (p0[1] - p[1]) > 0
84062         // signedArea(this.point, this.otherEvent.point, p) > 0 :
84063         : (p1[0] - p[0]) * (p0[1] - p[1]) - (p0[0] - p[0]) * (p1[1] - p[1]) > 0;
84064         //signedArea(this.otherEvent.point, this.point, p) > 0;
84065     };
84066
84067
84068     /**
84069      * @param{Array.<Number>}p
84070      * @return {Boolean}
84071      */
84072     SweepEvent.prototype.isAbove = function isAbove (p) {
84073       return !this.isBelow(p);
84074     };
84075
84076
84077     /**
84078      * @return {Boolean}
84079      */
84080     SweepEvent.prototype.isVertical = function isVertical () {
84081       return this.point[0] === this.otherEvent.point[0];
84082     };
84083
84084
84085     SweepEvent.prototype.clone = function clone () {
84086       var copy = new SweepEvent(
84087         this.point, this.left, this.otherEvent, this.isSubject, this.type);
84088
84089       copy.inResult     = this.inResult;
84090       copy.prevInResult = this.prevInResult;
84091       copy.isExteriorRing = this.isExteriorRing;
84092       copy.inOut        = this.inOut;
84093       copy.otherInOut   = this.otherInOut;
84094
84095       return copy;
84096     };
84097
84098     function equals(p1, p2) {
84099       if (p1[0] === p2[0]) {
84100         if (p1[1] === p2[1]) {
84101           return true;
84102         } else {
84103           return false;
84104         }
84105       }
84106       return false;
84107     }
84108
84109     // const EPSILON = 1e-9;
84110     // const abs = Math.abs;
84111     // TODO https://github.com/w8r/martinez/issues/6#issuecomment-262847164
84112     // Precision problem.
84113     //
84114     // module.exports = function equals(p1, p2) {
84115     //   return abs(p1[0] - p2[0]) <= EPSILON && abs(p1[1] - p2[1]) <= EPSILON;
84116     // };
84117
84118     /**
84119      * Signed area of the triangle (p0, p1, p2)
84120      * @param  {Array.<Number>} p0
84121      * @param  {Array.<Number>} p1
84122      * @param  {Array.<Number>} p2
84123      * @return {Number}
84124      */
84125     function signedArea(p0, p1, p2) {
84126       return (p0[0] - p2[0]) * (p1[1] - p2[1]) - (p1[0] - p2[0]) * (p0[1] - p2[1]);
84127     }
84128
84129     /**
84130      * @param  {SweepEvent} e1
84131      * @param  {SweepEvent} e2
84132      * @return {Number}
84133      */
84134     function compareEvents(e1, e2) {
84135       var p1 = e1.point;
84136       var p2 = e2.point;
84137
84138       // Different x-coordinate
84139       if (p1[0] > p2[0]) { return 1; }
84140       if (p1[0] < p2[0]) { return -1; }
84141
84142       // Different points, but same x-coordinate
84143       // Event with lower y-coordinate is processed first
84144       if (p1[1] !== p2[1]) { return p1[1] > p2[1] ? 1 : -1; }
84145
84146       return specialCases(e1, e2, p1, p2);
84147     }
84148
84149
84150     /* eslint-disable no-unused-vars */
84151     function specialCases(e1, e2, p1, p2) {
84152       // Same coordinates, but one is a left endpoint and the other is
84153       // a right endpoint. The right endpoint is processed first
84154       if (e1.left !== e2.left)
84155         { return e1.left ? 1 : -1; }
84156
84157       // const p2 = e1.otherEvent.point, p3 = e2.otherEvent.point;
84158       // const sa = (p1[0] - p3[0]) * (p2[1] - p3[1]) - (p2[0] - p3[0]) * (p1[1] - p3[1])
84159       // Same coordinates, both events
84160       // are left endpoints or right endpoints.
84161       // not collinear
84162       if (signedArea(p1, e1.otherEvent.point, e2.otherEvent.point) !== 0) {
84163         // the event associate to the bottom segment is processed first
84164         return (!e1.isBelow(e2.otherEvent.point)) ? 1 : -1;
84165       }
84166
84167       return (!e1.isSubject && e2.isSubject) ? 1 : -1;
84168     }
84169     /* eslint-enable no-unused-vars */
84170
84171     /**
84172      * @param  {SweepEvent} se
84173      * @param  {Array.<Number>} p
84174      * @param  {Queue} queue
84175      * @return {Queue}
84176      */
84177     function divideSegment(se, p, queue)  {
84178       var r = new SweepEvent(p, false, se,            se.isSubject);
84179       var l = new SweepEvent(p, true,  se.otherEvent, se.isSubject);
84180
84181       /* eslint-disable no-console */
84182       if (equals(se.point, se.otherEvent.point)) {
84183
84184         console.warn('what is that, a collapsed segment?', se);
84185       }
84186       /* eslint-enable no-console */
84187
84188       r.contourId = l.contourId = se.contourId;
84189
84190       // avoid a rounding error. The left event would be processed after the right event
84191       if (compareEvents(l, se.otherEvent) > 0) {
84192         se.otherEvent.left = true;
84193         l.left = false;
84194       }
84195
84196       // avoid a rounding error. The left event would be processed after the right event
84197       // if (compareEvents(se, r) > 0) {}
84198
84199       se.otherEvent.otherEvent = l;
84200       se.otherEvent = r;
84201
84202       queue.push(l);
84203       queue.push(r);
84204
84205       return queue;
84206     }
84207
84208     //const EPS = 1e-9;
84209
84210     /**
84211      * Finds the magnitude of the cross product of two vectors (if we pretend
84212      * they're in three dimensions)
84213      *
84214      * @param {Object} a First vector
84215      * @param {Object} b Second vector
84216      * @private
84217      * @returns {Number} The magnitude of the cross product
84218      */
84219     function crossProduct(a, b) {
84220       return (a[0] * b[1]) - (a[1] * b[0]);
84221     }
84222
84223     /**
84224      * Finds the dot product of two vectors.
84225      *
84226      * @param {Object} a First vector
84227      * @param {Object} b Second vector
84228      * @private
84229      * @returns {Number} The dot product
84230      */
84231     function dotProduct(a, b) {
84232       return (a[0] * b[0]) + (a[1] * b[1]);
84233     }
84234
84235     /**
84236      * Finds the intersection (if any) between two line segments a and b, given the
84237      * line segments' end points a1, a2 and b1, b2.
84238      *
84239      * This algorithm is based on Schneider and Eberly.
84240      * http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf
84241      * Page 244.
84242      *
84243      * @param {Array.<Number>} a1 point of first line
84244      * @param {Array.<Number>} a2 point of first line
84245      * @param {Array.<Number>} b1 point of second line
84246      * @param {Array.<Number>} b2 point of second line
84247      * @param {Boolean=}       noEndpointTouch whether to skip single touchpoints
84248      *                                         (meaning connected segments) as
84249      *                                         intersections
84250      * @returns {Array.<Array.<Number>>|Null} If the lines intersect, the point of
84251      * intersection. If they overlap, the two end points of the overlapping segment.
84252      * Otherwise, null.
84253      */
84254     function intersection (a1, a2, b1, b2, noEndpointTouch) {
84255       // The algorithm expects our lines in the form P + sd, where P is a point,
84256       // s is on the interval [0, 1], and d is a vector.
84257       // We are passed two points. P can be the first point of each pair. The
84258       // vector, then, could be thought of as the distance (in x and y components)
84259       // from the first point to the second point.
84260       // So first, let's make our vectors:
84261       var va = [a2[0] - a1[0], a2[1] - a1[1]];
84262       var vb = [b2[0] - b1[0], b2[1] - b1[1]];
84263       // We also define a function to convert back to regular point form:
84264
84265       /* eslint-disable arrow-body-style */
84266
84267       function toPoint(p, s, d) {
84268         return [
84269           p[0] + s * d[0],
84270           p[1] + s * d[1]
84271         ];
84272       }
84273
84274       /* eslint-enable arrow-body-style */
84275
84276       // The rest is pretty much a straight port of the algorithm.
84277       var e = [b1[0] - a1[0], b1[1] - a1[1]];
84278       var kross    = crossProduct(va, vb);
84279       var sqrKross = kross * kross;
84280       var sqrLenA  = dotProduct(va, va);
84281       //const sqrLenB  = dotProduct(vb, vb);
84282
84283       // Check for line intersection. This works because of the properties of the
84284       // cross product -- specifically, two vectors are parallel if and only if the
84285       // cross product is the 0 vector. The full calculation involves relative error
84286       // to account for possible very small line segments. See Schneider & Eberly
84287       // for details.
84288       if (sqrKross > 0/* EPS * sqrLenB * sqLenA */) {
84289         // If they're not parallel, then (because these are line segments) they
84290         // still might not actually intersect. This code checks that the
84291         // intersection point of the lines is actually on both line segments.
84292         var s = crossProduct(e, vb) / kross;
84293         if (s < 0 || s > 1) {
84294           // not on line segment a
84295           return null;
84296         }
84297         var t = crossProduct(e, va) / kross;
84298         if (t < 0 || t > 1) {
84299           // not on line segment b
84300           return null;
84301         }
84302         if (s === 0 || s === 1) {
84303           // on an endpoint of line segment a
84304           return noEndpointTouch ? null : [toPoint(a1, s, va)];
84305         }
84306         if (t === 0 || t === 1) {
84307           // on an endpoint of line segment b
84308           return noEndpointTouch ? null : [toPoint(b1, t, vb)];
84309         }
84310         return [toPoint(a1, s, va)];
84311       }
84312
84313       // If we've reached this point, then the lines are either parallel or the
84314       // same, but the segments could overlap partially or fully, or not at all.
84315       // So we need to find the overlap, if any. To do that, we can use e, which is
84316       // the (vector) difference between the two initial points. If this is parallel
84317       // with the line itself, then the two lines are the same line, and there will
84318       // be overlap.
84319       //const sqrLenE = dotProduct(e, e);
84320       kross = crossProduct(e, va);
84321       sqrKross = kross * kross;
84322
84323       if (sqrKross > 0 /* EPS * sqLenB * sqLenE */) {
84324       // Lines are just parallel, not the same. No overlap.
84325         return null;
84326       }
84327
84328       var sa = dotProduct(va, e) / sqrLenA;
84329       var sb = sa + dotProduct(va, vb) / sqrLenA;
84330       var smin = Math.min(sa, sb);
84331       var smax = Math.max(sa, sb);
84332
84333       // this is, essentially, the FindIntersection acting on floats from
84334       // Schneider & Eberly, just inlined into this function.
84335       if (smin <= 1 && smax >= 0) {
84336
84337         // overlap on an end point
84338         if (smin === 1) {
84339           return noEndpointTouch ? null : [toPoint(a1, smin > 0 ? smin : 0, va)];
84340         }
84341
84342         if (smax === 0) {
84343           return noEndpointTouch ? null : [toPoint(a1, smax < 1 ? smax : 1, va)];
84344         }
84345
84346         if (noEndpointTouch && smin === 0 && smax === 1) { return null; }
84347
84348         // There's overlap on a segment -- two points of intersection. Return both.
84349         return [
84350           toPoint(a1, smin > 0 ? smin : 0, va),
84351           toPoint(a1, smax < 1 ? smax : 1, va)
84352         ];
84353       }
84354
84355       return null;
84356     }
84357
84358     /**
84359      * @param  {SweepEvent} se1
84360      * @param  {SweepEvent} se2
84361      * @param  {Queue}      queue
84362      * @return {Number}
84363      */
84364     function possibleIntersection (se1, se2, queue) {
84365       // that disallows self-intersecting polygons,
84366       // did cost us half a day, so I'll leave it
84367       // out of respect
84368       // if (se1.isSubject === se2.isSubject) return;
84369       var inter = intersection(
84370         se1.point, se1.otherEvent.point,
84371         se2.point, se2.otherEvent.point
84372       );
84373
84374       var nintersections = inter ? inter.length : 0;
84375       if (nintersections === 0) { return 0; } // no intersection
84376
84377       // the line segments intersect at an endpoint of both line segments
84378       if ((nintersections === 1) &&
84379           (equals(se1.point, se2.point) ||
84380            equals(se1.otherEvent.point, se2.otherEvent.point))) {
84381         return 0;
84382       }
84383
84384       if (nintersections === 2 && se1.isSubject === se2.isSubject) {
84385         // if(se1.contourId === se2.contourId){
84386         // console.warn('Edges of the same polygon overlap',
84387         //   se1.point, se1.otherEvent.point, se2.point, se2.otherEvent.point);
84388         // }
84389         //throw new Error('Edges of the same polygon overlap');
84390         return 0;
84391       }
84392
84393       // The line segments associated to se1 and se2 intersect
84394       if (nintersections === 1) {
84395
84396         // if the intersection point is not an endpoint of se1
84397         if (!equals(se1.point, inter[0]) && !equals(se1.otherEvent.point, inter[0])) {
84398           divideSegment(se1, inter[0], queue);
84399         }
84400
84401         // if the intersection point is not an endpoint of se2
84402         if (!equals(se2.point, inter[0]) && !equals(se2.otherEvent.point, inter[0])) {
84403           divideSegment(se2, inter[0], queue);
84404         }
84405         return 1;
84406       }
84407
84408       // The line segments associated to se1 and se2 overlap
84409       var events        = [];
84410       var leftCoincide  = false;
84411       var rightCoincide = false;
84412
84413       if (equals(se1.point, se2.point)) {
84414         leftCoincide = true; // linked
84415       } else if (compareEvents(se1, se2) === 1) {
84416         events.push(se2, se1);
84417       } else {
84418         events.push(se1, se2);
84419       }
84420
84421       if (equals(se1.otherEvent.point, se2.otherEvent.point)) {
84422         rightCoincide = true;
84423       } else if (compareEvents(se1.otherEvent, se2.otherEvent) === 1) {
84424         events.push(se2.otherEvent, se1.otherEvent);
84425       } else {
84426         events.push(se1.otherEvent, se2.otherEvent);
84427       }
84428
84429       if ((leftCoincide && rightCoincide) || leftCoincide) {
84430         // both line segments are equal or share the left endpoint
84431         se2.type = NON_CONTRIBUTING;
84432         se1.type = (se2.inOut === se1.inOut)
84433           ? SAME_TRANSITION : DIFFERENT_TRANSITION;
84434
84435         if (leftCoincide && !rightCoincide) {
84436           // honestly no idea, but changing events selection from [2, 1]
84437           // to [0, 1] fixes the overlapping self-intersecting polygons issue
84438           divideSegment(events[1].otherEvent, events[0].point, queue);
84439         }
84440         return 2;
84441       }
84442
84443       // the line segments share the right endpoint
84444       if (rightCoincide) {
84445         divideSegment(events[0], events[1].point, queue);
84446         return 3;
84447       }
84448
84449       // no line segment includes totally the other one
84450       if (events[0] !== events[3].otherEvent) {
84451         divideSegment(events[0], events[1].point, queue);
84452         divideSegment(events[1], events[2].point, queue);
84453         return 3;
84454       }
84455
84456       // one line segment includes the other one
84457       divideSegment(events[0], events[1].point, queue);
84458       divideSegment(events[3].otherEvent, events[2].point, queue);
84459
84460       return 3;
84461     }
84462
84463     /**
84464      * @param  {SweepEvent} le1
84465      * @param  {SweepEvent} le2
84466      * @return {Number}
84467      */
84468     function compareSegments(le1, le2) {
84469       if (le1 === le2) { return 0; }
84470
84471       // Segments are not collinear
84472       if (signedArea(le1.point, le1.otherEvent.point, le2.point) !== 0 ||
84473         signedArea(le1.point, le1.otherEvent.point, le2.otherEvent.point) !== 0) {
84474
84475         // If they share their left endpoint use the right endpoint to sort
84476         if (equals(le1.point, le2.point)) { return le1.isBelow(le2.otherEvent.point) ? -1 : 1; }
84477
84478         // Different left endpoint: use the left endpoint to sort
84479         if (le1.point[0] === le2.point[0]) { return le1.point[1] < le2.point[1] ? -1 : 1; }
84480
84481         // has the line segment associated to e1 been inserted
84482         // into S after the line segment associated to e2 ?
84483         if (compareEvents(le1, le2) === 1) { return le2.isAbove(le1.point) ? -1 : 1; }
84484
84485         // The line segment associated to e2 has been inserted
84486         // into S after the line segment associated to e1
84487         return le1.isBelow(le2.point) ? -1 : 1;
84488       }
84489
84490       if (le1.isSubject === le2.isSubject) { // same polygon
84491         var p1 = le1.point, p2 = le2.point;
84492         if (p1[0] === p2[0] && p1[1] === p2[1]/*equals(le1.point, le2.point)*/) {
84493           p1 = le1.otherEvent.point; p2 = le2.otherEvent.point;
84494           if (p1[0] === p2[0] && p1[1] === p2[1]) { return 0; }
84495           else { return le1.contourId > le2.contourId ? 1 : -1; }
84496         }
84497       } else { // Segments are collinear, but belong to separate polygons
84498         return le1.isSubject ? -1 : 1;
84499       }
84500
84501       return compareEvents(le1, le2) === 1 ? 1 : -1;
84502     }
84503
84504     function subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation) {
84505       var sweepLine = new SplayTree(compareSegments);
84506       var sortedEvents = [];
84507
84508       var rightbound = Math.min(sbbox[2], cbbox[2]);
84509
84510       var prev, next, begin;
84511
84512       while (eventQueue.length !== 0) {
84513         var event = eventQueue.pop();
84514         sortedEvents.push(event);
84515
84516         // optimization by bboxes for intersection and difference goes here
84517         if ((operation === INTERSECTION && event.point[0] > rightbound) ||
84518             (operation === DIFFERENCE   && event.point[0] > sbbox[2])) {
84519           break;
84520         }
84521
84522         if (event.left) {
84523           next  = prev = sweepLine.insert(event);
84524           begin = sweepLine.minNode();
84525
84526           if (prev !== begin) { prev = sweepLine.prev(prev); }
84527           else                { prev = null; }
84528
84529           next = sweepLine.next(next);
84530
84531           var prevEvent = prev ? prev.key : null;
84532           var prevprevEvent = (void 0);
84533           computeFields(event, prevEvent, operation);
84534           if (next) {
84535             if (possibleIntersection(event, next.key, eventQueue) === 2) {
84536               computeFields(event, prevEvent, operation);
84537               computeFields(event, next.key, operation);
84538             }
84539           }
84540
84541           if (prev) {
84542             if (possibleIntersection(prev.key, event, eventQueue) === 2) {
84543               var prevprev = prev;
84544               if (prevprev !== begin) { prevprev = sweepLine.prev(prevprev); }
84545               else                    { prevprev = null; }
84546
84547               prevprevEvent = prevprev ? prevprev.key : null;
84548               computeFields(prevEvent, prevprevEvent, operation);
84549               computeFields(event,     prevEvent,     operation);
84550             }
84551           }
84552         } else {
84553           event = event.otherEvent;
84554           next = prev = sweepLine.find(event);
84555
84556           if (prev && next) {
84557
84558             if (prev !== begin) { prev = sweepLine.prev(prev); }
84559             else                { prev = null; }
84560
84561             next = sweepLine.next(next);
84562             sweepLine.remove(event);
84563
84564             if (next && prev) {
84565               possibleIntersection(prev.key, next.key, eventQueue);
84566             }
84567           }
84568         }
84569       }
84570       return sortedEvents;
84571     }
84572
84573     /**
84574      * @param  {Array.<SweepEvent>} sortedEvents
84575      * @return {Array.<SweepEvent>}
84576      */
84577     function orderEvents(sortedEvents) {
84578       var event, i, len, tmp;
84579       var resultEvents = [];
84580       for (i = 0, len = sortedEvents.length; i < len; i++) {
84581         event = sortedEvents[i];
84582         if ((event.left && event.inResult) ||
84583           (!event.left && event.otherEvent.inResult)) {
84584           resultEvents.push(event);
84585         }
84586       }
84587       // Due to overlapping edges the resultEvents array can be not wholly sorted
84588       var sorted = false;
84589       while (!sorted) {
84590         sorted = true;
84591         for (i = 0, len = resultEvents.length; i < len; i++) {
84592           if ((i + 1) < len &&
84593             compareEvents(resultEvents[i], resultEvents[i + 1]) === 1) {
84594             tmp = resultEvents[i];
84595             resultEvents[i] = resultEvents[i + 1];
84596             resultEvents[i + 1] = tmp;
84597             sorted = false;
84598           }
84599         }
84600       }
84601
84602
84603       for (i = 0, len = resultEvents.length; i < len; i++) {
84604         event = resultEvents[i];
84605         event.pos = i;
84606       }
84607
84608       // imagine, the right event is found in the beginning of the queue,
84609       // when his left counterpart is not marked yet
84610       for (i = 0, len = resultEvents.length; i < len; i++) {
84611         event = resultEvents[i];
84612         if (!event.left) {
84613           tmp = event.pos;
84614           event.pos = event.otherEvent.pos;
84615           event.otherEvent.pos = tmp;
84616         }
84617       }
84618
84619       return resultEvents;
84620     }
84621
84622
84623     /**
84624      * @param  {Number} pos
84625      * @param  {Array.<SweepEvent>} resultEvents
84626      * @param  {Object>}    processed
84627      * @return {Number}
84628      */
84629     function nextPos(pos, resultEvents, processed, origIndex) {
84630       var p, p1;
84631       var newPos = pos + 1;
84632       var length = resultEvents.length;
84633
84634       p  = resultEvents[pos].point;
84635
84636       if (newPos < length)
84637         { p1 = resultEvents[newPos].point; }
84638
84639
84640       // while in range and not the current one by value
84641       while (newPos < length && p1[0] === p[0] && p1[1] === p[1]) {
84642         if (!processed[newPos]) {
84643           return newPos;
84644         } else   {
84645           newPos++;
84646         }
84647         p1 = resultEvents[newPos].point;
84648       }
84649
84650       newPos = pos - 1;
84651
84652       while (processed[newPos] && newPos >= origIndex) {
84653         newPos--;
84654       }
84655       return newPos;
84656     }
84657
84658
84659     /**
84660      * @param  {Array.<SweepEvent>} sortedEvents
84661      * @return {Array.<*>} polygons
84662      */
84663     function connectEdges(sortedEvents, operation) {
84664       var i, len;
84665       var resultEvents = orderEvents(sortedEvents);
84666
84667       // "false"-filled array
84668       var processed = {};
84669       var result = [];
84670       var event;
84671
84672       for (i = 0, len = resultEvents.length; i < len; i++) {
84673         if (processed[i]) { continue; }
84674         var contour = [[]];
84675
84676         if (!resultEvents[i].isExteriorRing) {
84677           if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length === 0) {
84678             result.push(contour);
84679           } else if (result.length === 0) {
84680             result.push([[contour]]);
84681           } else {
84682             result[result.length - 1].push(contour[0]);
84683           }
84684         } else if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length > 1) {
84685           result[result.length - 1].push(contour[0]);
84686         } else {
84687           result.push(contour);
84688         }
84689
84690         var ringId = result.length - 1;
84691         var pos = i;
84692
84693         var initial = resultEvents[i].point;
84694         contour[0].push(initial);
84695
84696         while (pos >= i) {
84697           event = resultEvents[pos];
84698           processed[pos] = true;
84699
84700           if (event.left) {
84701             event.resultInOut = false;
84702             event.contourId   = ringId;
84703           } else {
84704             event.otherEvent.resultInOut = true;
84705             event.otherEvent.contourId   = ringId;
84706           }
84707
84708           pos = event.pos;
84709           processed[pos] = true;
84710           contour[0].push(resultEvents[pos].point);
84711           pos = nextPos(pos, resultEvents, processed, i);
84712         }
84713
84714         pos = pos === -1 ? i : pos;
84715
84716         event = resultEvents[pos];
84717         processed[pos] = processed[event.pos] = true;
84718         event.otherEvent.resultInOut = true;
84719         event.otherEvent.contourId   = ringId;
84720       }
84721
84722       // Handle if the result is a polygon (eg not multipoly)
84723       // Commented it again, let's see what do we mean by that
84724       // if (result.length === 1) result = result[0];
84725       return result;
84726     }
84727
84728     var tinyqueue = TinyQueue;
84729     var default_1 = TinyQueue;
84730
84731     function TinyQueue(data, compare) {
84732         var this$1 = this;
84733
84734         if (!(this instanceof TinyQueue)) { return new TinyQueue(data, compare); }
84735
84736         this.data = data || [];
84737         this.length = this.data.length;
84738         this.compare = compare || defaultCompare;
84739
84740         if (this.length > 0) {
84741             for (var i = (this.length >> 1) - 1; i >= 0; i--) { this$1._down(i); }
84742         }
84743     }
84744
84745     function defaultCompare(a, b) {
84746         return a < b ? -1 : a > b ? 1 : 0;
84747     }
84748
84749     TinyQueue.prototype = {
84750
84751         push: function (item) {
84752             this.data.push(item);
84753             this.length++;
84754             this._up(this.length - 1);
84755         },
84756
84757         pop: function () {
84758             if (this.length === 0) { return undefined; }
84759
84760             var top = this.data[0];
84761             this.length--;
84762
84763             if (this.length > 0) {
84764                 this.data[0] = this.data[this.length];
84765                 this._down(0);
84766             }
84767             this.data.pop();
84768
84769             return top;
84770         },
84771
84772         peek: function () {
84773             return this.data[0];
84774         },
84775
84776         _up: function (pos) {
84777             var data = this.data;
84778             var compare = this.compare;
84779             var item = data[pos];
84780
84781             while (pos > 0) {
84782                 var parent = (pos - 1) >> 1;
84783                 var current = data[parent];
84784                 if (compare(item, current) >= 0) { break; }
84785                 data[pos] = current;
84786                 pos = parent;
84787             }
84788
84789             data[pos] = item;
84790         },
84791
84792         _down: function (pos) {
84793             var this$1 = this;
84794
84795             var data = this.data;
84796             var compare = this.compare;
84797             var halfLength = this.length >> 1;
84798             var item = data[pos];
84799
84800             while (pos < halfLength) {
84801                 var left = (pos << 1) + 1;
84802                 var right = left + 1;
84803                 var best = data[left];
84804
84805                 if (right < this$1.length && compare(data[right], best) < 0) {
84806                     left = right;
84807                     best = data[right];
84808                 }
84809                 if (compare(best, item) >= 0) { break; }
84810
84811                 data[pos] = best;
84812                 pos = left;
84813             }
84814
84815             data[pos] = item;
84816         }
84817     };
84818     tinyqueue.default = default_1;
84819
84820     var max = Math.max;
84821     var min = Math.min;
84822
84823     var contourId = 0;
84824
84825
84826     function processPolygon(contourOrHole, isSubject, depth, Q, bbox, isExteriorRing) {
84827       var i, len, s1, s2, e1, e2;
84828       for (i = 0, len = contourOrHole.length - 1; i < len; i++) {
84829         s1 = contourOrHole[i];
84830         s2 = contourOrHole[i + 1];
84831         e1 = new SweepEvent(s1, false, undefined, isSubject);
84832         e2 = new SweepEvent(s2, false, e1,        isSubject);
84833         e1.otherEvent = e2;
84834
84835         if (s1[0] === s2[0] && s1[1] === s2[1]) {
84836           continue; // skip collapsed edges, or it breaks
84837         }
84838
84839         e1.contourId = e2.contourId = depth;
84840         if (!isExteriorRing) {
84841           e1.isExteriorRing = false;
84842           e2.isExteriorRing = false;
84843         }
84844         if (compareEvents(e1, e2) > 0) {
84845           e2.left = true;
84846         } else {
84847           e1.left = true;
84848         }
84849
84850         var x = s1[0], y = s1[1];
84851         bbox[0] = min(bbox[0], x);
84852         bbox[1] = min(bbox[1], y);
84853         bbox[2] = max(bbox[2], x);
84854         bbox[3] = max(bbox[3], y);
84855
84856         // Pushing it so the queue is sorted from left to right,
84857         // with object on the left having the highest priority.
84858         Q.push(e1);
84859         Q.push(e2);
84860       }
84861     }
84862
84863
84864     function fillQueue(subject, clipping, sbbox, cbbox, operation) {
84865       var eventQueue = new tinyqueue(null, compareEvents);
84866       var polygonSet, isExteriorRing, i, ii, j, jj; //, k, kk;
84867
84868       for (i = 0, ii = subject.length; i < ii; i++) {
84869         polygonSet = subject[i];
84870         for (j = 0, jj = polygonSet.length; j < jj; j++) {
84871           isExteriorRing = j === 0;
84872           if (isExteriorRing) { contourId++; }
84873           processPolygon(polygonSet[j], true, contourId, eventQueue, sbbox, isExteriorRing);
84874         }
84875       }
84876
84877       for (i = 0, ii = clipping.length; i < ii; i++) {
84878         polygonSet = clipping[i];
84879         for (j = 0, jj = polygonSet.length; j < jj; j++) {
84880           isExteriorRing = j === 0;
84881           if (operation === DIFFERENCE) { isExteriorRing = false; }
84882           if (isExteriorRing) { contourId++; }
84883           processPolygon(polygonSet[j], false, contourId, eventQueue, cbbox, isExteriorRing);
84884         }
84885       }
84886
84887       return eventQueue;
84888     }
84889
84890     var EMPTY = [];
84891
84892
84893     function trivialOperation(subject, clipping, operation) {
84894       var result = null;
84895       if (subject.length * clipping.length === 0) {
84896         if        (operation === INTERSECTION) {
84897           result = EMPTY;
84898         } else if (operation === DIFFERENCE) {
84899           result = subject;
84900         } else if (operation === UNION ||
84901                    operation === XOR) {
84902           result = (subject.length === 0) ? clipping : subject;
84903         }
84904       }
84905       return result;
84906     }
84907
84908
84909     function compareBBoxes(subject, clipping, sbbox, cbbox, operation) {
84910       var result = null;
84911       if (sbbox[0] > cbbox[2] ||
84912           cbbox[0] > sbbox[2] ||
84913           sbbox[1] > cbbox[3] ||
84914           cbbox[1] > sbbox[3]) {
84915         if        (operation === INTERSECTION) {
84916           result = EMPTY;
84917         } else if (operation === DIFFERENCE) {
84918           result = subject;
84919         } else if (operation === UNION ||
84920                    operation === XOR) {
84921           result = subject.concat(clipping);
84922         }
84923       }
84924       return result;
84925     }
84926
84927
84928     function boolean(subject, clipping, operation) {
84929       if (typeof subject[0][0][0] === 'number') {
84930         subject = [subject];
84931       }
84932       if (typeof clipping[0][0][0] === 'number') {
84933         clipping = [clipping];
84934       }
84935       var trivial = trivialOperation(subject, clipping, operation);
84936       if (trivial) {
84937         return trivial === EMPTY ? null : trivial;
84938       }
84939       var sbbox = [Infinity, Infinity, -Infinity, -Infinity];
84940       var cbbox = [Infinity, Infinity, -Infinity, -Infinity];
84941
84942       //console.time('fill queue');
84943       var eventQueue = fillQueue(subject, clipping, sbbox, cbbox, operation);
84944       //console.timeEnd('fill queue');
84945
84946       trivial = compareBBoxes(subject, clipping, sbbox, cbbox, operation);
84947       if (trivial) {
84948         return trivial === EMPTY ? null : trivial;
84949       }
84950       //console.time('subdivide edges');
84951       var sortedEvents = subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation);
84952       //console.timeEnd('subdivide edges');
84953
84954       //console.time('connect vertices');
84955       var result = connectEdges(sortedEvents, operation);
84956       //console.timeEnd('connect vertices');
84957       return result;
84958     }
84959
84960     function union (subject, clipping) {
84961       return boolean(subject, clipping, UNION);
84962     }
84963
84964     function diff (subject, clipping) {
84965       return boolean(subject, clipping, DIFFERENCE);
84966     }
84967
84968     function xor (subject, clipping){
84969       return boolean(subject, clipping, XOR);
84970     }
84971
84972     function intersection$1 (subject, clipping) {
84973       return boolean(subject, clipping, INTERSECTION);
84974     }
84975
84976     /**
84977      * @enum {Number}
84978      */
84979     var operations = { UNION: UNION, DIFFERENCE: DIFFERENCE, INTERSECTION: INTERSECTION, XOR: XOR };
84980
84981     exports.union = union;
84982     exports.diff = diff;
84983     exports.xor = xor;
84984     exports.intersection = intersection$1;
84985     exports.operations = operations;
84986
84987     Object.defineProperty(exports, '__esModule', { value: true });
84988
84989   })));
84990
84991   });
84992
84993   var martinez = unwrapExports(martinez_umd);
84994
84995   var read$6 = function (buffer, offset, isLE, mLen, nBytes) {
84996     var e, m;
84997     var eLen = (nBytes * 8) - mLen - 1;
84998     var eMax = (1 << eLen) - 1;
84999     var eBias = eMax >> 1;
85000     var nBits = -7;
85001     var i = isLE ? (nBytes - 1) : 0;
85002     var d = isLE ? -1 : 1;
85003     var s = buffer[offset + i];
85004
85005     i += d;
85006
85007     e = s & ((1 << (-nBits)) - 1);
85008     s >>= (-nBits);
85009     nBits += eLen;
85010     for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
85011
85012     m = e & ((1 << (-nBits)) - 1);
85013     e >>= (-nBits);
85014     nBits += mLen;
85015     for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
85016
85017     if (e === 0) {
85018       e = 1 - eBias;
85019     } else if (e === eMax) {
85020       return m ? NaN : ((s ? -1 : 1) * Infinity)
85021     } else {
85022       m = m + Math.pow(2, mLen);
85023       e = e - eBias;
85024     }
85025     return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
85026   };
85027
85028   var write$6 = function (buffer, value, offset, isLE, mLen, nBytes) {
85029     var e, m, c;
85030     var eLen = (nBytes * 8) - mLen - 1;
85031     var eMax = (1 << eLen) - 1;
85032     var eBias = eMax >> 1;
85033     var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0);
85034     var i = isLE ? 0 : (nBytes - 1);
85035     var d = isLE ? 1 : -1;
85036     var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;
85037
85038     value = Math.abs(value);
85039
85040     if (isNaN(value) || value === Infinity) {
85041       m = isNaN(value) ? 1 : 0;
85042       e = eMax;
85043     } else {
85044       e = Math.floor(Math.log(value) / Math.LN2);
85045       if (value * (c = Math.pow(2, -e)) < 1) {
85046         e--;
85047         c *= 2;
85048       }
85049       if (e + eBias >= 1) {
85050         value += rt / c;
85051       } else {
85052         value += rt * Math.pow(2, 1 - eBias);
85053       }
85054       if (value * c >= 2) {
85055         e++;
85056         c /= 2;
85057       }
85058
85059       if (e + eBias >= eMax) {
85060         m = 0;
85061         e = eMax;
85062       } else if (e + eBias >= 1) {
85063         m = ((value * c) - 1) * Math.pow(2, mLen);
85064         e = e + eBias;
85065       } else {
85066         m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
85067         e = 0;
85068       }
85069     }
85070
85071     for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
85072
85073     e = (e << mLen) | m;
85074     eLen += mLen;
85075     for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
85076
85077     buffer[offset + i - d] |= s * 128;
85078   };
85079
85080   var ieee754 = {
85081         read: read$6,
85082         write: write$6
85083   };
85084
85085   var pbf = Pbf;
85086
85087
85088
85089   function Pbf(buf) {
85090       this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);
85091       this.pos = 0;
85092       this.type = 0;
85093       this.length = this.buf.length;
85094   }
85095
85096   Pbf.Varint  = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum
85097   Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64
85098   Pbf.Bytes   = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields
85099   Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32
85100
85101   var SHIFT_LEFT_32 = (1 << 16) * (1 << 16),
85102       SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
85103
85104   Pbf.prototype = {
85105
85106       destroy: function() {
85107           this.buf = null;
85108       },
85109
85110       // === READING =================================================================
85111
85112       readFields: function(readField, result, end) {
85113           end = end || this.length;
85114
85115           while (this.pos < end) {
85116               var val = this.readVarint(),
85117                   tag = val >> 3,
85118                   startPos = this.pos;
85119
85120               this.type = val & 0x7;
85121               readField(tag, result, this);
85122
85123               if (this.pos === startPos) this.skip(val);
85124           }
85125           return result;
85126       },
85127
85128       readMessage: function(readField, result) {
85129           return this.readFields(readField, result, this.readVarint() + this.pos);
85130       },
85131
85132       readFixed32: function() {
85133           var val = readUInt32(this.buf, this.pos);
85134           this.pos += 4;
85135           return val;
85136       },
85137
85138       readSFixed32: function() {
85139           var val = readInt32(this.buf, this.pos);
85140           this.pos += 4;
85141           return val;
85142       },
85143
85144       // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)
85145
85146       readFixed64: function() {
85147           var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
85148           this.pos += 8;
85149           return val;
85150       },
85151
85152       readSFixed64: function() {
85153           var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
85154           this.pos += 8;
85155           return val;
85156       },
85157
85158       readFloat: function() {
85159           var val = ieee754.read(this.buf, this.pos, true, 23, 4);
85160           this.pos += 4;
85161           return val;
85162       },
85163
85164       readDouble: function() {
85165           var val = ieee754.read(this.buf, this.pos, true, 52, 8);
85166           this.pos += 8;
85167           return val;
85168       },
85169
85170       readVarint: function(isSigned) {
85171           var buf = this.buf,
85172               val, b;
85173
85174           b = buf[this.pos++]; val  =  b & 0x7f;        if (b < 0x80) return val;
85175           b = buf[this.pos++]; val |= (b & 0x7f) << 7;  if (b < 0x80) return val;
85176           b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;
85177           b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;
85178           b = buf[this.pos];   val |= (b & 0x0f) << 28;
85179
85180           return readVarintRemainder(val, isSigned, this);
85181       },
85182
85183       readVarint64: function() { // for compatibility with v2.0.1
85184           return this.readVarint(true);
85185       },
85186
85187       readSVarint: function() {
85188           var num = this.readVarint();
85189           return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding
85190       },
85191
85192       readBoolean: function() {
85193           return Boolean(this.readVarint());
85194       },
85195
85196       readString: function() {
85197           var end = this.readVarint() + this.pos,
85198               str = readUtf8(this.buf, this.pos, end);
85199           this.pos = end;
85200           return str;
85201       },
85202
85203       readBytes: function() {
85204           var end = this.readVarint() + this.pos,
85205               buffer = this.buf.subarray(this.pos, end);
85206           this.pos = end;
85207           return buffer;
85208       },
85209
85210       // verbose for performance reasons; doesn't affect gzipped size
85211
85212       readPackedVarint: function(arr, isSigned) {
85213           var end = readPackedEnd(this);
85214           arr = arr || [];
85215           while (this.pos < end) arr.push(this.readVarint(isSigned));
85216           return arr;
85217       },
85218       readPackedSVarint: function(arr) {
85219           var end = readPackedEnd(this);
85220           arr = arr || [];
85221           while (this.pos < end) arr.push(this.readSVarint());
85222           return arr;
85223       },
85224       readPackedBoolean: function(arr) {
85225           var end = readPackedEnd(this);
85226           arr = arr || [];
85227           while (this.pos < end) arr.push(this.readBoolean());
85228           return arr;
85229       },
85230       readPackedFloat: function(arr) {
85231           var end = readPackedEnd(this);
85232           arr = arr || [];
85233           while (this.pos < end) arr.push(this.readFloat());
85234           return arr;
85235       },
85236       readPackedDouble: function(arr) {
85237           var end = readPackedEnd(this);
85238           arr = arr || [];
85239           while (this.pos < end) arr.push(this.readDouble());
85240           return arr;
85241       },
85242       readPackedFixed32: function(arr) {
85243           var end = readPackedEnd(this);
85244           arr = arr || [];
85245           while (this.pos < end) arr.push(this.readFixed32());
85246           return arr;
85247       },
85248       readPackedSFixed32: function(arr) {
85249           var end = readPackedEnd(this);
85250           arr = arr || [];
85251           while (this.pos < end) arr.push(this.readSFixed32());
85252           return arr;
85253       },
85254       readPackedFixed64: function(arr) {
85255           var end = readPackedEnd(this);
85256           arr = arr || [];
85257           while (this.pos < end) arr.push(this.readFixed64());
85258           return arr;
85259       },
85260       readPackedSFixed64: function(arr) {
85261           var end = readPackedEnd(this);
85262           arr = arr || [];
85263           while (this.pos < end) arr.push(this.readSFixed64());
85264           return arr;
85265       },
85266
85267       skip: function(val) {
85268           var type = val & 0x7;
85269           if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}
85270           else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;
85271           else if (type === Pbf.Fixed32) this.pos += 4;
85272           else if (type === Pbf.Fixed64) this.pos += 8;
85273           else throw new Error('Unimplemented type: ' + type);
85274       },
85275
85276       // === WRITING =================================================================
85277
85278       writeTag: function(tag, type) {
85279           this.writeVarint((tag << 3) | type);
85280       },
85281
85282       realloc: function(min) {
85283           var length = this.length || 16;
85284
85285           while (length < this.pos + min) length *= 2;
85286
85287           if (length !== this.length) {
85288               var buf = new Uint8Array(length);
85289               buf.set(this.buf);
85290               this.buf = buf;
85291               this.length = length;
85292           }
85293       },
85294
85295       finish: function() {
85296           this.length = this.pos;
85297           this.pos = 0;
85298           return this.buf.subarray(0, this.length);
85299       },
85300
85301       writeFixed32: function(val) {
85302           this.realloc(4);
85303           writeInt32(this.buf, val, this.pos);
85304           this.pos += 4;
85305       },
85306
85307       writeSFixed32: function(val) {
85308           this.realloc(4);
85309           writeInt32(this.buf, val, this.pos);
85310           this.pos += 4;
85311       },
85312
85313       writeFixed64: function(val) {
85314           this.realloc(8);
85315           writeInt32(this.buf, val & -1, this.pos);
85316           writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
85317           this.pos += 8;
85318       },
85319
85320       writeSFixed64: function(val) {
85321           this.realloc(8);
85322           writeInt32(this.buf, val & -1, this.pos);
85323           writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
85324           this.pos += 8;
85325       },
85326
85327       writeVarint: function(val) {
85328           val = +val || 0;
85329
85330           if (val > 0xfffffff || val < 0) {
85331               writeBigVarint(val, this);
85332               return;
85333           }
85334
85335           this.realloc(4);
85336
85337           this.buf[this.pos++] =           val & 0x7f  | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
85338           this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
85339           this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
85340           this.buf[this.pos++] =   (val >>> 7) & 0x7f;
85341       },
85342
85343       writeSVarint: function(val) {
85344           this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);
85345       },
85346
85347       writeBoolean: function(val) {
85348           this.writeVarint(Boolean(val));
85349       },
85350
85351       writeString: function(str) {
85352           str = String(str);
85353           this.realloc(str.length * 4);
85354
85355           this.pos++; // reserve 1 byte for short string length
85356
85357           var startPos = this.pos;
85358           // write the string directly to the buffer and see how much was written
85359           this.pos = writeUtf8(this.buf, str, this.pos);
85360           var len = this.pos - startPos;
85361
85362           if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
85363
85364           // finally, write the message length in the reserved place and restore the position
85365           this.pos = startPos - 1;
85366           this.writeVarint(len);
85367           this.pos += len;
85368       },
85369
85370       writeFloat: function(val) {
85371           this.realloc(4);
85372           ieee754.write(this.buf, val, this.pos, true, 23, 4);
85373           this.pos += 4;
85374       },
85375
85376       writeDouble: function(val) {
85377           this.realloc(8);
85378           ieee754.write(this.buf, val, this.pos, true, 52, 8);
85379           this.pos += 8;
85380       },
85381
85382       writeBytes: function(buffer) {
85383           var len = buffer.length;
85384           this.writeVarint(len);
85385           this.realloc(len);
85386           for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];
85387       },
85388
85389       writeRawMessage: function(fn, obj) {
85390           this.pos++; // reserve 1 byte for short message length
85391
85392           // write the message directly to the buffer and see how much was written
85393           var startPos = this.pos;
85394           fn(obj, this);
85395           var len = this.pos - startPos;
85396
85397           if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
85398
85399           // finally, write the message length in the reserved place and restore the position
85400           this.pos = startPos - 1;
85401           this.writeVarint(len);
85402           this.pos += len;
85403       },
85404
85405       writeMessage: function(tag, fn, obj) {
85406           this.writeTag(tag, Pbf.Bytes);
85407           this.writeRawMessage(fn, obj);
85408       },
85409
85410       writePackedVarint:   function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr);   },
85411       writePackedSVarint:  function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr);  },
85412       writePackedBoolean:  function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr);  },
85413       writePackedFloat:    function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr);    },
85414       writePackedDouble:   function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr);   },
85415       writePackedFixed32:  function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr);  },
85416       writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); },
85417       writePackedFixed64:  function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr);  },
85418       writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); },
85419
85420       writeBytesField: function(tag, buffer) {
85421           this.writeTag(tag, Pbf.Bytes);
85422           this.writeBytes(buffer);
85423       },
85424       writeFixed32Field: function(tag, val) {
85425           this.writeTag(tag, Pbf.Fixed32);
85426           this.writeFixed32(val);
85427       },
85428       writeSFixed32Field: function(tag, val) {
85429           this.writeTag(tag, Pbf.Fixed32);
85430           this.writeSFixed32(val);
85431       },
85432       writeFixed64Field: function(tag, val) {
85433           this.writeTag(tag, Pbf.Fixed64);
85434           this.writeFixed64(val);
85435       },
85436       writeSFixed64Field: function(tag, val) {
85437           this.writeTag(tag, Pbf.Fixed64);
85438           this.writeSFixed64(val);
85439       },
85440       writeVarintField: function(tag, val) {
85441           this.writeTag(tag, Pbf.Varint);
85442           this.writeVarint(val);
85443       },
85444       writeSVarintField: function(tag, val) {
85445           this.writeTag(tag, Pbf.Varint);
85446           this.writeSVarint(val);
85447       },
85448       writeStringField: function(tag, str) {
85449           this.writeTag(tag, Pbf.Bytes);
85450           this.writeString(str);
85451       },
85452       writeFloatField: function(tag, val) {
85453           this.writeTag(tag, Pbf.Fixed32);
85454           this.writeFloat(val);
85455       },
85456       writeDoubleField: function(tag, val) {
85457           this.writeTag(tag, Pbf.Fixed64);
85458           this.writeDouble(val);
85459       },
85460       writeBooleanField: function(tag, val) {
85461           this.writeVarintField(tag, Boolean(val));
85462       }
85463   };
85464
85465   function readVarintRemainder(l, s, p) {
85466       var buf = p.buf,
85467           h, b;
85468
85469       b = buf[p.pos++]; h  = (b & 0x70) >> 4;  if (b < 0x80) return toNum(l, h, s);
85470       b = buf[p.pos++]; h |= (b & 0x7f) << 3;  if (b < 0x80) return toNum(l, h, s);
85471       b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) return toNum(l, h, s);
85472       b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) return toNum(l, h, s);
85473       b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) return toNum(l, h, s);
85474       b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) return toNum(l, h, s);
85475
85476       throw new Error('Expected varint not more than 10 bytes');
85477   }
85478
85479   function readPackedEnd(pbf) {
85480       return pbf.type === Pbf.Bytes ?
85481           pbf.readVarint() + pbf.pos : pbf.pos + 1;
85482   }
85483
85484   function toNum(low, high, isSigned) {
85485       if (isSigned) {
85486           return high * 0x100000000 + (low >>> 0);
85487       }
85488
85489       return ((high >>> 0) * 0x100000000) + (low >>> 0);
85490   }
85491
85492   function writeBigVarint(val, pbf) {
85493       var low, high;
85494
85495       if (val >= 0) {
85496           low  = (val % 0x100000000) | 0;
85497           high = (val / 0x100000000) | 0;
85498       } else {
85499           low  = ~(-val % 0x100000000);
85500           high = ~(-val / 0x100000000);
85501
85502           if (low ^ 0xffffffff) {
85503               low = (low + 1) | 0;
85504           } else {
85505               low = 0;
85506               high = (high + 1) | 0;
85507           }
85508       }
85509
85510       if (val >= 0x10000000000000000 || val < -0x10000000000000000) {
85511           throw new Error('Given varint doesn\'t fit into 10 bytes');
85512       }
85513
85514       pbf.realloc(10);
85515
85516       writeBigVarintLow(low, high, pbf);
85517       writeBigVarintHigh(high, pbf);
85518   }
85519
85520   function writeBigVarintLow(low, high, pbf) {
85521       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
85522       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
85523       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
85524       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
85525       pbf.buf[pbf.pos]   = low & 0x7f;
85526   }
85527
85528   function writeBigVarintHigh(high, pbf) {
85529       var lsb = (high & 0x07) << 4;
85530
85531       pbf.buf[pbf.pos++] |= lsb         | ((high >>>= 3) ? 0x80 : 0); if (!high) return;
85532       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
85533       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
85534       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
85535       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
85536       pbf.buf[pbf.pos++]  = high & 0x7f;
85537   }
85538
85539   function makeRoomForExtraLength(startPos, len, pbf) {
85540       var extraLen =
85541           len <= 0x3fff ? 1 :
85542           len <= 0x1fffff ? 2 :
85543           len <= 0xfffffff ? 3 : Math.ceil(Math.log(len) / (Math.LN2 * 7));
85544
85545       // if 1 byte isn't enough for encoding message length, shift the data to the right
85546       pbf.realloc(extraLen);
85547       for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];
85548   }
85549
85550   function writePackedVarint(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]);   }
85551   function writePackedSVarint(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]);  }
85552   function writePackedFloat(arr, pbf)    { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]);    }
85553   function writePackedDouble(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]);   }
85554   function writePackedBoolean(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]);  }
85555   function writePackedFixed32(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]);  }
85556   function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }
85557   function writePackedFixed64(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]);  }
85558   function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }
85559
85560   // Buffer code below from https://github.com/feross/buffer, MIT-licensed
85561
85562   function readUInt32(buf, pos) {
85563       return ((buf[pos]) |
85564           (buf[pos + 1] << 8) |
85565           (buf[pos + 2] << 16)) +
85566           (buf[pos + 3] * 0x1000000);
85567   }
85568
85569   function writeInt32(buf, val, pos) {
85570       buf[pos] = val;
85571       buf[pos + 1] = (val >>> 8);
85572       buf[pos + 2] = (val >>> 16);
85573       buf[pos + 3] = (val >>> 24);
85574   }
85575
85576   function readInt32(buf, pos) {
85577       return ((buf[pos]) |
85578           (buf[pos + 1] << 8) |
85579           (buf[pos + 2] << 16)) +
85580           (buf[pos + 3] << 24);
85581   }
85582
85583   function readUtf8(buf, pos, end) {
85584       var str = '';
85585       var i = pos;
85586
85587       while (i < end) {
85588           var b0 = buf[i];
85589           var c = null; // codepoint
85590           var bytesPerSequence =
85591               b0 > 0xEF ? 4 :
85592               b0 > 0xDF ? 3 :
85593               b0 > 0xBF ? 2 : 1;
85594
85595           if (i + bytesPerSequence > end) break;
85596
85597           var b1, b2, b3;
85598
85599           if (bytesPerSequence === 1) {
85600               if (b0 < 0x80) {
85601                   c = b0;
85602               }
85603           } else if (bytesPerSequence === 2) {
85604               b1 = buf[i + 1];
85605               if ((b1 & 0xC0) === 0x80) {
85606                   c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F);
85607                   if (c <= 0x7F) {
85608                       c = null;
85609                   }
85610               }
85611           } else if (bytesPerSequence === 3) {
85612               b1 = buf[i + 1];
85613               b2 = buf[i + 2];
85614               if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) {
85615                   c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F);
85616                   if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) {
85617                       c = null;
85618                   }
85619               }
85620           } else if (bytesPerSequence === 4) {
85621               b1 = buf[i + 1];
85622               b2 = buf[i + 2];
85623               b3 = buf[i + 3];
85624               if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {
85625                   c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F);
85626                   if (c <= 0xFFFF || c >= 0x110000) {
85627                       c = null;
85628                   }
85629               }
85630           }
85631
85632           if (c === null) {
85633               c = 0xFFFD;
85634               bytesPerSequence = 1;
85635
85636           } else if (c > 0xFFFF) {
85637               c -= 0x10000;
85638               str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800);
85639               c = 0xDC00 | c & 0x3FF;
85640           }
85641
85642           str += String.fromCharCode(c);
85643           i += bytesPerSequence;
85644       }
85645
85646       return str;
85647   }
85648
85649   function writeUtf8(buf, str, pos) {
85650       for (var i = 0, c, lead; i < str.length; i++) {
85651           c = str.charCodeAt(i); // code point
85652
85653           if (c > 0xD7FF && c < 0xE000) {
85654               if (lead) {
85655                   if (c < 0xDC00) {
85656                       buf[pos++] = 0xEF;
85657                       buf[pos++] = 0xBF;
85658                       buf[pos++] = 0xBD;
85659                       lead = c;
85660                       continue;
85661                   } else {
85662                       c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;
85663                       lead = null;
85664                   }
85665               } else {
85666                   if (c > 0xDBFF || (i + 1 === str.length)) {
85667                       buf[pos++] = 0xEF;
85668                       buf[pos++] = 0xBF;
85669                       buf[pos++] = 0xBD;
85670                   } else {
85671                       lead = c;
85672                   }
85673                   continue;
85674               }
85675           } else if (lead) {
85676               buf[pos++] = 0xEF;
85677               buf[pos++] = 0xBF;
85678               buf[pos++] = 0xBD;
85679               lead = null;
85680           }
85681
85682           if (c < 0x80) {
85683               buf[pos++] = c;
85684           } else {
85685               if (c < 0x800) {
85686                   buf[pos++] = c >> 0x6 | 0xC0;
85687               } else {
85688                   if (c < 0x10000) {
85689                       buf[pos++] = c >> 0xC | 0xE0;
85690                   } else {
85691                       buf[pos++] = c >> 0x12 | 0xF0;
85692                       buf[pos++] = c >> 0xC & 0x3F | 0x80;
85693                   }
85694                   buf[pos++] = c >> 0x6 & 0x3F | 0x80;
85695               }
85696               buf[pos++] = c & 0x3F | 0x80;
85697           }
85698       }
85699       return pos;
85700   }
85701
85702   var pointGeometry = Point;
85703
85704   /**
85705    * A standalone point geometry with useful accessor, comparison, and
85706    * modification methods.
85707    *
85708    * @class Point
85709    * @param {Number} x the x-coordinate. this could be longitude or screen
85710    * pixels, or any other sort of unit.
85711    * @param {Number} y the y-coordinate. this could be latitude or screen
85712    * pixels, or any other sort of unit.
85713    * @example
85714    * var point = new Point(-77, 38);
85715    */
85716   function Point(x, y) {
85717       this.x = x;
85718       this.y = y;
85719   }
85720
85721   Point.prototype = {
85722
85723       /**
85724        * Clone this point, returning a new point that can be modified
85725        * without affecting the old one.
85726        * @return {Point} the clone
85727        */
85728       clone: function() { return new Point(this.x, this.y); },
85729
85730       /**
85731        * Add this point's x & y coordinates to another point,
85732        * yielding a new point.
85733        * @param {Point} p the other point
85734        * @return {Point} output point
85735        */
85736       add:     function(p) { return this.clone()._add(p); },
85737
85738       /**
85739        * Subtract this point's x & y coordinates to from point,
85740        * yielding a new point.
85741        * @param {Point} p the other point
85742        * @return {Point} output point
85743        */
85744       sub:     function(p) { return this.clone()._sub(p); },
85745
85746       /**
85747        * Multiply this point's x & y coordinates by point,
85748        * yielding a new point.
85749        * @param {Point} p the other point
85750        * @return {Point} output point
85751        */
85752       multByPoint:    function(p) { return this.clone()._multByPoint(p); },
85753
85754       /**
85755        * Divide this point's x & y coordinates by point,
85756        * yielding a new point.
85757        * @param {Point} p the other point
85758        * @return {Point} output point
85759        */
85760       divByPoint:     function(p) { return this.clone()._divByPoint(p); },
85761
85762       /**
85763        * Multiply this point's x & y coordinates by a factor,
85764        * yielding a new point.
85765        * @param {Point} k factor
85766        * @return {Point} output point
85767        */
85768       mult:    function(k) { return this.clone()._mult(k); },
85769
85770       /**
85771        * Divide this point's x & y coordinates by a factor,
85772        * yielding a new point.
85773        * @param {Point} k factor
85774        * @return {Point} output point
85775        */
85776       div:     function(k) { return this.clone()._div(k); },
85777
85778       /**
85779        * Rotate this point around the 0, 0 origin by an angle a,
85780        * given in radians
85781        * @param {Number} a angle to rotate around, in radians
85782        * @return {Point} output point
85783        */
85784       rotate:  function(a) { return this.clone()._rotate(a); },
85785
85786       /**
85787        * Rotate this point around p point by an angle a,
85788        * given in radians
85789        * @param {Number} a angle to rotate around, in radians
85790        * @param {Point} p Point to rotate around
85791        * @return {Point} output point
85792        */
85793       rotateAround:  function(a,p) { return this.clone()._rotateAround(a,p); },
85794
85795       /**
85796        * Multiply this point by a 4x1 transformation matrix
85797        * @param {Array<Number>} m transformation matrix
85798        * @return {Point} output point
85799        */
85800       matMult: function(m) { return this.clone()._matMult(m); },
85801
85802       /**
85803        * Calculate this point but as a unit vector from 0, 0, meaning
85804        * that the distance from the resulting point to the 0, 0
85805        * coordinate will be equal to 1 and the angle from the resulting
85806        * point to the 0, 0 coordinate will be the same as before.
85807        * @return {Point} unit vector point
85808        */
85809       unit:    function() { return this.clone()._unit(); },
85810
85811       /**
85812        * Compute a perpendicular point, where the new y coordinate
85813        * is the old x coordinate and the new x coordinate is the old y
85814        * coordinate multiplied by -1
85815        * @return {Point} perpendicular point
85816        */
85817       perp:    function() { return this.clone()._perp(); },
85818
85819       /**
85820        * Return a version of this point with the x & y coordinates
85821        * rounded to integers.
85822        * @return {Point} rounded point
85823        */
85824       round:   function() { return this.clone()._round(); },
85825
85826       /**
85827        * Return the magitude of this point: this is the Euclidean
85828        * distance from the 0, 0 coordinate to this point's x and y
85829        * coordinates.
85830        * @return {Number} magnitude
85831        */
85832       mag: function() {
85833           return Math.sqrt(this.x * this.x + this.y * this.y);
85834       },
85835
85836       /**
85837        * Judge whether this point is equal to another point, returning
85838        * true or false.
85839        * @param {Point} other the other point
85840        * @return {boolean} whether the points are equal
85841        */
85842       equals: function(other) {
85843           return this.x === other.x &&
85844                  this.y === other.y;
85845       },
85846
85847       /**
85848        * Calculate the distance from this point to another point
85849        * @param {Point} p the other point
85850        * @return {Number} distance
85851        */
85852       dist: function(p) {
85853           return Math.sqrt(this.distSqr(p));
85854       },
85855
85856       /**
85857        * Calculate the distance from this point to another point,
85858        * without the square root step. Useful if you're comparing
85859        * relative distances.
85860        * @param {Point} p the other point
85861        * @return {Number} distance
85862        */
85863       distSqr: function(p) {
85864           var dx = p.x - this.x,
85865               dy = p.y - this.y;
85866           return dx * dx + dy * dy;
85867       },
85868
85869       /**
85870        * Get the angle from the 0, 0 coordinate to this point, in radians
85871        * coordinates.
85872        * @return {Number} angle
85873        */
85874       angle: function() {
85875           return Math.atan2(this.y, this.x);
85876       },
85877
85878       /**
85879        * Get the angle from this point to another point, in radians
85880        * @param {Point} b the other point
85881        * @return {Number} angle
85882        */
85883       angleTo: function(b) {
85884           return Math.atan2(this.y - b.y, this.x - b.x);
85885       },
85886
85887       /**
85888        * Get the angle between this point and another point, in radians
85889        * @param {Point} b the other point
85890        * @return {Number} angle
85891        */
85892       angleWith: function(b) {
85893           return this.angleWithSep(b.x, b.y);
85894       },
85895
85896       /*
85897        * Find the angle of the two vectors, solving the formula for
85898        * the cross product a x b = |a||b|sin(θ) for θ.
85899        * @param {Number} x the x-coordinate
85900        * @param {Number} y the y-coordinate
85901        * @return {Number} the angle in radians
85902        */
85903       angleWithSep: function(x, y) {
85904           return Math.atan2(
85905               this.x * y - this.y * x,
85906               this.x * x + this.y * y);
85907       },
85908
85909       _matMult: function(m) {
85910           var x = m[0] * this.x + m[1] * this.y,
85911               y = m[2] * this.x + m[3] * this.y;
85912           this.x = x;
85913           this.y = y;
85914           return this;
85915       },
85916
85917       _add: function(p) {
85918           this.x += p.x;
85919           this.y += p.y;
85920           return this;
85921       },
85922
85923       _sub: function(p) {
85924           this.x -= p.x;
85925           this.y -= p.y;
85926           return this;
85927       },
85928
85929       _mult: function(k) {
85930           this.x *= k;
85931           this.y *= k;
85932           return this;
85933       },
85934
85935       _div: function(k) {
85936           this.x /= k;
85937           this.y /= k;
85938           return this;
85939       },
85940
85941       _multByPoint: function(p) {
85942           this.x *= p.x;
85943           this.y *= p.y;
85944           return this;
85945       },
85946
85947       _divByPoint: function(p) {
85948           this.x /= p.x;
85949           this.y /= p.y;
85950           return this;
85951       },
85952
85953       _unit: function() {
85954           this._div(this.mag());
85955           return this;
85956       },
85957
85958       _perp: function() {
85959           var y = this.y;
85960           this.y = this.x;
85961           this.x = -y;
85962           return this;
85963       },
85964
85965       _rotate: function(angle) {
85966           var cos = Math.cos(angle),
85967               sin = Math.sin(angle),
85968               x = cos * this.x - sin * this.y,
85969               y = sin * this.x + cos * this.y;
85970           this.x = x;
85971           this.y = y;
85972           return this;
85973       },
85974
85975       _rotateAround: function(angle, p) {
85976           var cos = Math.cos(angle),
85977               sin = Math.sin(angle),
85978               x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y),
85979               y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y);
85980           this.x = x;
85981           this.y = y;
85982           return this;
85983       },
85984
85985       _round: function() {
85986           this.x = Math.round(this.x);
85987           this.y = Math.round(this.y);
85988           return this;
85989       }
85990   };
85991
85992   /**
85993    * Construct a point from an array if necessary, otherwise if the input
85994    * is already a Point, or an unknown type, return it unchanged
85995    * @param {Array<Number>|Point|*} a any kind of input value
85996    * @return {Point} constructed point, or passed-through value.
85997    * @example
85998    * // this
85999    * var point = Point.convert([0, 1]);
86000    * // is equivalent to
86001    * var point = new Point(0, 1);
86002    */
86003   Point.convert = function (a) {
86004       if (a instanceof Point) {
86005           return a;
86006       }
86007       if (Array.isArray(a)) {
86008           return new Point(a[0], a[1]);
86009       }
86010       return a;
86011   };
86012
86013   var vectortilefeature = VectorTileFeature;
86014
86015   function VectorTileFeature(pbf, end, extent, keys, values) {
86016       // Public
86017       this.properties = {};
86018       this.extent = extent;
86019       this.type = 0;
86020
86021       // Private
86022       this._pbf = pbf;
86023       this._geometry = -1;
86024       this._keys = keys;
86025       this._values = values;
86026
86027       pbf.readFields(readFeature, this, end);
86028   }
86029
86030   function readFeature(tag, feature, pbf) {
86031       if (tag == 1) feature.id = pbf.readVarint();
86032       else if (tag == 2) readTag(pbf, feature);
86033       else if (tag == 3) feature.type = pbf.readVarint();
86034       else if (tag == 4) feature._geometry = pbf.pos;
86035   }
86036
86037   function readTag(pbf, feature) {
86038       var end = pbf.readVarint() + pbf.pos;
86039
86040       while (pbf.pos < end) {
86041           var key = feature._keys[pbf.readVarint()],
86042               value = feature._values[pbf.readVarint()];
86043           feature.properties[key] = value;
86044       }
86045   }
86046
86047   VectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon'];
86048
86049   VectorTileFeature.prototype.loadGeometry = function() {
86050       var pbf = this._pbf;
86051       pbf.pos = this._geometry;
86052
86053       var end = pbf.readVarint() + pbf.pos,
86054           cmd = 1,
86055           length = 0,
86056           x = 0,
86057           y = 0,
86058           lines = [],
86059           line;
86060
86061       while (pbf.pos < end) {
86062           if (length <= 0) {
86063               var cmdLen = pbf.readVarint();
86064               cmd = cmdLen & 0x7;
86065               length = cmdLen >> 3;
86066           }
86067
86068           length--;
86069
86070           if (cmd === 1 || cmd === 2) {
86071               x += pbf.readSVarint();
86072               y += pbf.readSVarint();
86073
86074               if (cmd === 1) { // moveTo
86075                   if (line) lines.push(line);
86076                   line = [];
86077               }
86078
86079               line.push(new pointGeometry(x, y));
86080
86081           } else if (cmd === 7) {
86082
86083               // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90
86084               if (line) {
86085                   line.push(line[0].clone()); // closePolygon
86086               }
86087
86088           } else {
86089               throw new Error('unknown command ' + cmd);
86090           }
86091       }
86092
86093       if (line) lines.push(line);
86094
86095       return lines;
86096   };
86097
86098   VectorTileFeature.prototype.bbox = function() {
86099       var pbf = this._pbf;
86100       pbf.pos = this._geometry;
86101
86102       var end = pbf.readVarint() + pbf.pos,
86103           cmd = 1,
86104           length = 0,
86105           x = 0,
86106           y = 0,
86107           x1 = Infinity,
86108           x2 = -Infinity,
86109           y1 = Infinity,
86110           y2 = -Infinity;
86111
86112       while (pbf.pos < end) {
86113           if (length <= 0) {
86114               var cmdLen = pbf.readVarint();
86115               cmd = cmdLen & 0x7;
86116               length = cmdLen >> 3;
86117           }
86118
86119           length--;
86120
86121           if (cmd === 1 || cmd === 2) {
86122               x += pbf.readSVarint();
86123               y += pbf.readSVarint();
86124               if (x < x1) x1 = x;
86125               if (x > x2) x2 = x;
86126               if (y < y1) y1 = y;
86127               if (y > y2) y2 = y;
86128
86129           } else if (cmd !== 7) {
86130               throw new Error('unknown command ' + cmd);
86131           }
86132       }
86133
86134       return [x1, y1, x2, y2];
86135   };
86136
86137   VectorTileFeature.prototype.toGeoJSON = function(x, y, z) {
86138       var size = this.extent * Math.pow(2, z),
86139           x0 = this.extent * x,
86140           y0 = this.extent * y,
86141           coords = this.loadGeometry(),
86142           type = VectorTileFeature.types[this.type],
86143           i, j;
86144
86145       function project(line) {
86146           for (var j = 0; j < line.length; j++) {
86147               var p = line[j], y2 = 180 - (p.y + y0) * 360 / size;
86148               line[j] = [
86149                   (p.x + x0) * 360 / size - 180,
86150                   360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90
86151               ];
86152           }
86153       }
86154
86155       switch (this.type) {
86156       case 1:
86157           var points = [];
86158           for (i = 0; i < coords.length; i++) {
86159               points[i] = coords[i][0];
86160           }
86161           coords = points;
86162           project(coords);
86163           break;
86164
86165       case 2:
86166           for (i = 0; i < coords.length; i++) {
86167               project(coords[i]);
86168           }
86169           break;
86170
86171       case 3:
86172           coords = classifyRings(coords);
86173           for (i = 0; i < coords.length; i++) {
86174               for (j = 0; j < coords[i].length; j++) {
86175                   project(coords[i][j]);
86176               }
86177           }
86178           break;
86179       }
86180
86181       if (coords.length === 1) {
86182           coords = coords[0];
86183       } else {
86184           type = 'Multi' + type;
86185       }
86186
86187       var result = {
86188           type: "Feature",
86189           geometry: {
86190               type: type,
86191               coordinates: coords
86192           },
86193           properties: this.properties
86194       };
86195
86196       if ('id' in this) {
86197           result.id = this.id;
86198       }
86199
86200       return result;
86201   };
86202
86203   // classifies an array of rings into polygons with outer rings and holes
86204
86205   function classifyRings(rings) {
86206       var len = rings.length;
86207
86208       if (len <= 1) return [rings];
86209
86210       var polygons = [],
86211           polygon,
86212           ccw;
86213
86214       for (var i = 0; i < len; i++) {
86215           var area = signedArea(rings[i]);
86216           if (area === 0) continue;
86217
86218           if (ccw === undefined) ccw = area < 0;
86219
86220           if (ccw === area < 0) {
86221               if (polygon) polygons.push(polygon);
86222               polygon = [rings[i]];
86223
86224           } else {
86225               polygon.push(rings[i]);
86226           }
86227       }
86228       if (polygon) polygons.push(polygon);
86229
86230       return polygons;
86231   }
86232
86233   function signedArea(ring) {
86234       var sum = 0;
86235       for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {
86236           p1 = ring[i];
86237           p2 = ring[j];
86238           sum += (p2.x - p1.x) * (p1.y + p2.y);
86239       }
86240       return sum;
86241   }
86242
86243   var vectortilelayer = VectorTileLayer;
86244
86245   function VectorTileLayer(pbf, end) {
86246       // Public
86247       this.version = 1;
86248       this.name = null;
86249       this.extent = 4096;
86250       this.length = 0;
86251
86252       // Private
86253       this._pbf = pbf;
86254       this._keys = [];
86255       this._values = [];
86256       this._features = [];
86257
86258       pbf.readFields(readLayer, this, end);
86259
86260       this.length = this._features.length;
86261   }
86262
86263   function readLayer(tag, layer, pbf) {
86264       if (tag === 15) layer.version = pbf.readVarint();
86265       else if (tag === 1) layer.name = pbf.readString();
86266       else if (tag === 5) layer.extent = pbf.readVarint();
86267       else if (tag === 2) layer._features.push(pbf.pos);
86268       else if (tag === 3) layer._keys.push(pbf.readString());
86269       else if (tag === 4) layer._values.push(readValueMessage(pbf));
86270   }
86271
86272   function readValueMessage(pbf) {
86273       var value = null,
86274           end = pbf.readVarint() + pbf.pos;
86275
86276       while (pbf.pos < end) {
86277           var tag = pbf.readVarint() >> 3;
86278
86279           value = tag === 1 ? pbf.readString() :
86280               tag === 2 ? pbf.readFloat() :
86281               tag === 3 ? pbf.readDouble() :
86282               tag === 4 ? pbf.readVarint64() :
86283               tag === 5 ? pbf.readVarint() :
86284               tag === 6 ? pbf.readSVarint() :
86285               tag === 7 ? pbf.readBoolean() : null;
86286       }
86287
86288       return value;
86289   }
86290
86291   // return feature `i` from this layer as a `VectorTileFeature`
86292   VectorTileLayer.prototype.feature = function(i) {
86293       if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds');
86294
86295       this._pbf.pos = this._features[i];
86296
86297       var end = this._pbf.readVarint() + this._pbf.pos;
86298       return new vectortilefeature(this._pbf, end, this.extent, this._keys, this._values);
86299   };
86300
86301   var vectortile = VectorTile;
86302
86303   function VectorTile(pbf, end) {
86304       this.layers = pbf.readFields(readTile, {}, end);
86305   }
86306
86307   function readTile(tag, layers, pbf) {
86308       if (tag === 3) {
86309           var layer = new vectortilelayer(pbf, pbf.readVarint() + pbf.pos);
86310           if (layer.length) layers[layer.name] = layer;
86311       }
86312   }
86313
86314   var VectorTile$1 = vectortile;
86315   var VectorTileFeature$1 = vectortilefeature;
86316   var VectorTileLayer$1 = vectortilelayer;
86317
86318   var vectorTile = {
86319         VectorTile: VectorTile$1,
86320         VectorTileFeature: VectorTileFeature$1,
86321         VectorTileLayer: VectorTileLayer$1
86322   };
86323
86324   var tiler$5 = utilTiler().tileSize(512).margin(1);
86325   var dispatch$6 = dispatch('loadedData');
86326   var _vtCache;
86327
86328
86329   function abortRequest$5(i) {
86330       i.abort();
86331   }
86332
86333
86334   function vtToGeoJSON(data, tile, mergeCache) {
86335       var vectorTile$$1 = new vectorTile.VectorTile(new pbf(data.response));
86336       var layers = Object.keys(vectorTile$$1.layers);
86337       if (!Array.isArray(layers)) { layers = [layers]; }
86338
86339       var features = [];
86340       layers.forEach(function(layerID) {
86341           var layer = vectorTile$$1.layers[layerID];
86342           if (layer) {
86343               for (var i = 0; i < layer.length; i++) {
86344                   var feature = layer.feature(i).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
86345                   var geometry = feature.geometry;
86346
86347                   // Treat all Polygons as MultiPolygons
86348                   if (geometry.type === 'Polygon') {
86349                       geometry.type = 'MultiPolygon';
86350                       geometry.coordinates = [geometry.coordinates];
86351                   }
86352
86353                   // Clip to tile bounds
86354                   if (geometry.type === 'MultiPolygon') {
86355                       var isClipped = false;
86356                       var featureClip = turf_bboxClip(feature, tile.extent.rectangle());
86357                       if (!isEqual(feature.geometry, featureClip.geometry)) {
86358                           // feature = featureClip;
86359                           isClipped = true;
86360                       }
86361                       if (!feature.geometry.coordinates.length) continue;   // not actually on this tile
86362                       if (!feature.geometry.coordinates[0].length) continue;   // not actually on this tile
86363                   }
86364
86365                   // Generate some unique IDs and add some metadata
86366                   var featurehash = utilHashcode(fastJsonStableStringify(feature));
86367                   var propertyhash = utilHashcode(fastJsonStableStringify(feature.properties || {}));
86368                   feature.__layerID__ = layerID.replace(/[^_a-zA-Z0-9\-]/g, '_');
86369                   feature.__featurehash__ = featurehash;
86370                   feature.__propertyhash__ = propertyhash;
86371                   features.push(feature);
86372
86373                   // Clipped Polygons at same zoom with identical properties can get merged
86374                   if (isClipped && geometry.type === 'MultiPolygon') {
86375                       var merged = mergeCache[propertyhash];
86376                       if (merged && merged.length) {
86377                           var other = merged[0];
86378                           var coords = martinez.union(
86379                               feature.geometry.coordinates, other.geometry.coordinates
86380                           );
86381
86382                           if (!coords || !coords.length) {
86383                               continue;  // something failed in martinez union
86384                           }
86385
86386                           merged.push(feature);
86387                           for (var j = 0; j < merged.length; j++) {      // all these features get...
86388                               merged[j].geometry.coordinates = coords;   // same coords
86389                               merged[j].__featurehash__ = featurehash;   // same hash, so deduplication works
86390                           }
86391                       } else {
86392                           mergeCache[propertyhash] = [feature];
86393                       }
86394                   }
86395               }
86396           }
86397       });
86398
86399       return features;
86400   }
86401
86402
86403   function loadTile(source, tile) {
86404       if (source.loaded[tile.id] || source.inflight[tile.id]) return;
86405
86406       var url = source.template
86407           .replace('{x}', tile.xyz[0])
86408           .replace('{y}', tile.xyz[1])
86409           // TMS-flipped y coordinate
86410           .replace(/\{[t-]y\}/, Math.pow(2, tile.xyz[2]) - tile.xyz[1] - 1)
86411           .replace(/\{z(oom)?\}/, tile.xyz[2])
86412           .replace(/\{switch:([^}]+)\}/, function(s, r) {
86413               var subdomains = r.split(',');
86414               return subdomains[(tile.xyz[0] + tile.xyz[1]) % subdomains.length];
86415           });
86416
86417       source.inflight[tile.id] = request(url)
86418           .responseType('arraybuffer')
86419           .get(function(err, data) {
86420               source.loaded[tile.id] = [];
86421               delete source.inflight[tile.id];
86422               if (err || !data) return;
86423
86424               var z = tile.xyz[2];
86425               if (!source.canMerge[z]) {
86426                   source.canMerge[z] = {};  // initialize mergeCache
86427               }
86428
86429               source.loaded[tile.id] = vtToGeoJSON(data, tile, source.canMerge[z]);
86430               dispatch$6.call('loadedData');
86431           });
86432   }
86433
86434
86435   var serviceVectorTile = {
86436
86437       init: function() {
86438           if (!_vtCache) {
86439               this.reset();
86440           }
86441
86442           this.event = utilRebind(this, dispatch$6, 'on');
86443       },
86444
86445
86446       reset: function() {
86447           for (var sourceID in _vtCache) {
86448               var source = _vtCache[sourceID];
86449               if (source && source.inflight) {
86450                   forEach(source.inflight, abortRequest$5);
86451               }
86452           }
86453
86454           _vtCache = {};
86455       },
86456
86457
86458       addSource: function(sourceID, template) {
86459           _vtCache[sourceID] = { template: template, inflight: {}, loaded: {}, canMerge: {} };
86460           return _vtCache[sourceID];
86461       },
86462
86463
86464       data: function(sourceID, projection) {
86465           var source = _vtCache[sourceID];
86466           if (!source) return [];
86467
86468           var tiles = tiler$5.getTiles(projection);
86469           var seen = {};
86470           var results = [];
86471
86472           for (var i = 0; i < tiles.length; i++) {
86473               var features = source.loaded[tiles[i].id];
86474               if (!features || !features.length) continue;
86475
86476               for (var j = 0; j < features.length; j++) {
86477                   var feature = features[j];
86478                   var hash = feature.__featurehash__;
86479                   if (seen[hash]) continue;
86480                   seen[hash] = true;
86481
86482                   // return a shallow clone, because the hash may change
86483                   // later if this feature gets merged with another
86484                   results.push(clone(feature));
86485               }
86486           }
86487
86488           return results;
86489       },
86490
86491
86492       loadTiles: function(sourceID, template, projection) {
86493           var source = _vtCache[sourceID];
86494           if (!source) {
86495               source = this.addSource(sourceID, template);
86496           }
86497
86498           var tiles = tiler$5.getTiles(projection);
86499
86500           // abort inflight requests that are no longer needed
86501           forEach(source.inflight, function(v, k) {
86502               var wanted = find$1(tiles, function(tile) { return k === tile.id; });
86503
86504               if (!wanted) {
86505                   abortRequest$5(v);
86506                   delete source.inflight[k];
86507               }
86508           });
86509
86510           tiles.forEach(function(tile) {
86511               loadTile(source, tile);
86512           });
86513       },
86514
86515
86516       cache: function() {
86517           return _vtCache;
86518       }
86519
86520   };
86521
86522   var endpoint = 'https://www.wikidata.org/w/api.php?';
86523   var _wikidataCache = {};
86524
86525   var serviceWikidata = {
86526
86527       init: function() {},
86528
86529       reset: function() {
86530           _wikidataCache = {};
86531       },
86532
86533
86534       // Given a Wikipedia language and article title, return an array of
86535       // corresponding Wikidata entities.
86536       itemsByTitle: function(lang, title, callback) {
86537           if (!title) {
86538               callback('', {});
86539               return;
86540           }
86541
86542           lang = lang || 'en';
86543
86544           d3_json(endpoint + utilQsString({
86545               action: 'wbgetentities',
86546               format: 'json',
86547               formatversion: 2,
86548               sites: lang.replace(/-/g, '_') + 'wiki',
86549               titles: title,
86550               languages: 'en', // shrink response by filtering to one language
86551               origin: '*'
86552           }), function(err, data) {
86553               if (err || !data || data.error) {
86554                   callback('', {});
86555               } else {
86556                   callback(title, data.entities || {});
86557               }
86558           });
86559       },
86560
86561
86562       entityByQID: function(qid, callback) {
86563           if (!qid) {
86564               callback('', {});
86565               return;
86566           }
86567           if (_wikidataCache[qid]) {
86568               callback('', _wikidataCache[qid]);
86569               return;
86570           }
86571
86572           var langs = uniq([
86573               currentLocale.toLowerCase(),
86574               currentLocale.split('-', 2)[0].toLowerCase(),
86575               'en'
86576           ]);
86577
86578           d3_json(endpoint + utilQsString({
86579               action: 'wbgetentities',
86580               format: 'json',
86581               formatversion: 2,
86582               ids: qid,
86583               props: /*sitelinks|*/'labels|descriptions',
86584               //sitefilter: lang + 'wiki',
86585               languages: langs.join('|'),
86586               languagefallback: 1,
86587               origin: '*'
86588           }), function(err, data) {
86589               if (err || !data || data.error) {
86590                   callback('', {});
86591               } else {
86592                   _wikidataCache[qid] = data.entities[qid];
86593                   callback(qid, data.entities[qid] || {});
86594               }
86595           });
86596       }
86597
86598   };
86599
86600   var endpoint$1 = 'https://en.wikipedia.org/w/api.php?';
86601
86602   var serviceWikipedia = {
86603
86604       init: function() {},
86605       reset: function() {},
86606
86607
86608       search: function(lang, query, callback) {
86609           if (!query) {
86610               callback('', []);
86611               return;
86612           }
86613
86614           lang = lang || 'en';
86615           d3_json(endpoint$1.replace('en', lang) +
86616               utilQsString({
86617                   action: 'query',
86618                   list: 'search',
86619                   srlimit: '10',
86620                   srinfo: 'suggestion',
86621                   format: 'json',
86622                   origin: '*',
86623                   srsearch: query
86624               }), function(err, data) {
86625                   if (err || !data || !data.query || !data.query.search || data.error) {
86626                       callback('', []);
86627                   } else {
86628                       var results = data.query.search.map(function(d) { return d.title; });
86629                       callback(query, results);
86630                   }
86631               }
86632           );
86633       },
86634
86635
86636       suggestions: function(lang, query, callback) {
86637           if (!query) {
86638               callback('', []);
86639               return;
86640           }
86641
86642           lang = lang || 'en';
86643           d3_json(endpoint$1.replace('en', lang) +
86644               utilQsString({
86645                   action: 'opensearch',
86646                   namespace: 0,
86647                   suggest: '',
86648                   format: 'json',
86649                   origin: '*',
86650                   search: query
86651               }), function(err, data) {
86652                   if (err || !data || data.error) {
86653                       callback('', []);
86654                   } else {
86655                       callback(data[0], data[1] || []);
86656                   }
86657               }
86658           );
86659       },
86660
86661
86662       translations: function(lang, title, callback) {
86663           if (!title) {
86664               callback({});
86665               return;
86666           }
86667
86668           d3_json(endpoint$1.replace('en', lang) +
86669               utilQsString({
86670                   action: 'query',
86671                   prop: 'langlinks',
86672                   format: 'json',
86673                   origin: '*',
86674                   lllimit: 500,
86675                   titles: title
86676               }), function(err, data) {
86677                   if (err || !data || !data.query || !data.query.pages || data.error) {
86678                       callback({});
86679                   } else {
86680                       var list = data.query.pages[Object.keys(data.query.pages)[0]],
86681                           translations = {};
86682                       if (list && list.langlinks) {
86683                           list.langlinks.forEach(function(d) {
86684                               translations[d.lang] = d['*'];
86685                           });
86686                       }
86687                       callback(translations);
86688                   }
86689               }
86690           );
86691       }
86692
86693   };
86694
86695   var services = {
86696       geocoder: serviceNominatim,
86697       keepRight: serviceKeepRight,
86698       mapillary: serviceMapillary,
86699       openstreetcam: serviceOpenstreetcam,
86700       osm: serviceOsm,
86701       osmWikibase: serviceOsmWikibase,
86702       maprules: serviceMapRules,
86703       streetside: serviceStreetside,
86704       taginfo: serviceTaginfo,
86705       vectorTile: serviceVectorTile,
86706       wikidata: serviceWikidata,
86707       wikipedia: serviceWikipedia
86708   };
86709
86710   function validationMapCSSChecks() {
86711       var validation = function(changes, graph) {
86712           if (!services.maprules) return [];
86713
86714           var rules = services.maprules.validationRules();
86715           var warnings = [];
86716           var createdModified = ['created', 'modified'];
86717
86718           for (var i = 0; i < rules.length; i++) {
86719               var rule = rules[i];
86720               for (var j = 0; j < createdModified.length; j++) {
86721                   var type = createdModified[j];
86722                   var entities = changes[type];
86723                   for (var k = 0; k < entities.length; k++) {
86724                       rule.findWarnings(entities[k], graph, warnings);
86725                   }
86726               }
86727           }
86728
86729           return warnings;
86730       };
86731
86732
86733       return validation;
86734   }
86735
86736   function validationMissingTag() {
86737
86738       // Slightly stricter check than Entity#isUsed (#3091)
86739       function hasTags(entity, graph) {
86740           return without(Object.keys(entity.tags), 'area', 'name').length > 0 ||
86741               graph.parentRelations(entity).length > 0;
86742       }
86743
86744       var validation = function(changes, graph) {
86745           var types = ['point', 'line', 'area', 'relation'];
86746           var warnings = [];
86747
86748           for (var i = 0; i < changes.created.length; i++) {
86749               var change = changes.created[i];
86750               var geometry = change.geometry(graph);
86751
86752               if (types.indexOf(geometry) !== -1 && !hasTags(change, graph)) {
86753                   warnings.push({
86754                       id: 'missing_tag',
86755                       message: t('validations.untagged_' + geometry),
86756                       tooltip: t('validations.untagged_' + geometry + '_tooltip'),
86757                       entity: change
86758                   });
86759               }
86760           }
86761
86762           return warnings;
86763       };
86764
86765
86766       return validation;
86767   }
86768
86769   function validationOldMultipolygon() {
86770
86771       return function validation(changes, graph) {
86772           var warnings = [];
86773           for (var i = 0; i < changes.created.length; i++) {
86774               var entity = changes.created[i];
86775               var parent = osmIsSimpleMultipolygonOuterMember(entity, graph);
86776               if (parent) {
86777                   warnings.push({
86778                       id: 'old_multipolygon',
86779                       message: t('validations.old_multipolygon'),
86780                       tooltip: t('validations.old_multipolygon_tooltip'),
86781                       entity: parent
86782                   });
86783               }
86784           }
86785           return warnings;
86786       };
86787   }
86788
86789   // https://github.com/openstreetmap/josm/blob/mirror/src/org/
86790   // openstreetmap/josm/data/validation/tests/UnclosedWays.java#L80
86791   function validationTagSuggestsArea() {
86792
86793       function tagSuggestsArea(tags) {
86794           if (isEmpty(tags)) return false;
86795
86796           var presence = ['landuse', 'amenities', 'tourism', 'shop'];
86797           for (var i = 0; i < presence.length; i++) {
86798               if (tags[presence[i]] !== undefined) {
86799                   if (presence[i] === 'tourism' && tags[presence[i]] === 'artwork') {
86800                       continue;   // exception for tourism=artwork - #5206
86801                   } else {
86802                       return presence[i] + '=' + tags[presence[i]];
86803                   }
86804               }
86805           }
86806
86807           if (tags.building && tags.building === 'yes') return 'building=yes';
86808       }
86809
86810
86811       var validation = function(changes, graph) {
86812           var warnings = [];
86813           for (var i = 0; i < changes.created.length; i++) {
86814               var change = changes.created[i];
86815               var geometry = change.geometry(graph);
86816               var suggestion = (geometry === 'line' ? tagSuggestsArea(change.tags) : undefined);
86817
86818               if (suggestion) {
86819                   warnings.push({
86820                       id: 'tag_suggests_area',
86821                       message: t('validations.tag_suggests_area', { tag: suggestion }),
86822                       entity: change
86823                   });
86824               }
86825           }
86826
86827           return warnings;
86828       };
86829
86830
86831       return validation;
86832   }
86833
86834
86835
86836   var Validations = /*#__PURE__*/Object.freeze({
86837     validationDeprecatedTag: validationDeprecatedTag,
86838     validationDisconnectedHighway: validationDisconnectedHighway,
86839     validationGenericName: validationGenericName,
86840     validationManyDeletions: validationManyDeletions,
86841     validationMapCSSChecks: validationMapCSSChecks,
86842     validationMissingTag: validationMissingTag,
86843     validationOldMultipolygon: validationOldMultipolygon,
86844     validationTagSuggestsArea: validationTagSuggestsArea
86845   });
86846
86847   function coreHistory(context) {
86848       var dispatch$$1 = dispatch('change', 'undone', 'redone');
86849       var lock = utilSessionMutex('lock');
86850       var duration = 150;
86851       var _imageryUsed = [];
86852       var _checkpoints = {};
86853       var _stack;
86854       var _index;
86855       var _tree;
86856
86857
86858       // internal _act, accepts list of actions and eased time
86859       function _act(actions, t) {
86860           actions = Array.prototype.slice.call(actions);
86861
86862           var annotation;
86863           if (!isFunction(actions[actions.length - 1])) {
86864               annotation = actions.pop();
86865           }
86866
86867           var graph = _stack[_index].graph;
86868           for (var i = 0; i < actions.length; i++) {
86869               graph = actions[i](graph, t);
86870           }
86871
86872           return {
86873               graph: graph,
86874               annotation: annotation,
86875               imageryUsed: _imageryUsed,
86876               transform: context.projection.transform(),
86877               selectedIDs: context.selectedIDs()
86878           };
86879       }
86880
86881
86882       // internal _perform with eased time
86883       function _perform(args, t) {
86884           var previous = _stack[_index].graph;
86885           _stack = _stack.slice(0, _index + 1);
86886           _stack.push(_act(args, t));
86887           _index++;
86888           return change(previous);
86889       }
86890
86891
86892       // internal _replace with eased time
86893       function _replace(args, t) {
86894           var previous = _stack[_index].graph;
86895           // assert(_index == _stack.length - 1)
86896           _stack[_index] = _act(args, t);
86897           return change(previous);
86898       }
86899
86900
86901       // internal _overwrite with eased time
86902       function _overwrite(args, t) {
86903           var previous = _stack[_index].graph;
86904           if (_index > 0) {
86905               _index--;
86906               _stack.pop();
86907           }
86908           _stack = _stack.slice(0, _index + 1);
86909           _stack.push(_act(args, t));
86910           _index++;
86911           return change(previous);
86912       }
86913
86914
86915       // determine diffrence and dispatch a change event
86916       function change(previous) {
86917           var difference$$1 = coreDifference(previous, history.graph());
86918           dispatch$$1.call('change', this, difference$$1);
86919           return difference$$1;
86920       }
86921
86922
86923       // iD uses namespaced keys so multiple installations do not conflict
86924       function getKey(n) {
86925           return 'iD_' + window.location.origin + '_' + n;
86926       }
86927
86928
86929       var history = {
86930
86931           graph: function() {
86932               return _stack[_index].graph;
86933           },
86934
86935
86936           base: function() {
86937               return _stack[0].graph;
86938           },
86939
86940
86941           merge: function(entities, extent) {
86942               _stack[0].graph.rebase(entities, map$3(_stack, 'graph'), false);
86943               _tree.rebase(entities, false);
86944
86945               dispatch$$1.call('change', this, undefined, extent);
86946           },
86947
86948
86949           perform: function() {
86950               // complete any transition already in progress
86951               select(document).interrupt('history.perform');
86952
86953               var transitionable = false;
86954               var action0 = arguments[0];
86955
86956               if (arguments.length === 1 ||
86957                   arguments.length === 2 && !isFunction(arguments[1])) {
86958                   transitionable = !!action0.transitionable;
86959               }
86960
86961               if (transitionable) {
86962                   var origArguments = arguments;
86963                   select(document)
86964                       .transition('history.perform')
86965                       .duration(duration)
86966                       .ease(linear$1)
86967                       .tween('history.tween', function() {
86968                           return function(t) {
86969                               if (t < 1) _overwrite([action0], t);
86970                           };
86971                       })
86972                       .on('start', function() {
86973                           _perform([action0], 0);
86974                       })
86975                       .on('end interrupt', function() {
86976                           _overwrite(origArguments, 1);
86977                       });
86978
86979               } else {
86980                   return _perform(arguments);
86981               }
86982           },
86983
86984
86985           replace: function() {
86986               select(document).interrupt('history.perform');
86987               return _replace(arguments, 1);
86988           },
86989
86990
86991           // Same as calling pop and then perform
86992           overwrite: function() {
86993               select(document).interrupt('history.perform');
86994               return _overwrite(arguments, 1);
86995           },
86996
86997
86998           pop: function(n) {
86999               select(document).interrupt('history.perform');
87000
87001               var previous = _stack[_index].graph;
87002               if (isNaN(+n) || +n < 0) {
87003                   n = 1;
87004               }
87005               while (n-- > 0 && _index > 0) {
87006                   _index--;
87007                   _stack.pop();
87008               }
87009               return change(previous);
87010           },
87011
87012
87013           // Back to the previous annotated state or _index = 0.
87014           undo: function() {
87015               select(document).interrupt('history.perform');
87016
87017               var previous = _stack[_index].graph;
87018               while (_index > 0) {
87019                   _index--;
87020                   if (_stack[_index].annotation) break;
87021               }
87022
87023               dispatch$$1.call('undone', this, _stack[_index]);
87024               return change(previous);
87025           },
87026
87027
87028           // Forward to the next annotated state.
87029           redo: function() {
87030               select(document).interrupt('history.perform');
87031
87032               var previous = _stack[_index].graph;
87033               var tryIndex = _index;
87034               while (tryIndex < _stack.length - 1) {
87035                   tryIndex++;
87036                   if (_stack[tryIndex].annotation) {
87037                       _index = tryIndex;
87038                       dispatch$$1.call('redone', this, _stack[_index]);
87039                       break;
87040                   }
87041               }
87042
87043               return change(previous);
87044           },
87045
87046
87047           undoAnnotation: function() {
87048               var i = _index;
87049               while (i >= 0) {
87050                   if (_stack[i].annotation) return _stack[i].annotation;
87051                   i--;
87052               }
87053           },
87054
87055
87056           redoAnnotation: function() {
87057               var i = _index + 1;
87058               while (i <= _stack.length - 1) {
87059                   if (_stack[i].annotation) return _stack[i].annotation;
87060                   i++;
87061               }
87062           },
87063
87064
87065           intersects: function(extent) {
87066               return _tree.intersects(extent, _stack[_index].graph);
87067           },
87068
87069
87070           difference: function() {
87071               var base = _stack[0].graph;
87072               var head = _stack[_index].graph;
87073               return coreDifference(base, head);
87074           },
87075
87076
87077           changes: function(action) {
87078               var base = _stack[0].graph;
87079               var head = _stack[_index].graph;
87080
87081               if (action) {
87082                   head = action(head);
87083               }
87084
87085               var difference$$1 = coreDifference(base, head);
87086
87087               return {
87088                   modified: difference$$1.modified(),
87089                   created: difference$$1.created(),
87090                   deleted: difference$$1.deleted()
87091               };
87092           },
87093
87094
87095           validate: function(changes) {
87096               return flatten(map$3(Validations, function(fn) {
87097                   return fn()(changes, _stack[_index].graph);
87098               }));
87099           },
87100
87101
87102           hasChanges: function() {
87103               return this.difference().length() > 0;
87104           },
87105
87106
87107           imageryUsed: function(sources) {
87108               if (sources) {
87109                   _imageryUsed = sources;
87110                   return history;
87111               } else {
87112                   var arr = map$3(_stack.slice(1, _index + 1), 'imageryUsed');
87113                   return without(uniq(flatten(arr)), 'Custom');
87114               }
87115           },
87116
87117
87118           // save the current history state
87119           checkpoint: function(key) {
87120               _checkpoints[key] = {
87121                   stack: cloneDeep(_stack),
87122                   index: _index
87123               };
87124               return history;
87125           },
87126
87127
87128           // restore history state to a given checkpoint or reset completely
87129           reset: function(key) {
87130               if (key !== undefined && _checkpoints.hasOwnProperty(key)) {
87131                   _stack = cloneDeep(_checkpoints[key].stack);
87132                   _index = _checkpoints[key].index;
87133               } else {
87134                   _stack = [{graph: coreGraph$$1()}];
87135                   _index = 0;
87136                   _tree = coreTree(_stack[0].graph);
87137                   _checkpoints = {};
87138               }
87139               dispatch$$1.call('change');
87140               return history;
87141           },
87142
87143
87144           toIntroGraph: function() {
87145               var nextId = { n: 0, r: 0, w: 0 };
87146               var permIds = {};
87147               var graph = this.graph();
87148               var baseEntities = {};
87149
87150               // clone base entities..
87151               forEach(graph.base().entities, function(entity) {
87152                   var copy = cloneDeepWith(entity, customizer);
87153                   baseEntities[copy.id] = copy;
87154               });
87155
87156               // replace base entities with head entities..
87157               forEach(graph.entities, function(entity, id) {
87158                   if (entity) {
87159                       var copy = cloneDeepWith(entity, customizer);
87160                       baseEntities[copy.id] = copy;
87161                   } else {
87162                       delete baseEntities[id];
87163                   }
87164               });
87165
87166               // swap temporary for permanent ids..
87167               forEach(baseEntities, function(entity) {
87168                   if (Array.isArray(entity.nodes)) {
87169                       entity.nodes = entity.nodes.map(function(node) {
87170                           return permIds[node] || node;
87171                       });
87172                   }
87173                   if (Array.isArray(entity.members)) {
87174                       entity.members = entity.members.map(function(member) {
87175                           member.id = permIds[member.id] || member.id;
87176                           return member;
87177                       });
87178                   }
87179               });
87180
87181               return JSON.stringify({ dataIntroGraph: baseEntities });
87182
87183
87184               function customizer(src) {
87185                   var copy = omit(cloneDeep(src), ['type', 'user', 'v', 'version', 'visible']);
87186                   if (isEmpty(copy.tags)) {
87187                       delete copy.tags;
87188                   }
87189
87190                   if (Array.isArray(copy.loc)) {
87191                       copy.loc[0] = +copy.loc[0].toFixed(6);
87192                       copy.loc[1] = +copy.loc[1].toFixed(6);
87193                   }
87194
87195                   var match = src.id.match(/([nrw])-\d*/);  // temporary id
87196                   if (match !== null) {
87197                       var nrw = match[1], permId;
87198                       do { permId = nrw + (++nextId[nrw]); }
87199                       while (baseEntities.hasOwnProperty(permId));
87200
87201                       copy.id = permIds[src.id] = permId;
87202                   }
87203                   return copy;
87204               }
87205           },
87206
87207
87208           toJSON: function() {
87209               if (!this.hasChanges()) return;
87210
87211               var allEntities = {};
87212               var baseEntities = {};
87213               var base = _stack[0];
87214
87215               var s = _stack.map(function(i) {
87216                   var modified = [];
87217                   var deleted = [];
87218
87219                   forEach(i.graph.entities, function(entity, id) {
87220                       if (entity) {
87221                           var key = osmEntity$$1.key(entity);
87222                           allEntities[key] = entity;
87223                           modified.push(key);
87224                       } else {
87225                           deleted.push(id);
87226                       }
87227
87228                       // make sure that the originals of changed or deleted entities get merged
87229                       // into the base of the _stack after restoring the data from JSON.
87230                       if (id in base.graph.entities) {
87231                           baseEntities[id] = base.graph.entities[id];
87232                       }
87233                       if (entity && entity.nodes) {
87234                           // get originals of pre-existing child nodes
87235                           forEach(entity.nodes, function(nodeId) {
87236                               if (nodeId in base.graph.entities) {
87237                                   baseEntities[nodeId] = base.graph.entities[nodeId];
87238                               }
87239                           });
87240                       }
87241                       // get originals of parent entities too
87242                       forEach(base.graph._parentWays[id], function(parentId) {
87243                           if (parentId in base.graph.entities) {
87244                               baseEntities[parentId] = base.graph.entities[parentId];
87245                           }
87246                       });
87247                   });
87248
87249                   var x = {};
87250
87251                   if (modified.length) x.modified = modified;
87252                   if (deleted.length) x.deleted = deleted;
87253                   if (i.imageryUsed) x.imageryUsed = i.imageryUsed;
87254                   if (i.annotation) x.annotation = i.annotation;
87255                   if (i.transform) x.transform = i.transform;
87256                   if (i.selectedIDs) x.selectedIDs = i.selectedIDs;
87257
87258                   return x;
87259               });
87260
87261               return JSON.stringify({
87262                   version: 3,
87263                   entities: values$1(allEntities),
87264                   baseEntities: values$1(baseEntities),
87265                   stack: s,
87266                   nextIDs: osmEntity$$1.id.next,
87267                   index: _index
87268               });
87269           },
87270
87271
87272           fromJSON: function(json, loadChildNodes) {
87273               var h = JSON.parse(json);
87274               var loadComplete = true;
87275
87276               osmEntity$$1.id.next = h.nextIDs;
87277               _index = h.index;
87278
87279               if (h.version === 2 || h.version === 3) {
87280                   var allEntities = {};
87281
87282                   h.entities.forEach(function(entity) {
87283                       allEntities[osmEntity$$1.key(entity)] = osmEntity$$1(entity);
87284                   });
87285
87286                   if (h.version === 3) {
87287                       // This merges originals for changed entities into the base of
87288                       // the _stack even if the current _stack doesn't have them (for
87289                       // example when iD has been restarted in a different region)
87290                       var baseEntities = h.baseEntities.map(function(d) { return osmEntity$$1(d); });
87291                       _stack[0].graph.rebase(baseEntities, map$3(_stack, 'graph'), true);
87292                       _tree.rebase(baseEntities, true);
87293
87294                       // When we restore a modified way, we also need to fetch any missing
87295                       // childnodes that would normally have been downloaded with it.. #2142
87296                       if (loadChildNodes) {
87297                           var osm = context.connection();
87298                           var nodes = flatten(uniq(map$3(filter(baseEntities, { type: 'way' }), 'nodes')));
87299                           var missing = reject(nodes, function(n) { return _stack[0].graph.hasEntity(n); });
87300
87301                           if (!isEmpty(missing) && osm) {
87302                               loadComplete = false;
87303                               context.redrawEnable(false);
87304
87305                               var loading = uiLoading(context).blocking(true);
87306                               context.container().call(loading);
87307
87308                               var childNodesLoaded = function(err, result) {
87309                                   if (!err) {
87310                                       var visible = groupBy(result.data, 'visible');
87311                                       if (!isEmpty(visible.true)) {
87312                                           missing = difference(missing, map$3(visible.true, 'id'));
87313                                           _stack[0].graph.rebase(visible.true, map$3(_stack, 'graph'), true);
87314                                           _tree.rebase(visible.true, true);
87315                                       }
87316
87317                                       // fetch older versions of nodes that were deleted..
87318                                       forEach(visible.false, function(entity) {
87319                                           osm.loadEntityVersion(entity.id, +entity.version - 1, childNodesLoaded);
87320                                       });
87321                                   }
87322
87323                                   if (err || isEmpty(missing)) {
87324                                       loading.close();
87325                                       context.redrawEnable(true);
87326                                       dispatch$$1.call('change');
87327                                   }
87328                               };
87329
87330                               osm.loadMultiple(missing, childNodesLoaded);
87331                           }
87332                       }
87333                   }
87334
87335                   _stack = h.stack.map(function(d) {
87336                       var entities = {}, entity;
87337
87338                       if (d.modified) {
87339                           d.modified.forEach(function(key) {
87340                               entity = allEntities[key];
87341                               entities[entity.id] = entity;
87342                           });
87343                       }
87344
87345                       if (d.deleted) {
87346                           d.deleted.forEach(function(id) {
87347                               entities[id] = undefined;
87348                           });
87349                       }
87350
87351                       return {
87352                           graph: coreGraph$$1(_stack[0].graph).load(entities),
87353                           annotation: d.annotation,
87354                           imageryUsed: d.imageryUsed,
87355                           transform: d.transform,
87356                           selectedIDs: d.selectedIDs
87357                       };
87358                   });
87359
87360               } else { // original version
87361                   _stack = h.stack.map(function(d) {
87362                       var entities = {};
87363
87364                       for (var i in d.entities) {
87365                           var entity = d.entities[i];
87366                           entities[i] = entity === 'undefined' ? undefined : osmEntity$$1(entity);
87367                       }
87368
87369                       d.graph = coreGraph$$1(_stack[0].graph).load(entities);
87370                       return d;
87371                   });
87372               }
87373
87374               var transform = _stack[_index].transform;
87375               if (transform) {
87376                   context.map().transformEase(transform, 0);   // 0 = immediate, no easing
87377               }
87378
87379               if (loadComplete) {
87380                   dispatch$$1.call('change');
87381               }
87382
87383               return history;
87384           },
87385
87386
87387           save: function() {
87388               if (lock.locked()) context.storage(getKey('saved_history'), history.toJSON() || null);
87389               return history;
87390           },
87391
87392
87393           clearSaved: function() {
87394               context.debouncedSave.cancel();
87395               if (lock.locked()) context.storage(getKey('saved_history'), null);
87396               return history;
87397           },
87398
87399
87400           lock: function() {
87401               return lock.lock();
87402           },
87403
87404
87405           unlock: function() {
87406               lock.unlock();
87407           },
87408
87409
87410           // is iD not open in another window and it detects that
87411           // there's a history stored in localStorage that's recoverable?
87412           restorableChanges: function() {
87413               return lock.locked() && !!context.storage(getKey('saved_history'));
87414           },
87415
87416
87417           // load history from a version stored in localStorage
87418           restore: function() {
87419               if (!lock.locked()) return;
87420
87421               var json = context.storage(getKey('saved_history'));
87422               if (json) history.fromJSON(json, true);
87423           },
87424
87425
87426           _getKey: getKey
87427
87428       };
87429
87430
87431       history.reset();
87432
87433       return utilRebind(history, dispatch$$1, 'on');
87434   }
87435
87436   /** Used to store function metadata. */
87437   var metaMap = WeakMap && new WeakMap;
87438
87439   /**
87440    * The base implementation of `setData` without support for hot loop shorting.
87441    *
87442    * @private
87443    * @param {Function} func The function to associate metadata with.
87444    * @param {*} data The metadata.
87445    * @returns {Function} Returns `func`.
87446    */
87447   var baseSetData = !metaMap ? identity$8 : function(func, data) {
87448     metaMap.set(func, data);
87449     return func;
87450   };
87451
87452   /**
87453    * Creates a function that produces an instance of `Ctor` regardless of
87454    * whether it was invoked as part of a `new` expression or by `call` or `apply`.
87455    *
87456    * @private
87457    * @param {Function} Ctor The constructor to wrap.
87458    * @returns {Function} Returns the new wrapped function.
87459    */
87460   function createCtor(Ctor) {
87461     return function() {
87462       // Use a `switch` statement to work with class constructors. See
87463       // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
87464       // for more details.
87465       var args = arguments;
87466       switch (args.length) {
87467         case 0: return new Ctor;
87468         case 1: return new Ctor(args[0]);
87469         case 2: return new Ctor(args[0], args[1]);
87470         case 3: return new Ctor(args[0], args[1], args[2]);
87471         case 4: return new Ctor(args[0], args[1], args[2], args[3]);
87472         case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
87473         case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
87474         case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
87475       }
87476       var thisBinding = baseCreate(Ctor.prototype),
87477           result = Ctor.apply(thisBinding, args);
87478
87479       // Mimic the constructor's `return` behavior.
87480       // See https://es5.github.io/#x13.2.2 for more details.
87481       return isObject(result) ? result : thisBinding;
87482     };
87483   }
87484
87485   /** Used to compose bitmasks for function metadata. */
87486   var WRAP_BIND_FLAG = 1;
87487
87488   /**
87489    * Creates a function that wraps `func` to invoke it with the optional `this`
87490    * binding of `thisArg`.
87491    *
87492    * @private
87493    * @param {Function} func The function to wrap.
87494    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
87495    * @param {*} [thisArg] The `this` binding of `func`.
87496    * @returns {Function} Returns the new wrapped function.
87497    */
87498   function createBind(func, bitmask, thisArg) {
87499     var isBind = bitmask & WRAP_BIND_FLAG,
87500         Ctor = createCtor(func);
87501
87502     function wrapper() {
87503       var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
87504       return fn.apply(isBind ? thisArg : this, arguments);
87505     }
87506     return wrapper;
87507   }
87508
87509   /* Built-in method references for those with the same name as other `lodash` methods. */
87510   var nativeMax$5 = Math.max;
87511
87512   /**
87513    * Creates an array that is the composition of partially applied arguments,
87514    * placeholders, and provided arguments into a single array of arguments.
87515    *
87516    * @private
87517    * @param {Array} args The provided arguments.
87518    * @param {Array} partials The arguments to prepend to those provided.
87519    * @param {Array} holders The `partials` placeholder indexes.
87520    * @params {boolean} [isCurried] Specify composing for a curried function.
87521    * @returns {Array} Returns the new array of composed arguments.
87522    */
87523   function composeArgs(args, partials, holders, isCurried) {
87524     var argsIndex = -1,
87525         argsLength = args.length,
87526         holdersLength = holders.length,
87527         leftIndex = -1,
87528         leftLength = partials.length,
87529         rangeLength = nativeMax$5(argsLength - holdersLength, 0),
87530         result = Array(leftLength + rangeLength),
87531         isUncurried = !isCurried;
87532
87533     while (++leftIndex < leftLength) {
87534       result[leftIndex] = partials[leftIndex];
87535     }
87536     while (++argsIndex < holdersLength) {
87537       if (isUncurried || argsIndex < argsLength) {
87538         result[holders[argsIndex]] = args[argsIndex];
87539       }
87540     }
87541     while (rangeLength--) {
87542       result[leftIndex++] = args[argsIndex++];
87543     }
87544     return result;
87545   }
87546
87547   /* Built-in method references for those with the same name as other `lodash` methods. */
87548   var nativeMax$6 = Math.max;
87549
87550   /**
87551    * This function is like `composeArgs` except that the arguments composition
87552    * is tailored for `_.partialRight`.
87553    *
87554    * @private
87555    * @param {Array} args The provided arguments.
87556    * @param {Array} partials The arguments to append to those provided.
87557    * @param {Array} holders The `partials` placeholder indexes.
87558    * @params {boolean} [isCurried] Specify composing for a curried function.
87559    * @returns {Array} Returns the new array of composed arguments.
87560    */
87561   function composeArgsRight(args, partials, holders, isCurried) {
87562     var argsIndex = -1,
87563         argsLength = args.length,
87564         holdersIndex = -1,
87565         holdersLength = holders.length,
87566         rightIndex = -1,
87567         rightLength = partials.length,
87568         rangeLength = nativeMax$6(argsLength - holdersLength, 0),
87569         result = Array(rangeLength + rightLength),
87570         isUncurried = !isCurried;
87571
87572     while (++argsIndex < rangeLength) {
87573       result[argsIndex] = args[argsIndex];
87574     }
87575     var offset = argsIndex;
87576     while (++rightIndex < rightLength) {
87577       result[offset + rightIndex] = partials[rightIndex];
87578     }
87579     while (++holdersIndex < holdersLength) {
87580       if (isUncurried || argsIndex < argsLength) {
87581         result[offset + holders[holdersIndex]] = args[argsIndex++];
87582       }
87583     }
87584     return result;
87585   }
87586
87587   /**
87588    * Gets the number of `placeholder` occurrences in `array`.
87589    *
87590    * @private
87591    * @param {Array} array The array to inspect.
87592    * @param {*} placeholder The placeholder to search for.
87593    * @returns {number} Returns the placeholder count.
87594    */
87595   function countHolders(array, placeholder) {
87596     var length = array.length,
87597         result = 0;
87598
87599     while (length--) {
87600       if (array[length] === placeholder) {
87601         ++result;
87602       }
87603     }
87604     return result;
87605   }
87606
87607   /**
87608    * The function whose prototype chain sequence wrappers inherit from.
87609    *
87610    * @private
87611    */
87612   function baseLodash() {
87613     // No operation performed.
87614   }
87615
87616   /** Used as references for the maximum length and index of an array. */
87617   var MAX_ARRAY_LENGTH = 4294967295;
87618
87619   /**
87620    * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
87621    *
87622    * @private
87623    * @constructor
87624    * @param {*} value The value to wrap.
87625    */
87626   function LazyWrapper(value) {
87627     this.__wrapped__ = value;
87628     this.__actions__ = [];
87629     this.__dir__ = 1;
87630     this.__filtered__ = false;
87631     this.__iteratees__ = [];
87632     this.__takeCount__ = MAX_ARRAY_LENGTH;
87633     this.__views__ = [];
87634   }
87635
87636   // Ensure `LazyWrapper` is an instance of `baseLodash`.
87637   LazyWrapper.prototype = baseCreate(baseLodash.prototype);
87638   LazyWrapper.prototype.constructor = LazyWrapper;
87639
87640   /**
87641    * Gets metadata for `func`.
87642    *
87643    * @private
87644    * @param {Function} func The function to query.
87645    * @returns {*} Returns the metadata for `func`.
87646    */
87647   var getData = !metaMap ? noop$3 : function(func) {
87648     return metaMap.get(func);
87649   };
87650
87651   /** Used to lookup unminified function names. */
87652   var realNames = {};
87653
87654   /** Used for built-in method references. */
87655   var objectProto$k = Object.prototype;
87656
87657   /** Used to check objects for own properties. */
87658   var hasOwnProperty$h = objectProto$k.hasOwnProperty;
87659
87660   /**
87661    * Gets the name of `func`.
87662    *
87663    * @private
87664    * @param {Function} func The function to query.
87665    * @returns {string} Returns the function name.
87666    */
87667   function getFuncName(func) {
87668     var result = (func.name + ''),
87669         array = realNames[result],
87670         length = hasOwnProperty$h.call(realNames, result) ? array.length : 0;
87671
87672     while (length--) {
87673       var data = array[length],
87674           otherFunc = data.func;
87675       if (otherFunc == null || otherFunc == func) {
87676         return data.name;
87677       }
87678     }
87679     return result;
87680   }
87681
87682   /**
87683    * The base constructor for creating `lodash` wrapper objects.
87684    *
87685    * @private
87686    * @param {*} value The value to wrap.
87687    * @param {boolean} [chainAll] Enable explicit method chain sequences.
87688    */
87689   function LodashWrapper(value, chainAll) {
87690     this.__wrapped__ = value;
87691     this.__actions__ = [];
87692     this.__chain__ = !!chainAll;
87693     this.__index__ = 0;
87694     this.__values__ = undefined;
87695   }
87696
87697   LodashWrapper.prototype = baseCreate(baseLodash.prototype);
87698   LodashWrapper.prototype.constructor = LodashWrapper;
87699
87700   /**
87701    * Creates a clone of `wrapper`.
87702    *
87703    * @private
87704    * @param {Object} wrapper The wrapper to clone.
87705    * @returns {Object} Returns the cloned wrapper.
87706    */
87707   function wrapperClone(wrapper) {
87708     if (wrapper instanceof LazyWrapper) {
87709       return wrapper.clone();
87710     }
87711     var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
87712     result.__actions__ = copyArray(wrapper.__actions__);
87713     result.__index__  = wrapper.__index__;
87714     result.__values__ = wrapper.__values__;
87715     return result;
87716   }
87717
87718   /** Used for built-in method references. */
87719   var objectProto$l = Object.prototype;
87720
87721   /** Used to check objects for own properties. */
87722   var hasOwnProperty$i = objectProto$l.hasOwnProperty;
87723
87724   /**
87725    * Creates a `lodash` object which wraps `value` to enable implicit method
87726    * chain sequences. Methods that operate on and return arrays, collections,
87727    * and functions can be chained together. Methods that retrieve a single value
87728    * or may return a primitive value will automatically end the chain sequence
87729    * and return the unwrapped value. Otherwise, the value must be unwrapped
87730    * with `_#value`.
87731    *
87732    * Explicit chain sequences, which must be unwrapped with `_#value`, may be
87733    * enabled using `_.chain`.
87734    *
87735    * The execution of chained methods is lazy, that is, it's deferred until
87736    * `_#value` is implicitly or explicitly called.
87737    *
87738    * Lazy evaluation allows several methods to support shortcut fusion.
87739    * Shortcut fusion is an optimization to merge iteratee calls; this avoids
87740    * the creation of intermediate arrays and can greatly reduce the number of
87741    * iteratee executions. Sections of a chain sequence qualify for shortcut
87742    * fusion if the section is applied to an array and iteratees accept only
87743    * one argument. The heuristic for whether a section qualifies for shortcut
87744    * fusion is subject to change.
87745    *
87746    * Chaining is supported in custom builds as long as the `_#value` method is
87747    * directly or indirectly included in the build.
87748    *
87749    * In addition to lodash methods, wrappers have `Array` and `String` methods.
87750    *
87751    * The wrapper `Array` methods are:
87752    * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
87753    *
87754    * The wrapper `String` methods are:
87755    * `replace` and `split`
87756    *
87757    * The wrapper methods that support shortcut fusion are:
87758    * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
87759    * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
87760    * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
87761    *
87762    * The chainable wrapper methods are:
87763    * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
87764    * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
87765    * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
87766    * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
87767    * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
87768    * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
87769    * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
87770    * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
87771    * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
87772    * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
87773    * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
87774    * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
87775    * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
87776    * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
87777    * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
87778    * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
87779    * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
87780    * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
87781    * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
87782    * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
87783    * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
87784    * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
87785    * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
87786    * `zipObject`, `zipObjectDeep`, and `zipWith`
87787    *
87788    * The wrapper methods that are **not** chainable by default are:
87789    * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
87790    * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
87791    * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
87792    * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
87793    * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
87794    * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
87795    * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
87796    * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
87797    * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
87798    * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
87799    * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
87800    * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
87801    * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
87802    * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
87803    * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
87804    * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
87805    * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
87806    * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
87807    * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
87808    * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
87809    * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
87810    * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
87811    * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
87812    * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
87813    * `upperFirst`, `value`, and `words`
87814    *
87815    * @name _
87816    * @constructor
87817    * @category Seq
87818    * @param {*} value The value to wrap in a `lodash` instance.
87819    * @returns {Object} Returns the new `lodash` wrapper instance.
87820    * @example
87821    *
87822    * function square(n) {
87823    *   return n * n;
87824    * }
87825    *
87826    * var wrapped = _([1, 2, 3]);
87827    *
87828    * // Returns an unwrapped value.
87829    * wrapped.reduce(_.add);
87830    * // => 6
87831    *
87832    * // Returns a wrapped value.
87833    * var squares = wrapped.map(square);
87834    *
87835    * _.isArray(squares);
87836    * // => false
87837    *
87838    * _.isArray(squares.value());
87839    * // => true
87840    */
87841   function lodash(value) {
87842     if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
87843       if (value instanceof LodashWrapper) {
87844         return value;
87845       }
87846       if (hasOwnProperty$i.call(value, '__wrapped__')) {
87847         return wrapperClone(value);
87848       }
87849     }
87850     return new LodashWrapper(value);
87851   }
87852
87853   // Ensure wrappers are instances of `baseLodash`.
87854   lodash.prototype = baseLodash.prototype;
87855   lodash.prototype.constructor = lodash;
87856
87857   /**
87858    * Checks if `func` has a lazy counterpart.
87859    *
87860    * @private
87861    * @param {Function} func The function to check.
87862    * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
87863    *  else `false`.
87864    */
87865   function isLaziable(func) {
87866     var funcName = getFuncName(func),
87867         other = lodash[funcName];
87868
87869     if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
87870       return false;
87871     }
87872     if (func === other) {
87873       return true;
87874     }
87875     var data = getData(other);
87876     return !!data && func === data[0];
87877   }
87878
87879   /**
87880    * Sets metadata for `func`.
87881    *
87882    * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
87883    * period of time, it will trip its breaker and transition to an identity
87884    * function to avoid garbage collection pauses in V8. See
87885    * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
87886    * for more details.
87887    *
87888    * @private
87889    * @param {Function} func The function to associate metadata with.
87890    * @param {*} data The metadata.
87891    * @returns {Function} Returns `func`.
87892    */
87893   var setData = shortOut(baseSetData);
87894
87895   /** Used to match wrap detail comments. */
87896   var reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
87897       reSplitDetails = /,? & /;
87898
87899   /**
87900    * Extracts wrapper details from the `source` body comment.
87901    *
87902    * @private
87903    * @param {string} source The source to inspect.
87904    * @returns {Array} Returns the wrapper details.
87905    */
87906   function getWrapDetails(source) {
87907     var match = source.match(reWrapDetails);
87908     return match ? match[1].split(reSplitDetails) : [];
87909   }
87910
87911   /** Used to match wrap detail comments. */
87912   var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;
87913
87914   /**
87915    * Inserts wrapper `details` in a comment at the top of the `source` body.
87916    *
87917    * @private
87918    * @param {string} source The source to modify.
87919    * @returns {Array} details The details to insert.
87920    * @returns {string} Returns the modified source.
87921    */
87922   function insertWrapDetails(source, details) {
87923     var length = details.length;
87924     if (!length) {
87925       return source;
87926     }
87927     var lastIndex = length - 1;
87928     details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
87929     details = details.join(length > 2 ? ', ' : ' ');
87930     return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
87931   }
87932
87933   /** Used to compose bitmasks for function metadata. */
87934   var WRAP_BIND_FLAG$1 = 1,
87935       WRAP_BIND_KEY_FLAG = 2,
87936       WRAP_CURRY_FLAG = 8,
87937       WRAP_CURRY_RIGHT_FLAG = 16,
87938       WRAP_PARTIAL_FLAG = 32,
87939       WRAP_PARTIAL_RIGHT_FLAG = 64,
87940       WRAP_ARY_FLAG = 128,
87941       WRAP_REARG_FLAG = 256,
87942       WRAP_FLIP_FLAG = 512;
87943
87944   /** Used to associate wrap methods with their bit flags. */
87945   var wrapFlags = [
87946     ['ary', WRAP_ARY_FLAG],
87947     ['bind', WRAP_BIND_FLAG$1],
87948     ['bindKey', WRAP_BIND_KEY_FLAG],
87949     ['curry', WRAP_CURRY_FLAG],
87950     ['curryRight', WRAP_CURRY_RIGHT_FLAG],
87951     ['flip', WRAP_FLIP_FLAG],
87952     ['partial', WRAP_PARTIAL_FLAG],
87953     ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
87954     ['rearg', WRAP_REARG_FLAG]
87955   ];
87956
87957   /**
87958    * Updates wrapper `details` based on `bitmask` flags.
87959    *
87960    * @private
87961    * @returns {Array} details The details to modify.
87962    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
87963    * @returns {Array} Returns `details`.
87964    */
87965   function updateWrapDetails(details, bitmask) {
87966     arrayEach(wrapFlags, function(pair) {
87967       var value = '_.' + pair[0];
87968       if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
87969         details.push(value);
87970       }
87971     });
87972     return details.sort();
87973   }
87974
87975   /**
87976    * Sets the `toString` method of `wrapper` to mimic the source of `reference`
87977    * with wrapper details in a comment at the top of the source body.
87978    *
87979    * @private
87980    * @param {Function} wrapper The function to modify.
87981    * @param {Function} reference The reference function.
87982    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
87983    * @returns {Function} Returns `wrapper`.
87984    */
87985   function setWrapToString(wrapper, reference, bitmask) {
87986     var source = (reference + '');
87987     return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
87988   }
87989
87990   /** Used to compose bitmasks for function metadata. */
87991   var WRAP_BIND_FLAG$2 = 1,
87992       WRAP_BIND_KEY_FLAG$1 = 2,
87993       WRAP_CURRY_BOUND_FLAG = 4,
87994       WRAP_CURRY_FLAG$1 = 8,
87995       WRAP_PARTIAL_FLAG$1 = 32,
87996       WRAP_PARTIAL_RIGHT_FLAG$1 = 64;
87997
87998   /**
87999    * Creates a function that wraps `func` to continue currying.
88000    *
88001    * @private
88002    * @param {Function} func The function to wrap.
88003    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
88004    * @param {Function} wrapFunc The function to create the `func` wrapper.
88005    * @param {*} placeholder The placeholder value.
88006    * @param {*} [thisArg] The `this` binding of `func`.
88007    * @param {Array} [partials] The arguments to prepend to those provided to
88008    *  the new function.
88009    * @param {Array} [holders] The `partials` placeholder indexes.
88010    * @param {Array} [argPos] The argument positions of the new function.
88011    * @param {number} [ary] The arity cap of `func`.
88012    * @param {number} [arity] The arity of `func`.
88013    * @returns {Function} Returns the new wrapped function.
88014    */
88015   function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
88016     var isCurry = bitmask & WRAP_CURRY_FLAG$1,
88017         newHolders = isCurry ? holders : undefined,
88018         newHoldersRight = isCurry ? undefined : holders,
88019         newPartials = isCurry ? partials : undefined,
88020         newPartialsRight = isCurry ? undefined : partials;
88021
88022     bitmask |= (isCurry ? WRAP_PARTIAL_FLAG$1 : WRAP_PARTIAL_RIGHT_FLAG$1);
88023     bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG$1 : WRAP_PARTIAL_FLAG$1);
88024
88025     if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
88026       bitmask &= ~(WRAP_BIND_FLAG$2 | WRAP_BIND_KEY_FLAG$1);
88027     }
88028     var newData = [
88029       func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
88030       newHoldersRight, argPos, ary, arity
88031     ];
88032
88033     var result = wrapFunc.apply(undefined, newData);
88034     if (isLaziable(func)) {
88035       setData(result, newData);
88036     }
88037     result.placeholder = placeholder;
88038     return setWrapToString(result, func, bitmask);
88039   }
88040
88041   /**
88042    * Gets the argument placeholder value for `func`.
88043    *
88044    * @private
88045    * @param {Function} func The function to inspect.
88046    * @returns {*} Returns the placeholder value.
88047    */
88048   function getHolder(func) {
88049     var object = func;
88050     return object.placeholder;
88051   }
88052
88053   /* Built-in method references for those with the same name as other `lodash` methods. */
88054   var nativeMin$2 = Math.min;
88055
88056   /**
88057    * Reorder `array` according to the specified indexes where the element at
88058    * the first index is assigned as the first element, the element at
88059    * the second index is assigned as the second element, and so on.
88060    *
88061    * @private
88062    * @param {Array} array The array to reorder.
88063    * @param {Array} indexes The arranged array indexes.
88064    * @returns {Array} Returns `array`.
88065    */
88066   function reorder(array, indexes) {
88067     var arrLength = array.length,
88068         length = nativeMin$2(indexes.length, arrLength),
88069         oldArray = copyArray(array);
88070
88071     while (length--) {
88072       var index = indexes[length];
88073       array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
88074     }
88075     return array;
88076   }
88077
88078   /** Used as the internal argument placeholder. */
88079   var PLACEHOLDER = '__lodash_placeholder__';
88080
88081   /**
88082    * Replaces all `placeholder` elements in `array` with an internal placeholder
88083    * and returns an array of their indexes.
88084    *
88085    * @private
88086    * @param {Array} array The array to modify.
88087    * @param {*} placeholder The placeholder to replace.
88088    * @returns {Array} Returns the new array of placeholder indexes.
88089    */
88090   function replaceHolders(array, placeholder) {
88091     var index = -1,
88092         length = array.length,
88093         resIndex = 0,
88094         result = [];
88095
88096     while (++index < length) {
88097       var value = array[index];
88098       if (value === placeholder || value === PLACEHOLDER) {
88099         array[index] = PLACEHOLDER;
88100         result[resIndex++] = index;
88101       }
88102     }
88103     return result;
88104   }
88105
88106   /** Used to compose bitmasks for function metadata. */
88107   var WRAP_BIND_FLAG$3 = 1,
88108       WRAP_BIND_KEY_FLAG$2 = 2,
88109       WRAP_CURRY_FLAG$2 = 8,
88110       WRAP_CURRY_RIGHT_FLAG$1 = 16,
88111       WRAP_ARY_FLAG$1 = 128,
88112       WRAP_FLIP_FLAG$1 = 512;
88113
88114   /**
88115    * Creates a function that wraps `func` to invoke it with optional `this`
88116    * binding of `thisArg`, partial application, and currying.
88117    *
88118    * @private
88119    * @param {Function|string} func The function or method name to wrap.
88120    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
88121    * @param {*} [thisArg] The `this` binding of `func`.
88122    * @param {Array} [partials] The arguments to prepend to those provided to
88123    *  the new function.
88124    * @param {Array} [holders] The `partials` placeholder indexes.
88125    * @param {Array} [partialsRight] The arguments to append to those provided
88126    *  to the new function.
88127    * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
88128    * @param {Array} [argPos] The argument positions of the new function.
88129    * @param {number} [ary] The arity cap of `func`.
88130    * @param {number} [arity] The arity of `func`.
88131    * @returns {Function} Returns the new wrapped function.
88132    */
88133   function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
88134     var isAry = bitmask & WRAP_ARY_FLAG$1,
88135         isBind = bitmask & WRAP_BIND_FLAG$3,
88136         isBindKey = bitmask & WRAP_BIND_KEY_FLAG$2,
88137         isCurried = bitmask & (WRAP_CURRY_FLAG$2 | WRAP_CURRY_RIGHT_FLAG$1),
88138         isFlip = bitmask & WRAP_FLIP_FLAG$1,
88139         Ctor = isBindKey ? undefined : createCtor(func);
88140
88141     function wrapper() {
88142       var length = arguments.length,
88143           args = Array(length),
88144           index = length;
88145
88146       while (index--) {
88147         args[index] = arguments[index];
88148       }
88149       if (isCurried) {
88150         var placeholder = getHolder(wrapper),
88151             holdersCount = countHolders(args, placeholder);
88152       }
88153       if (partials) {
88154         args = composeArgs(args, partials, holders, isCurried);
88155       }
88156       if (partialsRight) {
88157         args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
88158       }
88159       length -= holdersCount;
88160       if (isCurried && length < arity) {
88161         var newHolders = replaceHolders(args, placeholder);
88162         return createRecurry(
88163           func, bitmask, createHybrid, wrapper.placeholder, thisArg,
88164           args, newHolders, argPos, ary, arity - length
88165         );
88166       }
88167       var thisBinding = isBind ? thisArg : this,
88168           fn = isBindKey ? thisBinding[func] : func;
88169
88170       length = args.length;
88171       if (argPos) {
88172         args = reorder(args, argPos);
88173       } else if (isFlip && length > 1) {
88174         args.reverse();
88175       }
88176       if (isAry && ary < length) {
88177         args.length = ary;
88178       }
88179       if (this && this !== root$2 && this instanceof wrapper) {
88180         fn = Ctor || createCtor(fn);
88181       }
88182       return fn.apply(thisBinding, args);
88183     }
88184     return wrapper;
88185   }
88186
88187   /**
88188    * Creates a function that wraps `func` to enable currying.
88189    *
88190    * @private
88191    * @param {Function} func The function to wrap.
88192    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
88193    * @param {number} arity The arity of `func`.
88194    * @returns {Function} Returns the new wrapped function.
88195    */
88196   function createCurry(func, bitmask, arity) {
88197     var Ctor = createCtor(func);
88198
88199     function wrapper() {
88200       var length = arguments.length,
88201           args = Array(length),
88202           index = length,
88203           placeholder = getHolder(wrapper);
88204
88205       while (index--) {
88206         args[index] = arguments[index];
88207       }
88208       var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
88209         ? []
88210         : replaceHolders(args, placeholder);
88211
88212       length -= holders.length;
88213       if (length < arity) {
88214         return createRecurry(
88215           func, bitmask, createHybrid, wrapper.placeholder, undefined,
88216           args, holders, undefined, undefined, arity - length);
88217       }
88218       var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
88219       return apply(fn, this, args);
88220     }
88221     return wrapper;
88222   }
88223
88224   /** Used to compose bitmasks for function metadata. */
88225   var WRAP_BIND_FLAG$4 = 1;
88226
88227   /**
88228    * Creates a function that wraps `func` to invoke it with the `this` binding
88229    * of `thisArg` and `partials` prepended to the arguments it receives.
88230    *
88231    * @private
88232    * @param {Function} func The function to wrap.
88233    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
88234    * @param {*} thisArg The `this` binding of `func`.
88235    * @param {Array} partials The arguments to prepend to those provided to
88236    *  the new function.
88237    * @returns {Function} Returns the new wrapped function.
88238    */
88239   function createPartial(func, bitmask, thisArg, partials) {
88240     var isBind = bitmask & WRAP_BIND_FLAG$4,
88241         Ctor = createCtor(func);
88242
88243     function wrapper() {
88244       var argsIndex = -1,
88245           argsLength = arguments.length,
88246           leftIndex = -1,
88247           leftLength = partials.length,
88248           args = Array(leftLength + argsLength),
88249           fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
88250
88251       while (++leftIndex < leftLength) {
88252         args[leftIndex] = partials[leftIndex];
88253       }
88254       while (argsLength--) {
88255         args[leftIndex++] = arguments[++argsIndex];
88256       }
88257       return apply(fn, isBind ? thisArg : this, args);
88258     }
88259     return wrapper;
88260   }
88261
88262   /** Used as the internal argument placeholder. */
88263   var PLACEHOLDER$1 = '__lodash_placeholder__';
88264
88265   /** Used to compose bitmasks for function metadata. */
88266   var WRAP_BIND_FLAG$5 = 1,
88267       WRAP_BIND_KEY_FLAG$3 = 2,
88268       WRAP_CURRY_BOUND_FLAG$1 = 4,
88269       WRAP_CURRY_FLAG$3 = 8,
88270       WRAP_ARY_FLAG$2 = 128,
88271       WRAP_REARG_FLAG$1 = 256;
88272
88273   /* Built-in method references for those with the same name as other `lodash` methods. */
88274   var nativeMin$3 = Math.min;
88275
88276   /**
88277    * Merges the function metadata of `source` into `data`.
88278    *
88279    * Merging metadata reduces the number of wrappers used to invoke a function.
88280    * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
88281    * may be applied regardless of execution order. Methods like `_.ary` and
88282    * `_.rearg` modify function arguments, making the order in which they are
88283    * executed important, preventing the merging of metadata. However, we make
88284    * an exception for a safe combined case where curried functions have `_.ary`
88285    * and or `_.rearg` applied.
88286    *
88287    * @private
88288    * @param {Array} data The destination metadata.
88289    * @param {Array} source The source metadata.
88290    * @returns {Array} Returns `data`.
88291    */
88292   function mergeData(data, source) {
88293     var bitmask = data[1],
88294         srcBitmask = source[1],
88295         newBitmask = bitmask | srcBitmask,
88296         isCommon = newBitmask < (WRAP_BIND_FLAG$5 | WRAP_BIND_KEY_FLAG$3 | WRAP_ARY_FLAG$2);
88297
88298     var isCombo =
88299       ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_CURRY_FLAG$3)) ||
88300       ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_REARG_FLAG$1) && (data[7].length <= source[8])) ||
88301       ((srcBitmask == (WRAP_ARY_FLAG$2 | WRAP_REARG_FLAG$1)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG$3));
88302
88303     // Exit early if metadata can't be merged.
88304     if (!(isCommon || isCombo)) {
88305       return data;
88306     }
88307     // Use source `thisArg` if available.
88308     if (srcBitmask & WRAP_BIND_FLAG$5) {
88309       data[2] = source[2];
88310       // Set when currying a bound function.
88311       newBitmask |= bitmask & WRAP_BIND_FLAG$5 ? 0 : WRAP_CURRY_BOUND_FLAG$1;
88312     }
88313     // Compose partial arguments.
88314     var value = source[3];
88315     if (value) {
88316       var partials = data[3];
88317       data[3] = partials ? composeArgs(partials, value, source[4]) : value;
88318       data[4] = partials ? replaceHolders(data[3], PLACEHOLDER$1) : source[4];
88319     }
88320     // Compose partial right arguments.
88321     value = source[5];
88322     if (value) {
88323       partials = data[5];
88324       data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
88325       data[6] = partials ? replaceHolders(data[5], PLACEHOLDER$1) : source[6];
88326     }
88327     // Use source `argPos` if available.
88328     value = source[7];
88329     if (value) {
88330       data[7] = value;
88331     }
88332     // Use source `ary` if it's smaller.
88333     if (srcBitmask & WRAP_ARY_FLAG$2) {
88334       data[8] = data[8] == null ? source[8] : nativeMin$3(data[8], source[8]);
88335     }
88336     // Use source `arity` if one is not provided.
88337     if (data[9] == null) {
88338       data[9] = source[9];
88339     }
88340     // Use source `func` and merge bitmasks.
88341     data[0] = source[0];
88342     data[1] = newBitmask;
88343
88344     return data;
88345   }
88346
88347   /** Error message constants. */
88348   var FUNC_ERROR_TEXT$4 = 'Expected a function';
88349
88350   /** Used to compose bitmasks for function metadata. */
88351   var WRAP_BIND_FLAG$6 = 1,
88352       WRAP_BIND_KEY_FLAG$4 = 2,
88353       WRAP_CURRY_FLAG$4 = 8,
88354       WRAP_CURRY_RIGHT_FLAG$2 = 16,
88355       WRAP_PARTIAL_FLAG$2 = 32,
88356       WRAP_PARTIAL_RIGHT_FLAG$2 = 64;
88357
88358   /* Built-in method references for those with the same name as other `lodash` methods. */
88359   var nativeMax$7 = Math.max;
88360
88361   /**
88362    * Creates a function that either curries or invokes `func` with optional
88363    * `this` binding and partially applied arguments.
88364    *
88365    * @private
88366    * @param {Function|string} func The function or method name to wrap.
88367    * @param {number} bitmask The bitmask flags.
88368    *    1 - `_.bind`
88369    *    2 - `_.bindKey`
88370    *    4 - `_.curry` or `_.curryRight` of a bound function
88371    *    8 - `_.curry`
88372    *   16 - `_.curryRight`
88373    *   32 - `_.partial`
88374    *   64 - `_.partialRight`
88375    *  128 - `_.rearg`
88376    *  256 - `_.ary`
88377    *  512 - `_.flip`
88378    * @param {*} [thisArg] The `this` binding of `func`.
88379    * @param {Array} [partials] The arguments to be partially applied.
88380    * @param {Array} [holders] The `partials` placeholder indexes.
88381    * @param {Array} [argPos] The argument positions of the new function.
88382    * @param {number} [ary] The arity cap of `func`.
88383    * @param {number} [arity] The arity of `func`.
88384    * @returns {Function} Returns the new wrapped function.
88385    */
88386   function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
88387     var isBindKey = bitmask & WRAP_BIND_KEY_FLAG$4;
88388     if (!isBindKey && typeof func != 'function') {
88389       throw new TypeError(FUNC_ERROR_TEXT$4);
88390     }
88391     var length = partials ? partials.length : 0;
88392     if (!length) {
88393       bitmask &= ~(WRAP_PARTIAL_FLAG$2 | WRAP_PARTIAL_RIGHT_FLAG$2);
88394       partials = holders = undefined;
88395     }
88396     ary = ary === undefined ? ary : nativeMax$7(toInteger(ary), 0);
88397     arity = arity === undefined ? arity : toInteger(arity);
88398     length -= holders ? holders.length : 0;
88399
88400     if (bitmask & WRAP_PARTIAL_RIGHT_FLAG$2) {
88401       var partialsRight = partials,
88402           holdersRight = holders;
88403
88404       partials = holders = undefined;
88405     }
88406     var data = isBindKey ? undefined : getData(func);
88407
88408     var newData = [
88409       func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
88410       argPos, ary, arity
88411     ];
88412
88413     if (data) {
88414       mergeData(newData, data);
88415     }
88416     func = newData[0];
88417     bitmask = newData[1];
88418     thisArg = newData[2];
88419     partials = newData[3];
88420     holders = newData[4];
88421     arity = newData[9] = newData[9] === undefined
88422       ? (isBindKey ? 0 : func.length)
88423       : nativeMax$7(newData[9] - length, 0);
88424
88425     if (!arity && bitmask & (WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2)) {
88426       bitmask &= ~(WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2);
88427     }
88428     if (!bitmask || bitmask == WRAP_BIND_FLAG$6) {
88429       var result = createBind(func, bitmask, thisArg);
88430     } else if (bitmask == WRAP_CURRY_FLAG$4 || bitmask == WRAP_CURRY_RIGHT_FLAG$2) {
88431       result = createCurry(func, bitmask, arity);
88432     } else if ((bitmask == WRAP_PARTIAL_FLAG$2 || bitmask == (WRAP_BIND_FLAG$6 | WRAP_PARTIAL_FLAG$2)) && !holders.length) {
88433       result = createPartial(func, bitmask, thisArg, partials);
88434     } else {
88435       result = createHybrid.apply(undefined, newData);
88436     }
88437     var setter = data ? baseSetData : setData;
88438     return setWrapToString(setter(result, newData), func, bitmask);
88439   }
88440
88441   /** Used to compose bitmasks for function metadata. */
88442   var WRAP_BIND_FLAG$7 = 1,
88443       WRAP_PARTIAL_FLAG$3 = 32;
88444
88445   /**
88446    * Creates a function that invokes `func` with the `this` binding of `thisArg`
88447    * and `partials` prepended to the arguments it receives.
88448    *
88449    * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
88450    * may be used as a placeholder for partially applied arguments.
88451    *
88452    * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
88453    * property of bound functions.
88454    *
88455    * @static
88456    * @memberOf _
88457    * @since 0.1.0
88458    * @category Function
88459    * @param {Function} func The function to bind.
88460    * @param {*} thisArg The `this` binding of `func`.
88461    * @param {...*} [partials] The arguments to be partially applied.
88462    * @returns {Function} Returns the new bound function.
88463    * @example
88464    *
88465    * function greet(greeting, punctuation) {
88466    *   return greeting + ' ' + this.user + punctuation;
88467    * }
88468    *
88469    * var object = { 'user': 'fred' };
88470    *
88471    * var bound = _.bind(greet, object, 'hi');
88472    * bound('!');
88473    * // => 'hi fred!'
88474    *
88475    * // Bound with placeholders.
88476    * var bound = _.bind(greet, object, _, '!');
88477    * bound('hi');
88478    * // => 'hi fred!'
88479    */
88480   var bind$2 = baseRest(function(func, thisArg, partials) {
88481     var bitmask = WRAP_BIND_FLAG$7;
88482     if (partials.length) {
88483       var holders = replaceHolders(partials, getHolder(bind$2));
88484       bitmask |= WRAP_PARTIAL_FLAG$3;
88485     }
88486     return createWrap(func, bitmask, thisArg, partials, holders);
88487   });
88488
88489   // Assign default placeholders.
88490   bind$2.placeholder = {};
88491
88492   function presetCollection(collection) {
88493       var maxSearchResults = 50;
88494       var maxSuggestionResults = 10;
88495
88496       var presets = {
88497
88498           collection: collection,
88499
88500
88501           item: function(id) {
88502               return find$1(this.collection, function(d) {
88503                   return d.id === id;
88504               });
88505           },
88506
88507           index: function(id) {
88508               return findIndex(this.collection, function(d) {
88509                   return d.id === id;
88510               });
88511           },
88512
88513           matchGeometry: function(geometry) {
88514               return presetCollection(this.collection.filter(function(d) {
88515                   return d.matchGeometry(geometry);
88516               }));
88517           },
88518
88519
88520           search: function(value, geometry) {
88521               if (!value) return this;
88522
88523               function leading(a) {
88524                   var index = a.indexOf(value);
88525                   return index === 0 || a[index - 1] === ' ';
88526               }
88527
88528               function suggestionName(name) {
88529                   var nameArray = name.split(' - ');
88530                   if (nameArray.length > 1) {
88531                       name = nameArray.slice(0, nameArray.length - 1).join(' - ');
88532                   }
88533                   return name.toLowerCase();
88534               }
88535
88536
88537               value = value.toLowerCase();
88538
88539               var searchable = filter(this.collection, function(a) {
88540                   return a.searchable !== false && a.suggestion !== true;
88541               });
88542               var suggestions = filter(this.collection, function(a) {
88543                   return a.suggestion === true;
88544               });
88545
88546
88547               // matches value to preset.name
88548               var leading_name = filter(searchable, function(a) {
88549                       return leading(a.name().toLowerCase());
88550                   }).sort(function(a, b) {
88551                       var aCompare = a.name().toLowerCase();
88552                       var bCompare = b.name().toLowerCase();
88553                       var i;
88554
88555                       // priority if search string matches preset name exactly - #4325
88556                       if (value === aCompare) return -1;
88557                       if (value === bCompare) return 1;
88558
88559                       // priority for higher matchScore
88560                       i = b.originalScore - a.originalScore;
88561                       if (i !== 0) return i;
88562
88563                       // priority if search string appears earlier in preset name
88564                       i = aCompare.indexOf(value) - bCompare.indexOf(value);
88565                       if (i !== 0) return i;
88566
88567                       // priority for shorter preset names
88568                       return a.name().length - b.name().length;
88569                   });
88570
88571               // matches value to preset.terms values
88572               var leading_terms = filter(searchable, function(a) {
88573                   return some(a.terms() || [], leading);
88574               });
88575
88576               // matches value to preset.tags values
88577               var leading_tag_values = filter(searchable, function(a) {
88578                   return some(without(values$1(a.tags || {}), '*'), leading);
88579               });
88580
88581
88582               // finds close matches to value in preset.name
88583               var similar_name = searchable
88584                   .map(function(a) {
88585                       return { preset: a, dist: utilEditDistance(value, a.name()) };
88586                   }).filter(function(a) {
88587                       return a.dist + Math.min(value.length - a.preset.name().length, 0) < 3;
88588                   }).sort(function(a, b) {
88589                       return a.dist - b.dist;
88590                   }).map(function(a) {
88591                       return a.preset;
88592                   });
88593
88594               // finds close matches to value in preset.terms
88595               var similar_terms = filter(searchable, function(a) {
88596                       return some(a.terms() || [], function(b) {
88597                           return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
88598                       });
88599                   });
88600
88601               var leading_suggestions = filter(suggestions, function(a) {
88602                       return leading(suggestionName(a.name()));
88603                   }).sort(function(a, b) {
88604                       a = suggestionName(a.name());
88605                       b = suggestionName(b.name());
88606                       var i = a.indexOf(value) - b.indexOf(value);
88607                       if (i === 0) return a.length - b.length;
88608                       else return i;
88609                   });
88610
88611               var similar_suggestions = suggestions.map(function(a) {
88612                       return { preset: a, dist: utilEditDistance(value, suggestionName(a.name())) };
88613                   }).filter(function(a) {
88614                       return a.dist + Math.min(value.length - suggestionName(a.preset.name()).length, 0) < 1;
88615                   }).sort(function(a, b) {
88616                       return a.dist - b.dist;
88617                   }).map(function(a) {
88618                       return a.preset;
88619                   });
88620
88621               var other = presets.item(geometry);
88622
88623               var results = leading_name.concat(
88624                   leading_terms,
88625                   leading_tag_values,
88626                   leading_suggestions.slice(0, maxSuggestionResults + 5),
88627                   similar_name,
88628                   similar_terms,
88629                   similar_suggestions.slice(0, maxSuggestionResults)
88630               ).slice(0, maxSearchResults - 1);
88631
88632               return presetCollection(uniq(results.concat(other)));
88633           }
88634       };
88635
88636
88637       return presets;
88638   }
88639
88640   function presetCategory(id, category, all) {
88641       category = clone(category);
88642
88643       category.id = id;
88644
88645
88646       category.members = presetCollection(category.members.map(function(id) {
88647           return all.item(id);
88648       }));
88649
88650
88651       category.matchGeometry = function(geometry) {
88652           return category.geometry.indexOf(geometry) >= 0;
88653       };
88654
88655
88656       category.matchScore = function() {
88657           return -1;
88658       };
88659
88660
88661       category.name = function() {
88662           return t('presets.categories.' + id + '.name', {'default': id});
88663       };
88664
88665
88666       category.terms = function() {
88667           return [];
88668       };
88669
88670
88671       return category;
88672   }
88673
88674   function presetField(id, field) {
88675       field = clone(field);
88676
88677       field.id = id;
88678
88679       // for use in classes, element ids, css selectors
88680       field.safeid = id.replace(/[^_a-zA-Z0-9\-]/g, '_');
88681
88682       field.matchGeometry = function(geometry) {
88683           return !field.geometry || field.geometry === geometry;
88684       };
88685
88686
88687       field.t = function(scope, options) {
88688           return t('presets.fields.' + id + '.' + scope, options);
88689       };
88690
88691
88692       field.label = function() {
88693           return field.overrideLabel || field.t('label', {'default': id});
88694       };
88695
88696
88697       var placeholder = field.placeholder;
88698       field.placeholder = function() {
88699           return field.t('placeholder', {'default': placeholder});
88700       };
88701
88702
88703       return field;
88704   }
88705
88706   function presetPreset(id, preset, fields, visible, rawPresets) {
88707       preset = clone(preset);
88708
88709       preset.id = id;
88710
88711       preset.parentPresetID = function() {
88712           var endIndex = preset.id.lastIndexOf('/');
88713           if (endIndex < 0) return null;
88714
88715           return preset.id.substring(0, endIndex);
88716       };
88717
88718
88719       // For a preset without fields, use the fields of the parent preset.
88720       // Replace {preset} placeholders with the fields of the specified presets.
88721       function resolveFieldInheritance() {
88722
88723           // Skip `fields` for the keys which define the preset.
88724           // These are usually `typeCombo` fields like `shop=*`
88725           function withoutKeyFields(fieldID) {
88726               var f = fields[fieldID];
88727               if (f.key) {
88728                   return preset.tags[f.key] === undefined;
88729               }
88730               return true;
88731           }
88732
88733           // returns an array of field IDs to inherit from the given presetID, if found
88734           function inheritedFieldIDs(presetID, prop) {
88735               if (!presetID) return null;
88736
88737               var inheritPreset = rawPresets[presetID];
88738               if (!inheritPreset) return null;
88739
88740               var inheritFieldIDs = inheritPreset[prop] || [];
88741
88742               if (prop === 'fields') {
88743                   inheritFieldIDs = inheritFieldIDs.filter(withoutKeyFields);
88744               }
88745
88746               return inheritFieldIDs;
88747           }
88748
88749
88750           ['fields', 'moreFields'].forEach(function(prop) {
88751               var fieldIDs = [];
88752               if (preset[prop] && preset[prop].length) {    // fields were defined
88753                   preset[prop].forEach(function(fieldID) {
88754                       var match = fieldID.match(/\{(.*)\}/);
88755                       if (match !== null) {        // presetID wrapped in braces {}
88756                           var inheritIDs = inheritedFieldIDs(match[1], prop);
88757                           if (inheritIDs !== null) {
88758                               fieldIDs = fieldIDs.concat(inheritIDs);
88759                           } else {
88760                               /* eslint-disable no-console */
88761                               console.log('Cannot resolve presetID ' + match[0] +
88762                                   ' found in ' + preset.id + ' ' + prop);
88763                               /* eslint-enable no-console */
88764                           }
88765                       } else {
88766                           fieldIDs.push(fieldID);  // no braces - just a normal field
88767                       }
88768                   });
88769
88770               } else {  // no fields defined, so use the parent's if possible
88771                   fieldIDs = inheritedFieldIDs(preset.parentPresetID(), prop);
88772               }
88773               // resolve duplicate fields
88774               fieldIDs = uniq(fieldIDs);
88775
88776               // update this preset with the results
88777               preset[prop] = fieldIDs;
88778
88779               // update the raw object to allow for multiple levels of inheritance
88780               rawPresets[preset.id][prop] = fieldIDs;
88781           });
88782       }
88783
88784       if (rawPresets) {
88785           resolveFieldInheritance();
88786       }
88787
88788       preset.fields = (preset.fields || []).map(getFields);
88789       preset.moreFields = (preset.moreFields || []).map(getFields);
88790       preset.geometry = (preset.geometry || []);
88791
88792       visible = visible || false;
88793
88794       function getFields(f) {
88795           return fields[f];
88796       }
88797
88798
88799       preset.matchGeometry = function(geometry) {
88800           return preset.geometry.indexOf(geometry) >= 0;
88801       };
88802
88803
88804       preset.originalScore = preset.matchScore || 1;
88805
88806
88807       preset.matchScore = function(entity) {
88808           var tags = preset.tags;
88809           var score = 0;
88810
88811           for (var t$$1 in tags) {
88812               if (entity.tags[t$$1] === tags[t$$1]) {
88813                   score += preset.originalScore;
88814               } else if (tags[t$$1] === '*' && t$$1 in entity.tags) {
88815                   score += preset.originalScore / 2;
88816               } else {
88817                   return -1;
88818               }
88819           }
88820
88821           return score;
88822       };
88823
88824
88825       preset.t = function(scope, options) {
88826           return t('presets.presets.' + id + '.' + scope, options);
88827       };
88828
88829
88830       var origName = preset.name || '';
88831       preset.name = function() {
88832           if (preset.suggestion) {
88833               var path = id.split('/');
88834               path.pop();  // remove brand name
88835               // NOTE: insert an en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
88836               return origName + ' – ' + t('presets.presets.' + path.join('/') + '.name');
88837           }
88838           return preset.t('name', { 'default': origName });
88839       };
88840
88841       var origTerms = (preset.terms || []).join();
88842       preset.terms = function() {
88843           return preset.t('terms', { 'default': origTerms }).toLowerCase().trim().split(/\s*,+\s*/);
88844       };
88845
88846
88847       preset.isFallback = function() {
88848           var tagCount = Object.keys(preset.tags).length;
88849           return tagCount === 0 || (tagCount === 1 && preset.tags.hasOwnProperty('area'));
88850       };
88851
88852       preset.visible = function(val) {
88853           if (!arguments.length) return visible;
88854           visible = val;
88855           return visible;
88856       };
88857
88858
88859       var reference = preset.reference || {};
88860       preset.reference = function(geometry) {
88861           var key = reference.key || Object.keys(omit(preset.tags, 'name'))[0],
88862               value = reference.value || preset.tags[key];
88863
88864           if (geometry === 'relation' && key === 'type') {
88865               if (value in preset.tags) {
88866                   key = value;
88867                   value = preset.tags[key];
88868               } else {
88869                   return { rtype: value };
88870               }
88871           }
88872
88873           if (value === '*') {
88874               return { key: key };
88875           } else {
88876               return { key: key, value: value };
88877           }
88878       };
88879
88880
88881       preset.removeTags = preset.removeTags || preset.tags || {};
88882       preset.unsetTags = function(tags, geometry) {
88883           tags = omit(tags, Object.keys(preset.removeTags));
88884
88885           for (var f in preset.fields) {
88886               var field = preset.fields[f];
88887               if (field.matchGeometry(geometry) && field.default === tags[field.key]) {
88888                   delete tags[field.key];
88889               }
88890           }
88891
88892           delete tags.area;
88893           return tags;
88894       };
88895
88896
88897       preset.addTags = preset.addTags || preset.tags || {};
88898       preset.setTags = function(tags, geometry) {
88899           var addTags = preset.addTags;
88900           var k;
88901
88902           tags = clone(tags);
88903
88904           for (k in addTags) {
88905               if (addTags[k] === '*') {
88906                   tags[k] = 'yes';
88907               } else {
88908                   tags[k] = addTags[k];
88909               }
88910           }
88911
88912           // Add area=yes if necessary.
88913           // This is necessary if the geometry is already an area (e.g. user drew an area) AND any of:
88914           // 1. chosen preset could be either an area or a line (`barrier=city_wall`)
88915           // 2. chosen preset doesn't have a key in areaKeys (`railway=station`)
88916           if (!addTags.hasOwnProperty('area')) {
88917               delete tags.area;
88918               if (geometry === 'area') {
88919                   var needsAreaTag = true;
88920                   if (preset.geometry.indexOf('line') === -1) {
88921                       for (k in addTags) {
88922                           if (k in areaKeys) {
88923                               needsAreaTag = false;
88924                               break;
88925                           }
88926                       }
88927                   }
88928                   if (needsAreaTag) {
88929                       tags.area = 'yes';
88930                   }
88931               }
88932           }
88933
88934           for (var f in preset.fields) {
88935               var field = preset.fields[f];
88936               if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) {
88937                   tags[field.key] = field.default;
88938               }
88939           }
88940
88941           return tags;
88942       };
88943
88944
88945       return preset;
88946   }
88947
88948   function presetIndex() {
88949       // a presetCollection with methods for
88950       // loading new data and returning defaults
88951
88952       var all = presetCollection([]);
88953       var _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
88954       var _fields = {};
88955       var _universal = [];
88956       var _recent = presetCollection([]);
88957
88958       // Index of presets by (geometry, tag key).
88959       var _index = {
88960           point: {},
88961           vertex: {},
88962           line: {},
88963           area: {},
88964           relation: {}
88965       };
88966
88967       all.match = function(entity, resolver) {
88968           return resolver.transient(entity, 'presetMatch', function() {
88969               var geometry = entity.geometry(resolver);
88970               var address;
88971
88972               // Treat entities on addr:interpolation lines as points, not vertices - #3241
88973               if (geometry === 'vertex' && entity.isOnAddressLine(resolver)) {
88974                   geometry = 'point';
88975               }
88976
88977               var geometryMatches = _index[geometry];
88978               var best = -1;
88979               var match;
88980
88981               for (var k in entity.tags) {
88982                   // If any part of an address is present,
88983                   // allow fallback to "Address" preset - #4353
88984                   if (k.match(/^addr:/) !== null && geometryMatches['addr:*']) {
88985                       address = geometryMatches['addr:*'][0];
88986                   }
88987
88988                   var keyMatches = geometryMatches[k];
88989                   if (!keyMatches) continue;
88990
88991                   for (var i = 0; i < keyMatches.length; i++) {
88992                       var score = keyMatches[i].matchScore(entity);
88993                       if (score > best) {
88994                           best = score;
88995                           match = keyMatches[i];
88996                       }
88997                   }
88998               }
88999
89000               if (address && (!match || match.isFallback())) {
89001                   match = address;
89002               }
89003               return match || all.item(geometry);
89004           });
89005       };
89006
89007
89008       // Because of the open nature of tagging, iD will never have a complete
89009       // list of tags used in OSM, so we want it to have logic like "assume
89010       // that a closed way with an amenity tag is an area, unless the amenity
89011       // is one of these specific types". This function computes a structure
89012       // that allows testing of such conditions, based on the presets designated
89013       // as as supporting (or not supporting) the area geometry.
89014       //
89015       // The returned object L is a whitelist/blacklist of tags. A closed way
89016       // with a tag (k, v) is considered to be an area if `k in L && !(v in L[k])`
89017       // (see `Way#isArea()`). In other words, the keys of L form the whitelist,
89018       // and the subkeys form the blacklist.
89019       all.areaKeys = function() {
89020           var areaKeys = {};
89021           var ignore = ['barrier', 'highway', 'footway', 'railway', 'type'];  // probably a line..
89022           var presets = reject(all.collection, 'suggestion');
89023
89024           // whitelist
89025           presets.forEach(function(d) {
89026               for (var key in d.tags) break;
89027               if (!key) return;
89028               if (ignore.indexOf(key) !== -1) return;
89029
89030               if (d.geometry.indexOf('area') !== -1) {    // probably an area..
89031                   areaKeys[key] = areaKeys[key] || {};
89032               }
89033           });
89034
89035           // blacklist
89036           presets.forEach(function(d) {
89037               for (var key in d.tags) break;
89038               if (!key) return;
89039               if (ignore.indexOf(key) !== -1) return;
89040
89041               var value = d.tags[key];
89042               if (key in areaKeys &&                      // probably an area...
89043                   d.geometry.indexOf('line') !== -1 &&    // but sometimes a line
89044                   value !== '*') {
89045                   areaKeys[key][value] = true;
89046               }
89047           });
89048
89049           return areaKeys;
89050       };
89051
89052       all.build = function(d, visible) {
89053           if (d.fields) {
89054               forEach(d.fields, function(d, id) {
89055                   _fields[id] = presetField(id, d);
89056                   if (d.universal) {
89057                       _universal.push(_fields[id]);
89058                   }
89059               });
89060           }
89061
89062           if (d.presets) {
89063               var rawPresets = d.presets;
89064               forEach(d.presets, function(d, id) {
89065                   var existing = all.index(id);
89066                   if (existing !== -1) {
89067                       all.collection[existing] = presetPreset(id, d, _fields, visible, rawPresets);
89068                   } else {
89069                       all.collection.push(presetPreset(id, d, _fields, visible, rawPresets));
89070                   }
89071               });
89072           }
89073
89074           if (d.categories) {
89075               forEach(d.categories, function(d, id) {
89076                   var existing = all.index(id);
89077                   if (existing !== -1) {
89078                       all.collection[existing] = presetCategory(id, d, all);
89079                   } else {
89080                       all.collection.push(presetCategory(id, d, all));
89081                   }
89082               });
89083           }
89084
89085           if (d.defaults) {
89086               var getItem = bind$2(all.item, all);
89087               _defaults = {
89088                   area: presetCollection(d.defaults.area.map(getItem)),
89089                   line: presetCollection(d.defaults.line.map(getItem)),
89090                   point: presetCollection(d.defaults.point.map(getItem)),
89091                   vertex: presetCollection(d.defaults.vertex.map(getItem)),
89092                   relation: presetCollection(d.defaults.relation.map(getItem))
89093               };
89094           }
89095
89096           for (var i = 0; i < all.collection.length; i++) {
89097               var preset = all.collection[i];
89098               var geometry = preset.geometry;
89099
89100               for (var j = 0; j < geometry.length; j++) {
89101                   var g = _index[geometry[j]];
89102                   for (var k in preset.tags) {
89103                       (g[k] = g[k] || []).push(preset);
89104                   }
89105               }
89106           }
89107           return all;
89108       };
89109
89110       all.init = function() {
89111           all.collection = [];
89112           _recent.collection = [];
89113           _fields = {};
89114           _universal = [];
89115           _index = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
89116
89117           return all.build(data.presets, true);
89118       };
89119
89120
89121       all.reset = function() {
89122           all.collection = [];
89123           _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
89124           _fields = {};
89125           _universal = [];
89126           _recent = presetCollection([]);
89127
89128           // Index of presets by (geometry, tag key).
89129           _index = {
89130               point: {},
89131               vertex: {},
89132               line: {},
89133               area: {},
89134               relation: {}
89135           };
89136
89137           return all;
89138       };
89139
89140       all.fromExternal = function(external, done) {
89141           all.reset();
89142           d3_json(external, function(err, externalPresets) {
89143               if (err) {
89144                   all.init();
89145               } else {
89146                   all.build(data.presets, false); // make default presets hidden to begin
89147                   all.build(externalPresets, true); // make the external visible
89148               }
89149               done(all);
89150           });
89151       };
89152
89153       all.field = function(id) {
89154           return _fields[id];
89155       };
89156
89157       all.universal = function() {
89158           return _universal;
89159       };
89160
89161       all.defaults = function(geometry, n) {
89162           var rec = _recent.matchGeometry(geometry).collection.slice(0, 4);
89163           var def = uniq(rec.concat(_defaults[geometry].collection)).slice(0, n - 1);
89164           return presetCollection(uniq(rec.concat(def).concat(all.item(geometry))));
89165       };
89166
89167       all.choose = function(preset) {
89168           if (preset.searchable !== false) {
89169               _recent = presetCollection(uniq([preset].concat(_recent.collection)));
89170           }
89171           return all;
89172       };
89173
89174       return all;
89175   }
89176
89177   var areaKeys = {};
89178
89179   function setAreaKeys(value) {
89180       areaKeys = value;
89181   }
89182
89183
89184   function coreContext() {
89185       var context = {};
89186       context.version = '2.13.0';
89187
89188       // create a special translation that contains the keys in place of the strings
89189       var tkeys = cloneDeep(en);
89190       var parents = [];
89191
89192       function traverser(v, k, obj) {
89193           parents.push(k);
89194           if (isObject(v)) {
89195               forOwn(v, traverser);
89196           } else if (isString(v)) {
89197               obj[k] = parents.join('.');
89198           }
89199           parents.pop();
89200       }
89201
89202       forOwn(tkeys, traverser);
89203       addTranslation('_tkeys_', tkeys);
89204
89205       addTranslation('en', en);
89206       setLocale('en');
89207
89208       var dispatch$$1 = dispatch('enter', 'exit', 'change');
89209
89210       // https://github.com/openstreetmap/iD/issues/772
89211       // http://mathiasbynens.be/notes/localstorage-pattern#comment-9
89212       var storage;
89213       try { storage = localStorage; } catch (e) {}  // eslint-disable-line no-empty
89214       storage = storage || (function() {
89215           var s = {};
89216           return {
89217               getItem: function(k) { return s[k]; },
89218               setItem: function(k, v) { s[k] = v; },
89219               removeItem: function(k) { delete s[k]; }
89220           };
89221       })();
89222
89223       context.storage = function(k, v) {
89224           try {
89225               if (arguments.length === 1) return storage.getItem(k);
89226               else if (v === null) storage.removeItem(k);
89227               else storage.setItem(k, v);
89228           } catch (e) {
89229               // localstorage quota exceeded
89230               /* eslint-disable no-console */
89231               if (typeof console !== 'undefined') console.error('localStorage quota exceeded');
89232               /* eslint-enable no-console */
89233           }
89234       };
89235
89236
89237       /* User interface and keybinding */
89238       var ui;
89239       context.ui = function() { return ui; };
89240
89241       var keybinding = utilKeybinding('context');
89242       context.keybinding = function() { return keybinding; };
89243       select(document).call(keybinding);
89244
89245
89246       /* Straight accessors. Avoid using these if you can. */
89247       var connection, history;
89248       context.connection = function() { return connection; };
89249       context.history = function() { return history; };
89250
89251
89252       /* Connection */
89253       context.preauth = function(options) {
89254           if (connection) {
89255               connection.switch(options);
89256           }
89257           return context;
89258       };
89259
89260       context.loadTiles = utilCallWhenIdle(function(projection, callback) {
89261           var cid;
89262           function done(err, result) {
89263               if (connection.getConnectionId() !== cid) {
89264                   if (callback) callback({ message: 'Connection Switched', status: -1 });
89265                   return;
89266               }
89267               if (!err) history.merge(result.data, result.extent);
89268               if (callback) callback(err, result);
89269           }
89270           if (connection && context.editable()) {
89271               cid = connection.getConnectionId();
89272               connection.loadTiles(projection, done);
89273           }
89274       });
89275
89276       context.loadEntity = function(entityID, callback) {
89277           var cid;
89278           function done(err, result) {
89279               if (connection.getConnectionId() !== cid) {
89280                   if (callback) callback({ message: 'Connection Switched', status: -1 });
89281                   return;
89282               }
89283               if (!err) history.merge(result.data, result.extent);
89284               if (callback) callback(err, result);
89285           }
89286           if (connection) {
89287               cid = connection.getConnectionId();
89288               connection.loadEntity(entityID, done);
89289           }
89290       };
89291
89292       context.zoomToEntity = function(entityID, zoomTo) {
89293           if (zoomTo !== false) {
89294               this.loadEntity(entityID, function(err, result) {
89295                   if (err) return;
89296                   var entity = find$1(result.data, function(e) { return e.id === entityID; });
89297                   if (entity) {
89298                       map.zoomTo(entity);
89299                   }
89300               });
89301           }
89302
89303           map.on('drawn.zoomToEntity', function() {
89304               if (!context.hasEntity(entityID)) return;
89305               map.on('drawn.zoomToEntity', null);
89306               context.on('enter.zoomToEntity', null);
89307               context.enter(modeSelect(context, [entityID]));
89308           });
89309
89310           context.on('enter.zoomToEntity', function() {
89311               if (mode.id !== 'browse') {
89312                   map.on('drawn.zoomToEntity', null);
89313                   context.on('enter.zoomToEntity', null);
89314               }
89315           });
89316       };
89317
89318       var minEditableZoom = 16;
89319       context.minEditableZoom = function(_) {
89320           if (!arguments.length) return minEditableZoom;
89321           minEditableZoom = _;
89322           if (connection) {
89323               connection.tileZoom(_);
89324           }
89325           return context;
89326       };
89327
89328
89329       /* History */
89330       var inIntro = false;
89331       context.inIntro = function(_) {
89332           if (!arguments.length) return inIntro;
89333           inIntro = _;
89334           return context;
89335       };
89336
89337       context.save = function() {
89338           // no history save, no message onbeforeunload
89339           if (inIntro || select('.modal').size()) return;
89340
89341           var canSave;
89342           if (mode && mode.id === 'save') {
89343               canSave = false;
89344
89345               // Attempt to prevent user from creating duplicate changes - see #5200
89346               if (services.osm && services.osm.isChangesetInflight()) {
89347                   history.clearSaved();
89348                   return;
89349               }
89350
89351           } else {
89352               canSave = context.selectedIDs().every(function(id) {
89353                   var entity = context.hasEntity(id);
89354                   return entity && !entity.isDegenerate();
89355               });
89356           }
89357
89358           if (canSave) {
89359               history.save();
89360           }
89361           if (history.hasChanges()) {
89362               return t('save.unsaved_changes');
89363           }
89364       };
89365
89366
89367       /* Graph */
89368       context.hasEntity = function(id) {
89369           return history.graph().hasEntity(id);
89370       };
89371       context.entity = function(id) {
89372           return history.graph().entity(id);
89373       };
89374       context.childNodes = function(way) {
89375           return history.graph().childNodes(way);
89376       };
89377       context.geometry = function(id) {
89378           return context.entity(id).geometry(history.graph());
89379       };
89380
89381
89382       /* Modes */
89383       var mode;
89384       context.mode = function() {
89385           return mode;
89386       };
89387       context.enter = function(newMode) {
89388           if (mode) {
89389               mode.exit();
89390               dispatch$$1.call('exit', this, mode);
89391           }
89392
89393           mode = newMode;
89394           mode.enter();
89395           dispatch$$1.call('enter', this, mode);
89396       };
89397
89398       context.selectedIDs = function() {
89399           if (mode && mode.selectedIDs) {
89400               return mode.selectedIDs();
89401           } else {
89402               return [];
89403           }
89404       };
89405
89406       context.activeID = function() {
89407           return mode && mode.activeID && mode.activeID();
89408       };
89409
89410       var _selectedNoteID;
89411       context.selectedNoteID = function(noteID) {
89412           if (!arguments.length) return _selectedNoteID;
89413           _selectedNoteID = noteID;
89414           return context;
89415       };
89416
89417       var _selectedErrorID;
89418       context.selectedErrorID = function(errorID) {
89419           if (!arguments.length) return _selectedErrorID;
89420           _selectedErrorID = errorID;
89421           return context;
89422       };
89423
89424
89425       /* Behaviors */
89426       context.install = function(behavior) {
89427           context.surface().call(behavior);
89428       };
89429       context.uninstall = function(behavior) {
89430           context.surface().call(behavior.off);
89431       };
89432
89433
89434       /* Copy/Paste */
89435       var copyIDs = [], copyGraph;
89436       context.copyGraph = function() { return copyGraph; };
89437       context.copyIDs = function(_) {
89438           if (!arguments.length) return copyIDs;
89439           copyIDs = _;
89440           copyGraph = history.graph();
89441           return context;
89442       };
89443
89444
89445       /* Background */
89446       var background;
89447       context.background = function() { return background; };
89448
89449
89450       /* Features */
89451       var features;
89452       context.features = function() { return features; };
89453       context.hasHiddenConnections = function(id) {
89454           var graph = history.graph(),
89455               entity = graph.entity(id);
89456           return features.hasHiddenConnections(entity, graph);
89457       };
89458
89459
89460       /* Presets */
89461       var presets;
89462       context.presets = function() { return presets; };
89463
89464
89465       /* Map */
89466       var map;
89467       context.map = function() { return map; };
89468       context.layers = function() { return map.layers; };
89469       context.surface = function() { return map.surface; };
89470       context.editable = function() { return map.editable(); };
89471       context.surfaceRect = function() {
89472           return map.surface.node().getBoundingClientRect();
89473       };
89474
89475
89476       /* Debug */
89477       var debugFlags = {
89478           tile: false,        // tile boundaries
89479           collision: false,   // label collision bounding boxes
89480           imagery: false,     // imagery bounding polygons
89481           community: false,   // community bounding polygons
89482           imperial: false,    // imperial (not metric) bounding polygons
89483           driveLeft: false,   // driveLeft bounding polygons
89484           target: false       // touch targets
89485       };
89486       context.debugFlags = function() {
89487           return debugFlags;
89488       };
89489       context.setDebug = function(flag, val) {
89490           if (arguments.length === 1) val = true;
89491           debugFlags[flag] = val;
89492           dispatch$$1.call('change');
89493           return context;
89494       };
89495       context.getDebug = function(flag) {
89496           return flag && debugFlags[flag];
89497       };
89498
89499
89500       /* Container */
89501       var container = select(document.body);
89502       context.container = function(_) {
89503           if (!arguments.length) return container;
89504           container = _;
89505           container.classed('id-container', true);
89506           return context;
89507       };
89508       var embed;
89509       context.embed = function(_) {
89510           if (!arguments.length) return embed;
89511           embed = _;
89512           return context;
89513       };
89514
89515
89516       /* Assets */
89517       var assetPath = '';
89518       context.assetPath = function(_) {
89519           if (!arguments.length) return assetPath;
89520           assetPath = _;
89521           return context;
89522       };
89523
89524       var assetMap = {};
89525       context.assetMap = function(_) {
89526           if (!arguments.length) return assetMap;
89527           assetMap = _;
89528           return context;
89529       };
89530
89531       context.asset = function(_) {
89532           var filename = assetPath + _;
89533           return assetMap[filename] || filename;
89534       };
89535
89536       context.imagePath = function(_) {
89537           return context.asset('img/' + _);
89538       };
89539
89540
89541       /* locales */
89542       // `locale` variable contains a "requested locale".
89543       // It won't become the `currentLocale` until after loadLocale() is called.
89544       var locale, localePath;
89545
89546       context.locale = function(loc, path) {
89547           if (!arguments.length) return currentLocale;
89548           locale = loc;
89549           localePath = path;
89550           return context;
89551       };
89552
89553       context.loadLocale = function(callback) {
89554           if (locale && locale !== 'en' && dataLocales.hasOwnProperty(locale)) {
89555               localePath = localePath || context.asset('locales/' + locale + '.json');
89556               d3_json(localePath, function(err, result) {
89557                   if (!err) {
89558                       addTranslation(locale, result[locale]);
89559                       setLocale(locale);
89560                       utilDetect(true);
89561                   }
89562                   if (callback) {
89563                       callback(err);
89564                   }
89565               });
89566           } else {
89567               if (locale) {
89568                   setLocale(locale);
89569                   utilDetect(true);
89570               }
89571               if (callback) {
89572                   callback();
89573               }
89574           }
89575       };
89576
89577
89578       /* reset (aka flush) */
89579       context.reset = context.flush = function() {
89580           context.debouncedSave.cancel();
89581           forEach(services, function(service) {
89582               if (service && typeof service.reset === 'function') {
89583                   service.reset(context);
89584               }
89585           });
89586           features.reset();
89587           history.reset();
89588           return context;
89589       };
89590
89591
89592       /* Init */
89593
89594       context.projection = geoRawMercator();
89595       context.curtainProjection = geoRawMercator();
89596
89597       locale = utilDetect().locale;
89598       if (locale && !dataLocales.hasOwnProperty(locale)) {
89599           locale = locale.split('-')[0];
89600       }
89601
89602       history = coreHistory(context);
89603       context.graph = history.graph;
89604       context.changes = history.changes;
89605       context.intersects = history.intersects;
89606
89607       // Debounce save, since it's a synchronous localStorage write,
89608       // and history changes can happen frequently (e.g. when dragging).
89609       context.debouncedSave = debounce(context.save, 350);
89610       function withDebouncedSave(fn) {
89611           return function() {
89612               var result = fn.apply(history, arguments);
89613               context.debouncedSave();
89614               return result;
89615           };
89616       }
89617
89618       context.perform = withDebouncedSave(history.perform);
89619       context.replace = withDebouncedSave(history.replace);
89620       context.pop = withDebouncedSave(history.pop);
89621       context.overwrite = withDebouncedSave(history.overwrite);
89622       context.undo = withDebouncedSave(history.undo);
89623       context.redo = withDebouncedSave(history.redo);
89624
89625       ui = uiInit(context);
89626
89627       connection = services.osm;
89628       background = rendererBackground(context);
89629       features = rendererFeatures(context);
89630       presets = presetIndex();
89631
89632       if (services.maprules && utilStringQs(window.location.hash).maprules) {
89633           var maprules = utilStringQs(window.location.hash).maprules;
89634           d3_json(maprules, function (err, mapcss) {
89635               if (err) return;
89636               services.maprules.init(context.presets().areaKeys());
89637               forEach(mapcss, function(mapcssSelector) {
89638                   return services.maprules.addRule(mapcssSelector);
89639               });
89640           });
89641       }
89642
89643       map = rendererMap(context);
89644       context.mouse = map.mouse;
89645       context.extent = map.extent;
89646       context.pan = map.pan;
89647       context.zoomIn = map.zoomIn;
89648       context.zoomOut = map.zoomOut;
89649       context.zoomInFurther = map.zoomInFurther;
89650       context.zoomOutFurther = map.zoomOutFurther;
89651       context.redrawEnable = map.redrawEnable;
89652
89653       forEach(services, function(service) {
89654           if (service && typeof service.init === 'function') {
89655               service.init(context);
89656           }
89657       });
89658
89659       background.init();
89660       features.init();
89661       if (utilStringQs(window.location.hash).presets) {
89662           var external = utilStringQs(window.location.hash).presets;
89663           presets.fromExternal(external, function(externalPresets) {
89664               context.presets = function() { return externalPresets; }; // default + external presets...
89665               areaKeys = presets.areaKeys();
89666           });
89667       } else {
89668           presets.init();
89669           areaKeys = presets.areaKeys();
89670       }
89671
89672       return utilRebind(context, dispatch$$1, 'on');
89673   }
89674
89675   function osmWay() {
89676       if (!(this instanceof osmWay)) {
89677           return (new osmWay()).initialize(arguments);
89678       } else if (arguments.length) {
89679           this.initialize(arguments);
89680       }
89681   }
89682
89683
89684   osmEntity$$1.way = osmWay;
89685
89686   osmWay.prototype = Object.create(osmEntity$$1.prototype);
89687
89688
89689   assignIn(osmWay.prototype, {
89690       type: 'way',
89691       nodes: [],
89692
89693
89694       copy: function(resolver, copies) {
89695           if (copies[this.id]) return copies[this.id];
89696
89697           var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
89698
89699           var nodes = this.nodes.map(function(id) {
89700               return resolver.entity(id).copy(resolver, copies).id;
89701           });
89702
89703           copy = copy.update({ nodes: nodes });
89704           copies[this.id] = copy;
89705
89706           return copy;
89707       },
89708
89709
89710       extent: function(resolver) {
89711           return resolver.transient(this, 'extent', function() {
89712               var extent = geoExtent$$1();
89713               for (var i = 0; i < this.nodes.length; i++) {
89714                   var node = resolver.hasEntity(this.nodes[i]);
89715                   if (node) {
89716                       extent._extend(node.extent());
89717                   }
89718               }
89719               return extent;
89720           });
89721       },
89722
89723
89724       first: function() {
89725           return this.nodes[0];
89726       },
89727
89728
89729       last: function() {
89730           return this.nodes[this.nodes.length - 1];
89731       },
89732
89733
89734       contains: function(node) {
89735           return this.nodes.indexOf(node) >= 0;
89736       },
89737
89738
89739       affix: function(node) {
89740           if (this.nodes[0] === node) return 'prefix';
89741           if (this.nodes[this.nodes.length - 1] === node) return 'suffix';
89742       },
89743
89744
89745       layer: function() {
89746           // explicit layer tag, clamp between -10, 10..
89747           if (isFinite(this.tags.layer)) {
89748               return Math.max(-10, Math.min(+(this.tags.layer), 10));
89749           }
89750
89751           // implied layer tag..
89752           if (this.tags.covered === 'yes') return -1;
89753           if (this.tags.location === 'overground') return 1;
89754           if (this.tags.location === 'underground') return -1;
89755           if (this.tags.location === 'underwater') return -10;
89756
89757           if (this.tags.power === 'line') return 10;
89758           if (this.tags.power === 'minor_line') return 10;
89759           if (this.tags.aerialway) return 10;
89760           if (this.tags.bridge) return 1;
89761           if (this.tags.cutting) return -1;
89762           if (this.tags.tunnel) return -1;
89763           if (this.tags.waterway) return -1;
89764           if (this.tags.man_made === 'pipeline') return -10;
89765           if (this.tags.boundary) return -10;
89766           return 0;
89767       },
89768
89769
89770       isOneWay: function() {
89771           // explicit oneway tag..
89772           var values = {
89773               'yes': true,
89774               '1': true,
89775               '-1': true,
89776               'reversible': true,
89777               'alternating': true,
89778               'no': false,
89779               '0': false
89780           };
89781           if (values[this.tags.oneway] !== undefined) {
89782               return values[this.tags.oneway];
89783           }
89784
89785           // implied oneway tag..
89786           for (var key in this.tags) {
89787               if (key in osmOneWayTags && (this.tags[key] in osmOneWayTags[key]))
89788                   return true;
89789           }
89790           return false;
89791       },
89792
89793       // Some identifier for tag that implies that this way is "sided",
89794       // i.e. the right side is the 'inside' (e.g. the right side of a
89795       // natural=cliff is lower).
89796       sidednessIdentifier: function() {
89797           for (var key in this.tags) {
89798               var value = this.tags[key];
89799               if (key in osmRightSideIsInsideTags && (value in osmRightSideIsInsideTags[key])) {
89800                   if (osmRightSideIsInsideTags[key][value] === true) {
89801                       return key;
89802                   } else {
89803                       // if the map's value is something other than a
89804                       // literal true, we should use it so we can
89805                       // special case some keys (e.g. natural=coastline
89806                       // is handled differently to other naturals).
89807                       return osmRightSideIsInsideTags[key][value];
89808                   }
89809               }
89810           }
89811
89812           return null;
89813       },
89814       isSided: function() {
89815           if (this.tags.two_sided === 'yes') {
89816               return false;
89817           }
89818
89819           return this.sidednessIdentifier() != null;
89820       },
89821
89822       lanes: function() {
89823           return osmLanes(this);
89824       },
89825
89826
89827       isClosed: function() {
89828           return this.nodes.length > 1 && this.first() === this.last();
89829       },
89830
89831
89832       isConvex: function(resolver) {
89833           if (!this.isClosed() || this.isDegenerate()) return null;
89834
89835           var nodes = uniq(resolver.childNodes(this));
89836           var coords = map$3(nodes, 'loc');
89837           var curr = 0;
89838           var prev = 0;
89839
89840           for (var i = 0; i < coords.length; i++) {
89841               var o = coords[(i+1) % coords.length];
89842               var a = coords[i];
89843               var b = coords[(i+2) % coords.length];
89844               var res = geoVecCross(a, b, o);
89845
89846               curr = (res > 0) ? 1 : (res < 0) ? -1 : 0;
89847               if (curr === 0) {
89848                   continue;
89849               } else if (prev && curr !== prev) {
89850                   return false;
89851               }
89852               prev = curr;
89853           }
89854           return true;
89855       },
89856
89857
89858       isArea: function() {
89859           // `highway` and `railway` are typically linear features, but there
89860           // are a few exceptions that should be treated as areas, even in the
89861           // absence of a proper `area=yes` or `areaKeys` tag.. see #4194
89862           var lineKeys = {
89863               highway: {
89864                   rest_area: true,
89865                   services: true
89866               },
89867               railway: {
89868                   roundhouse: true,
89869                   station: true,
89870                   traverser: true,
89871                   turntable: true,
89872                   wash: true
89873               }
89874           };
89875
89876           if (this.tags.area === 'yes')
89877               return true;
89878           if (!this.isClosed() || this.tags.area === 'no')
89879               return false;
89880           for (var key in this.tags) {
89881               if (key in areaKeys && !(this.tags[key] in areaKeys[key])) {
89882                   return true;
89883               }
89884               if (key in lineKeys && this.tags[key] in lineKeys[key]) {
89885                   return true;
89886               }
89887           }
89888           return false;
89889       },
89890
89891
89892       isDegenerate: function() {
89893           return uniq(this.nodes).length < (this.isArea() ? 3 : 2);
89894       },
89895
89896
89897       areAdjacent: function(n1, n2) {
89898           for (var i = 0; i < this.nodes.length; i++) {
89899               if (this.nodes[i] === n1) {
89900                   if (this.nodes[i - 1] === n2) return true;
89901                   if (this.nodes[i + 1] === n2) return true;
89902               }
89903           }
89904           return false;
89905       },
89906
89907
89908       geometry: function(graph) {
89909           return graph.transient(this, 'geometry', function() {
89910               return this.isArea() ? 'area' : 'line';
89911           });
89912       },
89913
89914
89915       // If this way is not closed, append the beginning node to the end of the nodelist to close it.
89916       close: function() {
89917           if (this.isClosed() || !this.nodes.length) return this;
89918
89919           var nodes = this.nodes.slice();
89920           nodes = nodes.filter(noRepeatNodes);
89921           nodes.push(nodes[0]);
89922           return this.update({ nodes: nodes });
89923       },
89924
89925
89926       // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
89927       unclose: function() {
89928           if (!this.isClosed()) return this;
89929
89930           var nodes = this.nodes.slice();
89931           var connector = this.first();
89932           var i = nodes.length - 1;
89933
89934           // remove trailing connectors..
89935           while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
89936               nodes.splice(i, 1);
89937               i = nodes.length - 1;
89938           }
89939
89940           nodes = nodes.filter(noRepeatNodes);
89941           return this.update({ nodes: nodes });
89942       },
89943
89944
89945       // Adds a node (id) in front of the node which is currently at position index.
89946       // If index is undefined, the node will be added to the end of the way for linear ways,
89947       //   or just before the final connecting node for circular ways.
89948       // Consecutive duplicates are eliminated including existing ones.
89949       // Circularity is always preserved when adding a node.
89950       addNode: function(id, index) {
89951           var nodes = this.nodes.slice();
89952           var isClosed = this.isClosed();
89953           var max = isClosed ? nodes.length - 1 : nodes.length;
89954
89955           if (index === undefined) {
89956               index = max;
89957           }
89958
89959           if (index < 0 || index > max) {
89960               throw new RangeError('index ' + index + ' out of range 0..' + max);
89961           }
89962
89963           // If this is a closed way, remove all connector nodes except the first one
89964           // (there may be duplicates) and adjust index if necessary..
89965           if (isClosed) {
89966               var connector = this.first();
89967
89968               // leading connectors..
89969               var i = 1;
89970               while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
89971                   nodes.splice(i, 1);
89972                   if (index > i) index--;
89973               }
89974
89975               // trailing connectors..
89976               i = nodes.length - 1;
89977               while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
89978                   nodes.splice(i, 1);
89979                   if (index > i) index--;
89980                   i = nodes.length - 1;
89981               }
89982           }
89983
89984           nodes.splice(index, 0, id);
89985           nodes = nodes.filter(noRepeatNodes);
89986
89987           // If the way was closed before, append a connector node to keep it closed..
89988           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
89989               nodes.push(nodes[0]);
89990           }
89991
89992           return this.update({ nodes: nodes });
89993       },
89994
89995
89996       // Replaces the node which is currently at position index with the given node (id).
89997       // Consecutive duplicates are eliminated including existing ones.
89998       // Circularity is preserved when updating a node.
89999       updateNode: function(id, index) {
90000           var nodes = this.nodes.slice();
90001           var isClosed = this.isClosed();
90002           var max = nodes.length - 1;
90003
90004           if (index === undefined || index < 0 || index > max) {
90005               throw new RangeError('index ' + index + ' out of range 0..' + max);
90006           }
90007
90008           // If this is a closed way, remove all connector nodes except the first one
90009           // (there may be duplicates) and adjust index if necessary..
90010           if (isClosed) {
90011               var connector = this.first();
90012
90013               // leading connectors..
90014               var i = 1;
90015               while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
90016                   nodes.splice(i, 1);
90017                   if (index > i) index--;
90018               }
90019
90020               // trailing connectors..
90021               i = nodes.length - 1;
90022               while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
90023                   nodes.splice(i, 1);
90024                   if (index === i) index = 0;  // update leading connector instead
90025                   i = nodes.length - 1;
90026               }
90027           }
90028
90029           nodes.splice(index, 1, id);
90030           nodes = nodes.filter(noRepeatNodes);
90031
90032           // If the way was closed before, append a connector node to keep it closed..
90033           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
90034               nodes.push(nodes[0]);
90035           }
90036
90037           return this.update({nodes: nodes});
90038       },
90039
90040
90041       // Replaces each occurrence of node id needle with replacement.
90042       // Consecutive duplicates are eliminated including existing ones.
90043       // Circularity is preserved.
90044       replaceNode: function(needleID, replacementID) {
90045           var nodes = this.nodes.slice();
90046           var isClosed = this.isClosed();
90047
90048           for (var i = 0; i < nodes.length; i++) {
90049               if (nodes[i] === needleID) {
90050                   nodes[i] = replacementID;
90051               }
90052           }
90053
90054           nodes = nodes.filter(noRepeatNodes);
90055
90056           // If the way was closed before, append a connector node to keep it closed..
90057           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
90058               nodes.push(nodes[0]);
90059           }
90060
90061           return this.update({nodes: nodes});
90062       },
90063
90064
90065       // Removes each occurrence of node id.
90066       // Consecutive duplicates are eliminated including existing ones.
90067       // Circularity is preserved.
90068       removeNode: function(id) {
90069           var nodes = this.nodes.slice();
90070           var isClosed = this.isClosed();
90071
90072           nodes = nodes
90073               .filter(function(node) { return node !== id; })
90074               .filter(noRepeatNodes);
90075
90076           // If the way was closed before, append a connector node to keep it closed..
90077           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
90078               nodes.push(nodes[0]);
90079           }
90080
90081           return this.update({nodes: nodes});
90082       },
90083
90084
90085       asJXON: function(changeset_id) {
90086           var r = {
90087               way: {
90088                   '@id': this.osmId(),
90089                   '@version': this.version || 0,
90090                   nd: map$3(this.nodes, function(id) {
90091                       return { keyAttributes: { ref: osmEntity$$1.id.toOSM(id) } };
90092                   }),
90093                   tag: map$3(this.tags, function(v, k) {
90094                       return { keyAttributes: { k: k, v: v } };
90095                   })
90096               }
90097           };
90098           if (changeset_id) {
90099               r.way['@changeset'] = changeset_id;
90100           }
90101           return r;
90102       },
90103
90104
90105       asGeoJSON: function(resolver) {
90106           return resolver.transient(this, 'GeoJSON', function() {
90107               var coordinates = map$3(resolver.childNodes(this), 'loc');
90108               if (this.isArea() && this.isClosed()) {
90109                   return {
90110                       type: 'Polygon',
90111                       coordinates: [coordinates]
90112                   };
90113               } else {
90114                   return {
90115                       type: 'LineString',
90116                       coordinates: coordinates
90117                   };
90118               }
90119           });
90120       },
90121
90122
90123       area: function(resolver) {
90124           return resolver.transient(this, 'area', function() {
90125               var nodes = resolver.childNodes(this);
90126
90127               var json = {
90128                   type: 'Polygon',
90129                   coordinates: [map$3(nodes, 'loc')]
90130               };
90131
90132               if (!this.isClosed() && nodes.length) {
90133                   json.coordinates[0].push(nodes[0].loc);
90134               }
90135
90136               var area = d3_geoArea(json);
90137
90138               // Heuristic for detecting counterclockwise winding order. Assumes
90139               // that OpenStreetMap polygons are not hemisphere-spanning.
90140               if (area > 2 * Math.PI) {
90141                   json.coordinates[0] = json.coordinates[0].reverse();
90142                   area = d3_geoArea(json);
90143               }
90144
90145               return isNaN(area) ? 0 : area;
90146           });
90147       }
90148   });
90149
90150
90151   // Filter function to eliminate consecutive duplicates.
90152   function noRepeatNodes(node, i, arr) {
90153       return i === 0 || node !== arr[i - 1];
90154   }
90155
90156   // For fixing up rendering of multipolygons with tags on the outer member.
90157   // https://github.com/openstreetmap/iD/issues/613
90158   function osmIsSimpleMultipolygonOuterMember(entity, graph) {
90159       if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0)
90160           return false;
90161
90162       var parents = graph.parentRelations(entity);
90163       if (parents.length !== 1)
90164           return false;
90165
90166       var parent = parents[0];
90167       if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
90168           return false;
90169
90170       var members = parent.members, member;
90171       for (var i = 0; i < members.length; i++) {
90172           member = members[i];
90173           if (member.id === entity.id && member.role && member.role !== 'outer')
90174               return false; // Not outer member
90175           if (member.id !== entity.id && (!member.role || member.role === 'outer'))
90176               return false; // Not a simple multipolygon
90177       }
90178
90179       return parent;
90180   }
90181
90182
90183   function osmSimpleMultipolygonOuterMember(entity, graph) {
90184       if (entity.type !== 'way')
90185           return false;
90186
90187       var parents = graph.parentRelations(entity);
90188       if (parents.length !== 1)
90189           return false;
90190
90191       var parent = parents[0];
90192       if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
90193           return false;
90194
90195       var members = parent.members, member, outerMember;
90196       for (var i = 0; i < members.length; i++) {
90197           member = members[i];
90198           if (!member.role || member.role === 'outer') {
90199               if (outerMember)
90200                   return false; // Not a simple multipolygon
90201               outerMember = member;
90202           }
90203       }
90204
90205       if (!outerMember)
90206           return false;
90207
90208       var outerEntity = graph.hasEntity(outerMember.id);
90209       if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length)
90210           return false;
90211
90212       return outerEntity;
90213   }
90214
90215
90216   // Join `toJoin` array into sequences of connecting ways.
90217
90218   // Segments which share identical start/end nodes will, as much as possible,
90219   // be connected with each other.
90220   //
90221   // The return value is a nested array. Each constituent array contains elements
90222   // of `toJoin` which have been determined to connect.
90223   //
90224   // Each consitituent array also has a `nodes` property whose value is an
90225   // ordered array of member nodes, with appropriate order reversal and
90226   // start/end coordinate de-duplication.
90227   //
90228   // Members of `toJoin` must have, at minimum, `type` and `id` properties.
90229   // Thus either an array of `osmWay`s or a relation member array may be used.
90230   //
90231   // If an member is an `osmWay`, its tags and childnodes may be reversed via
90232   // `actionReverse` in the output.
90233   //
90234   // The returned sequences array also has an `actions` array property, containing
90235   // any reversal actions that should be applied to the graph, should the calling
90236   // code attempt to actually join the given ways.
90237   //
90238   // Incomplete members (those for which `graph.hasEntity(element.id)` returns
90239   // false) and non-way members are ignored.
90240   //
90241   function osmJoinWays(toJoin, graph) {
90242       function resolve(member) {
90243           return graph.childNodes(graph.entity(member.id));
90244       }
90245
90246       function reverse(item) {
90247           var action = actionReverse(item.id, { reverseOneway: true });
90248           sequences.actions.push(action);
90249           return (item instanceof osmWay) ? action(graph).entity(item.id) : item;
90250       }
90251
90252       // make a copy containing only the items to join
90253       toJoin = toJoin.filter(function(member) {
90254           return member.type === 'way' && graph.hasEntity(member.id);
90255       });
90256
90257       // Are the things we are joining relation members or `osmWays`?
90258       // If `osmWays`, skip the "prefer a forward path" code below (see #4872)
90259       var i;
90260       var joinAsMembers = true;
90261       for (i = 0; i < toJoin.length; i++) {
90262           if (toJoin[i] instanceof osmWay) {
90263               joinAsMembers = false;
90264               break;
90265           }
90266       }
90267
90268       var sequences = [];
90269       sequences.actions = [];
90270
90271       while (toJoin.length) {
90272           // start a new sequence
90273           var item = toJoin.shift();
90274           var currWays = [item];
90275           var currNodes = resolve(item).slice();
90276           var doneSequence = false;
90277
90278           // add to it
90279           while (toJoin.length && !doneSequence) {
90280               var start = currNodes[0];
90281               var end = currNodes[currNodes.length - 1];
90282               var fn = null;
90283               var nodes = null;
90284
90285               // Find the next way/member to join.
90286               for (i = 0; i < toJoin.length; i++) {
90287                   item = toJoin[i];
90288                   nodes = resolve(item);
90289
90290                   // (for member ordering only, not way ordering - see #4872)
90291                   // Strongly prefer to generate a forward path that preserves the order
90292                   // of the members array. For multipolygons and most relations, member
90293                   // order does not matter - but for routes, it does. (see #4589)
90294                   // If we started this sequence backwards (i.e. next member way attaches to
90295                   // the start node and not the end node), reverse the initial way before continuing.
90296                   if (joinAsMembers && currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end &&
90297                       (nodes[nodes.length - 1] === start || nodes[0] === start)
90298                   ) {
90299                       currWays[0] = reverse(currWays[0]);
90300                       currNodes.reverse();
90301                       start = currNodes[0];
90302                       end = currNodes[currNodes.length - 1];
90303                   }
90304
90305                   if (nodes[0] === end) {
90306                       fn = currNodes.push;               // join to end
90307                       nodes = nodes.slice(1);
90308                       break;
90309                   } else if (nodes[nodes.length - 1] === end) {
90310                       fn = currNodes.push;               // join to end
90311                       nodes = nodes.slice(0, -1).reverse();
90312                       item = reverse(item);
90313                       break;
90314                   } else if (nodes[nodes.length - 1] === start) {
90315                       fn = currNodes.unshift;            // join to beginning
90316                       nodes = nodes.slice(0, -1);
90317                       break;
90318                   } else if (nodes[0] === start) {
90319                       fn = currNodes.unshift;            // join to beginning
90320                       nodes = nodes.slice(1).reverse();
90321                       item = reverse(item);
90322                       break;
90323                   } else {
90324                       fn = nodes = null;
90325                   }
90326               }
90327
90328               if (!nodes) {     // couldn't find a joinable way/member
90329                   doneSequence = true;
90330                   break;
90331               }
90332
90333               fn.apply(currWays, [item]);
90334               fn.apply(currNodes, nodes);
90335
90336               toJoin.splice(i, 1);
90337           }
90338
90339           currWays.nodes = currNodes;
90340           sequences.push(currWays);
90341       }
90342
90343       return sequences;
90344   }
90345
90346   function osmRelation() {
90347       if (!(this instanceof osmRelation)) {
90348           return (new osmRelation()).initialize(arguments);
90349       } else if (arguments.length) {
90350           this.initialize(arguments);
90351       }
90352   }
90353
90354
90355   osmEntity$$1.relation = osmRelation;
90356
90357   osmRelation.prototype = Object.create(osmEntity$$1.prototype);
90358
90359
90360   osmRelation.creationOrder = function(a, b) {
90361       var aId = parseInt(osmEntity$$1.id.toOSM(a.id), 10);
90362       var bId = parseInt(osmEntity$$1.id.toOSM(b.id), 10);
90363
90364       if (aId < 0 || bId < 0) return aId - bId;
90365       return bId - aId;
90366   };
90367
90368
90369   assignIn(osmRelation.prototype, {
90370       type: 'relation',
90371       members: [],
90372
90373
90374       copy: function(resolver, copies) {
90375           if (copies[this.id]) return copies[this.id];
90376
90377           var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
90378
90379           var members = this.members.map(function(member) {
90380               return assignIn({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id });
90381           });
90382
90383           copy = copy.update({members: members});
90384           copies[this.id] = copy;
90385
90386           return copy;
90387       },
90388
90389
90390       extent: function(resolver, memo) {
90391           return resolver.transient(this, 'extent', function() {
90392               if (memo && memo[this.id]) return geoExtent$$1();
90393               memo = memo || {};
90394               memo[this.id] = true;
90395
90396               var extent = geoExtent$$1();
90397               for (var i = 0; i < this.members.length; i++) {
90398                   var member = resolver.hasEntity(this.members[i].id);
90399                   if (member) {
90400                       extent._extend(member.extent(resolver, memo));
90401                   }
90402               }
90403               return extent;
90404           });
90405       },
90406
90407
90408       geometry: function(graph) {
90409           return graph.transient(this, 'geometry', function() {
90410               return this.isMultipolygon() ? 'area' : 'relation';
90411           });
90412       },
90413
90414
90415       isDegenerate: function() {
90416           return this.members.length === 0;
90417       },
90418
90419
90420       // Return an array of members, each extended with an 'index' property whose value
90421       // is the member index.
90422       indexedMembers: function() {
90423           var result = new Array(this.members.length);
90424           for (var i = 0; i < this.members.length; i++) {
90425               result[i] = assignIn({}, this.members[i], {index: i});
90426           }
90427           return result;
90428       },
90429
90430
90431       // Return the first member with the given role. A copy of the member object
90432       // is returned, extended with an 'index' property whose value is the member index.
90433       memberByRole: function(role) {
90434           for (var i = 0; i < this.members.length; i++) {
90435               if (this.members[i].role === role) {
90436                   return assignIn({}, this.members[i], {index: i});
90437               }
90438           }
90439       },
90440
90441       // Same as memberByRole, but returns all members with the given role
90442       membersByRole: function(role) {
90443           var result = [];
90444           for (var i = 0; i < this.members.length; i++) {
90445               if (this.members[i].role === role) {
90446                   result.push(assignIn({}, this.members[i], {index: i}));
90447               }
90448           }
90449           return result;
90450       },
90451
90452       // Return the first member with the given id. A copy of the member object
90453       // is returned, extended with an 'index' property whose value is the member index.
90454       memberById: function(id) {
90455           for (var i = 0; i < this.members.length; i++) {
90456               if (this.members[i].id === id) {
90457                   return assignIn({}, this.members[i], {index: i});
90458               }
90459           }
90460       },
90461
90462
90463       // Return the first member with the given id and role. A copy of the member object
90464       // is returned, extended with an 'index' property whose value is the member index.
90465       memberByIdAndRole: function(id, role) {
90466           for (var i = 0; i < this.members.length; i++) {
90467               if (this.members[i].id === id && this.members[i].role === role) {
90468                   return assignIn({}, this.members[i], {index: i});
90469               }
90470           }
90471       },
90472
90473
90474       addMember: function(member, index) {
90475           var members = this.members.slice();
90476           members.splice(index === undefined ? members.length : index, 0, member);
90477           return this.update({members: members});
90478       },
90479
90480
90481       updateMember: function(member, index) {
90482           var members = this.members.slice();
90483           members.splice(index, 1, assignIn({}, members[index], member));
90484           return this.update({members: members});
90485       },
90486
90487
90488       removeMember: function(index) {
90489           var members = this.members.slice();
90490           members.splice(index, 1);
90491           return this.update({members: members});
90492       },
90493
90494
90495       removeMembersWithID: function(id) {
90496           var members = reject(this.members, function(m) { return m.id === id; });
90497           return this.update({members: members});
90498       },
90499
90500
90501       // Wherever a member appears with id `needle.id`, replace it with a member
90502       // with id `replacement.id`, type `replacement.type`, and the original role,
90503       // By default, adding a duplicate member (by id and role) is prevented.
90504       // Return an updated relation.
90505       replaceMember: function(needle, replacement, keepDuplicates) {
90506           if (!this.memberById(needle.id))
90507               return this;
90508
90509           var members = [];
90510
90511           for (var i = 0; i < this.members.length; i++) {
90512               var member = this.members[i];
90513               if (member.id !== needle.id) {
90514                   members.push(member);
90515               } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) {
90516                   members.push({id: replacement.id, type: replacement.type, role: member.role});
90517               }
90518           }
90519
90520           return this.update({members: members});
90521       },
90522
90523
90524       asJXON: function(changeset_id) {
90525           var r = {
90526               relation: {
90527                   '@id': this.osmId(),
90528                   '@version': this.version || 0,
90529                   member: map$3(this.members, function(member) {
90530                       return {
90531                           keyAttributes: {
90532                               type: member.type,
90533                               role: member.role,
90534                               ref: osmEntity$$1.id.toOSM(member.id)
90535                           }
90536                       };
90537                   }),
90538                   tag: map$3(this.tags, function(v, k) {
90539                       return { keyAttributes: { k: k, v: v } };
90540                   })
90541               }
90542           };
90543           if (changeset_id) r.relation['@changeset'] = changeset_id;
90544           return r;
90545       },
90546
90547
90548       asGeoJSON: function(resolver) {
90549           return resolver.transient(this, 'GeoJSON', function () {
90550               if (this.isMultipolygon()) {
90551                   return {
90552                       type: 'MultiPolygon',
90553                       coordinates: this.multipolygon(resolver)
90554                   };
90555               } else {
90556                   return {
90557                       type: 'FeatureCollection',
90558                       properties: this.tags,
90559                       features: this.members.map(function (member) {
90560                           return assignIn({role: member.role}, resolver.entity(member.id).asGeoJSON(resolver));
90561                       })
90562                   };
90563               }
90564           });
90565       },
90566
90567
90568       area: function(resolver) {
90569           return resolver.transient(this, 'area', function() {
90570               return d3_geoArea(this.asGeoJSON(resolver));
90571           });
90572       },
90573
90574
90575       isMultipolygon: function() {
90576           return this.tags.type === 'multipolygon';
90577       },
90578
90579
90580       isComplete: function(resolver) {
90581           for (var i = 0; i < this.members.length; i++) {
90582               if (!resolver.hasEntity(this.members[i].id)) {
90583                   return false;
90584               }
90585           }
90586           return true;
90587       },
90588
90589
90590       isRestriction: function() {
90591           return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
90592       },
90593
90594
90595       isValidRestriction: function() {
90596           if (!this.isRestriction()) return false;
90597
90598           var froms = this.members.filter(function(m) { return m.role === 'from'; });
90599           var vias = this.members.filter(function(m) { return m.role === 'via'; });
90600           var tos = this.members.filter(function(m) { return m.role === 'to'; });
90601
90602           if (froms.length !== 1 && this.tags.restriction !== 'no_entry') return false;
90603           if (froms.some(function(m) { return m.type !== 'way'; })) return false;
90604
90605           if (tos.length !== 1 && this.tags.restriction !== 'no_exit') return false;
90606           if (tos.some(function(m) { return m.type !== 'way'; })) return false;
90607
90608           if (vias.length === 0) return false;
90609           if (vias.length > 1 && vias.some(function(m) { return m.type !== 'way'; })) return false;
90610
90611           return true;
90612       },
90613
90614
90615       // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
90616       // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
90617       //
90618       // This corresponds to the structure needed for rendering a multipolygon path using a
90619       // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
90620       //
90621       // In the case of invalid geometries, this function will still return a result which
90622       // includes the nodes of all way members, but some Nds may be unclosed and some inner
90623       // rings not matched with the intended outer ring.
90624       //
90625       multipolygon: function(resolver) {
90626           var outers = this.members.filter(function(m) { return 'outer' === (m.role || 'outer'); });
90627           var inners = this.members.filter(function(m) { return 'inner' === m.role; });
90628
90629           outers = osmJoinWays(outers, resolver);
90630           inners = osmJoinWays(inners, resolver);
90631
90632           outers = outers.map(function(outer) { return map$3(outer.nodes, 'loc'); });
90633           inners = inners.map(function(inner) { return map$3(inner.nodes, 'loc'); });
90634
90635           var result = outers.map(function(o) {
90636               // Heuristic for detecting counterclockwise winding order. Assumes
90637               // that OpenStreetMap polygons are not hemisphere-spanning.
90638               return [d3_geoArea({ type: 'Polygon', coordinates: [o] }) > 2 * Math.PI ? o.reverse() : o];
90639           });
90640
90641           function findOuter(inner) {
90642               var o, outer;
90643
90644               for (o = 0; o < outers.length; o++) {
90645                   outer = outers[o];
90646                   if (geoPolygonContainsPolygon(outer, inner))
90647                       return o;
90648               }
90649
90650               for (o = 0; o < outers.length; o++) {
90651                   outer = outers[o];
90652                   if (geoPolygonIntersectsPolygon(outer, inner, false))
90653                       return o;
90654               }
90655           }
90656
90657           for (var i = 0; i < inners.length; i++) {
90658               var inner = inners[i];
90659
90660               if (d3_geoArea({ type: 'Polygon', coordinates: [inner] }) < 2 * Math.PI) {
90661                   inner = inner.reverse();
90662               }
90663
90664               var o = findOuter(inners[i]);
90665               if (o !== undefined)
90666                   result[o].push(inners[i]);
90667               else
90668                   result.push([inners[i]]); // Invalid geometry
90669           }
90670
90671           return result;
90672       }
90673   });
90674
90675   function osmTurn(turn) {
90676       if (!(this instanceof osmTurn)) {
90677           return new osmTurn(turn);
90678       }
90679       assignIn(this, turn);
90680   }
90681
90682
90683   function osmIntersection(graph, startVertexId, maxDistance) {
90684       maxDistance = maxDistance || 30;    // in meters
90685       var vgraph = coreGraph$$1();           // virtual graph
90686       var i, j, k;
90687
90688
90689       function memberOfRestriction(entity) {
90690           return graph.parentRelations(entity)
90691               .some(function(r) { return r.isRestriction(); });
90692       }
90693
90694       function isRoad(way) {
90695           if (way.isArea() || way.isDegenerate()) return false;
90696           var roads = {
90697               'motorway': true,
90698               'motorway_link': true,
90699               'trunk': true,
90700               'trunk_link': true,
90701               'primary': true,
90702               'primary_link': true,
90703               'secondary': true,
90704               'secondary_link': true,
90705               'tertiary': true,
90706               'tertiary_link': true,
90707               'residential': true,
90708               'unclassified': true,
90709               'living_street': true,
90710               'service': true,
90711               'road': true,
90712               'track': true
90713           };
90714           return roads[way.tags.highway];
90715       }
90716
90717
90718       var startNode = graph.entity(startVertexId);
90719       var checkVertices = [startNode];
90720       var checkWays;
90721       var vertices = [];
90722       var vertexIds = [];
90723       var vertex;
90724       var ways = [];
90725       var wayIds = [];
90726       var way;
90727       var nodes = [];
90728       var node;
90729       var parents = [];
90730       var parent;
90731
90732       // `actions` will store whatever actions must be performed to satisfy
90733       // preconditions for adding a turn restriction to this intersection.
90734       //  - Remove any existing degenerate turn restrictions (missing from/to, etc)
90735       //  - Reverse oneways so that they are drawn in the forward direction
90736       //  - Split ways on key vertices
90737       var actions = [];
90738
90739
90740       // STEP 1:  walk the graph outwards from starting vertex to search
90741       //  for more key vertices and ways to include in the intersection..
90742
90743       while (checkVertices.length) {
90744           vertex = checkVertices.pop();
90745
90746           // check this vertex for parent ways that are roads
90747           checkWays = graph.parentWays(vertex);
90748           var hasWays = false;
90749           for (i = 0; i < checkWays.length; i++) {
90750               way = checkWays[i];
90751               if (!isRoad(way) && !memberOfRestriction(way)) continue;
90752
90753               ways.push(way);   // it's a road, or it's already in a turn restriction
90754               hasWays = true;
90755
90756               // check the way's children for more key vertices
90757               nodes = uniq(graph.childNodes(way));
90758               for (j = 0; j < nodes.length; j++) {
90759                   node = nodes[j];
90760                   if (node === vertex) continue;                                           // same thing
90761                   if (vertices.indexOf(node) !== -1) continue;                             // seen it already
90762                   if (node.loc && startNode.loc &&
90763                       geoSphericalDistance(node.loc, startNode.loc) > maxDistance) continue;   // too far from start
90764
90765                   // a key vertex will have parents that are also roads
90766                   var hasParents = false;
90767                   parents = graph.parentWays(node);
90768                   for (k = 0; k < parents.length; k++) {
90769                       parent = parents[k];
90770                       if (parent === way) continue;                 // same thing
90771                       if (ways.indexOf(parent) !== -1) continue;    // seen it already
90772                       if (!isRoad(parent)) continue;                // not a road
90773                       hasParents = true;
90774                       break;
90775                   }
90776
90777                   if (hasParents) {
90778                       checkVertices.push(node);
90779                   }
90780               }
90781           }
90782
90783           if (hasWays) {
90784               vertices.push(vertex);
90785           }
90786       }
90787
90788       vertices = uniq(vertices);
90789       ways = uniq(ways);
90790
90791
90792       // STEP 2:  Build a virtual graph containing only the entities in the intersection..
90793       // Everything done after this step should act on the virtual graph
90794       // Any actions that must be performed later to the main graph go in `actions` array
90795       ways.forEach(function(way) {
90796           graph.childNodes(way).forEach(function(node) {
90797               vgraph = vgraph.replace(node);
90798           });
90799
90800           vgraph = vgraph.replace(way);
90801
90802           graph.parentRelations(way).forEach(function(relation) {
90803               if (relation.isRestriction()) {
90804                   if (relation.isValidRestriction(graph)) {
90805                       vgraph = vgraph.replace(relation);
90806                   } else if (relation.isComplete(graph)) {
90807                       actions.push(actionDeleteRelation(relation.id));
90808                   }
90809               }
90810           });
90811       });
90812
90813
90814       // STEP 3:  Force all oneways to be drawn in the forward direction
90815       ways.forEach(function(w) {
90816           var way = vgraph.entity(w.id);
90817           if (way.tags.oneway === '-1') {
90818               var action = actionReverse(way.id, { reverseOneway: true });
90819               actions.push(action);
90820               vgraph = action(vgraph);
90821           }
90822       });
90823
90824
90825       // STEP 4:  Split ways on key vertices
90826       var origCount = osmEntity$$1.id.next.way;
90827       vertices.forEach(function(v) {
90828           // This is an odd way to do it, but we need to find all the ways that
90829           // will be split here, then split them one at a time to ensure that these
90830           // actions can be replayed on the main graph exactly in the same order.
90831           // (It is unintuitive, but the order of ways returned from graph.parentWays()
90832           // is arbitrary, depending on how the main graph and vgraph were built)
90833           var splitAll = actionSplit(v.id);
90834           if (!splitAll.disabled(vgraph)) {
90835               splitAll.ways(vgraph).forEach(function(way) {
90836                   var splitOne = actionSplit(v.id).limitWays([way.id]);
90837                   actions.push(splitOne);
90838                   vgraph = splitOne(vgraph);
90839               });
90840           }
90841       });
90842
90843       // In here is where we should also split the intersection at nearby junction.
90844       //   for https://github.com/mapbox/iD-internal/issues/31
90845       // nearbyVertices.forEach(function(v) {
90846       // });
90847
90848       // Reasons why we reset the way id count here:
90849       //  1. Continuity with way ids created by the splits so that we can replay
90850       //     these actions later if the user decides to create a turn restriction
90851       //  2. Avoids churning way ids just by hovering over a vertex
90852       //     and displaying the turn restriction editor
90853       osmEntity$$1.id.next.way = origCount;
90854
90855
90856       // STEP 5:  Update arrays to point to vgraph entities
90857       vertexIds = vertices.map(function(v) { return v.id; });
90858       vertices = [];
90859       ways = [];
90860
90861       vertexIds.forEach(function(id) {
90862           var vertex = vgraph.entity(id);
90863           var parents = vgraph.parentWays(vertex);
90864           vertices.push(vertex);
90865           ways = ways.concat(parents);
90866       });
90867
90868       vertices = uniq(vertices);
90869       ways = uniq(ways);
90870
90871       vertexIds = vertices.map(function(v) { return v.id; });
90872       wayIds = ways.map(function(w) { return w.id; });
90873
90874
90875       // STEP 6:  Update the ways with some metadata that will be useful for
90876       // walking the intersection graph later and rendering turn arrows.
90877
90878       function withMetadata(way, vertexIds) {
90879           var __oneWay = way.isOneWay();
90880
90881           // which affixes are key vertices?
90882           var __first = (vertexIds.indexOf(way.first()) !== -1);
90883           var __last = (vertexIds.indexOf(way.last()) !== -1);
90884
90885           // what roles is this way eligible for?
90886           var __via = (__first && __last);
90887           var __from = ((__first && !__oneWay) || __last);
90888           var __to = (__first || (__last && !__oneWay));
90889
90890           return way.update({
90891               __first:  __first,
90892               __last:  __last,
90893               __from:  __from,
90894               __via: __via,
90895               __to:  __to,
90896               __oneWay:  __oneWay
90897           });
90898       }
90899
90900       ways = [];
90901       wayIds.forEach(function(id) {
90902           var way = withMetadata(vgraph.entity(id), vertexIds);
90903           vgraph = vgraph.replace(way);
90904           ways.push(way);
90905       });
90906
90907
90908       // STEP 7:  Simplify - This is an iterative process where we:
90909       //  1. Find trivial vertices with only 2 parents
90910       //  2. trim off the leaf way from those vertices and remove from vgraph
90911
90912       var keepGoing;
90913       var removeWayIds = [];
90914       var removeVertexIds = [];
90915
90916       do {
90917           keepGoing = false;
90918           checkVertices = vertexIds.slice();
90919
90920           for (i = 0; i < checkVertices.length; i++) {
90921               var vertexId = checkVertices[i];
90922               vertex = vgraph.hasEntity(vertexId);
90923
90924               if (!vertex) {
90925                   if (vertexIds.indexOf(vertexId) !== -1) {
90926                       vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
90927                   }
90928                   removeVertexIds.push(vertexId);
90929                   continue;
90930               }
90931
90932               parents = vgraph.parentWays(vertex);
90933               if (parents.length < 3) {
90934                   if (vertexIds.indexOf(vertexId) !== -1) {
90935                       vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
90936                   }
90937               }
90938
90939               if (parents.length === 2) {     // vertex with 2 parents is trivial
90940                   var a = parents[0];
90941                   var b = parents[1];
90942                   var aIsLeaf = a && !a.__via;
90943                   var bIsLeaf = b && !b.__via;
90944                   var leaf, survivor;
90945
90946                   if (aIsLeaf && !bIsLeaf) {
90947                       leaf = a;
90948                       survivor = b;
90949                   } else if (!aIsLeaf && bIsLeaf) {
90950                       leaf = b;
90951                       survivor = a;
90952                   }
90953
90954                   if (leaf && survivor) {
90955                       survivor = withMetadata(survivor, vertexIds);      // update survivor way
90956                       vgraph = vgraph.replace(survivor).remove(leaf);    // update graph
90957                       removeWayIds.push(leaf.id);
90958                       keepGoing = true;
90959                   }
90960               }
90961
90962               parents = vgraph.parentWays(vertex);
90963
90964               if (parents.length < 2) {     // vertex is no longer a key vertex
90965                   if (vertexIds.indexOf(vertexId) !== -1) {
90966                       vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
90967                   }
90968                   removeVertexIds.push(vertexId);
90969                   keepGoing = true;
90970               }
90971
90972               if (parents.length < 1) {     // vertex is no longer attached to anything
90973                   vgraph = vgraph.remove(vertex);
90974               }
90975
90976           }
90977       } while (keepGoing);
90978
90979
90980       vertices = vertices
90981           .filter(function(vertex) { return removeVertexIds.indexOf(vertex.id) === -1; })
90982           .map(function(vertex) { return vgraph.entity(vertex.id); });
90983       ways = ways
90984           .filter(function(way) { return removeWayIds.indexOf(way.id) === -1; })
90985           .map(function(way) { return vgraph.entity(way.id); });
90986
90987
90988       // OK!  Here is our intersection..
90989       var intersection = {
90990           graph: vgraph,
90991           actions: actions,
90992           vertices: vertices,
90993           ways: ways,
90994       };
90995
90996
90997
90998       // Get all the valid turns through this intersection given a starting way id.
90999       // This operates on the virtual graph for everything.
91000       //
91001       // Basically, walk through all possible paths from starting way,
91002       //   honoring the existing turn restrictions as we go (watch out for loops!)
91003       //
91004       // For each path found, generate and return a `osmTurn` datastructure.
91005       //
91006       intersection.turns = function(fromWayId, maxViaWay) {
91007           if (!fromWayId) return [];
91008           if (!maxViaWay) maxViaWay = 0;
91009
91010           var vgraph = intersection.graph;
91011           var keyVertexIds = intersection.vertices.map(function(v) { return v.id; });
91012
91013           var start = vgraph.entity(fromWayId);
91014           if (!start || !(start.__from || start.__via)) return [];
91015
91016           // maxViaWay=0   from-*-to              (0 vias)
91017           // maxViaWay=1   from-*-via-*-to        (1 via max)
91018           // maxViaWay=2   from-*-via-*-via-*-to  (2 vias max)
91019           var maxPathLength = (maxViaWay * 2) + 3;
91020           var turns = [];
91021
91022           step(start);
91023           return turns;
91024
91025
91026           // traverse the intersection graph and find all the valid paths
91027           function step(entity, currPath, currRestrictions, matchedRestriction) {
91028               currPath = clone(currPath || []);
91029               if (currPath.length >= maxPathLength) return;
91030               currPath.push(entity.id);
91031               currRestrictions = clone(currRestrictions || []);
91032               var i, j;
91033
91034               if (entity.type === 'node') {
91035                   var parents = vgraph.parentWays(entity);
91036                   var nextWays = [];
91037
91038                   // which ways can we step into?
91039                   for (i = 0; i < parents.length; i++) {
91040                       var way = parents[i];
91041
91042                       // if next way is a oneway incoming to this vertex, skip
91043                       if (way.__oneWay && way.nodes[0] !== entity.id) continue;
91044
91045                       // if we have seen it before (allowing for an initial u-turn), skip
91046                       if (currPath.indexOf(way.id) !== -1 && currPath.length >= 3) continue;
91047
91048                       // Check all "current" restrictions (where we've already walked the `FROM`)
91049                       var restrict = undefined;
91050                       for (j = 0; j < currRestrictions.length; j++) {
91051                           var restriction = currRestrictions[j];
91052                           var f = restriction.memberByRole('from');
91053                           var v = restriction.membersByRole('via');
91054                           var t = restriction.memberByRole('to');
91055                           var isOnly = /^only_/.test(restriction.tags.restriction);
91056
91057                           // Does the current path match this turn restriction?
91058                           var matchesFrom = (f.id === fromWayId);
91059                           var matchesViaTo = false;
91060                           var isAlongOnlyPath = false;
91061
91062                           if (t.id === way.id) {     // match TO
91063
91064                               if (v.length === 1 && v[0].type === 'node') {    // match VIA node
91065                                   matchesViaTo = (v[0].id === entity.id && (
91066                                       (matchesFrom && currPath.length === 2) ||
91067                                       (!matchesFrom && currPath.length > 2)
91068                                   ));
91069
91070                               } else {                                         // match all VIA ways
91071                                   var pathVias = [];
91072                                   for (k = 2; k < currPath.length; k +=2 ) {   // k = 2 skips FROM
91073                                       pathVias.push(currPath[k]);              // (path goes way-node-way...)
91074                                   }
91075                                   var restrictionVias = [];
91076                                   for (k = 0; k < v.length; k++) {
91077                                       if (v[k].type === 'way') {
91078                                           restrictionVias.push(v[k].id);
91079                                       }
91080                                   }
91081                                   var diff = difference(pathVias, restrictionVias);
91082                                   matchesViaTo = !diff.length;
91083                               }
91084
91085                           } else if (isOnly) {
91086                               for (k = 0; k < v.length; k++) {
91087                                   // way doesn't match TO, but is one of the via ways along the path of an "only"
91088                                   if (v[k].type === 'way' && v[k].id === way.id) {
91089                                       isAlongOnlyPath = true;
91090                                       break;
91091                                   }
91092                               }
91093                           }
91094
91095                           if (matchesViaTo) {
91096                               if (isOnly) {
91097                                   restrict = { id: restriction.id, direct: matchesFrom, from: f.id, only: true, end: true };
91098                               } else {
91099                                   restrict = { id: restriction.id, direct: matchesFrom, from: f.id, no: true, end: true };
91100                               }
91101                           } else {    // indirect - caused by a different nearby restriction
91102                               if (isAlongOnlyPath) {
91103                                   restrict = { id: restriction.id, direct: false, from: f.id, only: true, end: false };
91104                               } else if (isOnly) {
91105                                   restrict = { id: restriction.id, direct: false, from: f.id, no: true, end: true };
91106                               }
91107                           }
91108
91109                           // stop looking if we find a "direct" restriction (matching FROM, VIA, TO)
91110                           if (restrict && restrict.direct)
91111                               break;
91112                       }
91113
91114                       nextWays.push({ way: way, restrict: restrict });
91115                   }
91116
91117                   nextWays.forEach(function(nextWay) {
91118                       step(nextWay.way, currPath, currRestrictions, nextWay.restrict);
91119                   });
91120
91121
91122               } else {  // entity.type === 'way'
91123                   if (currPath.length >= 3) {     // this is a "complete" path..
91124                       var turnPath = clone(currPath);
91125
91126                       // an indirect restriction - only include the partial path (starting at FROM)
91127                       if (matchedRestriction && matchedRestriction.direct === false) {
91128                           for (i = 0; i < turnPath.length; i++) {
91129                               if (turnPath[i] === matchedRestriction.from) {
91130                                   turnPath = turnPath.slice(i);
91131                                   break;
91132                               }
91133                           }
91134                       }
91135
91136                       var turn = pathToTurn(turnPath);
91137                       if (turn) {
91138                           if (matchedRestriction) {
91139                               turn.restrictionID = matchedRestriction.id;
91140                               turn.no = matchedRestriction.no;
91141                               turn.only = matchedRestriction.only;
91142                               turn.direct = matchedRestriction.direct;
91143                           }
91144                           turns.push(osmTurn(turn));
91145                       }
91146
91147                       if (currPath[0] === currPath[2]) return;   // if we made a u-turn - stop here
91148                   }
91149
91150                   if (matchedRestriction && matchedRestriction.end) return;  // don't advance any further
91151
91152                   // which nodes can we step into?
91153                   var n1 = vgraph.entity(entity.first());
91154                   var n2 = vgraph.entity(entity.last());
91155                   var dist = n1.loc && n2.loc && geoSphericalDistance(n1.loc, n2.loc);
91156                   var nextNodes = [];
91157
91158                   if (currPath.length > 1) {
91159                       if (dist > maxDistance) return;   // the next node is too far
91160                       if (!entity.__via) return;        // this way is a leaf / can't be a via
91161                   }
91162
91163                   if (!entity.__oneWay &&                     // bidirectional..
91164                       keyVertexIds.indexOf(n1.id) !== -1 &&   // key vertex..
91165                       currPath.indexOf(n1.id) === -1) {       // haven't seen it yet..
91166                       nextNodes.push(n1);                     // can advance to first node
91167                   }
91168                   if (keyVertexIds.indexOf(n2.id) !== -1 &&   // key vertex..
91169                       currPath.indexOf(n2.id) === -1) {       // haven't seen it yet..
91170                       nextNodes.push(n2);                     // can advance to last node
91171                   }
91172
91173                   nextNodes.forEach(function(nextNode) {
91174                       // gather restrictions FROM this way
91175                       var fromRestrictions = vgraph.parentRelations(entity).filter(function(r) {
91176                           if (!r.isRestriction()) return false;
91177
91178                           var f = r.memberByRole('from');
91179                           if (!f || f.id !== entity.id) return false;
91180
91181                           var isOnly = /^only_/.test(r.tags.restriction);
91182                           if (!isOnly) return true;
91183
91184                           // `only_` restrictions only matter along the direction of the VIA - #4849
91185                           var isOnlyVia = false;
91186                           var v = r.membersByRole('via');
91187                           if (v.length === 1 && v[0].type === 'node') {   // via node
91188                               isOnlyVia = (v[0].id === nextNode.id);
91189                           } else {                                        // via way(s)
91190                               for (var i = 0; i < v.length; i++) {
91191                                   if (v[i].type !== 'way') continue;
91192                                   var viaWay = vgraph.entity(v[i].id);
91193                                   if (viaWay.first() === nextNode.id || viaWay.last() === nextNode.id) {
91194                                       isOnlyVia = true;
91195                                       break;
91196                                   }
91197                               }
91198                           }
91199                           return isOnlyVia;
91200                       });
91201
91202                       step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false);
91203                   });
91204               }
91205           }
91206
91207
91208           // assumes path is alternating way-node-way of odd length
91209           function pathToTurn(path) {
91210               if (path.length < 3) return;
91211               var fromWayId, fromNodeId, fromVertexId;
91212               var toWayId, toNodeId, toVertexId;
91213               var viaWayIds, viaNodeId, isUturn;
91214
91215               fromWayId = path[0];
91216               toWayId = path[path.length - 1];
91217
91218               if (path.length === 3 && fromWayId === toWayId) {  // u turn
91219                   var way = vgraph.entity(fromWayId);
91220                   if (way.__oneWay) return null;
91221
91222                   isUturn = true;
91223                   viaNodeId = fromVertexId = toVertexId = path[1];
91224                   fromNodeId = toNodeId = adjacentNode(fromWayId, viaNodeId);
91225
91226               } else {
91227                   isUturn = false;
91228                   fromVertexId = path[1];
91229                   fromNodeId = adjacentNode(fromWayId, fromVertexId);
91230                   toVertexId = path[path.length - 2];
91231                   toNodeId = adjacentNode(toWayId, toVertexId);
91232
91233                   if (path.length === 3) {
91234                       viaNodeId = path[1];
91235                   } else {
91236                       viaWayIds = path.filter(function(entityId) { return entityId[0] === 'w'; });
91237                       viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1);  // remove first, last
91238                   }
91239               }
91240
91241               return {
91242                   key:  path.join('_'),
91243                   path: path,
91244                   from: { node: fromNodeId, way:  fromWayId, vertex: fromVertexId },
91245                   via:  { node: viaNodeId,  ways: viaWayIds },
91246                   to:   { node: toNodeId,   way:  toWayId, vertex: toVertexId },
91247                   u:    isUturn
91248               };
91249
91250
91251               function adjacentNode(wayId, affixId) {
91252                   var nodes = vgraph.entity(wayId).nodes;
91253                   return affixId === nodes[0] ? nodes[1] : nodes[nodes.length - 2];
91254               }
91255           }
91256
91257       };
91258
91259       return intersection;
91260   }
91261
91262
91263   function osmInferRestriction(graph, turn, projection) {
91264       var fromWay = graph.entity(turn.from.way);
91265       var fromNode = graph.entity(turn.from.node);
91266       var fromVertex = graph.entity(turn.from.vertex);
91267       var toWay = graph.entity(turn.to.way);
91268       var toNode = graph.entity(turn.to.node);
91269       var toVertex = graph.entity(turn.to.vertex);
91270
91271       var fromOneWay = (fromWay.tags.oneway === 'yes');
91272       var toOneWay = (toWay.tags.oneway === 'yes');
91273       var angle = (geoAngle(fromVertex, fromNode, projection) -
91274                   geoAngle(toVertex, toNode, projection)) * 180 / Math.PI;
91275
91276       while (angle < 0)
91277           angle += 360;
91278
91279       if (fromNode === toNode)
91280           return 'no_u_turn';
91281       if ((angle < 23 || angle > 336) && fromOneWay && toOneWay)
91282           return 'no_u_turn';   // wider tolerance for u-turn if both ways are oneway
91283       if ((angle < 40 || angle > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex)
91284           return 'no_u_turn';   // even wider tolerance for u-turn if there is a via way (from !== to)
91285       if (angle < 158)
91286           return 'no_right_turn';
91287       if (angle > 202)
91288           return 'no_left_turn';
91289
91290       return 'no_straight_on';
91291   }
91292
91293   function actionAddMember(relationId, member, memberIndex, insertPair) {
91294
91295       return function action(graph) {
91296           var relation = graph.entity(relationId);
91297
91298           // There are some special rules for Public Transport v2 routes.
91299           var isPTv2 = /stop|platform/.test(member.role);
91300
91301           if ((isNaN(memberIndex) || insertPair) && member.type === 'way' && !isPTv2) {
91302               // Try to perform sensible inserts based on how the ways join together
91303               graph = addWayMember(relation, graph);
91304           } else {
91305               // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
91306               // Stops and Platforms for PTv2 should be ordered first.
91307               // hack: We do not currently have the ability to place them in the exactly correct order.
91308               if (isPTv2 && isNaN(memberIndex)) {
91309                   memberIndex = 0;
91310               }
91311
91312               graph = graph.replace(relation.addMember(member, memberIndex));
91313           }
91314
91315           return graph;
91316       };
91317
91318
91319       // Add a way member into the relation "wherever it makes sense".
91320       // In this situation we were not supplied a memberIndex.
91321       function addWayMember(relation, graph) {
91322           var groups, tempWay, item, i, j, k;
91323
91324           // remove PTv2 stops and platforms before doing anything.
91325           var PTv2members = [];
91326           var members = [];
91327           for (i = 0; i < relation.members.length; i++) {
91328               var m = relation.members[i];
91329               if (/stop|platform/.test(m.role)) {
91330                   PTv2members.push(m);
91331               } else {
91332                   members.push(m);
91333               }
91334           }
91335           relation = relation.update({ members: members });
91336
91337
91338           if (insertPair) {
91339               // We're adding a member that must stay paired with an existing member.
91340               // (This feature is used by `actionSplit`)
91341               //
91342               // This is tricky because the members may exist multiple times in the
91343               // member list, and with different A-B/B-A ordering and different roles.
91344               // (e.g. a bus route that loops out and back - #4589).
91345               //
91346               // Replace the existing member with a temporary way,
91347               // so that `osmJoinWays` can treat the pair like a single way.
91348               tempWay = osmWay({ id: 'wTemp', nodes: insertPair.nodes });
91349               graph = graph.replace(tempWay);
91350               var tempMember = { id: tempWay.id, type: 'way', role: member.role };
91351               var tempRelation = relation.replaceMember({id: insertPair.originalID}, tempMember, true);
91352               groups = groupBy(tempRelation.members, function(m) { return m.type; });
91353               groups.way = groups.way || [];
91354
91355           } else {
91356               // Add the member anywhere, one time. Just push and let `osmJoinWays` decide where to put it.
91357               groups = groupBy(relation.members, function(m) { return m.type; });
91358               groups.way = groups.way || [];
91359               groups.way.push(member);
91360           }
91361
91362           members = withIndex(groups.way);
91363           var joined = osmJoinWays(members, graph);
91364
91365           // `joined` might not contain all of the way members,
91366           // But will contain only the completed (downloaded) members
91367           for (i = 0; i < joined.length; i++) {
91368               var segment = joined[i];
91369               var nodes = segment.nodes.slice();
91370               var startIndex = segment[0].index;
91371
91372               // j = array index in `members` where this segment starts
91373               for (j = 0; j < members.length; j++) {
91374                   if (members[j].index === startIndex) {
91375                       break;
91376                   }
91377               }
91378
91379               // k = each member in segment
91380               for (k = 0; k < segment.length; k++) {
91381                   item = segment[k];
91382                   var way = graph.entity(item.id);
91383
91384                   // If this is a paired item, generate members in correct order and role
91385                   if (tempWay && item.id === tempWay.id) {
91386                       if (nodes[0].id === insertPair.nodes[0]) {
91387                           item.pair = [
91388                               { id: insertPair.originalID, type: 'way', role: item.role },
91389                               { id: insertPair.insertedID, type: 'way', role: item.role }
91390                           ];
91391                       } else {
91392                           item.pair = [
91393                               { id: insertPair.insertedID, type: 'way', role: item.role },
91394                               { id: insertPair.originalID, type: 'way', role: item.role }
91395                           ];
91396                       }
91397                   }
91398
91399                   // reorder `members` if necessary
91400                   if (k > 0) {
91401                       if (j+k >= members.length || item.index !== members[j+k].index) {
91402                           moveMember(members, item.index, j+k);
91403                       }
91404                   }
91405
91406                   nodes.splice(0, way.nodes.length - 1);
91407               }
91408           }
91409
91410           if (tempWay) {
91411               graph = graph.remove(tempWay);
91412           }
91413
91414           // Final pass: skip dead items, split pairs, remove index properties
91415           var wayMembers = [];
91416           for (i = 0; i < members.length; i++) {
91417               item = members[i];
91418               if (item.index === -1) continue;
91419
91420               if (item.pair) {
91421                   wayMembers.push(item.pair[0]);
91422                   wayMembers.push(item.pair[1]);
91423               } else {
91424                   wayMembers.push(omit(item, 'index'));
91425               }
91426           }
91427
91428           // Put stops and platforms first, then nodes, ways, relations
91429           // This is recommended for Public Transport v2 routes:
91430           // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
91431           var newMembers = PTv2members.concat( (groups.node || []), wayMembers, (groups.relation || []) );
91432
91433           return graph.replace(relation.update({members: newMembers}));
91434
91435
91436           // `moveMember()` changes the `members` array in place by splicing
91437           // the item with `.index = findIndex` to where it belongs,
91438           // and marking the old position as "dead" with `.index = -1`
91439           //
91440           // j=5, k=0                jk
91441           // segment                 5 4 7 6
91442           // members       0 1 2 3 4 5 6 7 8 9        keep 5 in j+k
91443           //
91444           // j=5, k=1                j k
91445           // segment                 5 4 7 6
91446           // members       0 1 2 3 4 5 6 7 8 9        move 4 to j+k
91447           // members       0 1 2 3 x 5 4 6 7 8 9      moved
91448           //
91449           // j=5, k=2                j   k
91450           // segment                 5 4 7 6
91451           // members       0 1 2 3 x 5 4 6 7 8 9      move 7 to j+k
91452           // members       0 1 2 3 x 5 4 7 6 x 8 9    moved
91453           //
91454           // j=5, k=3                j     k
91455           // segment                 5 4 7 6
91456           // members       0 1 2 3 x 5 4 7 6 x 8 9    keep 6 in j+k
91457           //
91458           function moveMember(arr, findIndex, toIndex) {
91459               for (var i = 0; i < arr.length; i++) {
91460                   if (arr[i].index === findIndex) {
91461                       break;
91462                   }
91463               }
91464
91465               var item = clone(arr[i]);
91466               arr[i].index = -1;   // mark as dead
91467               item.index = toIndex;
91468               arr.splice(toIndex, 0, item);
91469           }
91470
91471
91472           // This is the same as `Relation.indexedMembers`,
91473           // Except we don't want to index all the members, only the ways
91474           function withIndex(arr) {
91475               var result = new Array(arr.length);
91476               for (var i = 0; i < arr.length; i++) {
91477                   result[i] = clone(arr[i]);
91478                   result[i].index = i;
91479               }
91480               return result;
91481           }
91482       }
91483
91484   }
91485
91486   function actionAddMidpoint(midpoint, node) {
91487       return function(graph) {
91488           graph = graph.replace(node.move(midpoint.loc));
91489
91490           var parents = intersection(
91491               graph.parentWays(graph.entity(midpoint.edge[0])),
91492               graph.parentWays(graph.entity(midpoint.edge[1])));
91493
91494           parents.forEach(function(way) {
91495               for (var i = 0; i < way.nodes.length - 1; i++) {
91496                   if (geoEdgeEqual([way.nodes[i], way.nodes[i + 1]], midpoint.edge)) {
91497                       graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1));
91498
91499                       // Add only one midpoint on doubled-back segments,
91500                       // turning them into self-intersections.
91501                       return;
91502                   }
91503               }
91504           });
91505
91506           return graph;
91507       };
91508   }
91509
91510   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as
91511   function actionAddVertex(wayId, nodeId, index) {
91512       return function(graph) {
91513           return graph.replace(graph.entity(wayId).addNode(nodeId, index));
91514       };
91515   }
91516
91517   function actionChangeMember(relationId, member, memberIndex) {
91518       return function(graph) {
91519           return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
91520       };
91521   }
91522
91523   function actionChangePreset(entityID, oldPreset, newPreset) {
91524       return function action(graph) {
91525           var entity = graph.entity(entityID);
91526           var geometry = entity.geometry(graph);
91527           var tags = entity.tags;
91528
91529           if (oldPreset) tags = oldPreset.unsetTags(tags, geometry);
91530           if (newPreset) tags = newPreset.setTags(tags, geometry);
91531
91532           return graph.replace(entity.update({tags: tags}));
91533       };
91534   }
91535
91536   function actionChangeTags(entityId, tags) {
91537       return function(graph) {
91538           var entity = graph.entity(entityId);
91539           return graph.replace(entity.update({tags: tags}));
91540       };
91541   }
91542
91543   function actionCircularize(wayId, projection, maxAngle) {
91544       maxAngle = (maxAngle || 20) * Math.PI / 180;
91545
91546
91547       var action = function(graph, t) {
91548           if (t === null || !isFinite(t)) t = 1;
91549           t = Math.min(Math.max(+t, 0), 1);
91550
91551           var way = graph.entity(wayId),
91552               origNodes = {};
91553
91554           graph.childNodes(way).forEach(function(node) {
91555               if (!origNodes[node.id]) origNodes[node.id] = node;
91556           });
91557
91558           if (!way.isConvex(graph)) {
91559               graph = action.makeConvex(graph);
91560           }
91561
91562           var nodes = uniq(graph.childNodes(way)),
91563               keyNodes = nodes.filter(function(n) { return graph.parentWays(n).length !== 1; }),
91564               points = nodes.map(function(n) { return projection(n.loc); }),
91565               keyPoints = keyNodes.map(function(n) { return projection(n.loc); }),
91566               centroid = (points.length === 2) ? geoVecInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points),
91567               radius = d3_median(points, function(p) { return geoVecLength(centroid, p); }),
91568               sign = d3_polygonArea(points) > 0 ? 1 : -1,
91569               ids;
91570
91571           // we need atleast two key nodes for the algorithm to work
91572           if (!keyNodes.length) {
91573               keyNodes = [nodes[0]];
91574               keyPoints = [points[0]];
91575           }
91576
91577           if (keyNodes.length === 1) {
91578               var index = nodes.indexOf(keyNodes[0]),
91579                   oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
91580
91581               keyNodes.push(nodes[oppositeIndex]);
91582               keyPoints.push(points[oppositeIndex]);
91583           }
91584
91585           // key points and nodes are those connected to the ways,
91586           // they are projected onto the circle, inbetween nodes are moved
91587           // to constant intervals between key nodes, extra inbetween nodes are
91588           // added if necessary.
91589           for (var i = 0; i < keyPoints.length; i++) {
91590               var nextKeyNodeIndex = (i + 1) % keyNodes.length,
91591                   startNode = keyNodes[i],
91592                   endNode = keyNodes[nextKeyNodeIndex],
91593                   startNodeIndex = nodes.indexOf(startNode),
91594                   endNodeIndex = nodes.indexOf(endNode),
91595                   numberNewPoints = -1,
91596                   indexRange = endNodeIndex - startNodeIndex,
91597                   nearNodes = {},
91598                   inBetweenNodes = [],
91599                   startAngle, endAngle, totalAngle, eachAngle,
91600                   angle, loc, node, origNode, j;
91601
91602               if (indexRange < 0) {
91603                   indexRange += nodes.length;
91604               }
91605
91606               // position this key node
91607               var distance = geoVecLength(centroid, keyPoints[i]);
91608               if (distance === 0) { distance = 1e-4; }
91609               keyPoints[i] = [
91610                   centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius,
91611                   centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius
91612               ];
91613               loc = projection.invert(keyPoints[i]);
91614               node = keyNodes[i];
91615               origNode = origNodes[node.id];
91616               node = node.move(geoVecInterp(origNode.loc, loc, t));
91617               graph = graph.replace(node);
91618
91619               // figure out the between delta angle we want to match to
91620               startAngle = Math.atan2(keyPoints[i][1] - centroid[1], keyPoints[i][0] - centroid[0]);
91621               endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
91622               totalAngle = endAngle - startAngle;
91623
91624               // detects looping around -pi/pi
91625               if (totalAngle * sign > 0) {
91626                   totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle));
91627               }
91628
91629               do {
91630                   numberNewPoints++;
91631                   eachAngle = totalAngle / (indexRange + numberNewPoints);
91632               } while (Math.abs(eachAngle) > maxAngle);
91633
91634
91635               // move existing nodes
91636               for (j = 1; j < indexRange; j++) {
91637                   angle = startAngle + j * eachAngle;
91638                   loc = projection.invert([
91639                       centroid[0] + Math.cos(angle) * radius,
91640                       centroid[1] + Math.sin(angle) * radius
91641                   ]);
91642
91643                   node = nodes[(j + startNodeIndex) % nodes.length];
91644                   origNode = origNodes[node.id];
91645                   nearNodes[node.id] = angle;
91646
91647                   node = node.move(geoVecInterp(origNode.loc, loc, t));
91648                   graph = graph.replace(node);
91649               }
91650
91651               // add new inbetween nodes if necessary
91652               for (j = 0; j < numberNewPoints; j++) {
91653                   angle = startAngle + (indexRange + j) * eachAngle;
91654                   loc = projection.invert([
91655                       centroid[0] + Math.cos(angle) * radius,
91656                       centroid[1] + Math.sin(angle) * radius
91657                   ]);
91658
91659                   // choose a nearnode to use as the original
91660                   var min$$1 = Infinity;
91661                   for (var nodeId in nearNodes) {
91662                       var nearAngle = nearNodes[nodeId],
91663                           dist = Math.abs(nearAngle - angle);
91664                       if (dist < min$$1) {
91665                           dist = min$$1;
91666                           origNode = origNodes[nodeId];
91667                       }
91668                   }
91669
91670                   node = osmNode({ loc: geoVecInterp(origNode.loc, loc, t) });
91671                   graph = graph.replace(node);
91672
91673                   nodes.splice(endNodeIndex + j, 0, node);
91674                   inBetweenNodes.push(node.id);
91675               }
91676
91677               // Check for other ways that share these keyNodes..
91678               // If keyNodes are adjacent in both ways,
91679               // we can add inBetween nodes to that shared way too..
91680               if (indexRange === 1 && inBetweenNodes.length) {
91681                   var startIndex1 = way.nodes.lastIndexOf(startNode.id),
91682                       endIndex1 = way.nodes.lastIndexOf(endNode.id),
91683                       wayDirection1 = (endIndex1 - startIndex1);
91684                   if (wayDirection1 < -1) { wayDirection1 = 1; }
91685
91686                   /* eslint-disable no-loop-func */
91687                   forEach(without(graph.parentWays(keyNodes[i]), way), function(sharedWay) {
91688                       if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
91689                           var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id),
91690                               endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id),
91691                               wayDirection2 = (endIndex2 - startIndex2),
91692                               insertAt = endIndex2;
91693                           if (wayDirection2 < -1) { wayDirection2 = 1; }
91694
91695                           if (wayDirection1 !== wayDirection2) {
91696                               inBetweenNodes.reverse();
91697                               insertAt = startIndex2;
91698                           }
91699                           for (j = 0; j < inBetweenNodes.length; j++) {
91700                               sharedWay = sharedWay.addNode(inBetweenNodes[j], insertAt + j);
91701                           }
91702                           graph = graph.replace(sharedWay);
91703                       }
91704                   });
91705                   /* eslint-enable no-loop-func */
91706               }
91707
91708           }
91709
91710           // update the way to have all the new nodes
91711           ids = nodes.map(function(n) { return n.id; });
91712           ids.push(ids[0]);
91713
91714           way = way.update({nodes: ids});
91715           graph = graph.replace(way);
91716
91717           return graph;
91718       };
91719
91720
91721       action.makeConvex = function(graph) {
91722           var way = graph.entity(wayId),
91723               nodes = uniq(graph.childNodes(way)),
91724               points = nodes.map(function(n) { return projection(n.loc); }),
91725               sign = d3_polygonArea(points) > 0 ? 1 : -1,
91726               hull = d3_polygonHull(points);
91727
91728           // D3 convex hulls go counterclockwise..
91729           if (sign === -1) {
91730               nodes.reverse();
91731               points.reverse();
91732           }
91733
91734           for (var i = 0; i < hull.length - 1; i++) {
91735               var startIndex = points.indexOf(hull[i]),
91736                   endIndex = points.indexOf(hull[i+1]),
91737                   indexRange = (endIndex - startIndex);
91738
91739               if (indexRange < 0) {
91740                   indexRange += nodes.length;
91741               }
91742
91743               // move interior nodes to the surface of the convex hull..
91744               for (var j = 1; j < indexRange; j++) {
91745                   var point = geoVecInterp(hull[i], hull[i+1], j / indexRange),
91746                       node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point));
91747                   graph = graph.replace(node);
91748               }
91749           }
91750           return graph;
91751       };
91752
91753
91754       action.disabled = function(graph) {
91755           if (!graph.entity(wayId).isClosed())
91756               return 'not_closed';
91757       };
91758
91759
91760       action.transitionable = true;
91761
91762
91763       return action;
91764   }
91765
91766   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteWayAction.as
91767   function actionDeleteWay(wayId) {
91768
91769
91770       function canDeleteNode(node, graph) {
91771           return !graph.parentWays(node).length &&
91772               !graph.parentRelations(node).length &&
91773               !node.hasInterestingTags();
91774       }
91775
91776
91777       var action = function(graph) {
91778           var way = graph.entity(wayId);
91779
91780           graph.parentRelations(way)
91781               .forEach(function(parent) {
91782                   parent = parent.removeMembersWithID(wayId);
91783                   graph = graph.replace(parent);
91784
91785                   if (parent.isDegenerate()) {
91786                       graph = actionDeleteRelation(parent.id)(graph);
91787                   }
91788               });
91789
91790           uniq(way.nodes).forEach(function(nodeId) {
91791               graph = graph.replace(way.removeNode(nodeId));
91792
91793               var node = graph.entity(nodeId);
91794               if (canDeleteNode(node, graph)) {
91795                   graph = graph.remove(node);
91796               }
91797           });
91798
91799           return graph.remove(way);
91800       };
91801
91802
91803       return action;
91804   }
91805
91806   function actionDeleteMultiple(ids) {
91807       var actions = {
91808           way: actionDeleteWay,
91809           node: actionDeleteNode,
91810           relation: actionDeleteRelation
91811       };
91812
91813
91814       var action = function(graph) {
91815           ids.forEach(function(id) {
91816               if (graph.hasEntity(id)) { // It may have been deleted aready.
91817                   graph = actions[graph.entity(id).type](id)(graph);
91818               }
91819           });
91820
91821           return graph;
91822       };
91823
91824
91825       return action;
91826   }
91827
91828   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as
91829   function actionDeleteRelation(relationId) {
91830
91831
91832       function canDeleteEntity(entity, graph) {
91833           return !graph.parentWays(entity).length &&
91834               !graph.parentRelations(entity).length &&
91835               !entity.hasInterestingTags();
91836       }
91837
91838
91839       var action = function(graph) {
91840           var relation = graph.entity(relationId);
91841
91842           graph.parentRelations(relation)
91843               .forEach(function(parent) {
91844                   parent = parent.removeMembersWithID(relationId);
91845                   graph = graph.replace(parent);
91846
91847                   if (parent.isDegenerate()) {
91848                       graph = actionDeleteRelation(parent.id)(graph);
91849                   }
91850               });
91851
91852           uniq(map$3(relation.members, 'id')).forEach(function(memberId) {
91853               graph = graph.replace(relation.removeMembersWithID(memberId));
91854
91855               var entity = graph.entity(memberId);
91856               if (canDeleteEntity(entity, graph)) {
91857                   graph = actionDeleteMultiple([memberId])(graph);
91858               }
91859           });
91860
91861           return graph.remove(relation);
91862       };
91863
91864
91865       return action;
91866   }
91867
91868   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteNodeAction.as
91869   function actionDeleteNode(nodeId) {
91870       var action = function(graph) {
91871           var node = graph.entity(nodeId);
91872
91873           graph.parentWays(node)
91874               .forEach(function(parent) {
91875                   parent = parent.removeNode(nodeId);
91876                   graph = graph.replace(parent);
91877
91878                   if (parent.isDegenerate()) {
91879                       graph = actionDeleteWay(parent.id)(graph);
91880                   }
91881               });
91882
91883           graph.parentRelations(node)
91884               .forEach(function(parent) {
91885                   parent = parent.removeMembersWithID(nodeId);
91886                   graph = graph.replace(parent);
91887
91888                   if (parent.isDegenerate()) {
91889                       graph = actionDeleteRelation(parent.id)(graph);
91890                   }
91891               });
91892
91893           return graph.remove(node);
91894       };
91895
91896
91897       return action;
91898   }
91899
91900   // Connect the ways at the given nodes.
91901   //
91902   // First choose a node to be the survivor, with preference given
91903   // to an existing (not new) node.
91904   //
91905   // Tags and relation memberships of of non-surviving nodes are merged
91906   // to the survivor.
91907   //
91908   // This is the inverse of `iD.actionDisconnect`.
91909   //
91910   // Reference:
91911   //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as
91912   //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java
91913   //
91914   function actionConnect(nodeIDs) {
91915       var action = function(graph) {
91916           var survivor;
91917           var node;
91918           var parents;
91919           var i, j;
91920
91921           // Choose a survivor node, prefer an existing (not new) node - #4974
91922           for (i = 0; i < nodeIDs.length; i++) {
91923               survivor = graph.entity(nodeIDs[i]);
91924               if (survivor.version) break;  // found one
91925           }
91926
91927           // Replace all non-surviving nodes with the survivor and merge tags.
91928           for (i = 0; i < nodeIDs.length; i++) {
91929               node = graph.entity(nodeIDs[i]);
91930               if (node.id === survivor.id) continue;
91931
91932               parents = graph.parentWays(node);
91933               for (j = 0; j < parents.length; j++) {
91934                   if (!parents[j].areAdjacent(node.id, survivor.id)) {
91935                       graph = graph.replace(parents[j].replaceNode(node.id, survivor.id));
91936                   }
91937               }
91938
91939               parents = graph.parentRelations(node);
91940               for (j = 0; j < parents.length; j++) {
91941                   graph = graph.replace(parents[j].replaceMember(node, survivor));
91942               }
91943
91944               survivor = survivor.mergeTags(node.tags);
91945               graph = actionDeleteNode(node.id)(graph);
91946           }
91947
91948           graph = graph.replace(survivor);
91949
91950           return graph;
91951       };
91952
91953
91954       action.disabled = function(graph) {
91955           var seen = {};
91956           var restrictionIDs = [];
91957           var survivor;
91958           var node, way;
91959           var relations, relation, role;
91960           var i, j, k;
91961
91962           // Choose a survivor node, prefer an existing (not new) node - #4974
91963           for (i = 0; i < nodeIDs.length; i++) {
91964               survivor = graph.entity(nodeIDs[i]);
91965               if (survivor.version) break;  // found one
91966           }
91967
91968           // 1. disable if the nodes being connected have conflicting relation roles
91969           for (i = 0; i < nodeIDs.length; i++) {
91970               node = graph.entity(nodeIDs[i]);
91971               relations = graph.parentRelations(node);
91972
91973               for (j = 0; j < relations.length; j++) {
91974                   relation = relations[j];
91975                   role = relation.memberById(node.id).role || '';
91976
91977                   // if this node is a via node in a restriction, remember for later
91978                   if (relation.isValidRestriction()) {
91979                       restrictionIDs.push(relation.id);
91980                   }
91981
91982                   if (seen[relation.id] !== undefined && seen[relation.id] !== role) {
91983                       return 'relation';
91984                   } else {
91985                       seen[relation.id] = role;
91986                   }
91987               }
91988           }
91989
91990           // gather restrictions for parent ways
91991           for (i = 0; i < nodeIDs.length; i++) {
91992               node = graph.entity(nodeIDs[i]);
91993
91994               var parents = graph.parentWays(node);
91995               for (j = 0; j < parents.length; j++) {
91996                   var parent = parents[j];
91997                   relations = graph.parentRelations(parent);
91998
91999                   for (k = 0; k < relations.length; k++) {
92000                       relation = relations[k];
92001                       if (relation.isValidRestriction()) {
92002                           restrictionIDs.push(relation.id);
92003                       }
92004                   }
92005               }
92006           }
92007
92008
92009           // test restrictions
92010           restrictionIDs = uniq(restrictionIDs);
92011           for (i = 0; i < restrictionIDs.length; i++) {
92012               relation = graph.entity(restrictionIDs[i]);
92013               if (!relation.isComplete(graph)) continue;
92014
92015               var memberWays = relation.members
92016                   .filter(function(m) { return m.type === 'way'; })
92017                   .map(function(m) { return graph.entity(m.id); });
92018
92019               memberWays = uniq(memberWays);
92020               var f = relation.memberByRole('from');
92021               var t = relation.memberByRole('to');
92022               var isUturn = (f.id === t.id);
92023
92024               // 2a. disable if connection would damage a restriction
92025               // (a key node is a node at the junction of ways)
92026               var nodes = { from: [], via: [], to: [], keyfrom: [], keyto: [] };
92027               for (j = 0; j < relation.members.length; j++) {
92028                   collectNodes(relation.members[j], nodes);
92029               }
92030
92031               nodes.keyfrom = uniq(nodes.keyfrom.filter(hasDuplicates));
92032               nodes.keyto = uniq(nodes.keyto.filter(hasDuplicates));
92033
92034               var filter = keyNodeFilter(nodes.keyfrom, nodes.keyto);
92035               nodes.from = nodes.from.filter(filter);
92036               nodes.via = nodes.via.filter(filter);
92037               nodes.to = nodes.to.filter(filter);
92038
92039               var connectFrom = false;
92040               var connectVia = false;
92041               var connectTo = false;
92042               var connectKeyFrom = false;
92043               var connectKeyTo = false;
92044
92045               for (j = 0; j < nodeIDs.length; j++) {
92046                   var n = nodeIDs[j];
92047                   if (nodes.from.indexOf(n) !== -1)    { connectFrom = true; }
92048                   if (nodes.via.indexOf(n) !== -1)     { connectVia = true; }
92049                   if (nodes.to.indexOf(n) !== -1)      { connectTo = true; }
92050                   if (nodes.keyfrom.indexOf(n) !== -1) { connectKeyFrom = true; }
92051                   if (nodes.keyto.indexOf(n) !== -1)   { connectKeyTo = true; }
92052               }
92053               if (connectFrom && connectTo && !isUturn) { return 'restriction'; }
92054               if (connectFrom && connectVia) { return 'restriction'; }
92055               if (connectTo   && connectVia) { return 'restriction'; }
92056
92057               // connecting to a key node -
92058               // if both nodes are on a member way (i.e. part of the turn restriction),
92059               // the connecting node must be adjacent to the key node.
92060               if (connectKeyFrom || connectKeyTo) {
92061                   if (nodeIDs.length !== 2) { return 'restriction'; }
92062
92063                   var n0 = null;
92064                   var n1 = null;
92065                   for (j = 0; j < memberWays.length; j++) {
92066                       way = memberWays[j];
92067                       if (way.contains(nodeIDs[0])) { n0 = nodeIDs[0]; }
92068                       if (way.contains(nodeIDs[1])) { n1 = nodeIDs[1]; }
92069                   }
92070
92071                   if (n0 && n1) {    // both nodes are part of the restriction
92072                       var ok = false;
92073                       for (j = 0; j < memberWays.length; j++) {
92074                           way = memberWays[j];
92075                           if (way.areAdjacent(n0, n1)) {
92076                               ok = true;
92077                               break;
92078                           }
92079                       }
92080                       if (!ok) {
92081                           return 'restriction';
92082                       }
92083                   }
92084               }
92085
92086               // 2b. disable if nodes being connected will destroy a member way in a restriction
92087               // (to test, make a copy and try actually connecting the nodes)
92088               for (j = 0; j < memberWays.length; j++) {
92089                   way = memberWays[j].update({});   // make copy
92090                   for (k = 0; k < nodeIDs.length; k++) {
92091                       if (nodeIDs[k] === survivor.id) continue;
92092
92093                       if (way.areAdjacent(nodeIDs[k], survivor.id)) {
92094                           way = way.removeNode(nodeIDs[k]);
92095                       } else {
92096                           way = way.replaceNode(nodeIDs[k], survivor.id);
92097                       }
92098                   }
92099                   if (way.isDegenerate()) {
92100                       return 'restriction';
92101                   }
92102               }
92103           }
92104
92105           return false;
92106
92107
92108           // if a key node appears multiple times (indexOf !== lastIndexOf) it's a FROM-VIA or TO-VIA junction
92109           function hasDuplicates(n, i, arr) {
92110               return arr.indexOf(n) !== arr.lastIndexOf(n);
92111           }
92112
92113           function keyNodeFilter(froms, tos) {
92114               return function(n) {
92115                   return froms.indexOf(n) === -1 && tos.indexOf(n) === -1;
92116               };
92117           }
92118
92119           function collectNodes(member, collection) {
92120               var entity = graph.hasEntity(member.id);
92121               if (!entity) return;
92122
92123               var role = member.role || '';
92124               if (!collection[role]) {
92125                   collection[role] = [];
92126               }
92127
92128               if (member.type === 'node') {
92129                   collection[role].push(member.id);
92130                   if (role === 'via') {
92131                       collection.keyfrom.push(member.id);
92132                       collection.keyto.push(member.id);
92133                   }
92134
92135               } else if (member.type === 'way') {
92136                   collection[role].push.apply(collection[role], entity.nodes);
92137                   if (role === 'from' || role === 'via') {
92138                       collection.keyfrom.push(entity.first());
92139                       collection.keyfrom.push(entity.last());
92140                   }
92141                   if (role === 'to' || role === 'via') {
92142                       collection.keyto.push(entity.first());
92143                       collection.keyto.push(entity.last());
92144                   }
92145               }
92146           }
92147       };
92148
92149
92150       return action;
92151   }
92152
92153   function actionCopyEntities(ids, fromGraph) {
92154       var copies = {};
92155
92156
92157       var action = function(graph) {
92158           ids.forEach(function(id) {
92159               fromGraph.entity(id).copy(fromGraph, copies);
92160           });
92161
92162           for (var id in copies) {
92163               graph = graph.replace(copies[id]);
92164           }
92165
92166           return graph;
92167       };
92168
92169
92170       action.copies = function() {
92171           return copies;
92172       };
92173
92174
92175       return action;
92176   }
92177
92178   function actionDeleteMember(relationId, memberIndex) {
92179       return function(graph) {
92180           var relation = graph.entity(relationId)
92181               .removeMember(memberIndex);
92182
92183           graph = graph.replace(relation);
92184
92185           if (relation.isDegenerate())
92186               graph = actionDeleteRelation(relation.id)(graph);
92187
92188           return graph;
92189       };
92190   }
92191
92192   function actionDeprecateTags(entityId) {
92193
92194       return function(graph) {
92195           var entity = graph.entity(entityId),
92196               newtags = clone(entity.tags),
92197               change = false,
92198               rule;
92199
92200           // This handles dataDeprecated tags with a single condition
92201           for (var i = 0; i < dataDeprecated.length; i++) {
92202
92203               rule = dataDeprecated[i];
92204               var match = toPairs(rule.old)[0],
92205                   replacements = rule.replace ? toPairs(rule.replace) : null;
92206
92207               if (entity.tags[match[0]] && match[1] === '*') {
92208
92209                   var value = entity.tags[match[0]];
92210                   if (replacements && !newtags[replacements[0][0]]) {
92211                       newtags[replacements[0][0]] = value;
92212                   }
92213                   delete newtags[match[0]];
92214                   change = true;
92215
92216               } else if (entity.tags[match[0]] === match[1]) {
92217                   newtags = assign({}, rule.replace || {}, omit(newtags, match[0]));
92218                   change = true;
92219               }
92220           }
92221
92222           if (change) {
92223               return graph.replace(entity.update({tags: newtags}));
92224           } else {
92225               return graph;
92226           }
92227       };
92228   }
92229
92230   function actionDiscardTags(difference) {
92231
92232       return function(graph) {
92233           function discardTags(entity) {
92234               var tags = {};
92235               var keys = Object.keys(entity.tags);
92236               var discarded = false;
92237
92238               for (var i = 0; i < keys.length; i++) {
92239                   var k = keys[i];
92240                   if (dataDiscarded[k] || !entity.tags[k]) {
92241                       discarded = true;
92242                   } else {
92243                       tags[k] = entity.tags[k];
92244                   }
92245               }
92246
92247               if (discarded) {
92248                   graph = graph.replace(entity.update({ tags: tags }));
92249               }
92250           }
92251
92252           difference.modified().forEach(discardTags);
92253           difference.created().forEach(discardTags);
92254
92255           return graph;
92256       };
92257   }
92258
92259   // Disconect the ways at the given node.
92260   //
92261   // Optionally, disconnect only the given ways.
92262   //
92263   // For testing convenience, accepts an ID to assign to the (first) new node.
92264   // Normally, this will be undefined and the way will automatically
92265   // be assigned a new ID.
92266   //
92267   // This is the inverse of `iD.actionConnect`.
92268   //
92269   // Reference:
92270   //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as
92271   //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java
92272   //
92273   function actionDisconnect(nodeId, newNodeId) {
92274       var wayIds;
92275
92276
92277       var action = function(graph) {
92278           var node = graph.entity(nodeId);
92279           var connections = action.connections(graph);
92280
92281           connections.forEach(function(connection) {
92282               var way = graph.entity(connection.wayID);
92283               var newNode = osmNode({id: newNodeId, loc: node.loc, tags: node.tags});
92284
92285               graph = graph.replace(newNode);
92286               if (connection.index === 0 && way.isArea()) {
92287                   // replace shared node with shared node..
92288                   graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
92289               } else if (way.isClosed() && connection.index === way.nodes.length - 1) {
92290                   // replace closing node with new new node..
92291                   graph = graph.replace(way.unclose().addNode(newNode.id));
92292               } else {
92293                   // replace shared node with multiple new nodes..
92294                   graph = graph.replace(way.updateNode(newNode.id, connection.index));
92295               }
92296           });
92297
92298           return graph;
92299       };
92300
92301
92302       action.connections = function(graph) {
92303           var candidates = [];
92304           var keeping = false;
92305           var parentWays = graph.parentWays(graph.entity(nodeId));
92306
92307           parentWays.forEach(function(way) {
92308               if (wayIds && wayIds.indexOf(way.id) === -1) {
92309                   keeping = true;
92310                   return;
92311               }
92312               if (way.isArea() && (way.nodes[0] === nodeId)) {
92313                   candidates.push({ wayID: way.id, index: 0 });
92314               } else {
92315                   way.nodes.forEach(function(waynode, index) {
92316                       if (waynode === nodeId) {
92317                           candidates.push({ wayID: way.id, index: index });
92318                       }
92319                   });
92320               }
92321           });
92322
92323           return keeping ? candidates : candidates.slice(1);
92324       };
92325
92326
92327       action.disabled = function(graph) {
92328           var connections = action.connections(graph);
92329           if (connections.length === 0 || (wayIds && wayIds.length !== connections.length))
92330               return 'not_connected';
92331
92332           var parentWays = graph.parentWays(graph.entity(nodeId));
92333           var seenRelationIds = {};
92334           var sharedRelation;
92335
92336           parentWays.forEach(function(way) {
92337               if (wayIds && wayIds.indexOf(way.id) === -1)
92338                   return;
92339
92340               var relations = graph.parentRelations(way);
92341               relations.forEach(function(relation) {
92342                   if (relation.id in seenRelationIds) {
92343                       sharedRelation = relation;
92344                   } else {
92345                       seenRelationIds[relation.id] = true;
92346                   }
92347               });
92348           });
92349
92350           if (sharedRelation)
92351               return 'relation';
92352       };
92353
92354
92355       action.limitWays = function(_) {
92356           if (!arguments.length) return wayIds;
92357           wayIds = _;
92358           return action;
92359       };
92360
92361
92362       return action;
92363   }
92364
92365   // Join ways at the end node they share.
92366   //
92367   // This is the inverse of `iD.actionSplit`.
92368   //
92369   // Reference:
92370   //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as
92371   //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java
92372   //
92373   function actionJoin(ids) {
92374
92375       function groupEntitiesByGeometry(graph) {
92376           var entities = ids.map(function(id) { return graph.entity(id); });
92377           return assignIn({line: []}, groupBy(entities, function(entity) { return entity.geometry(graph); }));
92378       }
92379
92380
92381       var action = function(graph) {
92382           var ways = ids.map(graph.entity, graph);
92383           var survivorID = ways[0].id;
92384
92385           // Prefer to keep an existing way.
92386           for (var i = 0; i < ways.length; i++) {
92387               if (!ways[i].isNew()) {
92388                   survivorID = ways[i].id;
92389                   break;
92390               }
92391           }
92392
92393           var sequences = osmJoinWays(ways, graph);
92394           var joined = sequences[0];
92395
92396           // We might need to reverse some of these ways before joining them.  #4688
92397           // `joined.actions` property will contain any actions we need to apply.
92398           graph = sequences.actions.reduce(function(g, action) { return action(g); }, graph);
92399
92400           var survivor = graph.entity(survivorID);
92401           survivor = survivor.update({ nodes: joined.nodes.map(function(n) { return n.id; }) });
92402           graph = graph.replace(survivor);
92403
92404           joined.forEach(function(way) {
92405               if (way.id === survivorID) return;
92406
92407               graph.parentRelations(way).forEach(function(parent) {
92408                   graph = graph.replace(parent.replaceMember(way, survivor));
92409               });
92410
92411               survivor = survivor.mergeTags(way.tags);
92412
92413               graph = graph.replace(survivor);
92414               graph = actionDeleteWay(way.id)(graph);
92415           });
92416
92417           return graph;
92418       };
92419
92420
92421       action.disabled = function(graph) {
92422           var geometries = groupEntitiesByGeometry(graph);
92423           if (ids.length < 2 || ids.length !== geometries.line.length)
92424               return 'not_eligible';
92425
92426           var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
92427           if (joined.length > 1)
92428               return 'not_adjacent';
92429
92430           var nodeIds = joined[0].nodes.map(function(n) { return n.id; }).slice(1, -1);
92431           var relation;
92432           var tags = {};
92433           var conflicting = false;
92434
92435           joined[0].forEach(function(way) {
92436               var parents = graph.parentRelations(way);
92437               parents.forEach(function(parent) {
92438                   if (parent.isRestriction() && parent.members.some(function(m) { return nodeIds.indexOf(m.id) >= 0; }))
92439                       relation = parent;
92440               });
92441
92442               for (var k in way.tags) {
92443                   if (!(k in tags)) {
92444                       tags[k] = way.tags[k];
92445                   } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) {
92446                       conflicting = true;
92447                   }
92448               }
92449           });
92450
92451           if (relation)
92452               return 'restriction';
92453
92454           if (conflicting)
92455               return 'conflicting_tags';
92456       };
92457
92458
92459       return action;
92460   }
92461
92462   function actionMerge(ids) {
92463
92464       function groupEntitiesByGeometry(graph) {
92465           var entities = ids.map(function(id) { return graph.entity(id); });
92466           return assignIn({point: [], area: [], line: [], relation: []},
92467               groupBy(entities, function(entity) { return entity.geometry(graph); }));
92468       }
92469
92470
92471       var action = function(graph) {
92472           var geometries = groupEntitiesByGeometry(graph),
92473               target = geometries.area[0] || geometries.line[0],
92474               points = geometries.point;
92475
92476           points.forEach(function(point) {
92477               target = target.mergeTags(point.tags);
92478               graph = graph.replace(target);
92479
92480               graph.parentRelations(point).forEach(function(parent) {
92481                   graph = graph.replace(parent.replaceMember(point, target));
92482               });
92483
92484               var nodes = uniq(graph.childNodes(target)),
92485                   removeNode = point;
92486
92487               for (var i = 0; i < nodes.length; i++) {
92488                   var node = nodes[i];
92489                   if (graph.parentWays(node).length > 1 ||
92490                       graph.parentRelations(node).length ||
92491                       node.hasInterestingTags()) {
92492                       continue;
92493                   }
92494
92495                   // Found an uninteresting child node on the target way.
92496                   // Move orig point into its place to preserve point's history. #3683
92497                   graph = graph.replace(point.update({ tags: {}, loc: node.loc }));
92498                   target = target.replaceNode(node.id, point.id);
92499                   graph = graph.replace(target);
92500                   removeNode = node;
92501                   break;
92502               }
92503
92504               graph = graph.remove(removeNode);
92505           });
92506
92507           return graph;
92508       };
92509
92510
92511       action.disabled = function(graph) {
92512           var geometries = groupEntitiesByGeometry(graph);
92513           if (geometries.point.length === 0 ||
92514               (geometries.area.length + geometries.line.length) !== 1 ||
92515               geometries.relation.length !== 0)
92516               return 'not_eligible';
92517       };
92518
92519
92520       return action;
92521   }
92522
92523   // `actionMergeNodes` is just a combination of:
92524   //
92525   // 1. move all the nodes to a common location
92526   // 2. `actionConnect` them
92527
92528   function actionMergeNodes(nodeIDs) {
92529
92530       // If there is a single "interesting" node, use that as the location.
92531       // Otherwise return the average location of all the nodes.
92532       function chooseLoc(graph) {
92533           if (!nodeIDs.length) return null;
92534           var sum = [0,0];
92535           var interestingCount = 0;
92536           var interestingLoc;
92537
92538           for (var i = 0; i < nodeIDs.length; i++) {
92539               var node = graph.entity(nodeIDs[i]);
92540               if (node.hasInterestingTags()) {
92541                   interestingLoc = (++interestingCount === 1) ? node.loc : null;
92542               }
92543               sum = geoVecAdd(sum, node.loc);
92544           }
92545
92546           return interestingLoc || geoVecScale(sum, 1 / nodeIDs.length);
92547       }
92548
92549
92550       var action = function(graph) {
92551           if (nodeIDs.length < 2) return graph;
92552           var toLoc = chooseLoc(graph);
92553
92554           for (var i = 0; i < nodeIDs.length; i++) {
92555               var node = graph.entity(nodeIDs[i]);
92556               graph = graph.replace(node.move(toLoc));
92557           }
92558
92559           return actionConnect(nodeIDs)(graph);
92560       };
92561
92562
92563       action.disabled = function(graph) {
92564           if (nodeIDs.length < 2) return 'not_eligible';
92565
92566           for (var i = 0; i < nodeIDs.length; i++) {
92567               var entity = graph.entity(nodeIDs[i]);
92568               if (entity.type !== 'node') return 'not_eligible';
92569           }
92570
92571           return actionConnect(nodeIDs).disabled(graph);
92572       };
92573
92574       return action;
92575   }
92576
92577   function actionMergePolygon(ids, newRelationId) {
92578
92579       function groupEntities(graph) {
92580           var entities = ids.map(function (id) { return graph.entity(id); });
92581           return assignIn({
92582                   closedWay: [],
92583                   multipolygon: [],
92584                   other: []
92585               }, groupBy(entities, function(entity) {
92586                   if (entity.type === 'way' && entity.isClosed()) {
92587                       return 'closedWay';
92588                   } else if (entity.type === 'relation' && entity.isMultipolygon()) {
92589                       return 'multipolygon';
92590                   } else {
92591                       return 'other';
92592                   }
92593               }));
92594       }
92595
92596
92597       var action = function(graph) {
92598           var entities = groupEntities(graph);
92599
92600           // An array representing all the polygons that are part of the multipolygon.
92601           //
92602           // Each element is itself an array of objects with an id property, and has a
92603           // locs property which is an array of the locations forming the polygon.
92604           var polygons = entities.multipolygon.reduce(function(polygons, m) {
92605               return polygons.concat(osmJoinWays(m.members, graph));
92606           }, []).concat(entities.closedWay.map(function(d) {
92607               var member = [{id: d.id}];
92608               member.nodes = graph.childNodes(d);
92609               return member;
92610           }));
92611
92612           // contained is an array of arrays of boolean values,
92613           // where contained[j][k] is true iff the jth way is
92614           // contained by the kth way.
92615           var contained = polygons.map(function(w, i) {
92616               return polygons.map(function(d, n) {
92617                   if (i === n) return null;
92618                   return geoPolygonContainsPolygon(
92619                       map$3(d.nodes, 'loc'),
92620                       map$3(w.nodes, 'loc'));
92621               });
92622           });
92623
92624           // Sort all polygons as either outer or inner ways
92625           var members = [],
92626               outer = true;
92627
92628           while (polygons.length) {
92629               extractUncontained(polygons);
92630               polygons = polygons.filter(isContained);
92631               contained = contained.filter(isContained).map(filterContained);
92632           }
92633
92634           function isContained(d, i) {
92635               return some(contained[i]);
92636           }
92637
92638           function filterContained(d) {
92639               return d.filter(isContained);
92640           }
92641
92642           function extractUncontained(polygons) {
92643               polygons.forEach(function(d, i) {
92644                   if (!isContained(d, i)) {
92645                       d.forEach(function(member) {
92646                           members.push({
92647                               type: 'way',
92648                               id: member.id,
92649                               role: outer ? 'outer' : 'inner'
92650                           });
92651                       });
92652                   }
92653               });
92654               outer = !outer;
92655           }
92656
92657           // Move all tags to one relation
92658           var relation = entities.multipolygon[0] ||
92659               osmRelation({ id: newRelationId, tags: { type: 'multipolygon' }});
92660
92661           entities.multipolygon.slice(1).forEach(function(m) {
92662               relation = relation.mergeTags(m.tags);
92663               graph = graph.remove(m);
92664           });
92665
92666           entities.closedWay.forEach(function(way) {
92667               function isThisOuter(m) {
92668                   return m.id === way.id && m.role !== 'inner';
92669               }
92670               if (members.some(isThisOuter)) {
92671                   relation = relation.mergeTags(way.tags);
92672                   graph = graph.replace(way.update({ tags: {} }));
92673               }
92674           });
92675
92676           return graph.replace(relation.update({
92677               members: members,
92678               tags: omit(relation.tags, 'area')
92679           }));
92680       };
92681
92682
92683       action.disabled = function(graph) {
92684           var entities = groupEntities(graph);
92685           if (entities.other.length > 0 ||
92686               entities.closedWay.length + entities.multipolygon.length < 2)
92687               return 'not_eligible';
92688           if (!entities.multipolygon.every(function(r) { return r.isComplete(graph); }))
92689               return 'incomplete_relation';
92690       };
92691
92692
92693       return action;
92694   }
92695
92696   // Text diff algorithm following Hunt and McIlroy 1976.
92697   // J. W. Hunt and M. D. McIlroy, An algorithm for differential file
92698   // comparison, Bell Telephone Laboratories CSTR #41 (1976)
92699   // http://www.cs.dartmouth.edu/~doug/
92700   //
92701   // Expects two arrays of strings.
92702   function LCS(file1, file2) {
92703     var equivalenceClasses;
92704     var file2indices;
92705     var newCandidate;
92706     var candidates;
92707     var line;
92708     var c, i, j, jX, r, s;
92709
92710     equivalenceClasses = {};
92711     for (j = 0; j < file2.length; j++) {
92712       line = file2[j];
92713       if (equivalenceClasses[line]) {
92714         equivalenceClasses[line].push(j);
92715       } else {
92716         equivalenceClasses[line] = [j];
92717       }
92718     }
92719
92720     candidates = [
92721       { file1index: -1, file2index: -1, chain: null }
92722     ];
92723
92724     for (i = 0; i < file1.length; i++) {
92725       line = file1[i];
92726       file2indices = equivalenceClasses[line] || [];
92727
92728       r = 0;
92729       c = candidates[0];
92730
92731       for (jX = 0; jX < file2indices.length; jX++) {
92732         j = file2indices[jX];
92733
92734         for (s = r; s < candidates.length; s++) {
92735           if ((candidates[s].file2index < j) && ((s === candidates.length - 1) || (candidates[s + 1].file2index > j))) {
92736             break;
92737           }
92738         }
92739
92740         if (s < candidates.length) {
92741           newCandidate = { file1index: i, file2index: j, chain: candidates[s] };
92742           if (r === candidates.length) {
92743             candidates.push(c);
92744           } else {
92745             candidates[r] = c;
92746           }
92747           r = s + 1;
92748           c = newCandidate;
92749           if (r === candidates.length) {
92750             break; // no point in examining further (j)s
92751           }
92752         }
92753       }
92754
92755       candidates[r] = c;
92756     }
92757
92758     // At this point, we know the LCS: it's in the reverse of the
92759     // linked-list through .chain of candidates[candidates.length - 1].
92760
92761     return candidates[candidates.length - 1];
92762   }
92763
92764
92765   // We apply the LCS to give a simple representation of the
92766   // offsets and lengths of mismatched chunks in the input
92767   // files. This is used by diff3MergeIndices below.
92768   function diffIndices(file1, file2) {
92769     var result = [];
92770     var tail1 = file1.length;
92771     var tail2 = file2.length;
92772
92773     for (var candidate = LCS(file1, file2);
92774        candidate !== null;
92775        candidate = candidate.chain)
92776     {
92777       var mismatchLength1 = tail1 - candidate.file1index - 1;
92778       var mismatchLength2 = tail2 - candidate.file2index - 1;
92779       tail1 = candidate.file1index;
92780       tail2 = candidate.file2index;
92781
92782       if (mismatchLength1 || mismatchLength2) {
92783         result.push({
92784           file1: [tail1 + 1, mismatchLength1],
92785           file2: [tail2 + 1, mismatchLength2]
92786         });
92787       }
92788     }
92789
92790     result.reverse();
92791     return result;
92792   }
92793
92794
92795   // Given three files, A, O, and B, where both A and B are
92796   // independently derived from O, returns a fairly complicated
92797   // internal representation of merge decisions it's taken. The
92798   // interested reader may wish to consult
92799   //
92800   // Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce.
92801   // 'A Formal Investigation of ' In Arvind and Prasad,
92802   // editors, Foundations of Software Technology and Theoretical
92803   // Computer Science (FSTTCS), December 2007.
92804   //
92805   // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf)
92806   function diff3MergeIndices(a, o, b) {
92807     var i;
92808     var m1 = diffIndices(o, a);
92809     var m2 = diffIndices(o, b);
92810
92811     var hunks = [];
92812     function addHunk(h, side) {
92813       hunks.push([h.file1[0], side, h.file1[1], h.file2[0], h.file2[1]]);
92814     }
92815     for (i = 0; i < m1.length; i++) { addHunk(m1[i], 0); }
92816     for (i = 0; i < m2.length; i++) { addHunk(m2[i], 2); }
92817     hunks.sort(function (x, y) { return x[0] - y[0]; });
92818
92819     var result = [];
92820     var commonOffset = 0;
92821     function copyCommon(targetOffset) {
92822       if (targetOffset > commonOffset) {
92823         result.push([1, commonOffset, targetOffset - commonOffset]);
92824         commonOffset = targetOffset;
92825       }
92826     }
92827
92828     for (var hunkIndex = 0; hunkIndex < hunks.length; hunkIndex++) {
92829       var firstHunkIndex = hunkIndex;
92830       var hunk = hunks[hunkIndex];
92831       var regionLhs = hunk[0];
92832       var regionRhs = regionLhs + hunk[2];
92833       while (hunkIndex < hunks.length - 1) {
92834         var maybeOverlapping = hunks[hunkIndex + 1];
92835         var maybeLhs = maybeOverlapping[0];
92836         if (maybeLhs > regionRhs) {
92837           break;
92838         }
92839         regionRhs = Math.max(regionRhs, maybeLhs + maybeOverlapping[2]);
92840         hunkIndex++;
92841       }
92842
92843       copyCommon(regionLhs);
92844       if (firstHunkIndex === hunkIndex) {
92845         // The 'overlap' was only one hunk long, meaning that
92846         // there's no conflict here. Either a and o were the
92847         // same, or b and o were the same.
92848         if (hunk[4] > 0) {
92849           result.push([hunk[1], hunk[3], hunk[4]]);
92850         }
92851       } else {
92852         // A proper conflict. Determine the extents of the
92853         // regions involved from a, o and b. Effectively merge
92854         // all the hunks on the left into one giant hunk, and
92855         // do the same for the right; then, correct for skew
92856         // in the regions of o that each side changed, and
92857         // report appropriate spans for the three sides.
92858         var regions = {
92859           0: [a.length, -1, o.length, -1],
92860           2: [b.length, -1, o.length, -1]
92861         };
92862         for (i = firstHunkIndex; i <= hunkIndex; i++) {
92863           hunk = hunks[i];
92864           var side = hunk[1];
92865           var r = regions[side];
92866           var oLhs = hunk[0];
92867           var oRhs = oLhs + hunk[2];
92868           var abLhs = hunk[3];
92869           var abRhs = abLhs + hunk[4];
92870           r[0] = Math.min(abLhs, r[0]);
92871           r[1] = Math.max(abRhs, r[1]);
92872           r[2] = Math.min(oLhs, r[2]);
92873           r[3] = Math.max(oRhs, r[3]);
92874         }
92875         var aLhs = regions[0][0] + (regionLhs - regions[0][2]);
92876         var aRhs = regions[0][1] + (regionRhs - regions[0][3]);
92877         var bLhs = regions[2][0] + (regionLhs - regions[2][2]);
92878         var bRhs = regions[2][1] + (regionRhs - regions[2][3]);
92879         result.push([-1,
92880                      aLhs,      aRhs      - aLhs,
92881                      regionLhs, regionRhs - regionLhs,
92882                      bLhs,      bRhs      - bLhs]);
92883       }
92884       commonOffset = regionRhs;
92885     }
92886
92887     copyCommon(o.length);
92888     return result;
92889   }
92890
92891
92892   // Applies the output of diff3MergeIndices to actually
92893   // construct the merged file; the returned result alternates
92894   // between 'ok' and 'conflict' blocks.
92895   function diff3Merge(a, o, b, excludeFalseConflicts) {
92896     var result = [];
92897     var files = [a, o, b];
92898     var indices = diff3MergeIndices(a, o, b);
92899
92900     var okLines = [];
92901     function flushOk() {
92902       if (okLines.length) {
92903         result.push({ok: okLines});
92904       }
92905       okLines = [];
92906     }
92907     function pushOk(xs) {
92908       for (var j = 0; j < xs.length; j++) {
92909         okLines.push(xs[j]);
92910       }
92911     }
92912
92913     function isTrueConflict(rec) {
92914       if (rec[2] !== rec[6]) return true;
92915       var aoff = rec[1];
92916       var boff = rec[5];
92917       for (var j = 0; j < rec[2]; j++) {
92918         if (a[j + aoff] !== b[j + boff]) {
92919           return true;
92920         }
92921       }
92922       return false;
92923     }
92924
92925     for (var i = 0; i < indices.length; i++) {
92926       var x = indices[i];
92927       var side = x[0];
92928       if (side === -1) {
92929         if (excludeFalseConflicts && !isTrueConflict(x)) {
92930           pushOk(files[0].slice(x[1], x[1] + x[2]));
92931         } else {
92932           flushOk();
92933           result.push({
92934             conflict: {
92935               a: a.slice(x[1], x[1] + x[2]),
92936               aIndex: x[1],
92937               o: o.slice(x[3], x[3] + x[4]),
92938               oIndex: x[3],
92939               b: b.slice(x[5], x[5] + x[6]),
92940               bIndex: x[5]
92941             }
92942           });
92943         }
92944       } else {
92945         pushOk(files[side].slice(x[1], x[1] + x[2]));
92946       }
92947     }
92948
92949     flushOk();
92950     return result;
92951   }
92952
92953   function actionMergeRemoteChanges(id, localGraph, remoteGraph, formatUser) {
92954       var _option = 'safe';  // 'safe', 'force_local', 'force_remote'
92955       var _conflicts = [];
92956
92957
92958       function user(d) {
92959           return isFunction(formatUser) ? formatUser(d) : d;
92960       }
92961
92962
92963       function mergeLocation(remote, target) {
92964           function pointEqual(a, b) {
92965               var epsilon = 1e-6;
92966               return (Math.abs(a[0] - b[0]) < epsilon) && (Math.abs(a[1] - b[1]) < epsilon);
92967           }
92968
92969           if (_option === 'force_local' || pointEqual(target.loc, remote.loc)) {
92970               return target;
92971           }
92972           if (_option === 'force_remote') {
92973               return target.update({loc: remote.loc});
92974           }
92975
92976           _conflicts.push(t('merge_remote_changes.conflict.location', { user: user(remote.user) }));
92977           return target;
92978       }
92979
92980
92981       function mergeNodes(base, remote, target) {
92982           if (_option === 'force_local' || isEqual(target.nodes, remote.nodes)) {
92983               return target;
92984           }
92985           if (_option === 'force_remote') {
92986               return target.update({nodes: remote.nodes});
92987           }
92988
92989           var ccount = _conflicts.length;
92990           var o = base.nodes || [];
92991           var a = target.nodes || [];
92992           var b = remote.nodes || [];
92993           var nodes = [];
92994           var hunks = diff3Merge(a, o, b, true);
92995
92996           for (var i = 0; i < hunks.length; i++) {
92997               var hunk = hunks[i];
92998               if (hunk.ok) {
92999                   nodes.push.apply(nodes, hunk.ok);
93000               } else {
93001                   // for all conflicts, we can assume c.a !== c.b
93002                   // because `diff3Merge` called with `true` option to exclude false conflicts..
93003                   var c = hunk.conflict;
93004                   if (isEqual(c.o, c.a)) {  // only changed remotely
93005                       nodes.push.apply(nodes, c.b);
93006                   } else if (isEqual(c.o, c.b)) {  // only changed locally
93007                       nodes.push.apply(nodes, c.a);
93008                   } else {       // changed both locally and remotely
93009                       _conflicts.push(t('merge_remote_changes.conflict.nodelist', { user: user(remote.user) }));
93010                       break;
93011                   }
93012               }
93013           }
93014
93015           return (_conflicts.length === ccount) ? target.update({nodes: nodes}) : target;
93016       }
93017
93018
93019       function mergeChildren(targetWay, children, updates, graph) {
93020           function isUsed(node, targetWay) {
93021               var parentWays = map$3(graph.parentWays(node), 'id');
93022               return node.hasInterestingTags() ||
93023                   without(parentWays, targetWay.id).length > 0 ||
93024                   graph.parentRelations(node).length > 0;
93025           }
93026
93027           var ccount = _conflicts.length;
93028
93029           for (var i = 0; i < children.length; i++) {
93030               var id = children[i];
93031               var node = graph.hasEntity(id);
93032
93033               // remove unused childNodes..
93034               if (targetWay.nodes.indexOf(id) === -1) {
93035                   if (node && !isUsed(node, targetWay)) {
93036                       updates.removeIds.push(id);
93037                   }
93038                   continue;
93039               }
93040
93041               // restore used childNodes..
93042               var local = localGraph.hasEntity(id);
93043               var remote = remoteGraph.hasEntity(id);
93044               var target;
93045
93046               if (_option === 'force_remote' && remote && remote.visible) {
93047                   updates.replacements.push(remote);
93048
93049               } else if (_option === 'force_local' && local) {
93050                   target = osmEntity$$1(local);
93051                   if (remote) {
93052                       target = target.update({ version: remote.version });
93053                   }
93054                   updates.replacements.push(target);
93055
93056               } else if (_option === 'safe' && local && remote && local.version !== remote.version) {
93057                   target = osmEntity$$1(local, { version: remote.version });
93058                   if (remote.visible) {
93059                       target = mergeLocation(remote, target);
93060                   } else {
93061                       _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
93062                   }
93063
93064                   if (_conflicts.length !== ccount) break;
93065                   updates.replacements.push(target);
93066               }
93067           }
93068
93069           return targetWay;
93070       }
93071
93072
93073       function updateChildren(updates, graph) {
93074           for (var i = 0; i < updates.replacements.length; i++) {
93075               graph = graph.replace(updates.replacements[i]);
93076           }
93077           if (updates.removeIds.length) {
93078               graph = actionDeleteMultiple(updates.removeIds)(graph);
93079           }
93080           return graph;
93081       }
93082
93083
93084       function mergeMembers(remote, target) {
93085           if (_option === 'force_local' || isEqual(target.members, remote.members)) {
93086               return target;
93087           }
93088           if (_option === 'force_remote') {
93089               return target.update({members: remote.members});
93090           }
93091
93092           _conflicts.push(t('merge_remote_changes.conflict.memberlist', { user: user(remote.user) }));
93093           return target;
93094       }
93095
93096
93097       function mergeTags(base, remote, target) {
93098           function ignoreKey(k) {
93099               return dataDiscarded[k];
93100           }
93101
93102           if (_option === 'force_local' || isEqual(target.tags, remote.tags)) {
93103               return target;
93104           }
93105           if (_option === 'force_remote') {
93106               return target.update({tags: remote.tags});
93107           }
93108
93109           var ccount = _conflicts.length;
93110           var o = base.tags || {};
93111           var a = target.tags || {};
93112           var b = remote.tags || {};
93113           var keys = reject(union(keys$1(o), keys$1(a), keys$1(b)), ignoreKey);
93114           var tags = clone(a);
93115           var changed = false;
93116
93117           for (var i = 0; i < keys.length; i++) {
93118               var k = keys[i];
93119
93120               if (o[k] !== b[k] && a[k] !== b[k]) {    // changed remotely..
93121                   if (o[k] !== a[k]) {      // changed locally..
93122                       _conflicts.push(t('merge_remote_changes.conflict.tags',
93123                           { tag: k, local: a[k], remote: b[k], user: user(remote.user) }));
93124
93125                   } else {                  // unchanged locally, accept remote change..
93126                       if (b.hasOwnProperty(k)) {
93127                           tags[k] = b[k];
93128                       } else {
93129                           delete tags[k];
93130                       }
93131                       changed = true;
93132                   }
93133               }
93134           }
93135
93136           return (changed && _conflicts.length === ccount) ? target.update({tags: tags}) : target;
93137       }
93138
93139
93140       //  `graph.base()` is the common ancestor of the two graphs.
93141       //  `localGraph` contains user's edits up to saving
93142       //  `remoteGraph` contains remote edits to modified nodes
93143       //  `graph` must be a descendent of `localGraph` and may include
93144       //      some conflict resolution actions performed on it.
93145       //
93146       //                  --- ... --- `localGraph` -- ... -- `graph`
93147       //                 /
93148       //  `graph.base()` --- ... --- `remoteGraph`
93149       //
93150       var action = function(graph) {
93151           var updates = { replacements: [], removeIds: [] };
93152           var base = graph.base().entities[id];
93153           var local = localGraph.entity(id);
93154           var remote = remoteGraph.entity(id);
93155           var target = osmEntity$$1(local, { version: remote.version });
93156
93157           // delete/undelete
93158           if (!remote.visible) {
93159               if (_option === 'force_remote') {
93160                   return actionDeleteMultiple([id])(graph);
93161
93162               } else if (_option === 'force_local') {
93163                   if (target.type === 'way') {
93164                       target = mergeChildren(target, uniq(local.nodes), updates, graph);
93165                       graph = updateChildren(updates, graph);
93166                   }
93167                   return graph.replace(target);
93168
93169               } else {
93170                   _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
93171                   return graph;  // do nothing
93172               }
93173           }
93174
93175           // merge
93176           if (target.type === 'node') {
93177               target = mergeLocation(remote, target);
93178
93179           } else if (target.type === 'way') {
93180               // pull in any child nodes that may not be present locally..
93181               graph.rebase(remoteGraph.childNodes(remote), [graph], false);
93182               target = mergeNodes(base, remote, target);
93183               target = mergeChildren(target, union(local.nodes, remote.nodes), updates, graph);
93184
93185           } else if (target.type === 'relation') {
93186               target = mergeMembers(remote, target);
93187           }
93188
93189           target = mergeTags(base, remote, target);
93190
93191           if (!_conflicts.length) {
93192               graph = updateChildren(updates, graph).replace(target);
93193           }
93194
93195           return graph;
93196       };
93197
93198
93199       action.withOption = function(opt) {
93200           _option = opt;
93201           return action;
93202       };
93203
93204
93205       action.conflicts = function() {
93206           return _conflicts;
93207       };
93208
93209
93210       return action;
93211   }
93212
93213   // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
93214   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
93215   function actionMove(moveIds, tryDelta, projection, cache) {
93216       var _delta = tryDelta;
93217
93218       function setupCache(graph) {
93219           function canMove(nodeId) {
93220               // Allow movement of any node that is in the selectedIDs list..
93221               if (moveIds.indexOf(nodeId) !== -1) return true;
93222
93223               // Allow movement of a vertex where 2 ways meet..
93224               var parents = map$3(graph.parentWays(graph.entity(nodeId)), 'id');
93225               if (parents.length < 3) return true;
93226
93227               // Restrict movement of a vertex where >2 ways meet, unless all parentWays are moving too..
93228               var parentsMoving = every(parents, function(id) { return cache.moving[id]; });
93229               if (!parentsMoving) delete cache.moving[nodeId];
93230
93231               return parentsMoving;
93232           }
93233
93234           function cacheEntities(ids) {
93235               for (var i = 0; i < ids.length; i++) {
93236                   var id = ids[i];
93237                   if (cache.moving[id]) continue;
93238                   cache.moving[id] = true;
93239
93240                   var entity = graph.hasEntity(id);
93241                   if (!entity) continue;
93242
93243                   if (entity.type === 'node') {
93244                       cache.nodes.push(id);
93245                       cache.startLoc[id] = entity.loc;
93246                   } else if (entity.type === 'way') {
93247                       cache.ways.push(id);
93248                       cacheEntities(entity.nodes);
93249                   } else {
93250                       cacheEntities(entity.members.map(function(member) {
93251                           return member.id;
93252                       }));
93253                   }
93254               }
93255           }
93256
93257           function cacheIntersections(ids) {
93258               function isEndpoint(way, id) {
93259                   return !way.isClosed() && !!way.affix(id);
93260               }
93261
93262               for (var i = 0; i < ids.length; i++) {
93263                   var id = ids[i];
93264
93265                   // consider only intersections with 1 moved and 1 unmoved way.
93266                   var childNodes = graph.childNodes(graph.entity(id));
93267                   for (var j = 0; j < childNodes.length; j++) {
93268                       var node = childNodes[j];
93269                       var parents = graph.parentWays(node);
93270                       if (parents.length !== 2) continue;
93271
93272                       var moved = graph.entity(id);
93273                       var unmoved = null;
93274                       for (var k = 0; k < parents.length; k++) {
93275                           var way = parents[k];
93276                           if (!cache.moving[way.id]) {
93277                               unmoved = way;
93278                               break;
93279                           }
93280                       }
93281                       if (!unmoved) continue;
93282
93283                       // exclude ways that are overly connected..
93284                       if (intersection(moved.nodes, unmoved.nodes).length > 2) continue;
93285                       if (moved.isArea() || unmoved.isArea()) continue;
93286
93287                       cache.intersections.push({
93288                           nodeId: node.id,
93289                           movedId: moved.id,
93290                           unmovedId: unmoved.id,
93291                           movedIsEP: isEndpoint(moved, node.id),
93292                           unmovedIsEP: isEndpoint(unmoved, node.id)
93293                       });
93294                   }
93295               }
93296           }
93297
93298
93299           if (!cache) {
93300               cache = {};
93301           }
93302           if (!cache.ok) {
93303               cache.moving = {};
93304               cache.intersections = [];
93305               cache.replacedVertex = {};
93306               cache.startLoc = {};
93307               cache.nodes = [];
93308               cache.ways = [];
93309
93310               cacheEntities(moveIds);
93311               cacheIntersections(cache.ways);
93312               cache.nodes = filter(cache.nodes, canMove);
93313
93314               cache.ok = true;
93315           }
93316       }
93317
93318
93319       // Place a vertex where the moved vertex used to be, to preserve way shape..
93320       //
93321       //  Start:
93322       //      b ---- e
93323       //     / \
93324       //    /   \
93325       //   /     \
93326       //  a       c
93327       //
93328       //      *               node '*' added to preserve shape
93329       //     / \
93330       //    /   b ---- e      way `b,e` moved here:
93331       //   /     \
93332       //  a       c
93333       //
93334       //
93335       function replaceMovedVertex(nodeId, wayId, graph, delta) {
93336           var way = graph.entity(wayId);
93337           var moved = graph.entity(nodeId);
93338           var movedIndex = way.nodes.indexOf(nodeId);
93339           var len, prevIndex, nextIndex;
93340
93341           if (way.isClosed()) {
93342               len = way.nodes.length - 1;
93343               prevIndex = (movedIndex + len - 1) % len;
93344               nextIndex = (movedIndex + len + 1) % len;
93345           } else {
93346               len = way.nodes.length;
93347               prevIndex = movedIndex - 1;
93348               nextIndex = movedIndex + 1;
93349           }
93350
93351           var prev = graph.hasEntity(way.nodes[prevIndex]);
93352           var next = graph.hasEntity(way.nodes[nextIndex]);
93353
93354           // Don't add orig vertex at endpoint..
93355           if (!prev || !next) return graph;
93356
93357           var key = wayId + '_' + nodeId;
93358           var orig = cache.replacedVertex[key];
93359           if (!orig) {
93360               orig = osmNode();
93361               cache.replacedVertex[key] = orig;
93362               cache.startLoc[orig.id] = cache.startLoc[nodeId];
93363           }
93364
93365           var start, end;
93366           if (delta) {
93367               start = projection(cache.startLoc[nodeId]);
93368               end = projection.invert(geoVecAdd(start, delta));
93369           } else {
93370               end = cache.startLoc[nodeId];
93371           }
93372           orig = orig.move(end);
93373
93374           var angle = Math.abs(geoAngle(orig, prev, projection) -
93375                   geoAngle(orig, next, projection)) * 180 / Math.PI;
93376
93377           // Don't add orig vertex if it would just make a straight line..
93378           if (angle > 175 && angle < 185) return graph;
93379
93380           // moving forward or backward along way?
93381           var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection);
93382           var p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection);
93383           var d1 = geoPathLength(p1);
93384           var d2 = geoPathLength(p2);
93385           var insertAt = (d1 <= d2) ? movedIndex : nextIndex;
93386
93387           // moving around closed loop?
93388           if (way.isClosed() && insertAt === 0) insertAt = len;
93389
93390           way = way.addNode(orig.id, insertAt);
93391           return graph.replace(orig).replace(way);
93392       }
93393
93394
93395       // Remove duplicate vertex that might have been added by
93396       // replaceMovedVertex.  This is done after the unzorro checks.
93397       function removeDuplicateVertices(wayId, graph) {
93398           var way = graph.entity(wayId);
93399           var epsilon = 1e-6;
93400           var prev, curr;
93401
93402           function isInteresting(node, graph) {
93403               return graph.parentWays(node).length > 1 ||
93404                   graph.parentRelations(node).length ||
93405                   node.hasInterestingTags();
93406           }
93407
93408           for (var i = 0; i < way.nodes.length; i++) {
93409               curr = graph.entity(way.nodes[i]);
93410
93411               if (prev && curr && geoVecEqual(prev.loc, curr.loc, epsilon)) {
93412                   if (!isInteresting(prev, graph)) {
93413                       way = way.removeNode(prev.id);
93414                       graph = graph.replace(way).remove(prev);
93415                   } else if (!isInteresting(curr, graph)) {
93416                       way = way.removeNode(curr.id);
93417                       graph = graph.replace(way).remove(curr);
93418                   }
93419               }
93420
93421               prev = curr;
93422           }
93423
93424           return graph;
93425       }
93426
93427
93428       // Reorder nodes around intersections that have moved..
93429       //
93430       //  Start:                way1.nodes: b,e         (moving)
93431       //  a - b - c ----- d     way2.nodes: a,b,c,d     (static)
93432       //      |                 vertex: b
93433       //      e                 isEP1: true,  isEP2, false
93434       //
93435       //  way1 `b,e` moved here:
93436       //  a ----- c = b - d
93437       //              |
93438       //              e
93439       //
93440       //  reorder nodes         way1.nodes: b,e
93441       //  a ----- c - b - d     way2.nodes: a,c,b,d
93442       //              |
93443       //              e
93444       //
93445       function unZorroIntersection(intersection$$1, graph) {
93446           var vertex = graph.entity(intersection$$1.nodeId);
93447           var way1 = graph.entity(intersection$$1.movedId);
93448           var way2 = graph.entity(intersection$$1.unmovedId);
93449           var isEP1 = intersection$$1.movedIsEP;
93450           var isEP2 = intersection$$1.unmovedIsEP;
93451
93452           // don't move the vertex if it is the endpoint of both ways.
93453           if (isEP1 && isEP2) return graph;
93454
93455           var nodes1 = without(graph.childNodes(way1), vertex);
93456           var nodes2 = without(graph.childNodes(way2), vertex);
93457
93458           if (way1.isClosed() && way1.first() === vertex.id) nodes1.push(nodes1[0]);
93459           if (way2.isClosed() && way2.first() === vertex.id) nodes2.push(nodes2[0]);
93460
93461           var edge1 = !isEP1 && geoChooseEdge(nodes1, projection(vertex.loc), projection);
93462           var edge2 = !isEP2 && geoChooseEdge(nodes2, projection(vertex.loc), projection);
93463           var loc;
93464
93465           // snap vertex to nearest edge (or some point between them)..
93466           if (!isEP1 && !isEP2) {
93467               var epsilon = 1e-6, maxIter = 10;
93468               for (var i = 0; i < maxIter; i++) {
93469                   loc = geoVecInterp(edge1.loc, edge2.loc, 0.5);
93470                   edge1 = geoChooseEdge(nodes1, projection(loc), projection);
93471                   edge2 = geoChooseEdge(nodes2, projection(loc), projection);
93472                   if (Math.abs(edge1.distance - edge2.distance) < epsilon) break;
93473               }
93474           } else if (!isEP1) {
93475               loc = edge1.loc;
93476           } else {
93477               loc = edge2.loc;
93478           }
93479
93480           graph = graph.replace(vertex.move(loc));
93481
93482           // if zorro happened, reorder nodes..
93483           if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) {
93484               way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index);
93485               graph = graph.replace(way1);
93486           }
93487           if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) {
93488               way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index);
93489               graph = graph.replace(way2);
93490           }
93491
93492           return graph;
93493       }
93494
93495
93496       function cleanupIntersections(graph) {
93497           for (var i = 0; i < cache.intersections.length; i++) {
93498               var obj = cache.intersections[i];
93499               graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, _delta);
93500               graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null);
93501               graph = unZorroIntersection(obj, graph);
93502               graph = removeDuplicateVertices(obj.movedId, graph);
93503               graph = removeDuplicateVertices(obj.unmovedId, graph);
93504           }
93505
93506           return graph;
93507       }
93508
93509
93510       // check if moving way endpoint can cross an unmoved way, if so limit delta..
93511       function limitDelta(graph) {
93512           function moveNode(loc) {
93513               return geoVecAdd(projection(loc), _delta);
93514           }
93515
93516           for (var i = 0; i < cache.intersections.length; i++) {
93517               var obj = cache.intersections[i];
93518
93519               // Don't limit movement if this is vertex joins 2 endpoints..
93520               if (obj.movedIsEP && obj.unmovedIsEP) continue;
93521               // Don't limit movement if this vertex is not an endpoint anyway..
93522               if (!obj.movedIsEP) continue;
93523
93524               var node = graph.entity(obj.nodeId);
93525               var start = projection(node.loc);
93526               var end = geoVecAdd(start, _delta);
93527               var movedNodes = graph.childNodes(graph.entity(obj.movedId));
93528               var movedPath = map$3(map$3(movedNodes, 'loc'), moveNode);
93529               var unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId));
93530               var unmovedPath = map$3(map$3(unmovedNodes, 'loc'), projection);
93531               var hits = geoPathIntersections(movedPath, unmovedPath);
93532
93533               for (var j = 0; i < hits.length; i++) {
93534                   if (isEqual(hits[j], end)) continue;
93535                   var edge = geoChooseEdge(unmovedNodes, end, projection);
93536                   _delta = geoVecSubtract(projection(edge.loc), start);
93537               }
93538           }
93539       }
93540
93541
93542       var action = function(graph) {
93543           if (_delta[0] === 0 && _delta[1] === 0) return graph;
93544
93545           setupCache(graph);
93546
93547           if (cache.intersections.length) {
93548               limitDelta(graph);
93549           }
93550
93551           for (var i = 0; i < cache.nodes.length; i++) {
93552               var node = graph.entity(cache.nodes[i]);
93553               var start = projection(node.loc);
93554               var end = geoVecAdd(start, _delta);
93555               graph = graph.replace(node.move(projection.invert(end)));
93556           }
93557
93558           if (cache.intersections.length) {
93559               graph = cleanupIntersections(graph);
93560           }
93561
93562           return graph;
93563       };
93564
93565
93566       action.delta = function() {
93567           return _delta;
93568       };
93569
93570
93571       return action;
93572   }
93573
93574   function actionMoveNode(nodeID, toLoc) {
93575
93576       var action = function(graph, t) {
93577           if (t === null || !isFinite(t)) t = 1;
93578           t = Math.min(Math.max(+t, 0), 1);
93579
93580           var node = graph.entity(nodeID);
93581           return graph.replace(
93582               node.move(geoVecInterp(node.loc, toLoc, t))
93583           );
93584       };
93585
93586       action.transitionable = true;
93587
93588       return action;
93589   }
93590
93591   function actionNoop() {
93592       return function(graph) {
93593           return graph;
93594       };
93595   }
93596
93597   /*
93598    * Based on https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/potlatch2/tools/Quadrilateralise.as
93599    */
93600   function actionOrthogonalize(wayId, projection) {
93601       var threshold = 12, // degrees within right or straight to alter
93602           lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180),
93603           upperThreshold = Math.cos(threshold * Math.PI / 180);
93604
93605
93606       var action = function(graph, t) {
93607           if (t === null || !isFinite(t)) t = 1;
93608           t = Math.min(Math.max(+t, 0), 1);
93609
93610           var way = graph.entity(wayId),
93611               nodes = graph.childNodes(way),
93612               points = uniq(nodes).map(function(n) { return projection(n.loc); }),
93613               corner = {i: 0, dotp: 1},
93614               epsilon = 1e-4,
93615               node, loc, score, motions, i, j;
93616
93617           if (points.length === 3) {   // move only one vertex for right triangle
93618               for (i = 0; i < 1000; i++) {
93619                   motions = points.map(calcMotion);
93620                   points[corner.i] = addPoints(points[corner.i], motions[corner.i]);
93621                   score = corner.dotp;
93622                   if (score < epsilon) {
93623                       break;
93624                   }
93625               }
93626
93627               node = graph.entity(nodes[corner.i].id);
93628               loc = projection.invert(points[corner.i]);
93629               graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
93630
93631           } else {
93632               var best,
93633                   originalPoints = clone(points);
93634               score = Infinity;
93635
93636               for (i = 0; i < 1000; i++) {
93637                   motions = points.map(calcMotion);
93638                   for (j = 0; j < motions.length; j++) {
93639                       points[j] = addPoints(points[j],motions[j]);
93640                   }
93641                   var newScore = squareness(points);
93642                   if (newScore < score) {
93643                       best = clone(points);
93644                       score = newScore;
93645                   }
93646                   if (score < epsilon) {
93647                       break;
93648                   }
93649               }
93650
93651               points = best;
93652
93653               for (i = 0; i < points.length; i++) {
93654                   // only move the points that actually moved
93655                   if (originalPoints[i][0] !== points[i][0] || originalPoints[i][1] !== points[i][1]) {
93656                       loc = projection.invert(points[i]);
93657                       node = graph.entity(nodes[i].id);
93658                       graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
93659                   }
93660               }
93661
93662               // remove empty nodes on straight sections
93663               for (i = 0; t === 1 && i < points.length; i++) {
93664                   node = graph.entity(nodes[i].id);
93665
93666                   if (graph.parentWays(node).length > 1 ||
93667                       graph.parentRelations(node).length ||
93668                       node.hasInterestingTags()) {
93669                       continue;
93670                   }
93671
93672                   var dotp = normalizedDotProduct(i, points);
93673                   if (dotp < -1 + epsilon) {
93674                       graph = actionDeleteNode(node.id)(graph);
93675                   }
93676               }
93677           }
93678
93679           return graph;
93680
93681
93682           function calcMotion(b, i, array) {
93683               var a = array[(i - 1 + array.length) % array.length],
93684                   c = array[(i + 1) % array.length],
93685                   p = subtractPoints(a, b),
93686                   q = subtractPoints(c, b),
93687                   scale, dotp;
93688
93689               scale = 2 * Math.min(geoVecLength(p, [0, 0]), geoVecLength(q, [0, 0]));
93690               p = normalizePoint(p, 1.0);
93691               q = normalizePoint(q, 1.0);
93692
93693               dotp = filterDotProduct(p[0] * q[0] + p[1] * q[1]);
93694
93695               // nasty hack to deal with almost-straight segments (angle is closer to 180 than to 90/270).
93696               if (array.length > 3) {
93697                   if (dotp < -0.707106781186547) {
93698                       dotp += 1.0;
93699                   }
93700               } else if (dotp && Math.abs(dotp) < corner.dotp) {
93701                   corner.i = i;
93702                   corner.dotp = Math.abs(dotp);
93703               }
93704
93705               return normalizePoint(addPoints(p, q), 0.1 * dotp * scale);
93706           }
93707       };
93708
93709
93710       function squareness(points) {
93711           return points.reduce(function(sum, val, i, array) {
93712               var dotp = normalizedDotProduct(i, array);
93713
93714               dotp = filterDotProduct(dotp);
93715               return sum + 2.0 * Math.min(Math.abs(dotp - 1.0), Math.min(Math.abs(dotp), Math.abs(dotp + 1)));
93716           }, 0);
93717       }
93718
93719
93720       function normalizedDotProduct(i, points) {
93721           var a = points[(i - 1 + points.length) % points.length],
93722               b = points[i],
93723               c = points[(i + 1) % points.length],
93724               p = subtractPoints(a, b),
93725               q = subtractPoints(c, b);
93726
93727           p = normalizePoint(p, 1.0);
93728           q = normalizePoint(q, 1.0);
93729
93730           return p[0] * q[0] + p[1] * q[1];
93731       }
93732
93733
93734       function subtractPoints(a, b) {
93735           return [a[0] - b[0], a[1] - b[1]];
93736       }
93737
93738
93739       function addPoints(a, b) {
93740           return [a[0] + b[0], a[1] + b[1]];
93741       }
93742
93743
93744       function normalizePoint(point, scale) {
93745           var vector = [0, 0];
93746           var length = Math.sqrt(point[0] * point[0] + point[1] * point[1]);
93747           if (length !== 0) {
93748               vector[0] = point[0] / length;
93749               vector[1] = point[1] / length;
93750           }
93751
93752           vector[0] *= scale;
93753           vector[1] *= scale;
93754
93755           return vector;
93756       }
93757
93758
93759       function filterDotProduct(dotp) {
93760           if (lowerThreshold > Math.abs(dotp) || Math.abs(dotp) > upperThreshold) {
93761               return dotp;
93762           }
93763
93764           return 0;
93765       }
93766
93767
93768       action.disabled = function(graph) {
93769           var way = graph.entity(wayId),
93770               nodes = graph.childNodes(way),
93771               points = uniq(nodes).map(function(n) { return projection(n.loc); });
93772
93773           if (squareness(points)) {
93774               return false;
93775           }
93776
93777           return 'not_squarish';
93778       };
93779
93780
93781       action.transitionable = true;
93782
93783
93784       return action;
93785   }
93786
93787   // `actionRestrictTurn` creates a turn restriction relation.
93788   //
93789   // `turn` must be an `osmTurn` object
93790   // see osm/intersection.js, pathToTurn()
93791   //
93792   // This specifies a restriction of type `restriction` when traveling from
93793   // `turn.from.way` toward `turn.to.way` via `turn.via.node` OR `turn.via.ways`.
93794   // (The action does not check that these entities form a valid intersection.)
93795   //
93796   // From, to, and via ways should be split before calling this action.
93797   // (old versions of the code would split the ways here, but we no longer do it)
93798   //
93799   // For testing convenience, accepts a restrictionID to assign to the new
93800   // relation. Normally, this will be undefined and the relation will
93801   // automatically be assigned a new ID.
93802   //
93803   function actionRestrictTurn(turn, restrictionType, restrictionID) {
93804
93805       return function(graph) {
93806           var fromWay = graph.entity(turn.from.way);
93807           var toWay = graph.entity(turn.to.way);
93808           var viaNode = turn.via.node && graph.entity(turn.via.node);
93809           var viaWays = turn.via.ways && turn.via.ways.map(function(id) { return graph.entity(id); });
93810           var members = [];
93811
93812           members.push({ id: fromWay.id, type: 'way',  role: 'from' });
93813
93814           if (viaNode) {
93815               members.push({ id: viaNode.id,  type: 'node', role: 'via' });
93816           } else if (viaWays) {
93817               viaWays.forEach(function(viaWay) {
93818                   members.push({ id: viaWay.id,  type: 'way', role: 'via' });
93819               });
93820           }
93821
93822           members.push({ id: toWay.id, type: 'way',  role: 'to' });
93823
93824           return graph.replace(osmRelation({
93825               id: restrictionID,
93826               tags: {
93827                   type: 'restriction',
93828                   restriction: restrictionType
93829               },
93830               members: members
93831           }));
93832       };
93833   }
93834
93835   function actionRevert(id) {
93836       var action = function(graph) {
93837           var entity = graph.hasEntity(id),
93838               base = graph.base().entities[id];
93839
93840           if (entity && !base) {    // entity will be removed..
93841               if (entity.type === 'node') {
93842                   graph.parentWays(entity)
93843                       .forEach(function(parent) {
93844                           parent = parent.removeNode(id);
93845                           graph = graph.replace(parent);
93846
93847                           if (parent.isDegenerate()) {
93848                               graph = actionDeleteWay(parent.id)(graph);
93849                           }
93850                       });
93851               }
93852
93853               graph.parentRelations(entity)
93854                   .forEach(function(parent) {
93855                       parent = parent.removeMembersWithID(id);
93856                       graph = graph.replace(parent);
93857
93858                       if (parent.isDegenerate()) {
93859                           graph = actionDeleteRelation(parent.id)(graph);
93860                       }
93861                   });
93862           }
93863
93864           return graph.revert(id);
93865       };
93866
93867       return action;
93868   }
93869
93870   function actionRotate(rotateIds, pivot, angle, projection) {
93871
93872       var action = function(graph) {
93873           return graph.update(function(graph) {
93874               utilGetAllNodes(rotateIds, graph).forEach(function(node) {
93875                   var point = geoRotate([projection(node.loc)], angle, pivot)[0];
93876                   graph = graph.replace(node.move(projection.invert(point)));
93877               });
93878           });
93879       };
93880
93881       return action;
93882   }
93883
93884   /* Built-in method references for those with the same name as other `lodash` methods. */
93885   var nativeMax$8 = Math.max;
93886
93887   /**
93888    * Gets the index at which the first occurrence of `value` is found in `array`
93889    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
93890    * for equality comparisons. If `fromIndex` is negative, it's used as the
93891    * offset from the end of `array`.
93892    *
93893    * @static
93894    * @memberOf _
93895    * @since 0.1.0
93896    * @category Array
93897    * @param {Array} array The array to inspect.
93898    * @param {*} value The value to search for.
93899    * @param {number} [fromIndex=0] The index to search from.
93900    * @returns {number} Returns the index of the matched value, else `-1`.
93901    * @example
93902    *
93903    * _.indexOf([1, 2, 1, 2], 2);
93904    * // => 1
93905    *
93906    * // Search from the `fromIndex`.
93907    * _.indexOf([1, 2, 1, 2], 2, 2);
93908    * // => 3
93909    */
93910   function indexOf(array, value, fromIndex) {
93911     var length = array == null ? 0 : array.length;
93912     if (!length) {
93913       return -1;
93914     }
93915     var index = fromIndex == null ? 0 : toInteger(fromIndex);
93916     if (index < 0) {
93917       index = nativeMax$8(length + index, 0);
93918     }
93919     return baseIndexOf(array, value, index);
93920   }
93921
93922   // Split a way at the given node.
93923   //
93924   // Optionally, split only the given ways, if multiple ways share
93925   // the given node.
93926   //
93927   // This is the inverse of `iD.actionJoin`.
93928   //
93929   // For testing convenience, accepts an ID to assign to the new way.
93930   // Normally, this will be undefined and the way will automatically
93931   // be assigned a new ID.
93932   //
93933   // Reference:
93934   //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
93935   //
93936   function actionSplit(nodeId, newWayIds) {
93937       var _wayIDs;
93938
93939       // If the way is closed, we need to search for a partner node
93940       // to split the way at.
93941       //
93942       // The following looks for a node that is both far away from
93943       // the initial node in terms of way segment length and nearby
93944       // in terms of beeline-distance. This assures that areas get
93945       // split on the most "natural" points (independent of the number
93946       // of nodes).
93947       // For example: bone-shaped areas get split across their waist
93948       // line, circles across the diameter.
93949       function splitArea(nodes, idxA, graph) {
93950           var lengths = new Array(nodes.length);
93951           var length;
93952           var i;
93953           var best = 0;
93954           var idxB;
93955
93956           function wrap(index) {
93957               return utilWrap(index, nodes.length);
93958           }
93959
93960           function dist(nA, nB) {
93961               var locA = graph.entity(nA).loc;
93962               var locB = graph.entity(nB).loc;
93963               var epsilon = 1e-6;
93964               return (locA && locB) ? geoSphericalDistance(locA, locB) : epsilon;
93965           }
93966
93967           // calculate lengths
93968           length = 0;
93969           for (i = wrap(idxA+1); i !== idxA; i = wrap(i+1)) {
93970               length += dist(nodes[i], nodes[wrap(i-1)]);
93971               lengths[i] = length;
93972           }
93973
93974           length = 0;
93975           for (i = wrap(idxA-1); i !== idxA; i = wrap(i-1)) {
93976               length += dist(nodes[i], nodes[wrap(i+1)]);
93977               if (length < lengths[i])
93978                   lengths[i] = length;
93979           }
93980
93981           // determine best opposite node to split
93982           for (i = 0; i < nodes.length; i++) {
93983               var cost = lengths[i] / dist(nodes[idxA], nodes[i]);
93984               if (cost > best) {
93985                   idxB = i;
93986                   best = cost;
93987               }
93988           }
93989
93990           return idxB;
93991       }
93992
93993
93994       function split(graph, wayA, newWayId) {
93995           var wayB = osmWay({id: newWayId, tags: wayA.tags});   // `wayB` is the NEW way
93996           var origNodes = wayA.nodes.slice();
93997           var nodesA;
93998           var nodesB;
93999           var isArea = wayA.isArea();
94000           var isOuter = osmIsSimpleMultipolygonOuterMember(wayA, graph);
94001
94002           if (wayA.isClosed()) {
94003               var nodes = wayA.nodes.slice(0, -1);
94004               var idxA = indexOf(nodes, nodeId);
94005               var idxB = splitArea(nodes, idxA, graph);
94006
94007               if (idxB < idxA) {
94008                   nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
94009                   nodesB = nodes.slice(idxB, idxA + 1);
94010               } else {
94011                   nodesA = nodes.slice(idxA, idxB + 1);
94012                   nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
94013               }
94014           } else {
94015               var idx = indexOf(wayA.nodes, nodeId, 1);
94016               nodesA = wayA.nodes.slice(0, idx + 1);
94017               nodesB = wayA.nodes.slice(idx);
94018           }
94019
94020           wayA = wayA.update({nodes: nodesA});
94021           wayB = wayB.update({nodes: nodesB});
94022
94023           graph = graph.replace(wayA);
94024           graph = graph.replace(wayB);
94025
94026           graph.parentRelations(wayA).forEach(function(relation) {
94027               var member;
94028
94029               // Turn restrictions - make sure:
94030               // 1. Splitting a FROM/TO way - only `wayA` OR `wayB` remains in relation
94031               //    (whichever one is connected to the VIA node/ways)
94032               // 2. Splitting a VIA way - `wayB` remains in relation as a VIA way
94033               if (relation.isRestriction()) {
94034                   var f = relation.memberByRole('from');
94035                   var v = relation.membersByRole('via');
94036                   var t = relation.memberByRole('to');
94037                   var i;
94038
94039                   // 1. split a FROM/TO
94040                   if (f.id === wayA.id || t.id === wayA.id) {
94041                       var keepB = false;
94042                       if (v.length === 1 && v[0].type === 'node') {   // check via node
94043                           keepB = wayB.contains(v[0].id);
94044                       } else {                                        // check via way(s)
94045                           for (i = 0; i < v.length; i++) {
94046                               if (v[i].type === 'way') {
94047                                   var wayVia = graph.hasEntity(v[i].id);
94048                                   if (wayVia && intersection(wayB.nodes, wayVia.nodes).length) {
94049                                       keepB = true;
94050                                       break;
94051                                   }
94052                               }
94053                           }
94054                       }
94055
94056                       if (keepB) {
94057                           relation = relation.replaceMember(wayA, wayB);
94058                           graph = graph.replace(relation);
94059                       }
94060
94061                   // 2. split a VIA
94062                   } else {
94063                       for (i = 0; i < v.length; i++) {
94064                           if (v[i].type === 'way' && v[i].id === wayA.id) {
94065                               member = {
94066                                   id: wayB.id,
94067                                   type: 'way',
94068                                   role: 'via'
94069                               };
94070                               graph = actionAddMember(relation.id, member, v[i].index + 1)(graph);
94071                               break;
94072                           }
94073                       }
94074                   }
94075
94076               // All other relations (Routes, Multipolygons, etc):
94077               // 1. Both `wayA` and `wayB` remain in the relation
94078               // 2. But must be inserted as a pair (see `actionAddMember` for details)
94079               } else {
94080                   if (relation === isOuter) {
94081                       graph = graph.replace(relation.mergeTags(wayA.tags));
94082                       graph = graph.replace(wayA.update({tags: {}}));
94083                       graph = graph.replace(wayB.update({tags: {}}));
94084                   }
94085
94086                   member = {
94087                       id: wayB.id,
94088                       type: 'way',
94089                       role: relation.memberById(wayA.id).role
94090                   };
94091
94092                   var insertPair = {
94093                       originalID: wayA.id,
94094                       insertedID: wayB.id,
94095                       nodes: origNodes
94096                   };
94097
94098                   graph = actionAddMember(relation.id, member, undefined, insertPair)(graph);
94099               }
94100           });
94101
94102           if (!isOuter && isArea) {
94103               var multipolygon = osmRelation({
94104                   tags: assignIn({}, wayA.tags, {type: 'multipolygon'}),
94105                   members: [
94106                       {id: wayA.id, role: 'outer', type: 'way'},
94107                       {id: wayB.id, role: 'outer', type: 'way'}
94108                   ]
94109               });
94110
94111               graph = graph.replace(multipolygon);
94112               graph = graph.replace(wayA.update({tags: {}}));
94113               graph = graph.replace(wayB.update({tags: {}}));
94114           }
94115
94116           return graph;
94117       }
94118
94119
94120       var action = function(graph) {
94121           var candidates = action.ways(graph);
94122           for (var i = 0; i < candidates.length; i++) {
94123               graph = split(graph, candidates[i], newWayIds && newWayIds[i]);
94124           }
94125           return graph;
94126       };
94127
94128
94129       action.ways = function(graph) {
94130           var node = graph.entity(nodeId);
94131           var parents = graph.parentWays(node);
94132           var hasLines = some(parents, function(parent) { return parent.geometry(graph) === 'line'; });
94133
94134           return parents.filter(function(parent) {
94135               if (_wayIDs && _wayIDs.indexOf(parent.id) === -1)
94136                   return false;
94137
94138               if (!_wayIDs && hasLines && parent.geometry(graph) !== 'line')
94139                   return false;
94140
94141               if (parent.isClosed()) {
94142                   return true;
94143               }
94144
94145               for (var i = 1; i < parent.nodes.length - 1; i++) {
94146                   if (parent.nodes[i] === nodeId) {
94147                       return true;
94148                   }
94149               }
94150
94151               return false;
94152           });
94153       };
94154
94155
94156       action.disabled = function(graph) {
94157           var candidates = action.ways(graph);
94158           if (candidates.length === 0 || (_wayIDs && _wayIDs.length !== candidates.length))
94159               return 'not_eligible';
94160       };
94161
94162
94163       action.limitWays = function(_) {
94164           if (!arguments.length) return _wayIDs;
94165           _wayIDs = _;
94166           return action;
94167       };
94168
94169
94170       return action;
94171   }
94172
94173   /*
94174    * Based on https://github.com/openstreetmap/potlatch2/net/systemeD/potlatch2/tools/Straighten.as
94175    */
94176   function actionStraighten(wayId, projection) {
94177
94178       function positionAlongWay(n, s, e) {
94179           return ((n[0] - s[0]) * (e[0] - s[0]) + (n[1] - s[1]) * (e[1] - s[1])) /
94180                   (Math.pow(e[0] - s[0], 2) + Math.pow(e[1] - s[1], 2));
94181       }
94182
94183
94184       var action = function(graph, t) {
94185           if (t === null || !isFinite(t)) t = 1;
94186           t = Math.min(Math.max(+t, 0), 1);
94187
94188           var way = graph.entity(wayId),
94189               nodes = graph.childNodes(way),
94190               points = nodes.map(function(n) { return projection(n.loc); }),
94191               startPoint = points[0],
94192               endPoint = points[points.length-1],
94193               toDelete = [],
94194               i;
94195
94196           for (i = 1; i < points.length-1; i++) {
94197               var node = nodes[i],
94198                   point = points[i];
94199
94200               if (t < 1 || graph.parentWays(node).length > 1 ||
94201                   graph.parentRelations(node).length ||
94202                   node.hasInterestingTags()) {
94203
94204                   var u = positionAlongWay(point, startPoint, endPoint),
94205                       p = [
94206                           startPoint[0] + u * (endPoint[0] - startPoint[0]),
94207                           startPoint[1] + u * (endPoint[1] - startPoint[1])
94208                       ],
94209                       loc2 = projection.invert(p);
94210
94211                   graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
94212
94213               } else {
94214                   // safe to delete
94215                   if (toDelete.indexOf(node) === -1) {
94216                       toDelete.push(node);
94217                   }
94218               }
94219           }
94220
94221           for (i = 0; i < toDelete.length; i++) {
94222               graph = actionDeleteNode(toDelete[i].id)(graph);
94223           }
94224
94225           return graph;
94226       };
94227
94228
94229       action.disabled = function(graph) {
94230           // check way isn't too bendy
94231           var way = graph.entity(wayId),
94232               nodes = graph.childNodes(way),
94233               points = nodes.map(function(n) { return projection(n.loc); }),
94234               startPoint = points[0],
94235               endPoint = points[points.length-1],
94236               threshold = 0.2 * geoVecLength(startPoint, endPoint),
94237               i;
94238
94239           if (threshold === 0) {
94240               return 'too_bendy';
94241           }
94242
94243           for (i = 1; i < points.length-1; i++) {
94244               var point = points[i],
94245                   u = positionAlongWay(point, startPoint, endPoint),
94246                   p0 = startPoint[0] + u * (endPoint[0] - startPoint[0]),
94247                   p1 = startPoint[1] + u * (endPoint[1] - startPoint[1]),
94248                   dist = Math.sqrt(Math.pow(p0 - point[0], 2) + Math.pow(p1 - point[1], 2));
94249
94250               // to bendy if point is off by 20% of total start/end distance in projected space
94251               if (isNaN(dist) || dist > threshold) {
94252                   return 'too_bendy';
94253               }
94254           }
94255       };
94256
94257
94258       action.transitionable = true;
94259
94260
94261       return action;
94262   }
94263
94264   // `actionUnrestrictTurn` deletes a turn restriction relation.
94265   //
94266   // `turn` must be an `osmTurn` object with a `restrictionID` property.
94267   // see osm/intersection.js, pathToTurn()
94268   //
94269   function actionUnrestrictTurn(turn) {
94270       return function(graph) {
94271           return actionDeleteRelation(turn.restrictionID)(graph);
94272       };
94273   }
94274
94275   /* Reflect the given area around its axis of symmetry */
94276   function actionReflect(reflectIds, projection) {
94277       var useLongAxis = true;
94278
94279
94280       // http://gis.stackexchange.com/questions/22895/finding-minimum-area-rectangle-for-given-points
94281       // http://gis.stackexchange.com/questions/3739/generalisation-strategies-for-building-outlines/3756#3756
94282       function getSmallestSurroundingRectangle(graph, nodes) {
94283           var points = nodes.map(function(n) { return projection(n.loc); }),
94284               hull = d3_polygonHull(points),
94285               centroid = d3_polygonCentroid(hull),
94286               minArea = Infinity,
94287               ssrExtent = [],
94288               ssrAngle = 0,
94289               c1 = hull[0];
94290
94291           for (var i = 0; i <= hull.length - 1; i++) {
94292               var c2 = (i === hull.length - 1) ? hull[0] : hull[i + 1],
94293                   angle = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]),
94294                   poly = geoRotate(hull, -angle, centroid),
94295                   extent = poly.reduce(function(extent, point) {
94296                           return extent.extend(geoExtent$$1(point));
94297                       }, geoExtent$$1()),
94298                   area = extent.area();
94299
94300               if (area < minArea) {
94301                   minArea = area;
94302                   ssrExtent = extent;
94303                   ssrAngle = angle;
94304               }
94305               c1 = c2;
94306           }
94307
94308           return {
94309               poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid),
94310               angle: ssrAngle
94311           };
94312       }
94313
94314
94315       var action = function(graph, t) {
94316           if (t === null || !isFinite(t)) t = 1;
94317           t = Math.min(Math.max(+t, 0), 1);
94318
94319           var nodes = utilGetAllNodes(reflectIds, graph),
94320               ssr = getSmallestSurroundingRectangle(graph, nodes);
94321
94322           // Choose line pq = axis of symmetry.
94323           // The shape's surrounding rectangle has 2 axes of symmetry.
94324           // Reflect across the longer axis by default.
94325           var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ],
94326               q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ],
94327               p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ],
94328               q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ],
94329               p, q;
94330
94331           var isLong = (geoVecLength(p1, q1) > geoVecLength(p2, q2));
94332           if ((useLongAxis && isLong) || (!useLongAxis && !isLong)) {
94333               p = p1;
94334               q = q1;
94335           } else {
94336               p = p2;
94337               q = q2;
94338           }
94339
94340           // reflect c across pq
94341           // http://math.stackexchange.com/questions/65503/point-reflection-over-a-line
94342           var dx = q[0] - p[0];
94343           var dy = q[1] - p[1];
94344           var a = (dx * dx - dy * dy) / (dx * dx + dy * dy);
94345           var b = 2 * dx * dy / (dx * dx + dy * dy);
94346           for (var i = 0; i < nodes.length; i++) {
94347               var node = nodes[i];
94348               var c = projection(node.loc);
94349               var c2 = [
94350                   a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0],
94351                   b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1]
94352               ];
94353               var loc2 = projection.invert(c2);
94354               node = node.move(geoVecInterp(node.loc, loc2, t));
94355               graph = graph.replace(node);
94356           }
94357
94358           return graph;
94359       };
94360
94361
94362       action.useLongAxis = function(_) {
94363           if (!arguments.length) return useLongAxis;
94364           useLongAxis = _;
94365           return action;
94366       };
94367
94368
94369       action.transitionable = true;
94370
94371
94372       return action;
94373   }
94374
94375   function actionDetachNode(nodeID) {
94376
94377       var action = function(graph) {
94378           var node = graph.entity(nodeID);
94379
94380           // Create a new node to replace the one we will detach
94381           var replacement = osmNode({ loc: node.loc });
94382           graph = graph.replace(replacement);
94383
94384           // Process each way in turn, updating the graph as we go
94385           graph = graph.parentWays(node)
94386               .reduce(function(accGraph, parentWay) {
94387                   return accGraph.replace(parentWay.replaceNode(nodeID, replacement.id));
94388               }, graph);
94389
94390           // Process any relations too
94391           return graph.parentRelations(node)
94392               .reduce(function(accGraph, parentRel) {
94393                   return accGraph.replace(parentRel.replaceMember(node, replacement));
94394               }, graph);
94395       };
94396
94397
94398       action.disabled = function(graph) {
94399           var node = graph.entity(nodeID);
94400           var parentRels = graph.parentRelations(node);
94401
94402           for (var i = 0; i < parentRels.length; i++) {
94403               var relation = parentRels[i];
94404               if (!relation.isValidRestriction()) continue;
94405
94406               for (var j = 0; j < relation.members.length; j++) {
94407                   var m = relation.members[j];
94408                   if (m.id === nodeID && (m.role === 'via' || m.role === 'location_hint')) {
94409                       return 'restriction';
94410                   }
94411               }
94412           }
94413
94414           return false;
94415       };
94416
94417
94418       return action;
94419   }
94420
94421   var Connection = services.osm;
94422
94423   var debug = false;
94424
94425   var iD = /*#__PURE__*/Object.freeze({
94426     Connection: Connection,
94427     debug: debug,
94428     d3: index$3,
94429     Context: coreContext,
94430     setAreaKeys: setAreaKeys,
94431     Difference: coreDifference,
94432     Graph: coreGraph$$1,
94433     History: coreHistory,
94434     Tree: coreTree,
94435     geoCross: geoVecCross,
94436     geoInterp: geoVecInterp,
94437     geoRoundCoordinates: geoVecFloor,
94438     geoEuclideanDistance: geoVecLength,
94439     Entity: osmEntity$$1,
94440     Node: osmNode,
94441     Relation: osmRelation,
94442     Way: osmWay,
94443     BackgroundSource: rendererBackgroundSource,
94444     Background: rendererBackground,
94445     Features: rendererFeatures,
94446     Map: rendererMap,
94447     TileLayer: rendererTileLayer,
94448     Detect: utilDetect,
94449     uiPreset: uiPresetEditor,
94450     actionAddEntity: actionAddEntity,
94451     actionAddMember: actionAddMember,
94452     actionAddMidpoint: actionAddMidpoint,
94453     actionAddVertex: actionAddVertex,
94454     actionChangeMember: actionChangeMember,
94455     actionChangePreset: actionChangePreset,
94456     actionChangeTags: actionChangeTags,
94457     actionCircularize: actionCircularize,
94458     actionConnect: actionConnect,
94459     actionCopyEntities: actionCopyEntities,
94460     actionDeleteMember: actionDeleteMember,
94461     actionDeleteMultiple: actionDeleteMultiple,
94462     actionDeleteNode: actionDeleteNode,
94463     actionDeleteRelation: actionDeleteRelation,
94464     actionDeleteWay: actionDeleteWay,
94465     actionDeprecateTags: actionDeprecateTags,
94466     actionDiscardTags: actionDiscardTags,
94467     actionDisconnect: actionDisconnect,
94468     actionJoin: actionJoin,
94469     actionMerge: actionMerge,
94470     actionMergeNodes: actionMergeNodes,
94471     actionMergePolygon: actionMergePolygon,
94472     actionMergeRemoteChanges: actionMergeRemoteChanges,
94473     actionMove: actionMove,
94474     actionMoveNode: actionMoveNode,
94475     actionNoop: actionNoop,
94476     actionOrthogonalize: actionOrthogonalize,
94477     actionRestrictTurn: actionRestrictTurn,
94478     actionReverse: actionReverse,
94479     actionRevert: actionRevert,
94480     actionRotate: actionRotate,
94481     actionSplit: actionSplit,
94482     actionStraighten: actionStraighten,
94483     actionUnrestrictTurn: actionUnrestrictTurn,
94484     actionReflect: actionReflect,
94485     actionDetachNode: actionDetachNode,
94486     behaviorAddWay: behaviorAddWay,
94487     behaviorBreathe: behaviorBreathe,
94488     behaviorCopy: behaviorCopy,
94489     behaviorDrag: behaviorDrag,
94490     behaviorDrawWay: behaviorDrawWay,
94491     behaviorDraw: behaviorDraw,
94492     behaviorEdit: behaviorEdit,
94493     behaviorHash: behaviorHash,
94494     behaviorHover: behaviorHover,
94495     behaviorLasso: behaviorLasso,
94496     behaviorOperation: behaviorOperation,
94497     behaviorPaste: behaviorPaste,
94498     behaviorSelect: behaviorSelect,
94499     behaviorTail: behaviorTail,
94500     coreContext: coreContext,
94501     coreDifference: coreDifference,
94502     coreGraph: coreGraph$$1,
94503     coreHistory: coreHistory,
94504     coreTree: coreTree,
94505     data: data,
94506     dataWikipedia: wikipedia$2,
94507     dataAddressFormats: dataAddressFormats,
94508     dataDeprecated: dataDeprecated,
94509     dataDiscarded: dataDiscarded,
94510     dataLocales: dataLocales,
94511     dataPhoneFormats: dataPhoneFormats,
94512     dataShortcuts: dataShortcuts,
94513     dataImperial: dataImperial,
94514     dataDriveLeft: dataDriveLeft,
94515     dataEn: en,
94516     geoExtent: geoExtent$$1,
94517     geoLatToMeters: geoLatToMeters,
94518     geoLonToMeters: geoLonToMeters,
94519     geoMetersToLat: geoMetersToLat,
94520     geoMetersToLon: geoMetersToLon,
94521     geoMetersToOffset: geoMetersToOffset,
94522     geoOffsetToMeters: geoOffsetToMeters,
94523     geoScaleToZoom: geoScaleToZoom,
94524     geoSphericalDistance: geoSphericalDistance,
94525     geoZoomToScale: geoZoomToScale,
94526     geoAngle: geoAngle,
94527     geoChooseEdge: geoChooseEdge,
94528     geoEdgeEqual: geoEdgeEqual,
94529     geoHasLineIntersections: geoHasLineIntersections,
94530     geoHasSelfIntersections: geoHasSelfIntersections,
94531     geoRotate: geoRotate,
94532     geoLineIntersection: geoLineIntersection,
94533     geoPathHasIntersections: geoPathHasIntersections,
94534     geoPathIntersections: geoPathIntersections,
94535     geoPathLength: geoPathLength,
94536     geoPointInPolygon: geoPointInPolygon,
94537     geoPolygonContainsPolygon: geoPolygonContainsPolygon,
94538     geoPolygonIntersectsPolygon: geoPolygonIntersectsPolygon,
94539     geoViewportEdge: geoViewportEdge,
94540     geoRawMercator: geoRawMercator,
94541     geoVecAdd: geoVecAdd,
94542     geoVecAngle: geoVecAngle,
94543     geoVecCross: geoVecCross,
94544     geoVecDot: geoVecDot,
94545     geoVecEqual: geoVecEqual,
94546     geoVecFloor: geoVecFloor,
94547     geoVecInterp: geoVecInterp,
94548     geoVecLength: geoVecLength,
94549     geoVecSubtract: geoVecSubtract,
94550     geoVecScale: geoVecScale,
94551     modeAddArea: modeAddArea$$1,
94552     modeAddLine: modeAddLine$$1,
94553     modeAddPoint: modeAddPoint$$1,
94554     modeAddNote: modeAddNote$$1,
94555     modeBrowse: modeBrowse,
94556     modeDragNode: modeDragNode$$1,
94557     modeDragNote: modeDragNote$$1,
94558     modeDrawArea: modeDrawArea,
94559     modeDrawLine: modeDrawLine,
94560     modeMove: modeMove$$1,
94561     modeRotate: modeRotate$$1,
94562     modeSave: modeSave$$1,
94563     modeSelect: modeSelect,
94564     modeSelectData: modeSelectData$$1,
94565     modeSelectError: modeSelectError$$1,
94566     modeSelectNote: modeSelectNote$$1,
94567     operationCircularize: operationCircularize,
94568     operationContinue: operationContinue,
94569     operationDelete: operationDelete,
94570     operationDisconnect: operationDisconnect,
94571     operationMerge: operationMerge,
94572     operationMove: operationMove,
94573     operationOrthogonalize: operationOrthogonalize,
94574     operationReflectShort: operationReflectShort,
94575     operationReflectLong: operationReflectLong,
94576     operationReverse: operationReverse,
94577     operationRotate: operationRotate,
94578     operationSplit: operationSplit,
94579     operationStraighten: operationStraighten,
94580     operationDetachNode: operationDetachNode,
94581     osmChangeset: osmChangeset,
94582     osmEntity: osmEntity$$1,
94583     krError: krError,
94584     osmNode: osmNode,
94585     osmNote: osmNote,
94586     osmRelation: osmRelation,
94587     osmWay: osmWay,
94588     osmIntersection: osmIntersection,
94589     osmTurn: osmTurn,
94590     osmInferRestriction: osmInferRestriction,
94591     osmLanes: osmLanes,
94592     osmIsSimpleMultipolygonOuterMember: osmIsSimpleMultipolygonOuterMember,
94593     osmSimpleMultipolygonOuterMember: osmSimpleMultipolygonOuterMember,
94594     osmJoinWays: osmJoinWays,
94595     osmOneWayTags: osmOneWayTags,
94596     osmPavedTags: osmPavedTags,
94597     osmIsInterestingTag: osmIsInterestingTag,
94598     presetCategory: presetCategory,
94599     presetCollection: presetCollection,
94600     presetField: presetField,
94601     presetPreset: presetPreset,
94602     presetIndex: presetIndex,
94603     rendererBackgroundSource: rendererBackgroundSource,
94604     rendererBackground: rendererBackground,
94605     rendererFeatures: rendererFeatures,
94606     rendererMap: rendererMap,
94607     rendererTileLayer: rendererTileLayer,
94608     services: services,
94609     serviceKeepRight: serviceKeepRight,
94610     serviceMapillary: serviceMapillary,
94611     serviceMapRules: serviceMapRules,
94612     serviceNominatim: serviceNominatim,
94613     serviceOpenstreetcam: serviceOpenstreetcam,
94614     serviceOsm: serviceOsm,
94615     serviceOsmWikibase: serviceOsmWikibase,
94616     serviceStreetside: serviceStreetside,
94617     serviceTaginfo: serviceTaginfo,
94618     serviceVectorTile: serviceVectorTile,
94619     serviceWikidata: serviceWikidata,
94620     serviceWikipedia: serviceWikipedia,
94621     svgAreas: svgAreas$$1,
94622     svgData: svgData$$1,
94623     svgDebug: svgDebug$$1,
94624     svgDefs: svgDefs,
94625     svgKeepRight: svgKeepRight$$1,
94626     svgIcon: svgIcon,
94627     svgGeolocate: svgGeolocate,
94628     svgLabels: svgLabels,
94629     svgLayers: svgLayers,
94630     svgLines: svgLines$$1,
94631     svgMapillaryImages: svgMapillaryImages$$1,
94632     svgMapillarySigns: svgMapillarySigns$$1,
94633     svgMidpoints: svgMidpoints$$1,
94634     svgNotes: svgNotes$$1,
94635     svgMarkerSegments: svgMarkerSegments,
94636     svgOpenstreetcamImages: svgOpenstreetcamImages$$1,
94637     svgOsm: svgOsm,
94638     svgPassiveVertex: svgPassiveVertex,
94639     svgPath: svgPath,
94640     svgPointTransform: svgPointTransform,
94641     svgPoints: svgPoints$$1,
94642     svgRelationMemberTags: svgRelationMemberTags,
94643     svgSegmentWay: svgSegmentWay,
94644     svgStreetside: svgStreetside$$1,
94645     svgTagClasses: svgTagClasses,
94646     svgTouch: svgTouch,
94647     svgTurns: svgTurns,
94648     svgVertices: svgVertices$$1,
94649     uiFields: uiFields,
94650     uiFieldDefaultCheck: uiFieldCheck,
94651     uiFieldOnewayCheck: uiFieldCheck,
94652     uiFieldCheck: uiFieldCheck,
94653     uiFieldMultiCombo: uiFieldCombo,
94654     uiFieldNetworkCombo: uiFieldCombo,
94655     uiFieldSemiCombo: uiFieldCombo,
94656     uiFieldTypeCombo: uiFieldCombo,
94657     uiFieldCombo: uiFieldCombo,
94658     uiFieldUrl: uiFieldText,
94659     uiFieldNumber: uiFieldText,
94660     uiFieldTel: uiFieldText,
94661     uiFieldEmail: uiFieldText,
94662     uiFieldText: uiFieldText,
94663     uiFieldAccess: uiFieldAccess,
94664     uiFieldAddress: uiFieldAddress,
94665     uiFieldCycleway: uiFieldCycleway,
94666     uiFieldLanes: uiFieldLanes,
94667     uiFieldLocalized: uiFieldLocalized,
94668     uiFieldMaxspeed: uiFieldMaxspeed,
94669     uiFieldStructureRadio: uiFieldRadio,
94670     uiFieldRadio: uiFieldRadio,
94671     uiFieldRestrictions: uiFieldRestrictions,
94672     uiFieldTextarea: uiFieldTextarea,
94673     uiFieldWikidata: uiFieldWikidata,
94674     uiFieldWikipedia: uiFieldWikipedia,
94675     uiIntro: uiIntro,
94676     uiInfoPanels: uiInfoPanels,
94677     uiPanelBackground: uiPanelBackground,
94678     uiPanelHistory: uiPanelHistory,
94679     uiPanelLocation: uiPanelLocation,
94680     uiPanelMeasurement: uiPanelMeasurement,
94681     uiSettingsCustomBackground: uiSettingsCustomBackground,
94682     uiSettingsCustomData: uiSettingsCustomData,
94683     uiInit: uiInit,
94684     uiAccount: uiAccount,
94685     uiAttribution: uiAttribution,
94686     uiBackground: uiBackground,
94687     uiBackgroundDisplayOptions: uiBackgroundDisplayOptions,
94688     uiBackgroundOffset: uiBackgroundOffset,
94689     uiChangesetEditor: uiChangesetEditor$$1,
94690     uiCmd: uiCmd,
94691     uiCombobox: uiCombobox,
94692     uiCommit: uiCommit,
94693     uiCommitChanges: uiCommitChanges,
94694     uiCommitWarnings: uiCommitWarnings,
94695     uiConfirm: uiConfirm,
94696     uiConflicts: uiConflicts,
94697     uiContributors: uiContributors,
94698     uiCurtain: uiCurtain,
94699     uiDataEditor: uiDataEditor$$1,
94700     uiDataHeader: uiDataHeader,
94701     uiDisclosure: uiDisclosure,
94702     uiEditMenu: uiEditMenu,
94703     uiEntityEditor: uiEntityEditor,
94704     uiFeatureInfo: uiFeatureInfo,
94705     uiFeatureList: uiFeatureList,
94706     uiField: uiField,
94707     uiFieldHelp: uiFieldHelp,
94708     uiFlash: uiFlash,
94709     uiFormFields: uiFormFields$$1,
94710     uiFullScreen: uiFullScreen,
94711     uiGeolocate: uiGeolocate,
94712     uiHelp: uiHelp,
94713     uiInfo: uiInfo,
94714     uiInspector: uiInspector,
94715     uiKeepRightDetails: uiKeepRightDetails,
94716     uiKeepRightEditor: uiKeepRightEditor$$1,
94717     uiKeepRightHeader: uiKeepRightHeader,
94718     uiLasso: uiLasso,
94719     uiLoading: uiLoading,
94720     uiMapData: uiMapData,
94721     uiMapInMap: uiMapInMap,
94722     uiModal: uiModal,
94723     uiModes: uiModes,
94724     uiNotice: uiNotice,
94725     uiNoteComments: uiNoteComments,
94726     uiNoteEditor: uiNoteEditor$$1,
94727     uiNoteHeader: uiNoteHeader,
94728     uiNoteReport: uiNoteReport,
94729     uiPresetEditor: uiPresetEditor,
94730     uiPresetIcon: uiPresetIcon,
94731     uiPresetList: uiPresetList,
94732     uiQuickLinks: uiQuickLinks,
94733     uiRadialMenu: uiRadialMenu,
94734     uiRawMemberEditor: uiRawMemberEditor$$1,
94735     uiRawMembershipEditor: uiRawMembershipEditor$$1,
94736     uiRawTagEditor: uiRawTagEditor$$1,
94737     uiRestore: uiRestore,
94738     uiSave: uiSave,
94739     uiScale: uiScale,
94740     uiSelectionList: uiSelectionList,
94741     uiSidebar: uiSidebar$$1,
94742     uiSourceSwitch: uiSourceSwitch,
94743     uiSpinner: uiSpinner,
94744     uiSplash: uiSplash,
94745     uiStatus: uiStatus,
94746     uiSuccess: uiSuccess$$1,
94747     uiTagReference: uiTagReference,
94748     uiToggle: uiToggle,
94749     uiTooltipHtml: uiTooltipHtml,
94750     uiUndoRedo: uiUndoRedo,
94751     uiVersion: uiVersion,
94752     uiViewOnOSM: uiViewOnOSM,
94753     uiViewOnKeepRight: uiViewOnKeepRight,
94754     uiZoom: uiZoom,
94755     utilAsyncMap: utilAsyncMap,
94756     utilCallWhenIdle: utilCallWhenIdle,
94757     utilCleanTags: utilCleanTags,
94758     utilDisplayName: utilDisplayName,
94759     utilDisplayNameForPath: utilDisplayNameForPath,
94760     utilDisplayType: utilDisplayType,
94761     utilEntityRoot: utilEntityRoot,
94762     utilEditDistance: utilEditDistance,
94763     utilEntitySelector: utilEntitySelector,
94764     utilEntityOrMemberSelector: utilEntityOrMemberSelector,
94765     utilEntityOrDeepMemberSelector: utilEntityOrDeepMemberSelector,
94766     utilFastMouse: utilFastMouse,
94767     utilFunctor: utilFunctor,
94768     utilGetAllNodes: utilGetAllNodes,
94769     utilGetPrototypeOf: utilGetPrototypeOf,
94770     utilGetSetValue: utilGetSetValue,
94771     utilHashcode: utilHashcode,
94772     utilHighlightEntity: utilHighlightEntity,
94773     utilIdleWorker: utilIdleWorker,
94774     utilKeybinding: utilKeybinding,
94775     utilNoAuto: utilNoAuto,
94776     utilPrefixCSSProperty: utilPrefixCSSProperty,
94777     utilPrefixDOMProperty: utilPrefixDOMProperty,
94778     utilQsString: utilQsString,
94779     utilRebind: utilRebind,
94780     utilSetTransform: utilSetTransform,
94781     utilSessionMutex: utilSessionMutex,
94782     utilStringQs: utilStringQs,
94783     utilTagText: utilTagText,
94784     utilTiler: utilTiler,
94785     utilTriggerEvent: utilTriggerEvent,
94786     utilWrap: utilWrap,
94787     validationDeprecatedTag: validationDeprecatedTag,
94788     validationDisconnectedHighway: validationDisconnectedHighway,
94789     validationGenericName: validationGenericName,
94790     validationManyDeletions: validationManyDeletions,
94791     validationMapCSSChecks: validationMapCSSChecks,
94792     validationMissingTag: validationMissingTag,
94793     validationOldMultipolygon: validationOldMultipolygon,
94794     validationTagSuggestsArea: validationTagSuggestsArea
94795   });
94796
94797   window.iD = iD;
94798
94799 }());
94800 //# sourceMappingURL=iD.js.map